From 467000afaa1faa8f3097e7e826305cbf90483ecd Mon Sep 17 00:00:00 2001 From: MisaelMa Date: Sat, 29 Mar 2025 15:34:55 -0500 Subject: [PATCH 1/9] feat(2json): improve compact --- packages/cfdi/xml2json/src/backup.ts | 157 +++++++++++ packages/cfdi/xml2json/src/backup2.ts | 101 +++++++ packages/cfdi/xml2json/src/xmlToJson.ts | 170 ++++++++---- packages/cfdi/xml2json/test/cfdi.test.ts | 40 +++ .../xml2json/test/conceptos-to-json.test.ts | 111 ++++++++ .../xml2json/test/impuestos-to-json.test.ts | 75 ++++++ .../cfdi/xml2json/test/xml-to-json.test.ts | 252 ------------------ 7 files changed, 598 insertions(+), 308 deletions(-) create mode 100644 packages/cfdi/xml2json/src/backup.ts create mode 100644 packages/cfdi/xml2json/src/backup2.ts create mode 100644 packages/cfdi/xml2json/test/cfdi.test.ts create mode 100644 packages/cfdi/xml2json/test/conceptos-to-json.test.ts create mode 100644 packages/cfdi/xml2json/test/impuestos-to-json.test.ts delete mode 100644 packages/cfdi/xml2json/test/xml-to-json.test.ts diff --git a/packages/cfdi/xml2json/src/backup.ts b/packages/cfdi/xml2json/src/backup.ts new file mode 100644 index 0000000..18605bc --- /dev/null +++ b/packages/cfdi/xml2json/src/backup.ts @@ -0,0 +1,157 @@ +const cleanJson = (obj: any): any => { + if (Array.isArray(obj)) { + return obj.map(cleanJson); + } else if (typeof obj === 'object' && obj !== null) { + const newObj: Record = {}; + for (const key in obj) { + const cleanKey = ( + key.includes(':') ? key.split(':').pop() : key + ) as string; + const value = cleanJson(obj[key]); + + if (key === '_attributes') { + Object.assign(newObj, value); + } else if (typeof value === 'object' && value !== null) { + const keys = Object.keys(value); + if ( + keys.length === 1 && + typeof value[keys[0]] === 'object' && + value[keys[0]] !== null + ) { + newObj[cleanKey] = Array.isArray(value[keys[0]]) + ? value[keys[0]] + : [value[keys[0]]]; + } else { + newObj[cleanKey] = value; + } + } else { + newObj[cleanKey] = value; + } + } + + return newObj; + } + + return obj; + }; + + interface Element { + name: string; + attributes: Record; + elements: Element[]; + } + + const cleanJson2 = (elements: Element[]): Record[] => { + const resolutions: Record[] = []; + + elements.forEach((element) => { + const name = element.name as string; + const attributes = element.attributes; + const child_elements = element.elements as Element[]; + + // Creamos un objeto para almacenar los datos del elemento + const elementData: Record = {}; + + // Agregamos los atributos del elemento al objeto + Object.keys(attributes).forEach((key) => { + elementData[key] = attributes[key]; + }); + + // Si tiene elementos hijos, los procesamos de forma recursiva + if (child_elements && child_elements.length > 0) { + const childData: Record[] = []; + child_elements.forEach((child_element) => { + const child_name = child_element.name as string; + const child_attributes = child_element.attributes; + + const child_elementData: Record = {}; + + // Agregamos los atributos del hijo + Object.keys(child_attributes).forEach((key) => { + child_elementData[key] = child_attributes[key]; + }); + + // Recursión para manejar subelementos anidados + const grandchild_elements = child_element.elements as Element[]; + if (grandchild_elements && grandchild_elements.length > 0) { + child_elementData[child_name] = cleanJson2(grandchild_elements); + } + + childData.push(child_elementData); + }); + + // Se agregan los hijos al objeto principal + elementData[name] = childData; + } + + // Añadimos el objeto al array de resultados + resolutions.push(elementData); + }); + + return resolutions; + }; + const extractElement = (node: Element, options = {}): any => { + const { parentName = '', isPlural } = options as { + parentName?: string; + isPlural?: boolean; + }; + const isPluralLocal = parentName.endsWith('s') && parentName.slice(0, -1) === node.name; + const data = {}; + + const subelements = node.elements; + let subelementos2 = [] + if (subelements && subelements.length > 0){ + subelementos2 = extractElements(subelements, { parentName: node.name, isPlural: isPluralLocal }); + } + + if (isPluralLocal) { + + Object.assign(data, node.attributes); + + } else { + Object.assign(data, { + [`${node.name}`]: node.attributes ? node.attributes : subelementos2, + }); + } + console.log("data", data); + return data; + }; + + const extractElements = (elements: Element[], options = {}): any => { + const { parentName = '', isPlural = false } = options as { + parentName?: string; + isPlural?: boolean; + }; + const extracted = elements.map((el, i) => { + const result_child = extractElement(el, { parentName, isPlural}); + return result_child + }); + + return extracted; + }; + const transformToCompact = (node: Element, options: any) => { + const { isPlural = false } = options; + if (!node || typeof node !== 'object') return node; + + const result = {}; + + if (node.attributes) { + Object.assign(result, node.attributes); + } + + // Convierte elementos + if (node.elements && node.elements.length > 0) { + const subelementos = extractElements(node.elements, { + parentName: node.name, + isPlural, + }); + console.log("subelementos", subelementos); + subelementos.forEach((el) => { + Object.assign(result, el); + }); + } + + return { + [node.name]: result + }; + }; \ No newline at end of file diff --git a/packages/cfdi/xml2json/src/backup2.ts b/packages/cfdi/xml2json/src/backup2.ts new file mode 100644 index 0000000..3c116b1 --- /dev/null +++ b/packages/cfdi/xml2json/src/backup2.ts @@ -0,0 +1,101 @@ +const toCompactElements = ( + elements: Element[], + { isPlural, parent }: any + ) => { + let result: any = []; + console.log('elements', elements); + + elements.forEach((element) => { + const name = element.name as string; + const attributes = Boolean(element.attributes); + const res = parent.replace(name, ''); + console.log('res', res); + const isLocalPlural = ['s', 'es'].includes(res); + if (attributes && !isPlural) { + if (isLocalPlural) { + result.push(element.attributes) + } else { + result[name] = element.attributes; + } + } + + const d = toCompactElements(element.elements ?? [], { + isPlural: isLocalPlural, + parent: name, + }); + + console.log(` + ============ + parent: ${parent} + name: ${name} + isPlural: ${isPlural} + isLocalPlural: ${isLocalPlural} + d: ${JSON.stringify(d)} + =========== + `); + console.log('result', result); + + if (!isLocalPlural) { + /* result[name] = { + ...result[name], + ...d, + }; */ + } + }); + + return result; + }; + + const toCompact = (node: Element, options: any) => { + const { parent = '', isPlural } = options || {}; + const nodeName = node.name as string; + console.log('node', node); + + let result: any = {}; + + if (node.attributes) { + Object.assign(result, node.attributes); + } + + if (node.elements && node.elements.length > 0) { + node.elements.forEach((element) => { + const name = element.name as string; + const attributes = Boolean(element.attributes); + const res = parent.replace(name, ''); + console.log('res', res); + const isLocalPlural = ['s', 'es'].includes(res); + if (attributes && !isPlural) { + if (isLocalPlural) { + result = element.attributes; + } else { + result[name] = element.attributes; + } + } + + const d = toCompactElements(element.elements ?? [], { + isPlural: isLocalPlural, + parent: name, + }); + + console.log(` + ============ + parent: ${parent} + name: ${name} + isPlural: ${isPlural} + isLocalPlural: ${isLocalPlural} + d: ${JSON.stringify(d)} + =========== + `); + console.log('result', result); + + if (!isLocalPlural) { + result[name] = { + ...result[name], + ...d, + }; + } + }); + } + + return result; + }; \ No newline at end of file diff --git a/packages/cfdi/xml2json/src/xmlToJson.ts b/packages/cfdi/xml2json/src/xmlToJson.ts index 4a2aeca..9f921c1 100644 --- a/packages/cfdi/xml2json/src/xmlToJson.ts +++ b/packages/cfdi/xml2json/src/xmlToJson.ts @@ -3,67 +3,125 @@ import { readFileSync } from 'fs'; import { ElementCompact, Element, Options, xml2js } from 'xml-js'; import { isPath } from '@cfdi/utils'; -function extractAttributes(element: Element | ElementCompact) { - const attributes: any = { ...element.attributes }; +export function XmlToJson( + xmlPath: string, + config?: { original?: boolean; compact?: boolean } +): any { + const original = Boolean(config?.original); + const compact = Boolean(config?.compact); + const stringXml = isPath(xmlPath) ? readFileSync(xmlPath, 'utf8') : xmlPath; + const options: Options.XML2JS = { + ignoreComment: false, + compact: false, + ignoreDeclaration: false, + elementNameFn: (name: string) => + original ? name : name.replace(/^.*:/, ''), + }; + const json = xml2js(stringXml, options); - if (element.elements) { - element.elements.forEach((child: any) => { - const childData = child.elements ? extractAttributes(child) : { ...child.attributes }; + const toCompacts = (elements: Element[], options: any) => { + const { parent = '', isPlural } = options || {}; + let result: any; + /* console.log('parent', parent); + console.log('isPlural', isPlural); */ - // Verificar si el nombre del padre es el plural del hijo (ej. Conceptos -> Concepto) - const isPluralParent = element.name.toLowerCase().endsWith(child.name.toLowerCase() + 's'); // Verifica si el padre es plural + //console.log('------------------') + elements.forEach((element, i) => { + const name = element.name as string; + const attributes = Boolean(element.attributes); + const res = parent.replace(name, ''); + const isElementPlural = ['s', 'es'].includes(res); - // Si el nombre del padre es el plural del hijo, aseguramos que el hijo sea tratado como un array - if (isPluralParent) { - if (attributes[child.name]) { - if (Array.isArray(attributes[child.name])) { - attributes[child.name].push(childData); - } else { - attributes[child.name] = [attributes[child.name], childData]; - } - } else { - attributes[child.name] = [childData]; // Forzar a que sea un array - } + if (attributes && !isPlural) { + if (isElementPlural) { + if (!result) { + result = []; + } + result[i] = element.attributes + } else { + if (!result) { + result = {}; + } + result[name] = element.attributes; + } + } + /* console.log(` + ============ + parent: ${parent} + name: ${name} + isPlural: ${isPlural} + isElementPlural: ${isElementPlural} + attributes: ${JSON.stringify(attributes)} + ===========`); */ + if (element.elements && element.elements.length > 0) { + if (isElementPlural) { + /* console.log('isElementPlural if ', isElementPlural); + console.log('element', element); */ + const compact = toCompacts(element.elements, { + parent: name, + isPlural: false, + }); + /* console.log('compact parent if', name); + console.log('compact --->', JSON.stringify(compact, null, 2)); + console.log("result", result) */ + result[i] = { + ...result[i], + ...compact + } + //result['amir'] = { + // compact + //...element.attributes, + //...result[name], + //...compact + //} + } else { + const compact = toCompacts(element.elements, { + parent: name, + isPlural: isElementPlural, + }); + /* console.log('compact parent else', name); + console.log('compact --->', compact); + console.log('isElementPlural', isElementPlural); + console.log('isPlural', isPlural); */ + if (!isPlural) { + if (!result) { + result = {}; + } + let r: any; + if (Array.isArray(compact)) { + r = { + [name]: compact, + }; + result ={ + ...result, + ...r, + } } else { - // Si no es plural, manejar como objeto único - if (attributes[child.name]) { - if (Array.isArray(attributes[child.name])) { - attributes[child.name].push(childData); - } else { - attributes[child.name] = [attributes[child.name], childData]; - } - } else { - attributes[child.name] = childData; - } + r = compact; + result[name] = { + ...result[name], + ...r, + }; } - }); - } + } else { + console.log('isPlural else', isPlural); + // result.push(compact); + } + } + } + }); - return attributes; -} + /* console.log('=============='); + console.log('result', JSON.stringify(result, null, 2)); + console.log('=============='); */ -export function XmlToJson(xmlPath: string, config?: {original: boolean}): XmlCdfi { - const original = Boolean(config?.original); - const stringXml = isPath(xmlPath) ? readFileSync(xmlPath, 'utf8') : xmlPath; - const options: Options.XML2JS = { - ignoreComment: false, - alwaysChildren: false, - compact: original, - ignoreDeclaration: false, - elementNameFn: (name: string) => original ? name : name.replace(/^.*:/, '') - }; - const json = xml2js(stringXml, options); - const onlyJson = () => { - const { declaration, elements } = json; - const comprobante_element = elements.find((el: any) => el.name === 'Comprobante'); - const comprobante = comprobante_element ? extractAttributes(comprobante_element) : {}; - return { - declaration: { - ...declaration.attributes - }, - 'Comprobante': comprobante - } - } - const result = original ? json : onlyJson(); - return result as XmlCdfi; + return result; + }; + + const compactJson = toCompacts(json.elements, { + isPlural: false, + parent: 'Comprobante', + }); + + return compactJson; } diff --git a/packages/cfdi/xml2json/test/cfdi.test.ts b/packages/cfdi/xml2json/test/cfdi.test.ts new file mode 100644 index 0000000..782c392 --- /dev/null +++ b/packages/cfdi/xml2json/test/cfdi.test.ts @@ -0,0 +1,40 @@ +import { describe, expect, it, test } from 'vitest'; +import { XmlToJson } from '../src/xmlToJson'; +import path from 'path'; + +const files_path = path.resolve(__dirname, '..', '..', '..', 'files', 'xml'); + +describe('CFDI', () => { + it('json', () => { + const xml = path.resolve( + files_path, + '5E2D6AFF-2DD7-43D1-83D3-14C1ACA396D9.xml' + ); + const json = XmlToJson(xml, { original: false, compact: true }); + //console.log(JSON.stringify(json, null, 2)) + expect(json).toBeDefined(); + }); + + it('Emisor & Receptor', () => { + const xml = path.resolve(files_path, 'emisor-receptor.xml'); + const json = XmlToJson(xml, { original: false, compact: false }); + expect(json).toBeDefined(); + + expect(json).toEqual({ + Comprobante: { + Emisor: { + Nombre: 'ESCUELA KEMPER URGATE', + RegimenFiscal: '603', + Rfc: 'EKU9003173C9', + }, + Receptor: { + DomicilioFiscalReceptor: '36257', + Nombre: 'XOCHILT CASAS CHAVEZ', + RegimenFiscalReceptor: '612', + Rfc: 'CACX7605101P8', + UsoCFDI: "G03", + }, + }, + }); + }); +}); diff --git a/packages/cfdi/xml2json/test/conceptos-to-json.test.ts b/packages/cfdi/xml2json/test/conceptos-to-json.test.ts new file mode 100644 index 0000000..bd2b133 --- /dev/null +++ b/packages/cfdi/xml2json/test/conceptos-to-json.test.ts @@ -0,0 +1,111 @@ +import { describe, expect, it, test } from 'vitest'; +import { XmlToJson } from '../src/xmlToJson' +import path from 'path'; + +const files_path = path.resolve(__dirname, '..', '..', '..', 'files','xml'); + +describe(' to json', () => { + + it('un concepto', () => { + const xml = path.resolve(files_path,'un-concepto.xml') + const json = XmlToJson(xml) + + expect(json).toBeDefined(); + + expect(json).toEqual({ + "Comprobante": { + "Conceptos": [ + { + "ClaveProdServ": "86121500", + "Cantidad": "1", + "ClaveUnidad": "E48", + "Unidad": "Pieza", + "Descripcion": "Mensualidad - diciembre", + "ValorUnitario": "5000", + "Importe": "5000", + "Descuento": "0" + } + ] + } + }); + }); + + it('dos conceptos', () => { + const xml = path.resolve(files_path,'dos-conceptos.xml') + const json = XmlToJson(xml) + + expect(json).toBeDefined(); + + expect(json).toEqual({ + "Comprobante": { + "Conceptos": [ + { + "ClaveProdServ": "86121500", + "Cantidad": "1", + "ClaveUnidad": "E48", + "Unidad": "Pieza", + "Descripcion": "Mensualidad - diciembre", + "ValorUnitario": "5000", + "Importe": "5000", + "Descuento": "0" + }, + { + "ClaveProdServ": "86121500", + "Cantidad": "1", + "ClaveUnidad": "E48", + "Unidad": "Pieza", + "Descripcion": "Mensualidad - diciembre", + "ValorUnitario": "5000", + "Importe": "5000", + "Descuento": "0" + } + ] + } + }); + }); + + it ('con complemento', () => { + const xml = path.resolve(files_path,'conceptos.xml') + const json = XmlToJson(xml) + // console.log(JSON.stringify(json, null, 2)); + expect(json).toBeDefined(); + expect(json).toEqual({ + "Comprobante": { + "Conceptos": [ + { + "ClaveProdServ": "86121500", + "Cantidad": "1", + "ClaveUnidad": "E48", + "Unidad": "Pieza", + "Descripcion": "Mensualidad - diciembre", + "ValorUnitario": "5000", + "Importe": "5000", + "Descuento": "0", + "Impuestos": { + "Traslados": [ + { + "Base": "1", + "Impuesto": "002", + "TipoFactor": "Exento" + } + ] + }, + "ComplementoConcepto": { + "instEducativas": { + "xmlns:iedu": "http://www.sat.gob.mx/iedu", + "rfcPago": "CACX7605101P8", + "autRVOE": "118141", + "nivelEducativo": "Primaria", + "CURP": "XEXX010101HNEXXXA4", + "nombreAlumno": "RUBINHO LOPEZ ADILENE", + "version": "1.0" + } + } + } + ] + } + }) + + }) + +}); diff --git a/packages/cfdi/xml2json/test/impuestos-to-json.test.ts b/packages/cfdi/xml2json/test/impuestos-to-json.test.ts new file mode 100644 index 0000000..eb68a68 --- /dev/null +++ b/packages/cfdi/xml2json/test/impuestos-to-json.test.ts @@ -0,0 +1,75 @@ +import { describe, expect, it, test } from 'vitest'; +import { XmlToJson } from '../src/xmlToJson'; +import path from 'path'; + +const files_path = path.resolve(__dirname, '..', '..', '..', 'files', 'xml'); + +describe('impuestos to json', () => { + it('traslados', () => { + const xml = path.resolve(files_path, 'un-impuesto.xml'); + const json = XmlToJson(xml); + //console.log('json', JSON.stringify(json, null, 2)); + expect(json).toBeDefined(); + + expect(json).toEqual({ + Comprobante: { + Impuestos: { + TotalImpuestosTrasladados: '31.72', + Traslados: [ + { + Impuesto: '002', + TipoFactor: 'Tasa', + TasaOCuota: '0.160000', + Importe: '31.72', + }, + ], + Retenciones: [ + { + Importe: '2.00', + Impuesto: '004', + }, + ], + }, + }, + }); + }); + + it('dos traslados', () => { + const xml = path.resolve(files_path, 'dos-impuestos.xml'); + const json = XmlToJson(xml); + + expect(json).toBeDefined(); + + expect(json).toEqual({ + Comprobante: { + Impuestos: { + TotalImpuestosTrasladados: '31.72', + Traslados: [ + { + Impuesto: '002', + TipoFactor: 'Tasa', + TasaOCuota: '0.160000', + Importe: '31.72', + }, + { + Impuesto: '002', + TipoFactor: 'Tasa', + TasaOCuota: '0.160000', + Importe: '31.72', + }, + ], + Retenciones: [ + { + Impuesto: '002', + Importe: '1.00', + }, + { + Impuesto: '002', + Importe: '1.00', + }, + ], + }, + }, + }); + }); +}); diff --git a/packages/cfdi/xml2json/test/xml-to-json.test.ts b/packages/cfdi/xml2json/test/xml-to-json.test.ts deleted file mode 100644 index 5f249dd..0000000 --- a/packages/cfdi/xml2json/test/xml-to-json.test.ts +++ /dev/null @@ -1,252 +0,0 @@ -import { describe, expect, it, test } from 'vitest'; -import { XmlToJson } from '../src/xmlToJson' -import path from 'path'; - -const files_path = path.resolve(__dirname, '..', '..', '..', 'files','xml'); - -describe('xml to json', () => { - - it('json', () => { - const xml = path.resolve(files_path,'5E2D6AFF-2DD7-43D1-83D3-14C1ACA396D9.xml') - const json = XmlToJson(xml, {original: true}) - console.log(JSON.stringify(json, null, 2)) - - expect(json).toBeDefined(); - }); - it('json', () => { - const xml = path.resolve(files_path,'5E2D6AFF-2DD7-43D1-83D3-14C1ACA396D9.xml') - const json = XmlToJson(xml) - console.log(JSON.stringify(json, null, 2)) - - expect(json).toBeDefined(); - /* expect(json).toEqual({ - "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", - "xmlns:cfdi": "http://www.sat.gob.mx/cfd/3", - "xsi:schemaLocation": " http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd", - "Version": "3.3", - "Serie": "I", - "Folio": "ACAPDC-50", - "Fecha": "2021-02-17T02:12:14", - "Sello": "HGJg9lit0Gr54foL1tBT+h/HnpjO9WdqJJldQPKoRUYGgo27ImMBgMoyn31Kz0qOxZA2IbW7Hl5MmxKd5ImdT3nPCRlX7E7wKMUkUdLzb95DvUXl4y2jX33Cd1g65i/9YJB5ItGj8BMFq79K7Yyxm2U/Z+Txfv1zeSRkQk0HT4VyM7mCUnru55AH3OBe692c7X2AAna4eNViZBi+C7fA1zmA4NuI6qTpQdsFgEy+dkCZRFNJIBgZ6VHtcwolA5uBGPKjWyndADpiYuPLhzLWn2TQEkWXW0geGoNFfFnPukbXqQTlZyBCZiEcRfQKWCzqpv8SM4PBhnXbPR0lKTFD2g==", - "FormaPago": "04", - "NoCertificado": "30001000000400002326", - "Certificado": "MIIFijCCA3KgAwIBAgIUMzAwMDEwMDAwMDA0MDAwMDIzMjYwDQYJKoZIhvcNAQELBQAwggErMQ8wDQYDVQQDDAZBQyBVQVQxLjAsBgNVBAoMJVNFUlZJQ0lPIERFIEFETUlOSVNUUkFDSU9OIFRSSUJVVEFSSUExGjAYBgNVBAsMEVNBVC1JRVMgQXV0aG9yaXR5MSgwJgYJKoZIhvcNAQkBFhlvc2Nhci5tYXJ0aW5lekBzYXQuZ29iLm14MR0wGwYDVQQJDBQzcmEgY2VycmFkYSBkZSBjYWRpejEOMAwGA1UEEQwFMDYzNzAxCzAJBgNVBAYTAk1YMRkwFwYDVQQIDBBDSVVEQUQgREUgTUVYSUNPMREwDwYDVQQHDAhDT1lPQUNBTjERMA8GA1UELRMIMi41LjQuNDUxJTAjBgkqhkiG9w0BCQITFnJlc3BvbnNhYmxlOiBBQ0RNQS1TQVQwHhcNMTkwNTI5MTgxMTQ4WhcNMjMwNTI5MTgxMTQ4WjCBsTEdMBsGA1UEAxMUQUxCQSBYS0FSQUpBTSBNRU5ERVoxHTAbBgNVBCkTFEFMQkEgWEtBUkFKQU0gTUVOREVaMR0wGwYDVQQKExRBTEJBIFhLQVJBSkFNIE1FTkRFWjEWMBQGA1UELRMNWEFNQTYyMDIxMERRNTEbMBkGA1UEBRMSWEFNQTYyMDIxME1TTEtOTDA0MR0wGwYDVQQLExRBTEJBIFhLQVJBSkFNIE1FTkRFWjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK2HkPEtxQ+eUC6J428PU1OHXmr7cHtTlE5+Zk0eYykm1tVNivygT+kz7FTgw1b0yoFh96Xp3tXBSeAmsO+DShFFyYMB6x3lllIEmMZD5JbMaCpzyPMRzAq6850Am3/ShjigUPRorUhdLO1Yes2CyySzYlhA08fq3FmOCQ4eQmSPN7422T+Srhm6pFYaVjwS0MlskslCIi+ANqL5RWg75tNjpJzLQXPJyG0KU1AaqXgUT1e+aTn38AyNVQc30QAjiI50CTUq5MJFixoCB9vol421L7peEIAox3DRVw9H/wns9973XLedyuj5r8ZZfs4BinkVh+mykTyZE63rEv14uncCAwEAAaMdMBswDAYDVR0TAQH/BAIwADALBgNVHQ8EBAMCBsAwDQYJKoZIhvcNAQELBQADggIBAAR/KOWy29oitYdYzuGe1o+JOx/AowEJuu9S4/thFE9ugvHiceFK3cUD8v4M4/AS9D+NVrcMpJocNwpUsW/GiGFqOHNcFVnoSsaeEUMSIW949/0lCeMusR10VnpUaXmYFVYZkFV0PsDYUHna+lqmHDLwzSpfyU20UapgpkPe7Ib6/5CmsPQ7GcF7HBrshO8MyLyYSi193MTDKO86thq5iBnTrt4qyCgI7+Hpk770C4wMskpitf0Z9BUUrBxAk+ZoH1fw1ysZtK+v4vS/wquib2SK+MpvlYEfam/613EE/PEAlBTXPDaWTxporKJJxnv/iOsm97FmvRuwAnB13r5cxc/UJFjD2bFm38/2wOUG1H3srG8xhVSTKUYQjvJU+V10dQe0O/QkWx9sPHlY67CdB5SlsCBl0mkB7mA2fsPyuP28EQtEenjm48wpBXgb4exOYq4flMPZ7LpO79SmnQPSeTIt8CIlc0HomkMCl30HQzGSMoItxGSO9Rrx3ogpNNcdhpD6p59TkYd2zM7argPP/lfbl7/3EbbN5miC1JgNgRfAq02CREdMEAK9Z6ErVWUUl8gd0Tva/C3ykCJdTdNgfEI8gONS2ky/axDNDHL8d4+I6tGItfM4drtukL9Trh8/5RPuPvKHg1tKonDp50mxu4ubXBDF2LAnsOshAB44fn+r", - "SubTotal": "5000", - "Descuento": "0", - "Moneda": "MXN", - "Total": "5000", - "TipoDeComprobante": "I", - "MetodoPago": "PUE", - "LugarExpedicion": "77728", - "Emisor": { - "Rfc": "XAMA620210DQ5", - "Nombre": "AMIR MISAEL MARIN COH", - "RegimenFiscal": "621" - }, - "Receptor": { - "Nombre": "AMIR MISAEL MARIN", - "Rfc": "XAXX010101000", - "UsoCFDI": "G03" - }, - "Conceptos": { - "Concepto": [ - { - "ClaveProdServ": "86121500", - "Cantidad": "1", - "ClaveUnidad": "E48", - "Unidad": "Pieza", - "Descripcion": "Mensualidad - diciembre", - "ValorUnitario": "5000", - "Importe": "5000", - "Descuento": "0" - }, - { - "ClaveProdServ": "86121500", - "Cantidad": "1", - "ClaveUnidad": "E48", - "Unidad": "Pieza", - "Descripcion": "Mensualidad - diciembre", - "ValorUnitario": "5000", - "Importe": "5000", - "Descuento": "0" - } - ] - }, - "Impuestos": { - "TotalImpuestosTrasladados": "0.16", - "Traslados": { - "Traslado": [ - { - "Base": "1", - "Impuesto": "002", - "TipoFactor": "Tasa", - "TasaOCuota": "0.160000", - "Importe": "0.16" - } - ] - } - }, - "Complemento": { - "ImpuestosLocales": { - "version": "1.0", - "TotaldeRetenciones": "0.000000", - "TotaldeTraslados": "48.000000", - "TrasladosLocales": { - "ImpLocTrasladado": "IMPUESTO DE HOSPEDAJE", - "TasadeTraslado": "4", - "Importe": "48.00" - } - }, - "CartaPorte": { - "RegistroISTMO": "Sí", - "UbicacionPoloOrigen": "01", - "UbicacionPoloDestino": "01", - "Version": "3.1", - "IdCCP": "CCCBCD94-870A-4332-A52A-A52AA52AA52A", - "TranspInternac": "No", - "TotalDistRec": "1", - "Ubicaciones": { - "Ubicacion": [ - { - "TipoUbicacion": "Origen", - "IDUbicacion": "OR101010", - "RFCRemitenteDestinatario": "URE180429TM6", - "NombreRemitenteDestinatario": "NombreRemitenteDestinatario1", - "FechaHoraSalidaLlegada": "2023-08-01T00:00:00", - "Domicilio": { - "Calle": "Calle1", - "NumeroExterior": "211", - "NumeroInterior": "212", - "Colonia": "1957", - "Localidad": "13", - "Referencia": "casa blanca", - "Municipio": "011", - "Estado": "CMX", - "Pais": "MEX", - "CodigoPostal": "13250" - } - }, - { - "TipoUbicacion": "Destino", - "IDUbicacion": "DE202020", - "RFCRemitenteDestinatario": "URE180429TM6", - "NombreRemitenteDestinatario": "NombreRemitenteDestinatario2", - "FechaHoraSalidaLlegada": "2023-08-01T00:00:01", - "DistanciaRecorrida": "1", - "Domicilio": { - "Calle": "Calle2", - "NumeroExterior": "214", - "NumeroInterior": "215", - "Colonia": "0347", - "Localidad": "23", - "Referencia": "casa negra", - "Municipio": "004", - "Estado": "COA", - "Pais": "MEX", - "CodigoPostal": "25350" - } - } - ] - }, - "Mercancias": { - "PesoBrutoTotal": "1.0", - "UnidadPeso": "XBX", - "NumTotalMercancias": "1", - "LogisticaInversaRecoleccionDevolucion": "Sí", - "Mercancia": [ - { - "FraccionArancelaria": "6309000100", - "BienesTransp": "11121900", - "Descripcion": "Accesorios de equipo de telefonía", - "Cantidad": "1.0", - "ClaveUnidad": "XBX", - "MaterialPeligroso": "No", - "PesoEnKg": "1", - "DenominacionGenericaProd": "DenominacionGenericaProd1", - "DenominacionDistintivaProd": "DenominacionDistintivaProd1", - "Fabricante": "Fabricante1", - "FechaCaducidad": "2003-04-02", - "LoteMedicamento": "LoteMedic1", - "FormaFarmaceutica": "01", - "CondicionesEspTransp": "01", - "RegistroSanitarioFolioAutorizacion": "RegistroSanita1", - "CantidadTransporta": { - "Cantidad": "1", - "IDOrigen": "OR101010", - "IDDestino": "DE202020" - } - } - ], - "Autotransporte": { - "PermSCT": "TPAF01", - "NumPermisoSCT": "NumPermisoSCT1", - "IdentificacionVehicular": { - "ConfigVehicular": "VL", - "PesoBrutoVehicular": "1", - "PlacaVM": "plac892", - "AnioModeloVM": "2020" - }, - "Seguros": { - "AseguraRespCivil": "AseguraRespCivil", - "PolizaRespCivil": "123456789" - }, - "Remolques": { - "Remolque": [ - { - "SubTipoRem": "CTR004", - "Placa": "VL45K98" - } - ] - } - } - }, - "FiguraTransporte": { - "TiposFigura": { - "TipoFigura": "01", - "RFCFigura": "URE180429TM6", - "NumLicencia": "NumLicencia1", - "NombreFigura": "NombreFigura1", - "Domicilio": { - "Calle": "Calle1", - "NumeroExterior": "NumeroExterior1", - "NumeroInterior": "NumeroInterior1", - "Colonia": "Colonia1", - "Localidad": "Localidad1", - "Referencia": "Referencia1", - "Municipio": "Municipio1", - "Estado": "Estado1", - "Pais": "AFG", - "CodigoPostal": "CodigoPosta1" - } - } - } - }, - "VehiculoUsado": { - "Version": "1.0", - "montoAdquisicion": "10000.00", - "montoEnajenacion": "0.00", - "claveVehicular": "AAAABBB", - "marca": "FORD", - "tipo": "Mustang", - "modelo": "1989", - "numeroMotor": "123123123", - "numeroSerie": "12312323", - "NIV": "1234ASD", - "valor": "5000.00" - }, - "TimbreFiscalDigital": { - "xsi:schemaLocation": "http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/cfd/TimbreFiscalDigital/TimbreFiscalDigitalv11.xsd", - "Version": "1.1", - "UUID": "5e2d6aff-2dd7-43d1-83d3-14c1aca396d9", - "FechaTimbrado": "2021-02-17T14:13:10", - "RfcProvCertif": "SPR190613I52", - "SelloCFD": "HGJg9lit0Gr54foL1tBT+h/HnpjO9WdqJJldQPKoRUYGgo27ImMBgMoyn31Kz0qOxZA2IbW7Hl5MmxKd5ImdT3nPCRlX7E7wKMUkUdLzb95DvUXl4y2jX33Cd1g65i/9YJB5ItGj8BMFq79K7Yyxm2U/Z+Txfv1zeSRkQk0HT4VyM7mCUnru55AH3OBe692c7X2AAna4eNViZBi+C7fA1zmA4NuI6qTpQdsFgEy+dkCZRFNJIBgZ6VHtcwolA5uBGPKjWyndADpiYuPLhzLWn2TQEkWXW0geGoNFfFnPukbXqQTlZyBCZiEcRfQKWCzqpv8SM4PBhnXbPR0lKTFD2g==", - "NoCertificadoSAT": "30001000000400002495", - "SelloSAT": "cftZzLlTrJFLWOV9hUqy7NvnTqcId5UwZxybaztZYVgFWF46rV3uCEtxN+ZPKAJOhuYZs2FJlz1e8pS1uxl4lyViSdBELqxeZMeuICf6GqwneLe0QEY39jYHvpaGFnF9AT1KyXWdO2JQIdbiH/dbX2XV498hnnUrEaJbQOl8ovb5ZebTueu4zMcj8QE9nqmEavb7PB3O0w9vvmNl4hoo6XkCvDArlW1FlJdpaFaHDnjfjt+SriyZAszwjaUFvgkgHU7MJCYh37HQd1qVLLbHeGlwiwGOhQ9vu4ziu6zZ9wpb1lPHWfVCymFTAM3LaWuUvA19cReTEgR9yHX1OcNlOg==", - "xmlns:tfd": "http://www.sat.gob.mx/TimbreFiscalDigital", - "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance" - } - } - }); */ - }); -}); From 28c11742b2f6a47da43aeb9496cc0ecc2ece432c Mon Sep 17 00:00:00 2001 From: MisaelMa Date: Sat, 29 Mar 2025 15:35:28 -0500 Subject: [PATCH 2/9] feat(pdf): remove unnecesary deseings --- packages/cfdi/pdf/src/abstract-cfdi-pdf.ts | 21 +- packages/cfdi/pdf/src/index.ts | 1 - .../pdf/src/templates/A111/A111.skelton.ts | 249 -------- packages/cfdi/pdf/src/templates/A111/index.ts | 90 --- .../pdf/src/templates/A117/A117.skeleton.ts | 560 ------------------ packages/cfdi/pdf/src/templates/A117/index.ts | 348 ----------- .../pdf/src/templates/B111/B111.skeleton.ts | 421 ------------- packages/cfdi/pdf/src/templates/B111/index.ts | 125 ---- packages/cfdi/pdf/src/templates/B112/index.ts | 473 --------------- packages/cfdi/pdf/src/templates/B123/index.ts | 440 -------------- packages/cfdi/pdf/src/templates/B222/index.ts | 558 ----------------- packages/cfdi/pdf/src/templates/B333/index.ts | 557 ----------------- packages/cfdi/pdf/src/templates/index.ts | 5 +- 13 files changed, 14 insertions(+), 3834 deletions(-) delete mode 100644 packages/cfdi/pdf/src/templates/A111/A111.skelton.ts delete mode 100644 packages/cfdi/pdf/src/templates/A111/index.ts delete mode 100644 packages/cfdi/pdf/src/templates/A117/A117.skeleton.ts delete mode 100644 packages/cfdi/pdf/src/templates/A117/index.ts delete mode 100644 packages/cfdi/pdf/src/templates/B111/B111.skeleton.ts delete mode 100644 packages/cfdi/pdf/src/templates/B111/index.ts delete mode 100644 packages/cfdi/pdf/src/templates/B112/index.ts delete mode 100644 packages/cfdi/pdf/src/templates/B123/index.ts delete mode 100644 packages/cfdi/pdf/src/templates/B222/index.ts delete mode 100644 packages/cfdi/pdf/src/templates/B333/index.ts diff --git a/packages/cfdi/pdf/src/abstract-cfdi-pdf.ts b/packages/cfdi/pdf/src/abstract-cfdi-pdf.ts index 2b437be..a47a2bc 100644 --- a/packages/cfdi/pdf/src/abstract-cfdi-pdf.ts +++ b/packages/cfdi/pdf/src/abstract-cfdi-pdf.ts @@ -6,13 +6,14 @@ import { XmlCdfi, XmlConcepto, XmlEmisor, + XmlEmisorAttribute, XmlImpuestos, XmlReceptor, -} from '@cfdi/xml' +} from '@cfdi/xml'; import { TCreatedPdf, createPdf } from 'pdfmake/build/pdfmake'; import { OptionsPdf } from './types'; -import { XmlTfd } from '@cfdi/complementos/types/complements/tfd/tfd.com' +import { XmlTfd } from '@cfdi/complementos/types/complements/tfd/tfd.com'; import { XmlToJson } from '@cfdi/2json'; import path from 'path'; // import PdfPrinter from 'pdfmake'; @@ -45,7 +46,7 @@ export abstract class RPDF { } protected abstract addLogo(): void; protected abstract addFolio(c: CFDIComprobante): void; - protected abstract addEmisorData(emisor: XmlEmisor, expedido: string): void; + protected abstract addEmisorData(emisor: XmlEmisorAttribute, expedido: string): void; protected abstract addDate(date: string): void; protected abstract addReceptor(receptor: XmlReceptor): void; protected abstract fechaTimbrado(tfd: XmlTfd): void; @@ -70,17 +71,17 @@ export abstract class RPDF { total: string ): void; public async getDocument(): Promise { - if (this.xml['cfdi:Comprobante']['cfdi:Emisor']) { + /* if (this.xml.Comprobante.Emisor) { this.addEmisorData( - this.xml['cfdi:Comprobante']['cfdi:Emisor'], - this.xml['cfdi:Comprobante']._attributes.LugarExpedicion + this.xml.Comprobante.Emisor, + this.xml.Comprobante.LugarExpedicion ); } await this.addLogo(); - this.addFolio(this.xml['cfdi:Comprobante']._attributes); - this.addDate(this.xml['cfdi:Comprobante']._attributes.Fecha); + this.addFolio(this.xml.Comprobante); + this.addDate(this.xml.Comprobante.Fecha); */ // @ts-ignore - this.addReceptor(this.xml['cfdi:Comprobante']['cfdi:Receptor']); + /*this.addReceptor(this.xml['cfdi:Comprobante']['cfdi:Receptor']); this.addDetalles(this.xml['cfdi:Comprobante']['cfdi:Conceptos']); this.addCatidad(this.xml['cfdi:Comprobante']._attributes); // @ts-ignore @@ -116,7 +117,7 @@ export abstract class RPDF { this.xml['cfdi:Comprobante']._attributes.Total as string ); } - } + } */ const fo = { ...this.fonts, ...Pd.fonts, ...this.options.fonts }; console.log(fo); return createPdf(this.docDefinition); diff --git a/packages/cfdi/pdf/src/index.ts b/packages/cfdi/pdf/src/index.ts index 4b05456..a3d3b4a 100644 --- a/packages/cfdi/pdf/src/index.ts +++ b/packages/cfdi/pdf/src/index.ts @@ -1,2 +1 @@ export * from './types/index'; -export * from "./templates" diff --git a/packages/cfdi/pdf/src/templates/A111/A111.skelton.ts b/packages/cfdi/pdf/src/templates/A111/A111.skelton.ts deleted file mode 100644 index c35c2c8..0000000 --- a/packages/cfdi/pdf/src/templates/A111/A111.skelton.ts +++ /dev/null @@ -1,249 +0,0 @@ -import { TDocumentDefinitions } from 'pdfmake/interfaces'; -export const A111SKELETON: TDocumentDefinitions | any = { - pageSize: 'A4', - pageMargins: [20, 25, 20, 25], - content: [ - { - text: [ - { - fontSize: 13, - text: '\nORDEN DE COMPRA ', - }, - ], - }, - - { - columns: [ - { - width: 200, - text: [ - { - text: [ - { - text: '\n\nSolicitante:', - style: { - bold: true, - fontSize: 10, - }, - }, - { text: ' Sistemas\n', fontSize: 10 }, - ], - }, - { - text: [ - { - text: 'Proveedor:', - style: { - bold: true, - fontSize: 10, - }, - }, - { text: ' Coppel\n', fontSize: 10 }, - ], - }, - { - text: [ - { - text: 'Empresa:', - style: { - bold: true, - fontSize: 10, - }, - }, - { text: ' Adriana Salvador Jeronimo\n', fontSize: 10 }, - ], - }, - ], - }, - { - width: 250, - text: [ - { - text: [], - }, - { - text: [ - { - text: '\n\nArticulos Solicitados:', - style: { - bold: true, - fontSize: 10, - }, - }, - { text: ' 1\n', fontSize: 10 }, - ], - }, - { - text: [ - { - text: 'Fecha de Pedido:', - style: { - bold: true, - fontSize: 10, - }, - }, - { text: '06/07/2020\n', fontSize: 10 }, - ], - }, - { - text: [ - { - text: 'Fecha de Llegada:', - style: { - bold: true, - fontSize: 10, - }, - }, - { text: ' 06/07/2020\n', fontSize: 10 }, - ], - }, - ], - }, - { - width: 150, - style: 'tableExample', - table: { - headerRows: 1, - body: [ - [ - { - text: 'Folio', - fillColor: '#dddddd', - border: [true, true, true, true], - }, - ], - ['109209437'], - ], - }, - }, - ], - }, - - { - style: 'tableExample', - table: { - widths: [40, 153, 50, 80, 60, 50, 50], - headerRows: 1, - body: [ - [ - { - text: 'N°', - fillColor: '#dddddd', - border: [true, true, true, true], - }, - { - text: 'Concepto/Descricion', - style: 'tableHeader', - fillColor: '#dddddd', - border: [true, true, true, true], - }, - { - text: 'C.pedida', - style: 'tableHeader', - fillColor: '#dddddd', - border: [true, true, true, true], - }, - { - text: 'Unidad', - style: 'tableHeader', - fillColor: '#dddddd', - border: [true, true, true, true], - }, - { - text: 'C.Recibida', - style: 'tableHeader', - fillColor: '#dddddd', - border: [true, true, true, true], - }, - { - text: 'Precio', - style: 'tableHeader', - fillColor: '#dddddd', - border: [true, true, true, true], - }, - { - text: 'Valor', - fillColor: '#dddddd', - border: [true, true, true, true], - }, - ], - ['1', 'cat', 'nomina', 'servicio', '19891', '090', '090'], - ], - }, - }, - { - style: 'tableExample', - table: { - widths: [548], - - body: [ - [ - { - border: [false, false, false, true], - alignment: 'center', - text: [ - { - border: [false, false, true, false], - linecolors: '#000080', - style: { fontSize: 10, bold: true, color: '#a76d09' }, - text: ' ', - }, - { - border: [false, false, false, false], - fontSize: 10, - text: '\n ', - }, - { - border: [false, false, false, false], - linecolors: '#000080', - style: { fontSize: 10, bold: true, color: '#a76d09' }, - text: '', - }, - { - border: [false, false, false, false], - fontSize: 10, - text: '\n\n\n\n ', - }, - ], - }, - ], - ], - }, - }, - - { - style: 'tableExample', - table: { - widths: [290, 250], - body: [ - [ - { - border: [false, false, false, false], - text: [ - { - alignment: 'left', - text: 'AUTORIZADO POR (Nombre y Firma) ', - style: { - bold: true, - }, - }, - ], - }, - { - border: [false, false, false, false], - text: [ - { - alignment: 'right', - text: 'SOLICITADO POR (Nombre y Firma) ', - style: { - bold: true, - }, - }, - ], - }, - ], - ], - }, - }, - ], -}; diff --git a/packages/cfdi/pdf/src/templates/A111/index.ts b/packages/cfdi/pdf/src/templates/A111/index.ts deleted file mode 100644 index 564473a..0000000 --- a/packages/cfdi/pdf/src/templates/A111/index.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { TDocumentDefinitions } from 'pdfmake/interfaces'; -import { - CFDIComprobante, - XmlCdfi, - XmlConcepto, - XmlEmisor, - XmlImpuestos, - XmlReceptor, -} from '@cfdi/xml' -import { createPdf, TCreatedPdf } from 'pdfmake/build/pdfmake'; -import { RPDF } from '../../abstract-cfdi-pdf'; -import { A111SKELETON } from './A111.skelton'; -import { OptionsPdf } from '../../types'; -import { XmlTfd } from '@cfdi/complementos/types/complements/tfd/tfd.com' -export class A111 extends RPDF { - constructor(xml: string, options: OptionsPdf = {} as OptionsPdf) { - super(xml, options); - this.setEskeleton(A111SKELETON); - } - - protected addLogo(): void { - // throw new Error('Method not implemented.'); - } - protected addFolio(c: CFDIComprobante): void { - //throw new Error('Method not implemented.'); - } - protected addEmisorData(emisor: XmlEmisor, expedido: string): void { - //throw new Error('Method not implemented.'); - } - protected addDate(date: string): void { - //throw new Error('Method not implemented.'); - } - protected addReceptor(receptor: XmlReceptor): void { - //throw new Error('Method not implemented.'); - } - protected fechaTimbrado(tfd: XmlTfd): void { - //throw new Error('Method not implemented.'); - } - protected addCatidad(comprobante: CFDIComprobante): void { - //throw new Error('Method not implemented.'); - } - protected addImpuesto(impuesto: XmlImpuestos): void { - //throw new Error('Method not implemented.'); - } - protected addNumberToLetter(total: number): void { - //throw new Error('Method not implemented.'); - } - protected addCSDEmisor(NoCertificado: string): void { - //throw new Error('Method not implemented.'); - } - protected addDetalles(detalles: XmlConcepto): void { - //throw new Error('Method not implemented.'); - } - protected addFormaDePago(forma: string): void { - //throw new Error('Method not implemented.'); - } - protected addMetodoDePago(metodo: string): void { - //throw new Error('Method not implemented.'); - } - protected addMoneda(moneda: string): void { - //throw new Error('Method not implemented.'); - } - protected addTipoComprobante(tipo: string): void { - //throw new Error('Method not implemented.'); - } - - protected addCSDSat(tfd: XmlTfd): void { - //throw new Error('Method not implemented.'); - } - protected folioFiscal(tfd: XmlTfd): void { - //throw new Error('Method not implemented.'); - } - protected addSelloDgtEmisor(tfd: XmlTfd): void { - //throw new Error('Method not implemented.'); - } - protected addSelloDelSat(tfd: XmlTfd): void { - //throw new Error('Method not implemented.'); - } - protected addCadenaOriginal(tfd: XmlTfd): void { - //throw new Error('Method not implemented.'); - } - protected addQr( - tfd: XmlTfd, - emisor: XmlEmisor | undefined, - receptor: XmlReceptor | undefined, - total: string - ): void { - //throw new Error('Method not implemented.'); - } -} diff --git a/packages/cfdi/pdf/src/templates/A117/A117.skeleton.ts b/packages/cfdi/pdf/src/templates/A117/A117.skeleton.ts deleted file mode 100644 index 25ef546..0000000 --- a/packages/cfdi/pdf/src/templates/A117/A117.skeleton.ts +++ /dev/null @@ -1,560 +0,0 @@ -import { TDocumentDefinitions } from 'pdfmake/interfaces'; -import { logo } from '@cfdi/utils'; -export const A117SKELETON: TDocumentDefinitions | any = { - pageSize: 'A4', - pageMargins: [20, 25, 20, 25], - content: [ - { - columns: [ - { - text: 'logo', - }, - { - width: 40, - text: '', - }, - { - margin: [0, 0, 0, 0], - width: 200, - text: [ - { - text: '\n', - style: { - bold: true, - color: '#a76d09', - }, - }, - { - text: [ - { - text: 'R.F.C: ', - style: { - bold: true, - color: '#a76d09', - }, - }, - { text: '\n' }, - ], - }, - { - text: [ - { - text: 'REGIMEN: ', - style: { - bold: true, - color: '#a76d09', - }, - }, - { text: '\n' }, - ], - }, - { - text: [ - { - text: 'LUGAR DE EXPEDICION: ', - style: { - bold: true, - color: '#a76d09', - }, - }, - { text: '\n' }, - ], - }, - ], - style: { - fontSize: 9, - }, - }, - [ - { - alignment: 'center', - margin: [55, 0, 0, 0], - text: 'FACTURA', - style: { - fontSize: 9, - bold: true, - }, - }, - { - margin: [80, 0, 0, 10], - alignment: 'center', - width: [10], - table: { - alignment: 'right', - body: [ - [ - { - text: 'FOLIO', - style: { - bold: true, - fontSize: 9, - alignment: 'center', - margin: [0, 0, 0, 0], - }, - }, - ], - ], - }, - layout: { - // @ts-ignore - paddingLeft: (i: any, node: any) => { - return 20; - }, - // @ts-ignore - paddingRight: (i: any, node: any) => { - return 20; - }, - // @ts-ignore - paddingTop: (i: any, node: any) => { - return 0; - }, - // @ts-ignore - paddingBottom: (i: any, node: any) => { - return 0; - }, - // @ts-ignore - fillColor: (rowIndex: number, node: any, columnIndex: any) => { - return rowIndex === 0 ? '#eeeeee' : null; - }, - }, - }, - { - alignment: 'center', - margin: [80, 0, 0, 0], - table: { - alignment: 'right', - heights: 10, - body: [ - [ - { - text: 'FECHA', - style: { - bold: true, - fontSize: 9, - alignment: 'center', - margin: [0, 0, 0, 0], - }, - }, - ], - ], - }, - layout: { - // @ts-ignore - paddingTop: (i: any, node: any) => { - return 0; - }, - // @ts-ignore - paddingBottom: (i: any, node: any) => { - return 0; - }, - // @ts-ignore - fillColor: (rowIndex: number, node: any, columnIndex: any) => { - return rowIndex === 0 ? '#eeeeee' : null; - }, - }, - }, - ], - ], - }, - { - bold: true, - margin: [0, 20, 0, 10], - text: [ - { - text: 'Datos del Cliente\n', - style: { - color: '#0941a7', - }, - }, - { - text: 'Razon Social: ', - style: { - bold: true, - color: '#a76d09', - }, - }, - { text: '' }, - { - text: 'R.F.C.: ', - style: { - bold: true, - color: '#a76d09', - }, - }, - { text: '' }, - { - text: 'Uso CFDI: ', - style: { - bold: true, - color: '#a76d09', - }, - }, - { text: '' }, - ], - style: { - fontSize: 10, - }, - }, - { - style: { - fontSize: 9, - }, - table: { - widths: [45, 50, 213, 40, 50, 53, 40], - body: [ - [ - { - text: 'CANTIDAD', - style: { - bold: true, - }, - }, - { - text: 'CLAVE SAT', - style: { - bold: true, - }, - }, - { - text: 'CONCEPTO/DESCRIPCIÓN', - alignment: 'center', - style: { - bold: true, - }, - }, - { - text: 'UNIDAD', - style: { - bold: true, - }, - }, - { - text: 'P.UNITARIO', - style: { - bold: true, - }, - }, - { - text: 'DESCUENTO', - style: { - bold: true, - }, - }, - { - text: 'IMPORTE', - style: { - bold: true, - }, - }, - ], - ], - }, - layout: { - // @ts-ignore - fillColor: (rowIndex: number, node: any, columnIndex: any) => { - return rowIndex === 0 ? '#eeeeee' : null; - }, - }, - }, - { - margin: [0, 7, 0, 7], - table: { - widths: ['*', 'auto'], - body: [ - [ - { - stack: [ - { - text: 'CANTIDAD CON LETRA', - style: { - bold: true, - fontSize: 9, - }, - }, - { - text: 'OCHOCIENTOS TREINTA Y NUEVE PESOS 99/100 M.N.', - style: { - fontSize: 9, - }, - }, - ], - }, - { - text: [ - { - text: 'SUBTOTAL: ', - style: { - bold: true, - color: '#a76d09', - }, - }, - { text: '\n' }, - { - text: 'DESCUENTO: ', - style: { - bold: true, - color: '#a76d09', - }, - }, - { text: '$\n' }, - { - text: 'IMPUESTOS: ', - style: { - bold: true, - color: '#a76d09', - }, - }, - { text: '$\n' }, - { - text: 'TOTAL: ', - style: { - bold: true, - color: '#a76d09', - }, - }, - { text: '$' }, - ], - style: { - fontSize: 9, - }, - }, - ], - ], - }, - }, - { - columns: [ - { - text: [ - { - text: 'Forma de pago: ', - style: { - bold: true, - color: '#a76d09', - }, - }, - { text: ' \n' }, - { - text: 'Método de pago: ', - style: { - bold: true, - color: '#a76d09', - }, - }, - { text: ' \n' }, - { - text: 'No. de cuenta: ', - style: { - bold: true, - color: '#a76d09', - }, - }, - { text: ' \n' }, - ], - style: { - fontSize: 9, - }, - }, - { - text: [ - { - text: 'Moneda: ', - style: { - bold: true, - color: '#a76d09', - }, - }, - { text: ' $ 1034.48\n' }, - { - text: 'Tipo de comprobante: ', - style: { - bold: true, - color: '#a76d09', - }, - }, - { text: ' $ 310.35\n' }, - ], - style: { - fontSize: 9, - }, - }, - ], - }, - { - style: { - fontSize: 9, - }, - table: { - widths: [250, 280], - body: [ - [ - { - border: [false, false, false, false], - text: 'No. CSD del Emisor', - alignment: 'center', - style: { - bold: true, - }, - }, - { - border: [false, false, false, false], - text: 'Fecha y hora de certificacion', - alignment: 'center', - style: { - bold: true, - }, - }, - ], - [ - { - border: [false, true, false, false], - text: ' ', - alignment: 'center', - }, - { - border: [false, true, false, false], - text: '', - alignment: 'center', - }, - ], - [ - { - border: [false, false, false, false], - text: 'Folio Fiscal', - alignment: 'center', - style: { - bold: true, - }, - }, - { - border: [false, false, false, false], - text: 'No. CSD del SAT', - alignment: 'center', - style: { - bold: true, - }, - }, - ], - [ - { - border: [false, true, false, false], - text: '', - alignment: 'center', - }, - { - border: [false, true, false, false], - text: '', - alignment: 'center', - }, - ], - ], - }, - }, - { - margin: [0, 25, 0, 0], - style: { - fontSize: 9, - }, - columns: [ - { - text: '', - }, - { - margin: [-10, -15, 0, 0], - table: { - widths: [418], - body: [ - [ - { - border: [false, false, false, false], - text: 'SELLO DIGITAL DEL EMISOR', - style: { - alignment: 'left', - color: '#0941a7', - }, - }, - ], - [ - { - border: [false, false, false, false], - text: '', - style: { - fontSize: 7, - }, - }, - ], - [ - { - border: [false, false, false, false], - text: 'SELLO DEL SAT', - style: { - alignment: 'left', - color: '#0941a7', - }, - }, - ], - [ - { - border: [false, false, false, false], - text: '', - style: { - fontSize: 7, - }, - }, - ], - [ - { - border: [false, false, false, false], - text: 'CADENA ORIGINAL DEL COMPLEMENTO DE CERTIFICACION DIGITAL DEL SAT', - style: { - alignment: 'left', - color: '#0941a7', - }, - }, - ], - [ - { - border: [false, false, false, false], - text: '', - style: { - fontSize: 7, - }, - }, - ], - ], - }, - style: { - fontSize: 9, - }, - }, - ], - }, - ], - // @ts-ignore - footer: (currentPage: number, pageCount: number) => { - return { - table: { - body: [ - [ - { - image: logo, - margin: [10, 0, 0, 0], - alignment: 'center', - fit: [20, 20], - }, - { - margin: [-5, 5, 0, 0], - text: 'by Signati', - // stext: "Page " + currentPage.toString() + ' of ' + pageCount, - alignment: 'right', - style: { - fontSize: 10, - }, - }, - ], - ], - }, - layout: 'noBorders', - }; - }, -}; diff --git a/packages/cfdi/pdf/src/templates/A117/index.ts b/packages/cfdi/pdf/src/templates/A117/index.ts deleted file mode 100644 index 863e59e..0000000 --- a/packages/cfdi/pdf/src/templates/A117/index.ts +++ /dev/null @@ -1,348 +0,0 @@ -import { CFDIComprobante, XmlConcepto, XmlEmisor, XmlReceptor, XmlImpuestos, XmlConceptoProperties } from '@cfdi/xml' -import { - FormaPagoList, - MetodoPagoList, - RegimenFiscalList, - TipoComprobanteList, -} from '@cfdi/catalogos' -import { XmlTfd } from '@cfdi/complementos/types/complements/tfd/tfd.com' -import { ContentText } from 'pdfmake/interfaces'; -import { logo, NumeroALetras } from '@cfdi/utils'; -// @ts-ignore -import * as QRCode from 'qrcode'; - -import { A117SKELETON } from './A117.skeleton'; -import { RPDF } from '../../abstract-cfdi-pdf'; -import { OptionsPdf } from '../../types'; -export class A117 extends RPDF { - constructor(xml: string, options: OptionsPdf = {} as OptionsPdf) { - super(xml, options); - this.setEskeleton(A117SKELETON); - } - protected addLogo(): void { - if (this.options.logo) { - if (typeof this.options.logo === 'object') { - this.docDefinition.content[0].columns[0] = { - width: this.options.logo.width, - image: this.options.logo.image, - height: this.options.logo.height, - alignment: 'left', - }; - } else { - this.docDefinition.content[0].columns[0] = { - width: 100, - image: this.options.logo, - height: 100, - alignment: 'left', - }; - } - } else { - this.docDefinition.content[0].columns[0] = { - width: 100, - image: logo, - height: 100, - alignment: 'left', - }; - } - } - - protected addFolio(c: CFDIComprobante) { - const data = [ - { - text: c.Serie + ' - ' + c.Folio, - style: { - fontSize: 10, - alignment: 'center', - color: 'red', - margin: [0, 0, 0, 0], - }, - }, - ]; - this.docDefinition.content[0].columns[3][1].table.body.push(data); - } - - protected addEmisorData(emisor: XmlEmisor, expedido: string) { - this.docDefinition.content[0].columns[2].text[0].text = - emisor._attributes!.Nombre + '\n'; - this.docDefinition.content[0].columns[2].text[1].text[1].text = - emisor._attributes!.Rfc + '\n'; - const regimen = RegimenFiscalList.find( - (f) => f.value.toString() === emisor._attributes!.RegimenFiscal - ); - this.docDefinition.content[0].columns[2].text[2].text[1].text = - emisor._attributes!.RegimenFiscal + - ' - ' + - regimen!.descripcion.toUpperCase() + - '\n'; - this.docDefinition.content[0].columns[2].text[3].text[1].text = this.options - .lugarExpedicion - ? this.options.lugarExpedicion - : expedido; - } - - protected addDate(date: string) { - const data = [ - { - text: date, - style: { - fontSize: 10, - alignment: 'center', - color: 'red', - margin: [0, 0, 0, 0], - }, - }, - ]; - this.docDefinition.content[0].columns[3][2].table.body.push(data); - } - - protected addDetalles(detalles: XmlConcepto) { - let deatails: XmlConceptoProperties[] = []; - /* al momento de la conversion no respeta el array - lo convierte en objeto cuando es solo un item, - por eso la validacion si es typo array o no*/ - if (Array.isArray(detalles['cfdi:Concepto'])) { - deatails = detalles['cfdi:Concepto']; - } else { - // @ts-ignore - deatails.push(detalles['cfdi:Concepto']); - } - for (const detail of deatails) { - const con = detail._attributes; - const descripcion: ContentText[] = [ - { - text: con.Descripcion + '\n', - }, - ]; - if (detail['cfdi:ComplementoConcepto']) { - if (detail['cfdi:ComplementoConcepto']['iedu:instEducativas']) { - if ( - detail['cfdi:ComplementoConcepto']['iedu:instEducativas'] - ._attributes - ) { - const iedu = - detail['cfdi:ComplementoConcepto']['iedu:instEducativas'] - ._attributes; - descripcion.push({ text: 'ALUMNO: ', bold: true }); - descripcion.push({ - text: iedu!.nombreAlumno.toLocaleUpperCase() + '\n', - }); - descripcion.push({ text: 'CURP: ', bold: true }); - descripcion.push({ text: iedu!.CURP.toLocaleUpperCase() + '\n' }); - descripcion.push({ text: 'NIVEL EDUCATIVO: ', bold: true }); - descripcion.push({ - text: iedu!.nivelEducativo.toLocaleUpperCase() + '\n', - }); - descripcion.push({ text: 'CLAVE: ', bold: true }); - descripcion.push({ - text: iedu!.autRVOE.toLocaleUpperCase() + '\n', - }); - descripcion.push({ text: 'RFC: ', bold: true }); - descripcion.push({ - text: iedu!.rfcPago.toLocaleUpperCase() + '\n', - }); - } - } - if ( - detail['cfdi:ComplementoConcepto']['terceros:PorCuentadeTerceros'] - ) { - // @ts-ignore - const terceros = - detail['cfdi:ComplementoConcepto']['terceros:PorCuentadeTerceros']; - } - if ( - detail['cfdi:ComplementoConcepto']['ventavehiculos:VentaVehiculos'] - ) { - // @ts-ignore - const ventavehiculos = - detail['cfdi:ComplementoConcepto']['ventavehiculos:VentaVehiculos']; - } - } - this.docDefinition.content[2].table.body.push([ - { - text: con.Cantidad, - }, - { - text: con.ClaveProdServ, - }, - { - text: descripcion, - }, - { - text: con.ClaveUnidad, - }, - { - text: '$' + con.ValorUnitario, - }, - { - text: '$' + con.Descuento, - }, - { - text: '$' + con.Importe, - }, - ]); - } - // this.docDefinition.content[2].table.body.push(table) - } - - protected addReceptor(receptor: XmlReceptor | undefined) { - this.docDefinition.content[1].text[2] = { - text: receptor - ? receptor._attributes - ? receptor._attributes.Nombre + '\n' - : '' - : '', - }; - this.docDefinition.content[1].text[4] = { - text: receptor - ? receptor._attributes - ? receptor._attributes.Rfc + '\n' - : '' - : '', - }; - this.docDefinition.content[1].text[6] = { - text: receptor - ? receptor._attributes - ? receptor._attributes.UsoCFDI + '\n' - : '' - : '', - }; - } - - protected addCatidad(comprobante: CFDIComprobante) { - this.docDefinition.content[3].table.body[0][1].text[1] = { - text: '$' + comprobante.SubTotal + '\n', - }; - this.docDefinition.content[3].table.body[0][1].text[3] = { - text: '$' + comprobante.Descuento + '\n', - }; - this.docDefinition.content[3].table.body[0][1].text[7] = { - text: '$' + comprobante.Total + '\n', - }; - } - - protected addImpuesto(impuesto: XmlImpuestos | undefined) { - if (impuesto) { - // tslint:disable-next-line:no-unused-expression - let impues = '0.00'; - if (impuesto._attributes.TotalImpuestosTrasladados) { - impues = impuesto._attributes.TotalImpuestosTrasladados as string - } - this.docDefinition.content[3].table.body[0][1].text[5] = { - text: '$' + impues + '\n', - }; - } - } - - protected addNumberToLetter(total: number) { - // tslint:disable-next-line:no-unused-expression - const nue = new NumeroALetras(); - this.docDefinition.content[3].table.body[0][0].stack[1].text = - nue.NumeroALetras(total, { - plural: 'PESOS', - singular: 'PESO', - centPlural: 'CENTAVOS', - centSingular: 'CENTAVO', - }); - } - - protected addCSDEmisor(NoCertificado: string) { - this.docDefinition.content[5].table.body[1][0].text = NoCertificado; - } - - protected fechaTimbrado(tfd: XmlTfd) { - this.docDefinition.content[5].table.body[1][1].text = - tfd._attributes.FechaTimbrado; - } - - protected addCSDSat(tfd: XmlTfd) { - this.docDefinition.content[5].table.body[3][1].text = - tfd._attributes.NoCertificadoSAT; - } - - protected folioFiscal(tfd: XmlTfd) { - this.docDefinition.content[5].table.body[3][0].text = - tfd._attributes.UUID.toUpperCase(); - } - - protected addSelloDgtEmisor(tfd: XmlTfd) { - this.docDefinition.content[6].columns[1].table.body[1][0].text = - tfd._attributes.SelloCFD; - } - - protected addSelloDelSat(tfd: XmlTfd) { - // @ts-ignore - this.docDefinition.content[6].columns[1].table.body[3][0].text = - tfd._attributes.SelloSAT; - } - - protected addCadenaOriginal(tfd: XmlTfd) { - const cadena = `||${tfd._attributes.Version}|${tfd._attributes.UUID}|${tfd._attributes.FechaTimbrado}|${tfd._attributes.RfcProvCertif}|${tfd._attributes.SelloCFD}|${tfd._attributes.NoCertificadoSAT}||`; - this.docDefinition.content[6].columns[1].table.body[5][0].text = cadena; - } - - protected addFormaDePago(forma: string) { - const description = FormaPagoList.find((f) => f.value === forma); - // console.log(this.docDefinition.content[4].columns[0].text, description) - this.docDefinition.content[4].columns[0].text[1] = { - text: forma + ' - ' + description!.label + '\n', - }; - } - - protected addMetodoDePago(metodo: string) { - const description = MetodoPagoList.find((f) => f.value === metodo); - this.docDefinition.content[4].columns[0].text[3] = { - text: metodo + ' - ' + description!.label + '\n', - }; - // console.log(this.docDefinition.content[4]) - } - - protected addCuenta(cuenta: string) { - this.docDefinition.content[4].columns[0].text[5] = { - text: cuenta + '\n', - }; - // console.log(this.docDefinition.content[5]) - } - - protected addMoneda(moneda: string) { - // console.log(this.docDefinition.content[4].columns[1].text) - this.docDefinition.content[4].columns[1].text[1] = { - text: moneda + '\n', - }; - } - - protected addTipoComprobante(tipo: string) { - const description = TipoComprobanteList.find((f) => f.value === tipo); - this.docDefinition.content[4].columns[1].text[3] = { - text: tipo + ' - ' + description!.label + '\n', - }; - // console.log(this.docDefinition.content[6].columns[1].text) - } - - protected async addQr( - tfd: XmlTfd, - emisor: XmlEmisor | undefined, - receptor: XmlReceptor | undefined, - total: string - ) { - const url = `https://verificacfdi.facturaelectronica.sat.gob.mx/default.aspx`; - const uuid = tfd._attributes.UUID; - const rfcEmisor = emisor!._attributes!.Rfc; - const rfcReceptor = receptor!._attributes!.Rfc; - const sello = tfd._attributes.SelloCFD.substr(-8); - const totalSplit = total.split('.') as any; - const totalStart = totalSplit[0].padStart(18, '0'); - const totalEnd = totalSplit[1] - ? totalSplit[1].padEnd(6, '0') - : '0'.padEnd(6, '0'); - const cantidad = totalStart + '.' + totalEnd; - const urlQr = `${url}?id=${uuid}&re=${rfcEmisor}&rr=${rfcReceptor}&tt=${cantidad}&fe=${sello}`; - const text = await QRCode.toDataURL(urlQr); - this.docDefinition.content[6].columns[0] = { - margin: [-10, -19, 0, 0], - width: 130, - image: text, - height: 130, - alignment: 'left', - }; - } -} diff --git a/packages/cfdi/pdf/src/templates/B111/B111.skeleton.ts b/packages/cfdi/pdf/src/templates/B111/B111.skeleton.ts deleted file mode 100644 index 9410fec..0000000 --- a/packages/cfdi/pdf/src/templates/B111/B111.skeleton.ts +++ /dev/null @@ -1,421 +0,0 @@ -import { TDocumentDefinitions } from 'pdfmake/interfaces'; -import { logo } from '@cfdi/utils'; - -export const B111ESKELETON: TDocumentDefinitions | any = { - pageSize: 'A4', - pageMargins: [20, 25, 20, 25], - content: [ - { - style: 'tableExample', - table: { - widths: [230, 100, 200], - body: [ - [ - { - text: [ - { - text: 'Datos de la empresa\n\n\n\n', - style: { - bold: true, - color: '#a76d09', - }, - }, - { - text: 'Nombre o razon social\n', - style: { - bold: true, - color: '#a76d09', - }, - }, - { - text: [ - { - text: 'Dirrecion\n', - style: { - bold: true, - color: '#a76d09', - }, - }, - ], - }, - { - text: [ - { - text: 'Telefonos\n', - style: { - bold: true, - color: '#a76d09', - }, - }, - ], - }, - { - text: [ - { - text: 'pagina web', - style: { - bold: true, - color: '#a76d09', - }, - }, - ], - }, - ], - }, - - [ - { - alignment: 'center', - border: [false, false, false, true], - table: { - body: [ - [ - { - image: logo, - width: 80, - height: 80, - }, - ], - ], - }, - layout: 'noBorders', - }, - ], - - { - style: 'tableExample', - table: { - headerRows: 1, - alignment: 'center', - border: [false, false, false, false], - body: [ - [ - { - text: 'FACTURA', - alignment: 'center', - style: { bold: true, color: '#a76d09' }, - }, - ], - [{ text: 'F3EE54R', alignment: 'center' }], - [ - { - text: 'FOLIO FISCAL', - alignment: 'center', - style: { bold: true, color: '#a76d09' }, - }, - ], - [], - [ - { - text: 'N° DE SERIE DE CERTIFICACION', - alignment: 'center', - style: { bold: true, color: '#a76d09' }, - }, - ], - [{ text: 'F3EE54R', alignment: 'center', style: { color: 'red' } }], - [ - { - text: 'FECHA Y HORA DE CERTIFICACION', - alignment: 'center', - style: { bold: true, color: '#a76d09' }, - }, - ], - [{ text: '18:12:12 02/07/2020', alignment: 'center',style: { color: 'red' } }], - ], - }, - layout: { - // @ts-ignore - fillColor: function (rowIndex, node, columnIndex) { - return rowIndex % 2 === 0 ? '#CCCCCC' : null; - }, - }, - }, - ], - ], - }, - }, - - { - style: 'tableExample', - table: { - widths: [270, 269], - body: [ - [ - { - text: [ - { - text: 'Datos del Emisor\n\n', - style: { - bold: true, - color: '#a76d09', - }, - }, - { - text: 'Nombre fiscal:', - style: { - bold: true, - color: '#a76d09', - }, - }, - { text: 'nombre fiscal\n' }, - { - text: [ - { - text: 'Rfc:', - style: { - bold: true, - color: '#a76d09', - }, - }, - ], - }, - { text: 'rfc\n' }, - { - text: [ - { - text: 'Dirección: ', - style: { - bold: true, - color: '#a76d09', - }, - }, - ], - }, - { text: 'Dirrrecion\n' }, - { - text: [ - { - text: 'Regimen fiscal:', - style: { - bold: true, - color: '#a76d09', - }, - }, - ], - }, - { text: 'regimen fiscal\n' }, - ], - }, - { - text: [ - { - text: 'Datos del Cliente\n\n', - style: { - bold: true, - color: '#a76d09', - }, - }, - { - text: 'Nombre Fiscal: ', - style: { - bold: true, - color: '#a76d09', - }, - }, - - { text: 'nombre fiscal\n' }, - { - text: [ - { - text: 'Rfc:', - style: { - bold: true, - color: '#a76d09', - }, - }, - ], - }, - - { text: 'Rfc\n' }, - { - text: [ - { - text: 'Dirección:', - style: { - bold: true, - color: '#a76d09', - }, - }, - ], - }, - - { text: 'Dirrecion\n' }, - { - text: [ - { - text: 'Regimen Fiscal:', - style: { - bold: true, - color: '#a76d09', - }, - }, - ], - }, - - { text: 'regimen fiscal\n' }, - ], - }, - ], - ], - }, - }, - - { - style: 'tableExample', - table: { - widths: [50, 40, 173, 120, 60, 60], - headerRows: 1, - body: [ - [ - { - text: 'cantidad', - fillColor: '#dddddd', - border: [true, true, true, true], - }, - { - text: 'Unidad', - style: 'tableHeader', - fillColor: '#dddddd', - border: [true, true, true, true], - }, - { - text: 'descricion', - style: 'tableHeader', - fillColor: '#dddddd', - border: [true, true, true, true], - }, - { - text: 'Clave servicio/producto', - style: 'tableHeader', - fillColor: '#dddddd', - border: [true, true, true, true], - }, - { - text: 'Precio Unitario', - style: 'tableHeader', - fillColor: '#dddddd', - border: [true, true, true, true], - }, - { - text: 'Importe', - style: 'tableHeader', - fillColor: '#dddddd', - border: [true, true, true, true], - }, - ], - ['1', 'cat', 'nomina', 'servicio', '19891', '090'], - ['1', 'cat', 'nomina', 'servicio', '19891', '090'], - ['1', 'cat', 'nomina', 'servicio', '19891', '090'], - ['1', 'cat', 'nomina', 'servicio', '19891', '090'], - ], - }, - }, - { - style: 'tableExample', - - table: { - widths: [99, 302, 129], - - body: [ - [ - { - alignment: 'center', - - table: { - body: [ - [ - { - image: logo, - width: 50, - height: 50, - }, - ], - ], - }, - layout: 'noBorders', - }, - { - text: 'Cantidad con letras:\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor', - }, - { - style: 'tableExample', - table: { - headerRows: 1, - alignment: 'center', - body: [ - [ - { text: 'Subtotal', alignment: 'center' }, - { text: 'FACTURA', alignment: 'center' }, - ], - [ - { text: 'Descuento', alignment: 'center' }, - { text: 'F3EE54R', alignment: 'center' }, - ], - [ - { text: 'I.V.A 16%', alignment: 'center' }, - { text: 'F3EE54R', alignment: 'center' }, - ], - [ - { text: 'Total', alignment: 'center' }, - { text: 'F3EE54R', alignment: 'center' }, - ], - ], - }, - }, - ], - ], - }, - }, - - { - style: 'tableExample', - table: { - widths: [548], - body: [ - [ - { - text: [ - { - text: 'SELLO DIGITAL\n', - style: { - bold: true, - color: '#0941a7', - }, - }, - { - text: 'aYjYNUhTvNVosLnPJsV5h/lAW/HSs45Qzhl2W5V2DPqrdoFfp9mH7wUcS5v3jP6Oql4Y7ncYOcLqakqfGeclJJP/6T1XmbcvPPdBq1DGWh6DaisHS2QCMOW3MGuv8Hc/0j7JwYbXFpTKKM3cudwTmzh76MUoqnssDUfuFIVJ8=`,\n\n', - }, - { - text: 'SELLO SAT\n', - style: { - bold: true, - color: '#0941a7', - }, - }, - { - text: 'GlU7AYil3GqVeUD9oJvqVKc2Uq/K2R7lkc2m6WPuhddjYvWm0foFfMVwzn2KfS7o6KZIddDXdAglhknZsz3ub3X0/aPW4DSwvDYXOF2yCCqd64vbt5MfWqpPqN2zmjzJVFe5ntIPQ21jveXAjR44pJIHNG3rUUUdhVnag6NFTqviaAV75z6OywesoMQCFcsoEjvKozzKGpT7Imuoa94aGIhj0TP5m1hk4OnROOcEBPo11mPf4elDKBDzk+iuCw4wiV/GHaeL0D4zBcVOL/Igz12MKRmYtNdmBfSCv3TI7bJ7qQUV1RckO2Rj1CpFrpa7xr/Vw6lEwitpkCwQ00SKBg==\n\n', - }, - { - text: [ - { - text: 'CADENA ORIGINAL DEL COMPLEMENTO DE CERTIFICACION DIGITAL DEL SAT\n', - style: { - bold: true, - color: '#0941a7', - }, - }, - ], - }, - { - text: - '||1.1|5D178E7E-C81C-11E8-89A8-237CD11664D5|2018-10-04T16:27:58|FMO1007168C6|eaYjYNUhTvNVosLnPJsV5h/xlAW/HSs45Qzhl2W5V2DPqrdoFfp9mH7wUcS5v3jP6Oql4Y7ncYOcLqakqfGeclJJP/6T1XmbcvPPdBq1DGWh6DaisHS2QCMOW3MG\n' + - 'uv8Hc/0j7JwYbXFpTKKM3cudwTmzh76MUoqnssDUfuFIVJ8=|00001000000401477845||', - }, - ], - }, - ], - ], - }, - }, - ], -}; diff --git a/packages/cfdi/pdf/src/templates/B111/index.ts b/packages/cfdi/pdf/src/templates/B111/index.ts deleted file mode 100644 index 46da621..0000000 --- a/packages/cfdi/pdf/src/templates/B111/index.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { - CFDIComprobante, - XmlComprobanteAttributes, - XmlConcepto, - XmlEmisor, - XmlImpuestos, - XmlReceptor, - XmlConceptoProperties -} from '@cfdi/xml' - -import { B111ESKELETON } from './B111.skeleton'; -import { OptionsPdf } from '../../types'; -import { RPDF } from '../../abstract-cfdi-pdf'; -import { XmlTfd } from '@cfdi/complementos/types/complements/tfd/tfd.com' - -import { ContentText } from 'pdfmake/interfaces'; - -export class B111 extends RPDF { - protected addLogo(): void { - // throw new Error('Method not implemented.'); - } - protected addFolio(c: XmlComprobanteAttributes ): void { - console.log(c); - const data = { text: c.Folio, alignment: 'center',color:"red" }; - - const arr = this.docDefinition.content[0].table.body[0][2].table.body[3]; - this.docDefinition.content[0].table.body[0][2].table.body[5].text=c.NoCertificado as string - - arr.push(data); - // this.docDefinition.content[0].table.body[0][2].table.body[3].push(data); - } - protected addEmisorData(emisor: XmlEmisor, expedido: string): void { - //throw new Error('Method not implemented.'); - this.docDefinition.content[1].table.body[0][0].text[2].text =" "+ emisor._attributes?.Nombre + "\n" ; - this.docDefinition.content[1].table.body[0][0].text[4].text =" "+ emisor._attributes?.Rfc + "\n" ; - this.docDefinition.content[1].table.body[0][0].text[6].text =" "+ this.options.lugarExpedicion + "\n" ; - this.docDefinition.content[1].table.body[0][0].text[8].text =" "+ emisor._attributes?.RegimenFiscal + "\n" ; - - } - protected addDate(date: string): void { - //throw new Error('Method not implemented.'); - } - protected addReceptor(receptor: XmlReceptor): void { - this.docDefinition.content[1].table.body[0][1].text[2].text =" "+ receptor._attributes?.Nombre + "\n" ; - this.docDefinition.content[1].table.body[0][1].text[4].text =" "+ receptor._attributes?.Rfc + "\n" ; - this.docDefinition.content[1].table.body[0][1].text[6].text =" "+ this.options.lugarExpedicion + "\n" ; - this.docDefinition.content[1].table.body[0][1].text[8].text =" "+ receptor._attributes?.UsoCFDI + "\n" ; - - // throw new Error('Method not implemented.'); - } - protected fechaTimbrado(tfd: XmlTfd): void { - // throw new Error('Method not implemented.'); - } - protected addCatidad(comprobante: CFDIComprobante): void { - //throw new Error('Method not implemented.'); - } - protected addImpuesto(impuesto: XmlImpuestos): void { - // throw new Error('Method not implemented.'); - } - protected addNumberToLetter(total: number): void { - // throw new Error('Method not implemented.'); - } - protected addCSDEmisor(NoCertificado: string): void { - //throw new Error('Method not implemented.'); - } - protected addDetalles(detalles: XmlConcepto): void { - let deatails: XmlConceptoProperties[] = []; - if (Array.isArray(detalles['cfdi:Concepto'])) { - deatails = detalles['cfdi:Concepto']; - } else { - // @ts-ignore - deatails.push(detalles['cfdi:Concepto']); - } - - for (const detail of deatails) { - const con = detail._attributes; - const descripcion: ContentText[] = [ - { - text: con.Descripcion + '\n', - }, - ]; - // this.docDefinition.content[2].table.body[1][1].push([con.Cantidad]) ; - } - //throw new Error('Method not implemented.'); - } - protected addFormaDePago(forma: string): void { - //throw new Error('Method not implemented.'); - } - protected addMetodoDePago(metodo: string): void { - //throw new Error('Method not implemented.'); - } - protected addMoneda(moneda: string): void { - //throw new Error('Method not implemented.'); - } - protected addTipoComprobante(tipo: string): void { - // throw new Error('Method not implemented.'); - } - protected addCSDSat(tfd: XmlTfd): void { - //throw new Error('Method not implemented.'); - } - protected folioFiscal(tfd: XmlTfd): void { - //throw new Error('Method not implemented.'); - } - protected addSelloDgtEmisor(tfd: XmlTfd): void { - //throw new Error('Method not implemented.'); - } - protected addSelloDelSat(tfd: XmlTfd): void { - //throw new Error('Method not implemented.'); - } - protected addCadenaOriginal(tfd: XmlTfd): void { - //throw new Error('Method not implemented.'); - } - protected addQr( - tfd: XmlTfd, - emisor: XmlEmisor | undefined, - receptor: XmlReceptor | undefined, - total: string - ): void { - //throw new Error('Method not implemented.'); - } - constructor(xml: string, options: OptionsPdf = {} as OptionsPdf) { - super(xml, options); - this.setEskeleton(B111ESKELETON); - } -} diff --git a/packages/cfdi/pdf/src/templates/B112/index.ts b/packages/cfdi/pdf/src/templates/B112/index.ts deleted file mode 100644 index 8c38d45..0000000 --- a/packages/cfdi/pdf/src/templates/B112/index.ts +++ /dev/null @@ -1,473 +0,0 @@ -import { XmlCdfi } from "@cfdi/xml" -import { XmlToJson } from "@cfdi/2json"; -import { logo } from '@cfdi/utils'; -import { createPdf, TCreatedPdf } from "pdfmake/build/pdfmake"; -import { TDocumentDefinitions } from "pdfmake/interfaces"; - - - - - -export class B112 { - // @ts-ignore - private xml: XmlCdfi; - private docDefinition: TDocumentDefinitions = { - pageSize: 'A4', - pageMargins: [20, 25, 20, 25], - content: [ - - { - - - style: 'tableExample', - table: { - - widths: [545], - body: [ - [ - { - border: [false, false, false, false], - fillColor: '#000080', - text: [ - - { - alignment: 'center', - text: 'FACTURA ELECTRÓNICA (CFDI)', - style: { - bold: true, - color: '#00FFFF', - fontSize: 13, - } - }, - - ] - } - ] - ] - } - }, - - - { - - style: 'tableExample', - table: { - - widths: [545], - body: [ - [ - { - border: [false, false, false, false], - text: [ - - { - alignment: 'left', - text: '\nNOMBRE O RAZON SOCIAL DE LA EMPRESA', - style: { - bold: true, - fontSize: 12, - } - }, - - ] - } - ] - ] - } - }, - { - columns: [ - { - width: 100, - image: logo, - height: 100, - alignment: 'left' - }, - { - width: 20, - text: '' - }, - { - margin: [0, 0, 0, 0], - width: 243, - text: [ - - { - text: [ - { - text: 'R.F.C:\n ', - style: { - bold: true, - color: '#a76d09', - } - }, - { text: ' GUCE910701NHA\n' } - ] - }, - { - text: [ - { - text: 'Dirrecion:\n', - style: { - bold: true, - color: '#a76d09', - } - }, - { text: ' av oquideas entre ruta5\n' } - ] - }, - { - text: [ - { - text: 'Telefono:\n', - style: { - bold: true, - color: '#a76d09', - } - }, - { text: ' 98765436899\n' } - ] - }, - ] - }, - { - width: 500, - - style: 'tableExample', - table: { - body: [ - [{ text: 'FACTURA', alignment: 'right', style: { bold: true, color: '#a76d09' } }], - [{ text: 'F3EE54R', alignment: 'right' }], - [{ text: 'FOLIO FISCAL', alignment: 'right', style: { bold: true, color: '#a76d09' } }], - [{ text: 'XXXXXXXXXX', alignment: 'right' }], - [{ text: 'N° DE SERIE DE CERTIFICACION', alignment: 'right', style: { bold: true, color: '#a76d09' } }], - [{ text: 'XXXXXXXXX', alignment: 'right' }], - [{ text: 'FECHA Y HORA DE CERTIFICACION', alignment: 'right', style: { bold: true, color: '#a76d09' } }], - [{ text: '18:12:12 02/07/2020', alignment: 'right' }], - ] - }, - layout: 'noBorders' - }, - - - ] - }, - { - style: 'tableExample', - table: { - - body: [ - [ - { - border: [false, false, false, false], - style: { bold: true, color: '#a76d09' }, - text: 'Lugar de Expedicion: ' - }, - { - border: [false, false, false, false], - - text: 'solidaridad,playa del carmen ' - }, - ] - ] - } - }, - - { - - style: 'tableExample', - table: { - - widths: [545], - body: [ - [ - { - border: [false, true, false, false], - text: [ - { - border: [false, true, false, false], - linecolors: '#000080', - style: { bold: true, color: '#a76d09' }, - text: 'Receptor: ' - }, - { - border: [false, false, false, false], - text: 'PEMEX GAS Y PETROQUIMICA BASICA\n ' - }, - { - border: [false, false, false, false], - linecolors: '#000080', - style: { bold: true, color: '#a76d09' }, - text: 'RFC del Clinete: ' - }, - { - border: [false, false, false, false], - text: 'PGP920716MT6\n ' - }, - { - border: [false, false, false, false], - linecolors: '#000080', - style: { bold: true, color: '#a76d09' }, - text: 'Dirrecion: ' - }, - { - border: [false, false, false, false], - text: 'AVENIDA MARINA NACIONAL 329 PETROLEOS MEXICANOS,Distrito Federal C.P. 86125, México \n' - }, - { - border: [false, false, false, false], - linecolors: '#000080', - style: { bold: true, color: '#a76d09' }, - text: 'Telefono: ' - }, - { - border: [false, false, false, false], - text: '9890808090 \n' - }, - ] - } - ] - ] - } - }, - { - style: 'tableExample', - table: { - widths: [50, 40, 173, 120, 60, 60], - headerRows: 1, - body: [ - - [{ text: 'cantidad', fillColor: '#dddddd', border: [true, true, true, true] }, { text: 'Unidad', style: 'tableHeader', fillColor: '#dddddd', border: [true, true, true, true] }, { text: 'descricion', style: 'tableHeader', fillColor: '#dddddd', border: [true, true, true, true] }, { text: 'Clave servicio/producto', style: 'tableHeader', fillColor: '#dddddd', border: [true, true, true, true] }, { text: 'Precio Unitario', style: 'tableHeader', fillColor: '#dddddd', border: [true, true, true, true] }, { text: 'Importe', style: 'tableHeader', fillColor: '#dddddd', border: [true, true, true, true] }], - ['1', 'cat', 'nomina', 'servicio', '19891', '090'], - ['1', 'cat', 'nomina', 'servicio', '19891', '090'], - ['1', 'cat', 'nomina', 'servicio', '19891', '090'], - ['1', 'cat', 'nomina', 'servicio', '19891', '090'], - - ] - }, - - - }, - { - margin: [0, 7, 0, 7], - table: { - - widths: ['auto', '*', 'auto'], - body: [ - [ - { - border: [false, false, false, false], - alignment: 'center', - - table: { - body: [ - [ - - { - image: logo, - width: 100, - height: 100, - }, - - - ], - ] - }, - layout: 'noBorders' - }, - { - border: [false, false, false, false], - stack: [ - { - text: 'CANTIDAD CON LETRA', - style: { - bold: true, - fontSize: 9 - } - }, - { - text: 'OCHOCIENTOS TREINTA Y NUEVE PESOS 99/100 M.N.\n\n', - style: { - fontSize: 9 - } - }, - { - text: 'METODO DE PAGO', - style: { - bold: true, - fontSize: 9 - } - }, - { - text: 'NO INDENTIFICADO\n', - style: { - fontSize: 9 - } - }, - { - text: 'REGIMEN', - style: { - bold: true, - fontSize: 9 - } - }, - { - text: 'PERSONA MORAL', - style: { - fontSize: 9 - } - } - ] - }, - { - border: [false, false, false, false], - style: 'tableExample', - table: { - headerRows: 1, - alignment: 'center', - body: [ - [{ text: 'Subtotal', alignment: 'center', }, { text: 'FACTURA', alignment: 'center' }], - [{ text: 'Descuento', alignment: 'center' }, { text: 'F3EE54R', alignment: 'center' }], - [{ text: 'I.V.A 16%', alignment: 'center' }, { text: 'F3EE54R', alignment: 'center' }], - [{ text: 'Total', alignment: 'center' }, { text: 'F3EE54R', alignment: 'center' }], - - - ] - }, - layout: 'lightHorizontalLines' - - } - ], - ] - } - }, - - - { - style: 'tableExample', - table: { - widths: [548], - - body: [ - [{ - border: [false, false, false, false], - text: [ - - { - text: 'SELLO DIGITAL\n', - style: { - bold: true, - color: '#0941a7', - fontSize: 10, - } - }, - { fontSize: 10, text: 'aYjYNUhTvNVosLnPJsV5h/lAW/HSs45Qzhl2W5V2DPqrdoFfp9mH7wUcS5v3jP6Oql4Y7ncYOcLqakqfGeclJJP/6T1XmbcvPPdBq1DGWh6DaisHS2QCMOW3MGuv8Hc/0j7JwYbXFpTKKM3cudwTmzh76MUoqnssDUfuFIVJ8=`,\n\n' }, - { - text: 'SELLO SAT\n', - style: { - fontSize: 10, - bold: true, - color: '#0941a7', - } - - }, - { fontSize: 10, text: 'GlU7AYil3GqVeUD9oJvqVKc2Uq/K2R7lkc2m6WPuhddjYvWm0foFfMVwzn2KfS7o6KZIddDXdAglhknZsz3ub3X0/aPW4DSwvDYXOF2yCCqd64vbt5MfWqpPqN2zmjzJVFe5ntIPQ21jveXAjR44pJIHNG3rUUUdhVnag6NFTqviaAV75z6OywesoMQCFcsoEjvKozzKGpT7Imuoa94aGIhj0TP5m1hk4OnROOcEBPo11mPf4elDKBDzk+iuCw4wiV/GHaeL0D4zBcVOL/Igz12MKRmYtNdmBfSCv3TI7bJ7qQUV1RckO2Rj1CpFrpa7xr/Vw6lEwitpkCwQ00SKBg==\n\n' }, - { - text: [ - { - text: 'CADENA ORIGINAL DEL COMPLEMENTO DE CERTIFICACION DIGITAL DEL SAT\n', - style: { - bold: true, - color: '#0941a7', - fontSize: 10, - } - }, - ] - }, - { - fontSize: 10, text: '||1.1|5D178E7E-C81C-11E8-89A8-237CD11664D5|2018-10-04T16:27:58|FMO1007168C6|eaYjYNUhTvNVosLnPJsV5h/xlAW/HSs45Qzhl2W5V2DPqrdoFfp9mH7wUcS5v3jP6Oql4Y7ncYOcLqakqfGeclJJP/6T1XmbcvPPdBq1DGWh6DaisHS2QCMOW3MG\n' + - 'uv8Hc/0j7JwYbXFpTKKM3cudwTmzh76MUoqnssDUfuFIVJ8=|00001000000401477845||' - }, - - - ] - }, - ] - ] - } - }, - { - - style: 'tableExample', - table: { - - widths: [548], - - body: [ - [ - { - border: [false, false, false, true], - alignment: 'center', - text: [ - { - border: [false, false, true, false], - linecolors: '#000080', - style: { fontSize: 10, bold: true, color: '#a76d09' }, - text: ' N° DE SERIE DE CERTIFICACION:', - }, - { - border: [false, false, false, false], - fontSize: 10, - text: 'XXXXXXXXX\n ' - }, - { - border: [false, false, false, false], - linecolors: '#000080', - style: { fontSize: 10, bold: true, color: '#a76d09' }, - text: 'FECHA Y HORA DE CERTIFICACION:' - }, - { - border: [false, false, false, false], - fontSize: 10, - text: '03/07/2020\n ' - }, - ] - } - ] - ] - } - }, - { - style: 'tableExample', - table: { - widths: [180, 200, 150], - headerRows: 1, - body: [ - - [{ text: ' PAGO EN UNA SOLA EXHIBICION', fontSize: 7, alignment: 'left', border: [false, false, false, false] }, - { text: 'Esta es una representación impresa de un CFDI', fontSize: 7, alignment: 'center', border: [false, false, false, false] }, - { text: 'Efectos fscales al pago', fontSize: 7, alignment: 'right', border: [false, false, false, false] }] - - - ] - }, - - - }, - - - - ], - - } - - constructor(xml: string) { - // @ts-ignore - this.xml = XmlToJson(xml) - } - - public async getDocument(): Promise { - return createPdf(this.docDefinition); - } - -} diff --git a/packages/cfdi/pdf/src/templates/B123/index.ts b/packages/cfdi/pdf/src/templates/B123/index.ts deleted file mode 100644 index fa21499..0000000 --- a/packages/cfdi/pdf/src/templates/B123/index.ts +++ /dev/null @@ -1,440 +0,0 @@ -import { TDocumentDefinitions } from "pdfmake/interfaces"; -import { XmlCdfi } from "@cfdi/xml"; -import { XmlToJson } from "@cfdi/2json"; -import { logo } from '@cfdi/utils'; -import { createPdf, TCreatedPdf } from "pdfmake/build/pdfmake"; - - -export class B123 { - // @ts-ignore - private xml: XmlCdfi; - private docDefinition: TDocumentDefinitions = { - pageSize: 'A4', - pageMargins: [20, 25, 20, 25], - content: [ - { - columns: [ - { - text: [ - { - text: 'Folio Fiscal', - style: { - bold: true, - color: '#a76d09', - } - }, - { text: 'foliofiscal\n' }, - - ] - }, - - - { - text: [ - { - alignment: 'right', - text: '098675 ', - style: { - bold: true, - color: '#a76d09', - } - - }, - - - ] - } - ] - }, - - { - columns: [ - { - text: [ - { - text: 'No. CSD del Emisor:', - style: { - bold: true, - color: '#a76d09', - } - }, - { text: 'No. CSD del Emisor:\n' }, - - ] - }, - - - { - text: [ - { - alignment: 'right', - text: 'palya del carmen ', - style: { - bold: true, - color: '#a76d09', - } - - }, - - - ] - } - ] - }, - { - alignment: 'right', - text: 'hora', - style: { - bold: true, - color: '#a76d09', - } - - }, - - { - columns: [ - { - width: 100, - image: logo, - height: 100, - alignment: 'left' - }, - { - width: 40, - text: '' - }, - { - margin: [0, 0, 0, 0], - width: 200, - text: [ - { - text: 'Nombre Razon social empresa\n', - style: { - bold: true, - color: '#a76d09', - }, - - - }, - { - text: [ - { - text: 'R.F.C: ', - style: { - bold: true, - color: '#a76d09', - } - }, - { text: 'rfc empresa\n' }, - - ] - }, - - { - text: [ - { - text: 'Domicilio empresa: ', - style: { - bold: true, - color: '#a76d09', - } - }, - { text: ' MZA 026 LOTE 003 EJIDO PLAYA DEL CARMEN, QROO, ENTRE CALLE 74 NORTE Y CALLE 72 NORTE, 77710\n' } - - ] - }, - { - text: [ - { - text: 'Cliente: ', - style: { - bold: true, - color: '#a76d09', - } - }, - { text: ' jose alberto\n' } - ] - }, - { - text: [ - { - text: 'Rfc cliente ', - style: { - bold: true, - color: '#a76d09', - } - }, - { text: ' rfcjose\n' } - ] - }, - { - text: [ - { - text: 'domicilio cliente: ', - style: { - bold: true, - color: '#a76d09', - } - }, - { text: ' Avenida ordieas\n' } - ] - } - ], - style: { - fontSize: 9, - } - }, - ], - - }, - - - { - style: 'tableExample', - table: { - widths: [50, 40, 180, 120, 60, 60], - headerRows: 1, - body: [ - - [{ - text: 'cantidad', - fillColor: '#dddddd', - border: [false, false, false, false] - }, { - text: 'Unidad', - style: 'tableHeader', - fillColor: '#dddddd', - border: [false, false, false, false] - }, { - text: 'descricion', - style: 'tableHeader', - fillColor: '#dddddd', - border: [false, false, false, false] - }, { - text: 'Clave servicio/producto', - style: 'tableHeader', - fillColor: '#dddddd', - border: [false, false, false, false] - }, { - text: 'Precio Unitario', - style: 'tableHeader', - fillColor: '#dddddd', - border: [false, false, false, false] - }, { - text: 'Importe', - style: 'tableHeader', - fillColor: '#dddddd', - border: [false, false, false, false] - }], - ['1', 'cat', 'nomina', 'servicio', '19891', '090'], - - ] - }, - layout: 'noBorders' - - }, - - { - style: 'tableExample', - color: '#444', - table: { - widths: [250, 200, 60], - headerRows: 1, - // keepWithHeaderRows: 1, - body: [ - - [ - { - text: 'Cantidad con letras:\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor', - border: [false, true, false, false] - }, - { - - - text: 'Subtotal:', - style: 'tableHeader', - border: [false, true, false, false], - alignment: 'center' - - - }, - { - text: '090', - style: 'tableHeader', - border: [false, true, false, false], - alignment: 'center' - } - ], - - ] - } - }, - - - { - style: 'tableExample', - color: '#444', - table: { - widths: [250, 200, 60], - headerRows: 1, - // keepWithHeaderRows: 1, - body: [ - - [ - { - text: 'Cantidad con letras:\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor', - border: [false, false, false, false] - }, - { - border: [false, true, false, true], - text: [ - - - { - text: 'DESCUENTO:\n ', - style: 'tableHeader', - - }, - - { - text: 'IMPUESTOS:\n ', - style: 'tableHeader', - }, - - { - text: 'TOTAL: ', - style: 'tableHeader', - }, - ], - style: { - fontSize: 9 - } - }, - { - border: [false, true, false, true], - text: [ - - - { text: ' $ 310.35\n', style: 'tableHeader', }, - { text: ' $ 115.86\n', style: 'tableHeader', }, - { text: ' $ 839.99', style: 'tableHeader', } - ], - style: { - fontSize: 9 - } - } - ], - ] - } - }, - { - alignment: 'justify', - - columns: [ - - { - - - style: 'tableExample', - fontSize: 9, - table: { - widths: [410, 200], - headerRows: 1, - body: [ - [{ text: '', style: 'tableHeader', border: [false, false, false, false] }, { - text: '', - style: 'tableHeader', - border: [false, false, false, false] - }], - ['', '',], - ], - - - }, - layout: 'noBorders' - }, - - - ] - }, - - { - alignment: 'justify', - - columns: [ - - { - width: 430, - fontSize: 9, - table: { - widths: [410, 200], - headerRows: 1, - body: [ - [{ - text: 'SELLO DIGITAL DEL EMISOR', - color: '#0941a7', - alignment: 'justify', - style: 'tableHeader', - border: [false, false, false, false] - }], - ['aYjYNUhTvNVosLnPJsV5h/lAW/HSs45Qzhl2W5V2DPqrdoFfp9mH7wUcS5v3jP6Oql4Y7ncYOcLqakqfGeclJJP/6T1XmbcvPPdBq1DGWh6DaisHS2QCMOW3MGuv8Hc/0j7JwYbXFpTKKM3cudwTmzh76MUoqnssDUfuFIVJ8=`,'], - [{ - text: 'SELLO SAT', - color: '#0941a7', - style: 'tableHeader', - border: [false, false, false, false] - }], - ['GlU7AYil3GqVeUD9oJvqVKc2Uq/K2R7lkc2m6WPuhddjYvWm0foFfMVwzn2KfS7o6KZIddDXdAglhknZsz3ub3X0/aPW4DSwvDYXOF2yCCqd64vbt5MfWqpPqN2zmjzJVFe5ntIPQ21jveXAjR44pJIHNG3rUUUdhVnag6NFTqviaAV75z6OywesoMQCFcsoEjvKozzKGpT7Imuoa94aGIhj0TP5m1hk4OnROOcEBPo11mPf4elDKBDzk+iuCw4wiV/GHaeL0D4zBcVOL/Igz12MKRmYtNdmBfSCv3TI7bJ7qQUV1RckO2Rj1CpFrpa7xr/Vw6lEwitpkCwQ00SKBg==',], - [{ - text: 'CADENA ORIGINAL DEL COMPLEMENTO DE CERTIFICACION DIGITAL DEL SAT', - color: '#0941a7', - style: 'tableHeader', - border: [false, false, false, false] - }], - ['||1.1|5D178E7E-C81C-11E8-89A8-237CD11664D5|2018-10-04T16:27:58|FMO1007168C6|eaYjYNUhTvNVosLnPJsV5h/xlAW/HSs45Qzhl2W5V2DPqrdoFfp9mH7wUcS5v3jP6Oql4Y7ncYOcLqakqfGeclJJP/6T1XmbcvPPdBq1DGWh6DaisHS2QCMOW3MG\n' + - 'uv8Hc/0j7JwYbXFpTKKM3cudwTmzh76MUoqnssDUfuFIVJ8=|00001000000401477845||',], - ] - - }, - layout: 'noBorders' - }, - { - stack: [ - { - image: logo, - width: 100, - height: 100 - }, - { - text: [ - { - text: 'Fecha y hora de certificacion\n', - style: { - bold: true, - color: '#a76d09', - } - }, - { text: 'fechay horal\n' }, - - ] - } - ] - }, - ] - }, - ], - - - } - - constructor(xml: string) { - // @ts-ignore - - this.xml = XmlToJson(xml) - } - - public async getDocument(): Promise { - return createPdf(this.docDefinition); - } - -} diff --git a/packages/cfdi/pdf/src/templates/B222/index.ts b/packages/cfdi/pdf/src/templates/B222/index.ts deleted file mode 100644 index 2f8ebd7..0000000 --- a/packages/cfdi/pdf/src/templates/B222/index.ts +++ /dev/null @@ -1,558 +0,0 @@ -import { TDocumentDefinitions } from "pdfmake/interfaces"; -import { XmlCdfi } from "@cfdi/xml"; -import { XmlToJson } from "@cfdi/2json"; -import { logo } from '@cfdi/utils'; -import { createPdf, TCreatedPdf } from "pdfmake/build/pdfmake"; - - -export class B222 { - // @ts-ignore - private xml: XmlCdfi; - private docDefinition: TDocumentDefinitions = { - pageSize: 'A4', - pageMargins: [20, 25, 20, 25], - content: [ - - - - - { - - - style: 'tableExample', - table: { - - widths: [545], - body: [ - [ - { - border: [false, false, false, false], - text: [ - - { - alignment: 'center', - text: 'Nombre de la Empresa o Razon social\n', - style: { - bold: true, - fontSize: 13, - } - }, - { - alignment: 'center', - text: 'MAPA234564A3', - style: { - bold: true, - fontSize: 10, - } - }, - - - ] - } - ] - ] - } - }, - { - columns: [ - - { - - text: [ - - { - text: [ - { - text: 'FACTURA\n ', - style: { - bold: true, - color: '#a76d09', - } - }, - - ] - }, - { - text: [ - { - text: 'Domicilio y lugar de expedicion:\n', - style: { - bold: true, - color: '#a76d09', - fontSize: 10, - } - }, - { text: ' av oquideas entre ruta5\n', fontSize: 10, } - ] - }, - - - ] - }, - { - width: 100, - image: logo, - height: 100, - alignment: 'left' - }, - { - width: 50, - text: '' - }, - ] - }, - { - columns: [ - - { - - text: [ - - { - text: [ - { - text: 'lugar de expedicion: ', - style: { - bold: true, - color: '#a76d09', - fontSize: 10 - } - }, - { text: ' av oquideas entre ruta5\n', fontSize: 10, } - ] - }, - { - text: [ - { - text: 'Datos del Receptro\n', - style: { - bold: true, - color: '#a76d09', - fontSize: 11, - } - }, - - ] - }, - { - text: [ - { - text: 'Cliente: ', - style: { - bold: true, - color: '#a76d09', - fontSize: 10 - } - }, - { text: ' jose alberto\n\n', fontSize: 10, } - ] - }, - - { - text: [ - { - text: 'RFC: ', - style: { - bold: true, - color: '#a76d09', - fontSize: 10 - } - }, - { text: ' PAPA90820082A\n', fontSize: 10, } - ] - }, - { - text: [ - { - text: 'Uso CFDI:', - style: { - bold: true, - color: '#a76d09', - fontSize: 10 - } - }, - { text: ' G03 Gastos en general\n', fontSize: 10, } - ] - }, - { - text: [ - { - text: 'Domicilio:', - style: { - bold: true, - color: '#a76d09', - fontSize: 10 - } - }, - { text: '28 sn ,col. montes otoch ncancun,qroo\n\n ', fontSize: 10, } - ] - }, - - - { - - text: [ - - { - text: [ - { - alignment: 'left', - text: 'MONEDA: ', - style: { - bold: true, - fontSize: 10 - } - }, - { text: ' MXN, ', fontSize: 10 } - ] - }, - ] - }, - { - text: [ - { - alignment: 'right', - text: 'TIPO DE CAMBIO:', - style: { - bold: true, - fontSize: 10 - - } - }, - { text: '0.0000', fontSize: 10 } - ] - }, - - { - text: [ - { - text: '\n\nTIPO DE COMPROBANTE:', - style: { - bold: true, - fontSize: 10 - - } - }, - { text: ' INGRESO', fontSize: 10 } - ] - }, - - - - - ] - }, - - { - width: 50, - text: '' - }, - { - - text: [ - - { - text: [ - { - text: '\nComprobante Fiscal Digital Por Internet\n ', - style: { - bold: true, - color: '#a76d09', - fontSize: 10 - } - }, - - ] - }, - { - text: [ - { - text: 'Folio Fiscal', - style: { - bold: true, - color: '#a76d09', - fontSize: 10, - } - }, - { text: 'xxxxxxxxxxxxxxx\n', fontSize: 10, } - ] - }, - { - text: [ - { - text: 'Numero de Comprobante', - style: { - bold: true, - color: '#a76d09', - fontSize: 10, - } - }, - { text: 'xxxxxxx\n', fontSize: 10, } - ] - }, - { - text: [ - { - text: 'Forma de Pago:', - style: { - bold: true, - color: '#a76d09', - fontSize: 10, - } - }, - { text: 'Por Defionir\n', fontSize: 10, } - ] - }, - { - text: [ - { - text: 'Fecha de Comprobante: ', - style: { - bold: true, - color: '#a76d09', - fontSize: 10, - } - }, - { text: '07/07/2020\n', fontSize: 10, } - ] - }, - { - text: [ - { - text: 'Fecha y hora de Certificacion: ', - style: { - bold: true, - color: '#a76d09', - fontSize: 10, - } - }, - { text: '07/07/2020 13:00:01\n', fontSize: 10, } - ] - }, - { - text: [ - { - text: 'Metodo de Pago\n', - style: { - bold: true, - color: '#a76d09', - fontSize: 10, - } - }, - - ] - }, - { - text: [ - { - text: 'Pago de una sola exihbicion\n', - style: { - bold: true, - color: '#a76d09', - fontSize: 10, - } - }, - - ] - }, - { - text: [ - { - text: 'Regimen Fiscal: ', - style: { - bold: true, - color: '#a76d09', - fontSize: 10, - } - }, - { text: '601 General de ley de personas morales \n', fontSize: 10, } - ] - }, - - ] - }, - - ] - }, - { - width: 50, - text: '\n' - }, - { - style: 'tableExample', - table: { - widths: [50, 40, 173, 120, 60, 60], - - body: [ - - [{ text: 'cantidad', border: [false, true, false, true] }, { text: 'Unidad', style: 'tableHeader', border: [false, true, false, true] }, { text: 'descricion', style: 'tableHeader', border: [false, true, false, true] }, { text: 'Clave servicio/producto', style: 'tableHeader', border: [false, true, false, true] }, { text: 'Precio Unitario', style: 'tableHeader', border: [false, true, false, true] }, { text: 'Importe', style: 'tableHeader', border: [false, true, false, true] }], - [{ text: '1', border: [false, true, false, true] }, { text: 'lt', style: 'tableHeader', border: [false, true, false, true] }, { text: 'juete de niña\n\n\n\nxxxxxxxx', style: 'tableHeader', border: [false, true, false, true] }, { text: 'Clave servicio/producto', style: 'tableHeader', border: [false, true, false, true] }, { text: 'Precio Unitario', style: 'tableHeader', border: [false, true, false, true] }, { text: 'Importe', style: 'tableHeader', border: [false, true, false, true] }], - ] - }, - - - }, - { - style: 'tableExample', - - table: { - widths: [412, 129], - - body: [ - [ - { - text: 'Cantidad con letras:\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor', - - }, - { - style: 'tableExample', - table: { - headerRows: 1, - alignment: 'center', - body: [ - [{ text: 'Subtotal', alignment: 'center', }, { text: 'FACTURA', alignment: 'center' }], - [{ text: 'Descuento', alignment: 'center' }, { text: 'F3EE54R', alignment: 'center' }], - [{ text: 'I.V.A 16%', alignment: 'center' }, { text: 'F3EE54R', alignment: 'center' }], - [{ text: 'Total', alignment: 'center' }, { text: 'F3EE54R', alignment: 'center' }], - - ] - }, - layout: 'lightHorizontalLines' - - - }], - - ] - }, - layout: 'noBorders' - - }, - { - text: [ - { - text: '*Este documento es una representacion impresa de un CFDI\n ', - style: { - bold: true, - color: '#a76d09', - fontSize: 10, - } - }, - - ] - }, - { - columns: [ - - { - text: [ - { - text: 'Numero de serie del Certificado de sello digital:\n ', - style: { - bold: true, - color: '#a76d09', - fontSize: 10, - } - }, - { text: 'xxxxxxxxxxxxxxxxxxx', fontSize: 10, } - ] - }, - { - text: [ - { - text: 'Numero de serie del Certificado de sello digital:\n', - style: { - bold: true, - color: '#a76d09', - fontSize: 10, - } - }, - { text: 'xxxxxxxxxxxxxxxxxxxxx\n', fontSize: 10, } - ] - }, - ] - }, - { - alignment: 'justify', - - columns: [ - - { - width: 430, - fontSize: 9, - table: { - widths: [410, 200], - headerRows: 1, - body: [ - [{ - text: 'SELLO DIGITAL DEL EMISOR', - color: '#0941a7', - alignment: 'justify', - style: 'tableHeader', - border: [false, false, false, false] - }], - ['aYjYNUhTvNVosLnPJsV5h/lAW/HSs45Qzhl2W5V2DPqrdoFfp9mH7wUcS5v3jP6Oql4Y7ncYOcLqakqfGeclJJP/6T1XmbcvPPdBq1DGWh6DaisHS2QCMOW3MGuv8Hc/0j7JwYbXFpTKKM3cudwTmzh76MUoqnssDUfuFIVJ8=`,'], - [{ - text: 'SELLO SAT', - color: '#0941a7', - style: 'tableHeader', - border: [false, false, false, false] - }], - ['GlU7AYil3GqVeUD9oJvqVKc2Uq/K2R7lkc2m6WPuhddjYvWm0foFfMVwzn2KfS7o6KZIddDXdAglhknZsz3ub3X0/aPW4DSwvDYXOF2yCCqd64vbt5MfWqpPqN2zmjzJVFe5ntIPQ21jveXAjR44pJIHNG3rUUUdhVnag6NFTqviaAV75z6OywesoMQCFcsoEjvKozzKGpT7Imuoa94aGIhj0TP5m1hk4OnROOcEBPo11mPf4elDKBDzk+iuCw4wiV/GHaeL0D4zBcVOL/Igz12MKRmYtNdmBfSCv3TI7bJ7qQUV1RckO2Rj1CpFrpa7xr/Vw6lEwitpkCwQ00SKBg==',], - [{ - text: 'CADENA ORIGINAL DEL COMPLEMENTO DE CERTIFICACION DIGITAL DEL SAT', - color: '#0941a7', - style: 'tableHeader', - border: [false, false, false, false] - }], - ['||1.1|5D178E7E-C81C-11E8-89A8-237CD11664D5|2018-10-04T16:27:58|FMO1007168C6|eaYjYNUhTvNVosLnPJsV5h/xlAW/HSs45Qzhl2W5V2DPqrdoFfp9mH7wUcS5v3jP6Oql4Y7ncYOcLqakqfGeclJJP/6T1XmbcvPPdBq1DGWh6DaisHS2QCMOW3MG\n' + - 'uv8Hc/0j7JwYbXFpTKKM3cudwTmzh76MUoqnssDUfuFIVJ8=|00001000000401477845||',], - ] - - }, - layout: 'noBorders' - }, - { - stack: [ - { - image: logo, - width: 100, - height: 100 - }, - - ] - }, - - ] - }, - - - - - - - - - - - - - - - - - - - - ], - } - - constructor(xml: string) { - // @ts-ignore - - this.xml = XmlToJson(xml) - } - - public async getDocument(): Promise { - return createPdf(this.docDefinition); - } -} diff --git a/packages/cfdi/pdf/src/templates/B333/index.ts b/packages/cfdi/pdf/src/templates/B333/index.ts deleted file mode 100644 index c99ce2b..0000000 --- a/packages/cfdi/pdf/src/templates/B333/index.ts +++ /dev/null @@ -1,557 +0,0 @@ -import { TDocumentDefinitions } from "pdfmake/interfaces"; -import { XmlCdfi } from "@cfdi/xml"; -import { XmlToJson } from "@cfdi/2json"; -import { logo } from '@cfdi/utils'; -import { createPdf, TCreatedPdf } from "pdfmake/build/pdfmake"; - - -export class B333 { - // @ts-ignore - private xml: XmlCdfi; - private docDefinition: TDocumentDefinitions = { - pageSize: 'A4', - pageMargins: [20, 25, 20, 25], - content: [ - - { - style: 'tableExample', - table: { - widths: ['*', 'auto'], - body: [ - [{ - columns: [ - { - width: 100, - image: logo, - height: 100, - alignment: 'left' - }, - { - width: 50, - text: '' - }, - { - margin: [0, 0, 0, 0], - width: 243, - text: [ - - { - text: [ - { - text: 'NOMBRE O RAZON SOCIAL DE LA EMPRESA\n\n ', - style: { - bold: true, - color: '#a76d09', - } - }, - - ] - }, - { - text: [ - { - text: 'DOMICILIO FISCAL:\n', - style: { - bold: true, - color: '#a76d09', - fontSize: 10, - - } - }, - { fontSize: 10, text: ' av oquideas entre ruta5\nCANCUN QUINTANRRO\n ' } - ] - }, - { - text: [ - { - text: 'RFC:\n', - style: { - fontSize: 10, - - bold: true, - color: '#a76d09', - } - }, - { text: ' 98765436899\n', fontSize: 10, } - ] - }, - { - text: [ - { - text: 'REGIMEN FISCAL:\n', - style: { - bold: true, - color: '#a76d09', - fontSize: 10, - - } - }, - { text: '601 General de ley de personas morales\n', fontSize: 10, } - ] - }, - ] - }, - ] - }, - - { - margin: [0, 0, 0, 0], - width: 243, - text: [ - - { - text: [ - { - text: 'FACTURA\n ', - style: { - alignment: 'center', - bold: true, - color: '#a76d09', - fontSize: 10 - } - }, - - ] - }, - { - text: [ - { - text: 'Tipo De Comprobante: ', - style: { - bold: true, - color: '#a76d09', - fontSize: 8 - } - }, - { fontSize: 8, text: ' Ingreso\n' } - ] - }, - { - text: [ - { - text: 'Fecha: ', - style: { - fontSize: 8, - bold: true, - color: '#a76d09', - } - }, - { fontSize: 8, text: ' 2020/07/08 13:28:12\n' } - ] - }, - { - text: [ - { - text: 'Lugar de expedicon:\n', - style: { - fontSize: 8, - bold: true, - color: '#a76d09', - } - }, - { fontSize: 8, text: 'Playa del carmen, solidaridad,quintan Roo\n' } - ] - }, - { - text: [ - { - text: 'Forma De Pago:\n', - style: { - fontSize: 8, - bold: true, - color: '#a76d09', - } - }, - { fontSize: 8, text: 'Pago en una sola Exhibicion\n' } - ] - }, - { - text: [ - { - text: 'Metodo de pago:\n', - style: { - fontSize: 8, - bold: true, - color: '#a76d09', - } - }, - { fontSize: 8, text: 'Tranferencia electronica\n' } - ] - }, - { - text: [ - { - text: 'Forma de pago Sat:', - style: { - fontSize: 8, - bold: true, - color: '#a76d09', - } - }, - { fontSize: 8, text: '\n' } - ] - }, - { - text: [ - { - text: 'Uso CFDI:', - style: { - fontSize: 8, - bold: true, - color: '#a76d09', - } - }, - { fontSize: 8, text: '\n' } - ] - }, - - - ] - },], - ] - } - }, - - { - style: 'tableExample', - table: { - widths: [546], - - body: [ - - [{ text: 'Facturado a: ( 1) Industrial azteca s.a de cv', fillColor: '#eeeeee', border: [true, true, true, true] }], - [{ - margin: [0, 0, 0, 0], - width: 243, - text: [ - - { - text: [ - - - { text: '\nCalle: avenida granjas no 17 entre san sebastian \n' }, - { - text: [ - { - text: 'RFC:', - style: { - bold: true, - color: '#a76d09', - } - }, - { text: 'JACE34567MJ5\n' } - ] - }, - - - ] - }, - ], - } - - ] - ] - }, - }, - { - style: 'tableExample', - table: { - widths: [546], - - body: [ - - [{ text: 'Enviar a:', fillColor: '#eeeeee', border: [true, true, true, true] }], - [{ - margin: [0, 0, 0, 0], - width: 243, - text: [ - - { - text: [ - - - { text: '\nCalle: avenida granjas no 17 entre san sebastian \n' }, - { - text: [ - { - text: 'RFC:', - style: { - - bold: true, - color: '#a76d09', - } - }, - { text: 'JACE34567MJ5\n' } - ] - }, - - - ] - }, - ], - } - - ] - ] - }, - }, - { - - text: '\n' - }, - - - { - style: 'tableExample', - table: { - widths: [50, 40, 162, 120, 70, 60], - - body: [ - - [{ fontSize: 10, text: 'cantidad', border: [true, true, false, true], fillColor: '#eeeeee', }, { fontSize: 10, text: 'Unidad', style: 'tableHeader', fillColor: '#eeeeee', border: [false, true, false, true] }, { fontSize: 10, text: 'descricion', fillColor: '#eeeeee', style: 'tableHeader', border: [false, true, false, true] }, { fontSize: 10, text: 'Clave servicio/producto', style: 'tableHeader', fillColor: '#eeeeee', border: [false, true, false, true] }, { fontSize: 10, text: 'Precio Unitario', style: 'tableHeader', fillColor: '#eeeeee', border: [false, true, false, true] }, { fontSize: 10, text: 'Importe', style: 'tableHeader', fillColor: '#eeeeee', border: [false, true, true, true] }], - [{ alignment: 'center', text: '1', border: [false, true, false, true] }, { text: 'lt', style: 'tableHeader', border: [false, true, false, true] }, { text: 'juete de niña', style: 'tableHeader', border: [false, true, false, true] }, { text: 'Clave servicio/producto', style: 'tableHeader', border: [false, true, false, true] }, { text: 'Precio Unitario', style: 'tableHeader', border: [false, true, false, true] }, { text: 'Importe', style: 'tableHeader', border: [false, true, false, true] }], - [{ alignment: 'center', text: '1', border: [false, true, false, true] }, { text: 'lt', style: 'tableHeader', border: [false, true, false, true] }, { text: 'juete de niña', style: 'tableHeader', border: [false, true, false, true] }, { text: 'Clave servicio/producto', style: 'tableHeader', border: [false, true, false, true] }, { text: 'Precio Unitario', style: 'tableHeader', border: [false, true, false, true] }, { text: 'Importe', style: 'tableHeader', border: [false, true, false, true] }], - ] - - }, - - - }, - { - margin: [0, 7, 0, 7], - table: { - - widths: ['auto', '*', 'auto'], - body: [ - [ - { - border: [false, false, false, false], - alignment: 'center', - - table: { - body: [ - [ - - { - image: logo, - width: 100, - height: 100, - }, - - - ], - ] - }, - layout: 'noBorders' - }, - { - border: [false, false, false, false], - style: 'tableExample', - table: { - - - body: [ - - [{ text: 'Cantidad con Letras', fillColor: '#eeeeee', border: [true, true, true, true] }], - [{ - margin: [0, 0, 0, 0], - width: 243, - text: [ - - { - text: [ - - - { text: '\nOCHOCIENTOS TREINTA Y NUEVE PESOS 99/100 M.N.\n\n' }, - - - - ] - }, - ], - } - - ] - ] - }, - }, - - { - border: [false, false, false, false], - style: 'tableExample', - table: { - headerRows: 1, - alignment: 'center', - body: [ - [{ text: 'Subtotal', alignment: 'center', }, { text: 'FACTURA', alignment: 'center' }], - [{ text: 'Descuento', alignment: 'center' }, { text: 'F3EE54R', alignment: 'center' }], - [{ text: 'I.V.A 16%', alignment: 'center' }, { text: 'F3EE54R', alignment: 'center' }], - [{ text: 'Total', alignment: 'center' }, { text: 'F3EE54R', alignment: 'center' }], - - - ] - }, - layout: 'lightHorizontalLines' - - } - ], - ] - } - }, - - - { - style: 'tableExample', - table: { - widths: [546], - - body: [ - - [{ text: 'Este Documento es una Representacion Impresa de un CFDI', alignment: 'center', fillColor: '#eeeeee', border: [true, true, true, true] }], - - ] - }, - }, - { - style: 'tableExample', - table: { - widths: [81, 143, 155, 140], - - body: [ - - [{ text: 'Folio Fiscal:', alignment: 'center', fillColor: '#eeeeee', border: [true, true, true, true] }, { text: 'xxxxxxxxxxxxxxxx', border: [true, true, true, true] }, { text: 'Fecha y Hora de Expedicon', alignment: 'center', fillColor: '#eeeeee', border: [true, true, true, true] }, { text: '08/07/2020 17:16:10', border: [true, true, true, true] }], - - ] - }, - }, - { - style: 'tableExample', - table: { - widths: [546], - - body: [ - - [{ text: 'Sello Digital del CFDI', alignment: 'center', fillColor: '#eeeeee', border: [true, true, true, true] }], - [{ - margin: [0, 0, 0, 0], - width: 243, - text: [ - - { - alignment: 'justify', - text: [ - - - { text: 'eaYjYNUhTvNVosLnPJsV5h/xlAW/HSs45Qzhl2W5V2DPqrdoFfp9mH7wUcS5v3jP6Oql4Y7ncYOcLqakqfGeclJJP/6T1XmbcvPPdBq1DGWh6DaisHS2QCMOW3MGuv8Hc/0j7JwYbXFpTKKM3cudwTmzh76MUoqnssDUfuFIVJ8= \n' }, - - - - ] - }, - ], - } - - ] - ] - }, - }, - { - style: 'tableExample', - table: { - widths: [270, 267], - - body: [ - - [{ fontSize: 10, text: 'Numero de Serie del Certificado de Sello Digital', alignment: 'center', fillColor: '#eeeeee', border: [true, true, true, true] }, { fontSize: 10, text: 'Numero de Serie del Certificado de Sello Digital del Sat', alignment: 'center', fillColor: '#eeeeee', border: [true, true, true, true] },], - [{ text: 'xxxxxxxxxxxxxxxx', alignment: 'center', border: [true, true, true, true] }, { text: 'xxxxxxxxxxxxxx', alignment: 'center', border: [true, true, true, true] }] - ] - }, - }, - { - style: 'tableExample', - table: { - widths: [546], - - body: [ - - [{ text: 'Cadena Orginal del Complemento de Certificacion Digital del SAT', alignment: 'center', fillColor: '#eeeeee', border: [true, true, true, true] }], - [{ - margin: [0, 0, 0, 0], - width: 243, - text: [ - - { - alignment: 'justify', - text: [ - - - { text: 'eaYjYNUhTvNVosLnPJsV5h/xlAW/HSs45Qzhl2W5V2DPqrdoFfp9mH7wUcS5v3jP6Oql4Y7ncYOcLqakqfGeclJJP/6T1XmbcvPPdBq1DGWh6DaisHS2QCMOW3MGuv8Hc/0j7JwYbXFpTKKM3cudwTmzh76MUoqnssDUfuFIVJ8= \n' }, - - - - ] - }, - ], - } - - ] - ] - }, - }, - { - style: 'tableExample', - table: { - widths: [546], - - body: [ - - [{ text: 'Sello Digital del SAT', alignment: 'center', fillColor: '#eeeeee', border: [true, true, true, true] }], - [{ - margin: [0, 0, 0, 0], - width: 243, - text: [ - - { - alignment: 'justify', - text: [ - - - { text: 'eaYjYNUhTvNVosLnPJsV5h/xlAW/HSs45Qzhl2W5V2DPqrdoFfp9mH7wUcS5v3jP6Oql4Y7ncYOcLqakqfGeclJJP/6T1XmbcvPPdBq1DGWh6DaisHS2QCMOW3MGuv8Hc/0j7JwYbXFpTKKM3cudwTmzh76MUoqnssDUfuFIVJ8= \n' }, - - - - ] - }, - ], - } - - ] - ] - }, - }, - - - - - - - - - ] - - - - - - } - - constructor(xml: string) { - // @ts-ignore - this.xml = XmlToJson(xml) - } - - public async getDocument(): Promise { - return createPdf(this.docDefinition); - } - -} diff --git a/packages/cfdi/pdf/src/templates/index.ts b/packages/cfdi/pdf/src/templates/index.ts index 17c1804..61271f4 100644 --- a/packages/cfdi/pdf/src/templates/index.ts +++ b/packages/cfdi/pdf/src/templates/index.ts @@ -1,7 +1,8 @@ -export { A117 } from './A117'; -export { B123 } from './B123'; +/*export { A117 } from './A117'; + export { B123 } from './B123'; export { B111 } from './B111' export { B112 } from './B112'; export { B222 } from './B222'; export { A111 } from './A111'; export { B333 } from './B333'; + */ \ No newline at end of file From 55c8346acf14f4330519d6011921ece0384314a1 Mon Sep 17 00:00:00 2001 From: MisaelMa Date: Sat, 29 Mar 2025 15:36:09 -0500 Subject: [PATCH 3/9] feat(core): improve ui --- .github/actions/cfdi/action.yml | 7 + .gitignore | 1 + .vscode/settings.json | 1 + .../rush/browser-approved-packages.json | 96 +- common/config/rush/pnpm-lock.yaml | 2866 ++++++++- common/config/rush/version-policies.json | 6 + common/scripts/github-actions.js | 5 +- packages/files/xml/conceptos.xml | 15 + packages/files/xml/dos-conceptos.xml | 7 + packages/files/xml/dos-impuestos.xml | 13 + packages/files/xml/emisor-receptor.xml | 6 + packages/files/xml/un-concepto.xml | 6 + packages/files/xml/un-impuesto.xml | 11 + packages/server/.gitignore | 41 + packages/server/README.md | 36 + packages/server/eslint.config.mjs | 16 + packages/server/next.config.ts | 8 + packages/server/package-lock.json | 5469 +++++++++++++++++ packages/server/package.json | 32 + packages/server/postcss.config.mjs | 5 + packages/server/public/file.svg | 1 + packages/server/public/globe.svg | 1 + packages/server/public/next.svg | 1 + packages/server/public/vercel.svg | 1 + packages/server/public/window.svg | 1 + packages/server/src/app/cfdi/pdf/route.ts | 22 + packages/server/src/app/favicon.ico | Bin 0 -> 25931 bytes packages/server/src/app/globals.css | 26 + packages/server/src/app/layout.tsx | 34 + packages/server/src/app/page.tsx | 101 + packages/server/tsconfig.json | 30 + .../profiles/default/tsconfig-base.json | 1 + rush.json | 14 + 33 files changed, 8702 insertions(+), 178 deletions(-) create mode 100644 packages/files/xml/conceptos.xml create mode 100644 packages/files/xml/dos-conceptos.xml create mode 100644 packages/files/xml/dos-impuestos.xml create mode 100644 packages/files/xml/emisor-receptor.xml create mode 100644 packages/files/xml/un-concepto.xml create mode 100644 packages/files/xml/un-impuesto.xml create mode 100644 packages/server/.gitignore create mode 100644 packages/server/README.md create mode 100644 packages/server/eslint.config.mjs create mode 100644 packages/server/next.config.ts create mode 100644 packages/server/package-lock.json create mode 100644 packages/server/package.json create mode 100644 packages/server/postcss.config.mjs create mode 100644 packages/server/public/file.svg create mode 100644 packages/server/public/globe.svg create mode 100644 packages/server/public/next.svg create mode 100644 packages/server/public/vercel.svg create mode 100644 packages/server/public/window.svg create mode 100644 packages/server/src/app/cfdi/pdf/route.ts create mode 100644 packages/server/src/app/favicon.ico create mode 100644 packages/server/src/app/globals.css create mode 100644 packages/server/src/app/layout.tsx create mode 100644 packages/server/src/app/page.tsx create mode 100644 packages/server/tsconfig.json diff --git a/.github/actions/cfdi/action.yml b/.github/actions/cfdi/action.yml index add8f24..76a2fe4 100644 --- a/.github/actions/cfdi/action.yml +++ b/.github/actions/cfdi/action.yml @@ -16,6 +16,13 @@ runs: branch: main path: packages/cfdi/schema token: ${{ inputs.token }} + - name: Desings + uses: actions/checkout@v4 + with: + repository: MisaelMa/designs + branch: main + path: packages/cfdi/designs + token: ${{ inputs.token }} - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v1 diff --git a/.gitignore b/.gitignore index 6f51bfd..e9ddf8f 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,7 @@ build/Release node_modules/ jspm_packages/ packages/cfdi/schema/ +packages/cfdi/designs # Optional npm cache directory .npm diff --git a/.vscode/settings.json b/.vscode/settings.json index 25e84d5..3b29883 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,6 @@ { "cSpell.words": [ + "cfdi", "recreando" ] } diff --git a/common/config/rush/browser-approved-packages.json b/common/config/rush/browser-approved-packages.json index ec78b03..15ba121 100644 --- a/common/config/rush/browser-approved-packages.json +++ b/common/config/rush/browser-approved-packages.json @@ -28,11 +28,11 @@ }, { "name": "@cfdi/2json", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "@cfdi/catalogos", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "@cfdi/complementos", @@ -50,6 +50,10 @@ "name": "@cfdi/curp", "allowedCategories": [ "libraries" ] }, + { + "name": "@cfdi/designs", + "allowedCategories": [ "private" ] + }, { "name": "@cfdi/elements", "allowedCategories": [ "libraries" ] @@ -60,7 +64,7 @@ }, { "name": "@cfdi/pdf", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "@cfdi/schema", @@ -72,12 +76,16 @@ }, { "name": "@cfdi/utils", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "@cfdi/xml", "allowedCategories": [ "libraries", "production" ] }, + { + "name": "@cfdi/xml2json", + "allowedCategories": [ "libraries" ] + }, { "name": "@cfdi/xsd", "allowedCategories": [ "libraries" ] @@ -102,6 +110,10 @@ "name": "@emotion/styled", "allowedCategories": [ "libraries" ] }, + { + "name": "@eslint/eslintrc", + "allowedCategories": [ "private" ] + }, { "name": "@esm2cjs/execa", "allowedCategories": [ "libraries" ] @@ -152,11 +164,11 @@ }, { "name": "@nestjs/cli", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "@nestjs/common", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "@nestjs/config", @@ -164,7 +176,7 @@ }, { "name": "@nestjs/core", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "@nestjs/jwt", @@ -176,7 +188,7 @@ }, { "name": "@nestjs/platform-express", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "@nestjs/schedule", @@ -184,7 +196,7 @@ }, { "name": "@nestjs/schematics", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "@nestjs/swagger", @@ -192,7 +204,7 @@ }, { "name": "@nestjs/testing", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "@nestjs/typeorm", @@ -230,6 +242,14 @@ "name": "@reduxjs/toolkit", "allowedCategories": [ "libraries" ] }, + { + "name": "@rollup/plugin-terser", + "allowedCategories": [ "libraries" ] + }, + { + "name": "@rollup/plugin-url", + "allowedCategories": [ "libraries" ] + }, { "name": "@rushstack/eslint-config", "allowedCategories": [ "libraries", "private", "production" ] @@ -256,7 +276,7 @@ }, { "name": "@swc/core", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "@swc/helpers", @@ -270,6 +290,10 @@ "name": "@swc/register", "allowedCategories": [ "libraries" ] }, + { + "name": "@tailwindcss/postcss", + "allowedCategories": [ "private" ] + }, { "name": "@testing-library/dom", "allowedCategories": [ "libraries", "private", "production" ] @@ -288,11 +312,11 @@ }, { "name": "@typescript-eslint/eslint-plugin", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "@typescript-eslint/parser", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "@vitest/coverage-v8", @@ -340,11 +364,11 @@ }, { "name": "class-transformer", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "class-validator", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "cookie", @@ -380,11 +404,11 @@ }, { "name": "eslint-config-next", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "eslint-config-prettier", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "eslint-import-resolver-typescript", @@ -412,7 +436,7 @@ }, { "name": "eslint-plugin-prettier", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "eslint-plugin-react", @@ -528,7 +552,7 @@ }, { "name": "next", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "next-redux-wrapper", @@ -576,7 +600,7 @@ }, { "name": "pdfmake", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "pg", @@ -584,7 +608,7 @@ }, { "name": "prettier", - "allowedCategories": [ "libraries", "production" ] + "allowedCategories": [ "libraries", "private", "production" ] }, { "name": "puppeteer", @@ -604,11 +628,11 @@ }, { "name": "react", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "react-dom", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "react-is", @@ -632,7 +656,7 @@ }, { "name": "reflect-metadata", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "rimraf", @@ -648,7 +672,7 @@ }, { "name": "rxjs", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "save-file", @@ -664,7 +688,7 @@ }, { "name": "source-map-support", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "styled-components", @@ -692,23 +716,27 @@ }, { "name": "supertest", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] + }, + { + "name": "tailwindcss", + "allowedCategories": [ "private" ] }, { "name": "ts-jest", - "allowedCategories": [ "libraries", "production" ] + "allowedCategories": [ "libraries", "private", "production" ] }, { "name": "ts-loader", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "ts-node", - "allowedCategories": [ "libraries", "production" ] + "allowedCategories": [ "libraries", "private", "production" ] }, { "name": "tsconfig-paths", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "tsconfig-paths-webpack-plugin", @@ -748,11 +776,15 @@ }, { "name": "vite", + "allowedCategories": [ "libraries", "private" ] + }, + { + "name": "vite-plugin-dts", "allowedCategories": [ "libraries" ] }, { "name": "vite-plugin-node", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "vite-tsconfig-paths", diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index d96c02f..c9fd4f7 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -53,7 +53,7 @@ importers: version: 5.14.9 '@vitest/coverage-v8': specifier: 2.1.3 - version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0)) + version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) '@vitest/ui': specifier: 2.1.3 version: 2.1.3(vitest@2.1.3) @@ -86,10 +86,10 @@ importers: version: 5.6.3 vite-tsconfig-paths: specifier: ~4.2.1 - version: 4.2.3(typescript@5.6.3)(vite@5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0)) + version: 4.2.3(typescript@5.6.3)(vite@6.2.2(@types/node@18.19.57)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) vitest: specifier: 2.1.3 - version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0) + version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) ../../packages/cfdi/complementos: dependencies: @@ -138,7 +138,7 @@ importers: version: 5.14.9 '@vitest/coverage-v8': specifier: 2.1.3 - version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0)) + version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) '@vitest/ui': specifier: 2.1.3 version: 2.1.3(vitest@2.1.3) @@ -174,10 +174,10 @@ importers: version: 5.6.3 vite-tsconfig-paths: specifier: ~4.2.1 - version: 4.2.3(typescript@5.6.3)(vite@5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0)) + version: 4.2.3(typescript@5.6.3)(vite@6.2.2(@types/node@18.19.57)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) vitest: specifier: 2.1.3 - version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0) + version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) ../../packages/cfdi/csd: dependencies: @@ -241,7 +241,7 @@ importers: version: 5.14.9 '@vitest/coverage-v8': specifier: 2.1.3 - version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0)) + version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) '@vitest/ui': specifier: 2.1.3 version: 2.1.3(vitest@2.1.3) @@ -277,10 +277,10 @@ importers: version: 5.6.3 vite-tsconfig-paths: specifier: ~4.2.1 - version: 4.2.3(typescript@5.6.3)(vite@5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0)) + version: 4.2.3(typescript@5.6.3)(vite@6.2.2(@types/node@18.19.57)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) vitest: specifier: 2.1.3 - version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0) + version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) ../../packages/cfdi/csf: dependencies: @@ -317,7 +317,7 @@ importers: version: 1.1.4 '@vitest/coverage-v8': specifier: 2.1.3 - version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0)) + version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) '@vitest/ui': specifier: 2.1.3 version: 2.1.3(vitest@2.1.3) @@ -341,10 +341,10 @@ importers: version: 5.6.3 vite-tsconfig-paths: specifier: ~4.2.1 - version: 4.2.3(typescript@5.6.3)(vite@5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0)) + version: 4.2.3(typescript@5.6.3)(vite@6.2.2(@types/node@18.19.57)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) vitest: specifier: 2.1.3 - version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0) + version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) ../../packages/cfdi/curp: dependencies: @@ -396,7 +396,7 @@ importers: version: 5.14.9 '@vitest/coverage-v8': specifier: 2.1.3 - version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0)) + version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) '@vitest/ui': specifier: 2.1.3 version: 2.1.3(vitest@2.1.3) @@ -429,10 +429,41 @@ importers: version: 5.6.3 vite-tsconfig-paths: specifier: ~4.2.1 - version: 4.2.3(typescript@5.6.3)(vite@5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0)) + version: 4.2.3(typescript@5.6.3)(vite@6.2.2(@types/node@18.19.57)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) vitest: specifier: 2.1.3 - version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0) + version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) + + ../../packages/cfdi/designs: + dependencies: + '@cfdi/2json': + specifier: workspace:* + version: link:../xml2json + '@cfdi/utils': + specifier: workspace:* + version: link:../utils + '@rollup/plugin-terser': + specifier: ^0.4.4 + version: 0.4.4(rollup@4.36.0) + '@rollup/plugin-url': + specifier: ^8.0.2 + version: 8.0.2(rollup@4.36.0) + '@types/pdfmake': + specifier: ^0.2.11 + version: 0.2.11 + pdfmake: + specifier: ^0.2.18 + version: 0.2.18 + vite-plugin-dts: + specifier: ^4.5.3 + version: 4.5.3(@types/node@20.17.23)(rollup@4.36.0)(typescript@5.7.2)(vite@6.2.2(@types/node@20.17.23)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) + devDependencies: + typescript: + specifier: ^5.0.0 + version: 5.7.2 + vite: + specifier: ^6.2.2 + version: 6.2.2(@types/node@20.17.23)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) ../../packages/cfdi/elements: dependencies: @@ -478,7 +509,7 @@ importers: version: 18.19.57 '@vitest/coverage-v8': specifier: 2.1.3 - version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0)) + version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) '@vitest/ui': specifier: 2.1.3 version: 2.1.3(vitest@2.1.3) @@ -502,10 +533,10 @@ importers: version: 5.6.3 vite-tsconfig-paths: specifier: ~4.2.1 - version: 4.2.3(typescript@5.6.3)(vite@5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0)) + version: 4.2.3(typescript@5.6.3)(vite@6.2.2(@types/node@18.19.57)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) vitest: specifier: 2.1.3 - version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0) + version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) ../../packages/cfdi/expresiones: dependencies: @@ -554,7 +585,7 @@ importers: version: 5.14.9 '@vitest/coverage-v8': specifier: 2.1.3 - version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0)) + version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) '@vitest/ui': specifier: 2.1.3 version: 2.1.3(vitest@2.1.3) @@ -590,10 +621,10 @@ importers: version: 5.6.3 vite-tsconfig-paths: specifier: ~4.2.1 - version: 4.2.3(typescript@5.6.3)(vite@5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0)) + version: 4.2.3(typescript@5.6.3)(vite@6.2.2(@types/node@18.19.57)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) vitest: specifier: 2.1.3 - version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0) + version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) ../../packages/cfdi/pdf: dependencies: @@ -678,7 +709,7 @@ importers: version: 5.14.9 '@vitest/coverage-v8': specifier: 2.1.3 - version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0)) + version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) '@vitest/ui': specifier: 2.1.3 version: 2.1.3(vitest@2.1.3) @@ -711,10 +742,10 @@ importers: version: 5.6.3 vite-tsconfig-paths: specifier: ~4.2.1 - version: 4.2.3(typescript@5.6.3)(vite@5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0)) + version: 4.2.3(typescript@5.6.3)(vite@6.2.2(@types/node@18.19.57)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) vitest: specifier: 2.1.3 - version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0) + version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) ../../packages/cfdi/rfc: devDependencies: @@ -759,7 +790,7 @@ importers: version: 5.14.9 '@vitest/coverage-v8': specifier: 2.1.3 - version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0)) + version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) '@vitest/ui': specifier: 2.1.3 version: 2.1.3(vitest@2.1.3) @@ -792,10 +823,10 @@ importers: version: 5.6.3 vite-tsconfig-paths: specifier: ~4.2.1 - version: 4.2.3(typescript@5.6.3)(vite@5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0)) + version: 4.2.3(typescript@5.6.3)(vite@6.2.2(@types/node@18.19.57)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) vitest: specifier: 2.1.3 - version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0) + version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) ../../packages/cfdi/schema: dependencies: @@ -824,6 +855,9 @@ importers: '@recreando/typescript-settings': specifier: workspace:* version: link:../../../rigs/typescript + '@recreando/vite': + specifier: workspace:* + version: link:../../../rigs/vite '@rushstack/eslint-config': specifier: ^4.0.2 version: 4.0.2(eslint@8.57.1)(typescript@5.6.3) @@ -853,7 +887,7 @@ importers: version: 5.14.9 '@vitest/coverage-v8': specifier: 2.1.3 - version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0)) + version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) '@vitest/ui': specifier: 2.1.3 version: 2.1.3(vitest@2.1.3) @@ -886,10 +920,10 @@ importers: version: 5.6.3 vite-tsconfig-paths: specifier: ~4.2.1 - version: 4.2.3(typescript@5.6.3)(vite@5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0)) + version: 4.2.3(typescript@5.6.3)(vite@6.2.2(@types/node@18.19.57)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) vitest: specifier: 2.1.3 - version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0) + version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) ../../packages/cfdi/transform: dependencies: @@ -944,7 +978,7 @@ importers: version: 5.14.9 '@vitest/coverage-v8': specifier: 2.1.3 - version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0)) + version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) '@vitest/ui': specifier: 2.1.3 version: 2.1.3(vitest@2.1.3) @@ -980,10 +1014,10 @@ importers: version: 5.6.3 vite-tsconfig-paths: specifier: ~4.2.1 - version: 4.2.3(typescript@5.6.3)(vite@5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0)) + version: 4.2.3(typescript@5.6.3)(vite@6.2.2(@types/node@18.19.57)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) vitest: specifier: 2.1.3 - version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0) + version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) ../../packages/cfdi/types: dependencies: @@ -1029,7 +1063,7 @@ importers: version: 18.19.57 '@vitest/coverage-v8': specifier: 2.1.3 - version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0)) + version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) '@vitest/ui': specifier: 2.1.3 version: 2.1.3(vitest@2.1.3) @@ -1053,10 +1087,10 @@ importers: version: 5.6.3 vite-tsconfig-paths: specifier: ~4.2.1 - version: 4.2.3(typescript@5.6.3)(vite@5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0)) + version: 4.2.3(typescript@5.6.3)(vite@6.2.2(@types/node@18.19.57)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) vitest: specifier: 2.1.3 - version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0) + version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) ../../packages/cfdi/utils: dependencies: @@ -1105,7 +1139,7 @@ importers: version: 5.14.9 '@vitest/coverage-v8': specifier: 2.1.3 - version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0)) + version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) '@vitest/ui': specifier: 2.1.3 version: 2.1.3(vitest@2.1.3) @@ -1141,10 +1175,10 @@ importers: version: 5.6.3 vite-tsconfig-paths: specifier: ~4.2.1 - version: 4.2.3(typescript@5.6.3)(vite@5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0)) + version: 4.2.3(typescript@5.6.3)(vite@6.2.2(@types/node@18.19.57)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) vitest: specifier: 2.1.3 - version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0) + version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) ../../packages/cfdi/xml: dependencies: @@ -1190,7 +1224,7 @@ importers: version: 18.19.57 '@vitest/coverage-v8': specifier: 2.1.3 - version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0)) + version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) '@vitest/ui': specifier: 2.1.3 version: 2.1.3(vitest@2.1.3) @@ -1214,10 +1248,10 @@ importers: version: 5.6.3 vite-tsconfig-paths: specifier: ~4.2.1 - version: 4.2.3(typescript@5.6.3)(vite@5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0)) + version: 4.2.3(typescript@5.6.3)(vite@6.2.2(@types/node@18.19.57)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) vitest: specifier: 2.1.3 - version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0) + version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) ../../packages/cfdi/xml2json: dependencies: @@ -1275,7 +1309,7 @@ importers: version: 5.14.9 '@vitest/coverage-v8': specifier: 2.1.3 - version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0)) + version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) '@vitest/ui': specifier: 2.1.3 version: 2.1.3(vitest@2.1.3) @@ -1311,10 +1345,10 @@ importers: version: 5.6.3 vite-tsconfig-paths: specifier: ~4.2.1 - version: 4.2.3(typescript@5.6.3)(vite@5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0)) + version: 4.2.3(typescript@5.6.3)(vite@6.2.2(@types/node@18.19.57)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) vitest: specifier: 2.1.3 - version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0) + version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) ../../packages/cfdi/xsd: dependencies: @@ -1372,7 +1406,7 @@ importers: version: 5.14.9 '@vitest/coverage-v8': specifier: 2.1.3 - version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0)) + version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) '@vitest/ui': specifier: 2.1.3 version: 2.1.3(vitest@2.1.3) @@ -1408,10 +1442,10 @@ importers: version: 5.6.3 vite-tsconfig-paths: specifier: ~4.2.1 - version: 4.2.3(typescript@5.6.3)(vite@5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0)) + version: 4.2.3(typescript@5.6.3)(vite@6.2.2(@types/node@18.19.57)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) vitest: specifier: 2.1.3 - version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0) + version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) ../../packages/clir/openssl: dependencies: @@ -1466,7 +1500,7 @@ importers: version: 5.14.9 '@vitest/coverage-v8': specifier: 2.1.3 - version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0)) + version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) '@vitest/ui': specifier: 2.1.3 version: 2.1.3(vitest@2.1.3) @@ -1499,10 +1533,10 @@ importers: version: 5.6.3 vite-tsconfig-paths: specifier: ~4.2.1 - version: 4.2.3(typescript@5.6.3)(vite@5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0)) + version: 4.2.3(typescript@5.6.3)(vite@6.2.2(@types/node@18.19.57)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) vitest: specifier: 2.1.3 - version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0) + version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) ../../packages/clir/saxon-he: dependencies: @@ -1533,7 +1567,7 @@ importers: version: 18.19.57 '@vitest/coverage-v8': specifier: 2.1.3 - version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0)) + version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) '@vitest/ui': specifier: 2.1.3 version: 2.1.3(vitest@2.1.3) @@ -1554,10 +1588,71 @@ importers: version: 5.6.3 vite-tsconfig-paths: specifier: ~4.2.1 - version: 4.2.3(typescript@5.6.3)(vite@5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0)) + version: 4.2.3(typescript@5.6.3)(vite@6.2.2(@types/node@18.19.57)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) vitest: specifier: 2.1.3 - version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0) + version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) + + ../../packages/server: + dependencies: + '@cfdi/2json': + specifier: workspace:* + version: link:../cfdi/xml2json + '@cfdi/catalogos': + specifier: workspace:* + version: link:../cfdi/catalogos + '@cfdi/designs': + specifier: workspace:* + version: link:../cfdi/designs + '@cfdi/pdf': + specifier: workspace:* + version: link:../cfdi/pdf + '@cfdi/utils': + specifier: workspace:* + version: link:../cfdi/utils + '@types/pdfmake': + specifier: ^0.2.11 + version: 0.2.11 + next: + specifier: 15.2.3 + version: 15.2.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + pdfmake: + specifier: ~0.2.18 + version: 0.2.18 + react: + specifier: ^19.0.0 + version: 19.0.0 + react-dom: + specifier: ^19.0.0 + version: 19.0.0(react@19.0.0) + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.0 + '@tailwindcss/postcss': + specifier: ^4 + version: 4.0.9 + '@types/node': + specifier: ^20 + version: 20.17.23 + '@types/react': + specifier: ^19 + version: 19.0.10 + '@types/react-dom': + specifier: ^19 + version: 19.0.4(@types/react@19.0.10) + eslint: + specifier: ^9 + version: 9.21.0(jiti@2.4.2) + eslint-config-next: + specifier: 15.2.1 + version: 15.2.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.2) + tailwindcss: + specifier: ^4 + version: 4.0.9 + typescript: + specifier: ^5 + version: 5.7.2 ../../rigs/eslint: dependencies: @@ -1675,10 +1770,10 @@ importers: dependencies: '@rushstack/heft': specifier: ^0.68.6 - version: 0.68.6(@types/node@18.19.57) + version: 0.68.6(@types/node@20.17.23) '@rushstack/heft-jest-plugin': specifier: ^0.12.18 - version: 0.12.18(@rushstack/heft@0.68.6(@types/node@18.19.57))(@types/node@18.19.57)(jest-environment-node@29.7.0) + version: 0.12.18(@rushstack/heft@0.68.6(@types/node@20.17.23))(@types/node@20.17.23)(jest-environment-node@29.7.0) eslint: specifier: ^8.57.0 version: 8.57.1 @@ -1696,11 +1791,11 @@ importers: dependencies: vite: specifier: ^4.0.0 - version: 4.5.5(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0) + version: 4.5.5(@types/node@20.17.23)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) devDependencies: '@vitest/coverage-v8': specifier: 2.1.3 - version: 2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0)) + version: 2.1.3(vitest@2.1.3(@types/node@20.17.23)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) '@vitest/ui': specifier: 2.1.3 version: 2.1.3(vitest@2.1.3) @@ -1709,10 +1804,10 @@ importers: version: 5.6.3 vite-tsconfig-paths: specifier: ~4.2.1 - version: 4.2.3(typescript@5.6.3)(vite@4.5.5(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0)) + version: 4.2.3(typescript@5.6.3)(vite@4.5.5(@types/node@20.17.23)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) vitest: specifier: 2.1.3 - version: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0) + version: 2.1.3(@types/node@20.17.23)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) packages: @@ -1722,6 +1817,10 @@ packages: '@adobe/css-tools@4.4.0': resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -2325,6 +2424,9 @@ packages: engines: {node: '>=0.1.95'} hasBin: true + '@emnapi/runtime@1.3.1': + resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + '@es-joy/jsdoccomment@0.36.1': resolution: {integrity: sha512-922xqFsTpHs6D0BUiG4toiyPOMc8/jafnWKxz1KWgS4XzKPy2qXf1Pe6UFuNSCQqt6tOuhAWXBNuuyUhJmw9Vg==} engines: {node: ^14 || ^16 || ^17 || ^18 || ^19} @@ -2335,6 +2437,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.25.1': + resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.18.20': resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} @@ -2347,6 +2455,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.25.1': + resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.18.20': resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} @@ -2359,6 +2473,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.25.1': + resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.18.20': resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} @@ -2371,6 +2491,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.25.1': + resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.18.20': resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} @@ -2383,6 +2509,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.25.1': + resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.18.20': resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} @@ -2395,6 +2527,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.25.1': + resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.18.20': resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} @@ -2407,6 +2545,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.25.1': + resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.18.20': resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} @@ -2419,6 +2563,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.1': + resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.18.20': resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} @@ -2431,6 +2581,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.25.1': + resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.18.20': resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} @@ -2443,6 +2599,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.25.1': + resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.18.20': resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} @@ -2455,6 +2617,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.25.1': + resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.14.54': resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==} engines: {node: '>=12'} @@ -2473,6 +2641,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.25.1': + resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.18.20': resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} @@ -2485,6 +2659,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.25.1': + resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.18.20': resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} @@ -2497,6 +2677,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.25.1': + resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.18.20': resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} @@ -2509,6 +2695,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.25.1': + resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.18.20': resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} @@ -2521,6 +2713,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.25.1': + resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.18.20': resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} @@ -2533,6 +2731,18 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.25.1': + resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.1': + resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.18.20': resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} @@ -2545,6 +2755,18 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.1': + resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.1': + resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.18.20': resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} @@ -2557,6 +2779,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.1': + resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.18.20': resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} @@ -2569,6 +2797,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.25.1': + resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.18.20': resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} @@ -2581,6 +2815,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.25.1': + resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.18.20': resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} @@ -2593,6 +2833,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.25.1': + resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.18.20': resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} @@ -2605,6 +2851,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.25.1': + resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2615,14 +2867,38 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint/config-array@0.19.2': + resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.12.0': + resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@3.3.0': + resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@8.57.1': resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/js@9.21.0': + resolution: {integrity: sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.7': + resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@esm2cjs/execa@6.1.1-cjs.1': resolution: {integrity: sha512-FHxfnmuDIjY1VS/BLzDkL8EkbcFvi8s6x1nYQ1Nyu0An0n88EJcGhDBcRWLFwt3C3nT7xwI+MwHRH1TZcAFW2w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2655,6 +2931,26 @@ packages: resolution: {integrity: sha512-o41riCGPiOEStayoikBCAqwa6igbv9L9rP+k5UCfQ24EJD/wGrdDs/KTNwkHG5JzDK3T60D5dMkWkLKEPy8gjA==} engines: {node: '>=12'} + '@foliojs-fork/fontkit@1.9.2': + resolution: {integrity: sha512-IfB5EiIb+GZk+77TRB86AHroVaqfq8JRFlUbz0WEwsInyCG0epX2tCPOy+UfaWPju30DeVoUAXfzWXmhn753KA==} + + '@foliojs-fork/linebreak@1.1.2': + resolution: {integrity: sha512-ZPohpxxbuKNE0l/5iBJnOAfUaMACwvUIKCvqtWGKIMv1lPYoNjYXRfhi9FeeV9McBkBLxsMFWTVVhHJA8cyzvg==} + + '@foliojs-fork/pdfkit@0.15.3': + resolution: {integrity: sha512-Obc0Wmy3bm7BINFVvPhcl2rnSSK61DQrlHU8aXnAqDk9LCjWdUOPwhgD8Ywz5VtuFjRxmVOM/kQ/XLIBjDvltw==} + + '@foliojs-fork/restructure@2.0.2': + resolution: {integrity: sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA==} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -2668,6 +2964,119 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + engines: {node: '>=18.18'} + + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -2893,12 +3302,79 @@ packages: peerDependencies: jsep: ^0.4.0||^1.0.0 + '@microsoft/api-extractor-model@7.30.4': + resolution: {integrity: sha512-RobC0gyVYsd2Fao9MTKOfTdBm41P/bCMUmzS5mQ7/MoAKEqy0FOBph3JOYdq4X4BsEnMEiSHc+0NUNmdzxCpjA==} + + '@microsoft/api-extractor@7.52.1': + resolution: {integrity: sha512-m3I5uAwE05orsu3D1AGyisX5KxsgVXB+U4bWOOaX/Z7Ftp/2Cy41qsNhO6LPvSxHBaapyser5dVorF1t5M6tig==} + hasBin: true + '@microsoft/tsdoc-config@0.17.0': resolution: {integrity: sha512-v/EYRXnCAIHxOHW+Plb6OWuUoMotxTN0GLatnpOb1xq0KuTNw/WI3pamJx/UbsoJP5k9MCw1QxvvhPcF9pH3Zg==} + '@microsoft/tsdoc-config@0.17.1': + resolution: {integrity: sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==} + '@microsoft/tsdoc@0.15.0': resolution: {integrity: sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==} + '@microsoft/tsdoc@0.15.1': + resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} + + '@next/env@15.2.3': + resolution: {integrity: sha512-a26KnbW9DFEUsSxAxKBORR/uD9THoYoKbkpFywMN/AFvboTt94b8+g/07T8J6ACsdLag8/PDU60ov4rPxRAixw==} + + '@next/eslint-plugin-next@15.2.1': + resolution: {integrity: sha512-6ppeToFd02z38SllzWxayLxjjNfzvc7Wm07gQOKSLjyASvKcXjNStZrLXMHuaWkhjqxe+cnhb2uzfWXm1VEj/Q==} + + '@next/swc-darwin-arm64@15.2.3': + resolution: {integrity: sha512-uaBhA8aLbXLqwjnsHSkxs353WrRgQgiFjduDpc7YXEU0B54IKx3vU+cxQlYwPCyC8uYEEX7THhtQQsfHnvv8dw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@15.2.3': + resolution: {integrity: sha512-pVwKvJ4Zk7h+4hwhqOUuMx7Ib02u3gDX3HXPKIShBi9JlYllI0nU6TWLbPT94dt7FSi6mSBhfc2JrHViwqbOdw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@15.2.3': + resolution: {integrity: sha512-50ibWdn2RuFFkOEUmo9NCcQbbV9ViQOrUfG48zHBCONciHjaUKtHcYFiCwBVuzD08fzvzkWuuZkd4AqbvKO7UQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@15.2.3': + resolution: {integrity: sha512-2gAPA7P652D3HzR4cLyAuVYwYqjG0mt/3pHSWTCyKZq/N/dJcUAEoNQMyUmwTZWCJRKofB+JPuDVP2aD8w2J6Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@15.2.3': + resolution: {integrity: sha512-ODSKvrdMgAJOVU4qElflYy1KSZRM3M45JVbeZu42TINCMG3anp7YCBn80RkISV6bhzKwcUqLBAmOiWkaGtBA9w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@15.2.3': + resolution: {integrity: sha512-ZR9kLwCWrlYxwEoytqPi1jhPd1TlsSJWAc+H/CJHmHkf2nD92MQpSRIURR1iNgA/kuFSdxB8xIPt4p/T78kwsg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@15.2.3': + resolution: {integrity: sha512-+G2FrDcfm2YDbhDiObDU/qPriWeiz/9cRR0yMWJeTLGGX6/x8oryO3tt7HhodA1vZ8r2ddJPCjtLcpaVl7TE2Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-x64-msvc@15.2.3': + resolution: {integrity: sha512-gHYS9tc+G2W0ZC8rBL+H6RdtXIyk40uLiaos0yj5US85FNhbFEndMA2nW3z47nzOWiSvXTZ5kBClc3rD0zJg0w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -2911,6 +3387,10 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@nolyfill/is-core-module@1.0.39': + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -2951,92 +3431,214 @@ packages: peerDependencies: rollup: ^1.20.0 || ^2.0.0 - '@rollup/pluginutils@3.1.0': - resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} - engines: {node: '>= 8.0.0'} + '@rollup/plugin-terser@0.4.4': + resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-url@8.0.2': + resolution: {integrity: sha512-5yW2LP5NBEgkvIRSSEdJkmxe5cUNZKG3eenKtfJvSkxVm/xTTu7w+ayBtNwhozl1ZnTUCU0xFaRQR+cBl2H7TQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@3.1.0': + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0 + '@rollup/pluginutils@5.1.4': + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/rollup-android-arm-eabi@4.24.0': resolution: {integrity: sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==} cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.36.0': + resolution: {integrity: sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.24.0': resolution: {integrity: sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.36.0': + resolution: {integrity: sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.24.0': resolution: {integrity: sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.36.0': + resolution: {integrity: sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.24.0': resolution: {integrity: sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.36.0': + resolution: {integrity: sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.36.0': + resolution: {integrity: sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.36.0': + resolution: {integrity: sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.24.0': resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.36.0': + resolution: {integrity: sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.24.0': resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.36.0': + resolution: {integrity: sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.24.0': resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.36.0': + resolution: {integrity: sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.24.0': resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.36.0': + resolution: {integrity: sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.36.0': + resolution: {integrity: sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==} cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.36.0': + resolution: {integrity: sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.24.0': resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.36.0': + resolution: {integrity: sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.24.0': resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.36.0': + resolution: {integrity: sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.24.0': resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.36.0': + resolution: {integrity: sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.24.0': resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.36.0': + resolution: {integrity: sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==} + cpu: [x64] + os: [linux] + '@rollup/rollup-win32-arm64-msvc@4.24.0': resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.36.0': + resolution: {integrity: sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.24.0': resolution: {integrity: sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.36.0': + resolution: {integrity: sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.24.0': resolution: {integrity: sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.36.0': + resolution: {integrity: sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==} + cpu: [x64] + os: [win32] + '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} @@ -3085,6 +3687,14 @@ packages: engines: {node: '>=10.13.0'} hasBin: true + '@rushstack/node-core-library@5.12.0': + resolution: {integrity: sha512-QSwwzgzWoil1SCQse+yCHwlhRxNv2dX9siPnAb9zR/UmMhac4mjMrlMZpk64BlCeOFi1kJKgXRkihSwRMbboAQ==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + '@rushstack/node-core-library@5.9.0': resolution: {integrity: sha512-MMsshEWkTbXqxqFxD4gcIUWQOCeBChlGczdZbHfqmNZQFLHB3yWxDFSMHFUdu2/OB9NUk7Awn5qRL+rws4HQNg==} peerDependencies: @@ -3112,12 +3722,23 @@ packages: '@types/node': optional: true + '@rushstack/terminal@0.15.1': + resolution: {integrity: sha512-3vgJYwumcjoDOXU3IxZfd616lqOdmr8Ezj4OWgJZfhmiBK4Nh7eWcv8sU8N/HdzXcuHDXCRGn/6O2Q75QvaZMA==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + '@rushstack/tree-pattern@0.3.4': resolution: {integrity: sha512-9uROnkiHWsQqxW6HirXABfTRlgzhYp6tevbYIGkwKQ09VaayUBkvFvt/urDKMwlo+tGU0iQQLuVige6c48wTgw==} '@rushstack/ts-command-line@4.23.0': resolution: {integrity: sha512-jYREBtsxduPV6ptNq8jOKp9+yx0ld1Tb/Tkdnlj8gTjazl1sF3DwX2VbluyYrNd0meWIL0bNeer7WDf5tKFjaQ==} + '@rushstack/ts-command-line@4.23.6': + resolution: {integrity: sha512-7WepygaF3YPEoToh4MAL/mmHkiIImQq3/uAkQX46kVoKTNOOlCtFGyNnze6OYuWw2o9rxsyrHVfIBKxq/am2RA==} + '@sinclair/typebox@0.24.51': resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} @@ -3167,9 +3788,91 @@ packages: postcss: '>=7.0.0' postcss-syntax: '>=0.36.2' + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + '@swc/helpers@0.3.17': resolution: {integrity: sha512-tb7Iu+oZ+zWJZ3HJqwx8oNwSDIU440hmVMDPhpACWQWnrZHK99Bxs70gT1L2dnr5Hg50ZRWEFkQCAnOVVV0z1Q==} + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + + '@tailwindcss/node@4.0.9': + resolution: {integrity: sha512-tOJvdI7XfJbARYhxX+0RArAhmuDcczTC46DGCEziqxzzbIaPnfYaIyRT31n4u8lROrsO7Q6u/K9bmQHL2uL1bQ==} + + '@tailwindcss/oxide-android-arm64@4.0.9': + resolution: {integrity: sha512-YBgy6+2flE/8dbtrdotVInhMVIxnHJPbAwa7U1gX4l2ThUIaPUp18LjB9wEH8wAGMBZUb//SzLtdXXNBHPUl6Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.0.9': + resolution: {integrity: sha512-pWdl4J2dIHXALgy2jVkwKBmtEb73kqIfMpYmcgESr7oPQ+lbcQ4+tlPeVXaSAmang+vglAfFpXQCOvs/aGSqlw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.0.9': + resolution: {integrity: sha512-4Dq3lKp0/C7vrRSkNPtBGVebEyWt9QPPlQctxJ0H3MDyiQYvzVYf8jKow7h5QkWNe8hbatEqljMj/Y0M+ERYJg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.0.9': + resolution: {integrity: sha512-k7U1RwRODta8x0uealtVt3RoWAWqA+D5FAOsvVGpYoI6ObgmnzqWW6pnVwz70tL8UZ/QXjeMyiICXyjzB6OGtQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.9': + resolution: {integrity: sha512-NDDjVweHz2zo4j+oS8y3KwKL5wGCZoXGA9ruJM982uVJLdsF8/1AeKvUwKRlMBpxHt1EdWJSAh8a0Mfhl28GlQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.0.9': + resolution: {integrity: sha512-jk90UZ0jzJl3Dy1BhuFfRZ2KP9wVKMXPjmCtY4U6fF2LvrjP5gWFJj5VHzfzHonJexjrGe1lMzgtjriuZkxagg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.0.9': + resolution: {integrity: sha512-3eMjyTC6HBxh9nRgOHzrc96PYh1/jWOwHZ3Kk0JN0Kl25BJ80Lj9HEvvwVDNTgPg154LdICwuFLuhfgH9DULmg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.0.9': + resolution: {integrity: sha512-v0D8WqI/c3WpWH1kq/HP0J899ATLdGZmENa2/emmNjubT0sWtEke9W9+wXeEoACuGAhF9i3PO5MeyditpDCiWQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.0.9': + resolution: {integrity: sha512-Kvp0TCkfeXyeehqLJr7otsc4hd/BUPfcIGrQiwsTVCfaMfjQZCG7DjI+9/QqPZha8YapLA9UoIcUILRYO7NE1Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-win32-arm64-msvc@4.0.9': + resolution: {integrity: sha512-m3+60T/7YvWekajNq/eexjhV8z10rswcz4BC9bioJ7YaN+7K8W2AmLmG0B79H14m6UHE571qB0XsPus4n0QVgQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.0.9': + resolution: {integrity: sha512-dpc05mSlqkwVNOUjGu/ZXd5U1XNch1kHFJ4/cHkZFvaW1RzbHmRt24gvM8/HC6IirMxNarzVw4IXVtvrOoZtxA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.0.9': + resolution: {integrity: sha512-eLizHmXFqHswJONwfqi/WZjtmWZpIalpvMlNhTM99/bkHtUs6IqgI1XQ0/W5eO2HiRQcIlXUogI2ycvKhVLNcA==} + engines: {node: '>= 10'} + + '@tailwindcss/postcss@4.0.9': + resolution: {integrity: sha512-BT/E+pdMqulavEAVM5NCpxmGEwHiLDPpkmg/c/X25ZBW+izTe+aZ+v1gf/HXTrihRoCxrUp5U4YyHsBTzspQKQ==} + '@testing-library/dom@8.20.1': resolution: {integrity: sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==} engines: {node: '>=12'} @@ -3254,6 +3957,9 @@ packages: '@types/node@18.19.57': resolution: {integrity: sha512-I2ioBd/IPrYDMv9UNR5NlPElOZ68QB7yY5V2EsLtSrTO0LM0PnCEFF9biLWHf5k+sIy4ohueCV9t4gk1AEdlVA==} + '@types/node@20.17.23': + resolution: {integrity: sha512-8PCGZ1ZJbEZuYNTMqywO+Sj4vSKjSjT6Ua+6RFOYlEvIvKQABPtrNkoVSLSKDb4obYcMhspVKmsw8Cm10NFRUg==} + '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -3272,12 +3978,23 @@ packages: '@types/pdfmake@0.1.21': resolution: {integrity: sha512-rDmJr/jzUZSg/AzWYAMVBS4z4weZKTOtrD6Jlt+hzZu87bkIe7WVA02+m+uGGopyTUazFoWYT6HXxwT68Nqfeg==} + '@types/pdfmake@0.2.11': + resolution: {integrity: sha512-gglgMQhnG6C2kco13DJlvokqTxL+XKxHwCejElH8fSCNF9ZCkRK6Mzo011jQ0zuug+YlIgn6BpcpZrARyWdW3Q==} + '@types/prettier@1.19.1': resolution: {integrity: sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==} '@types/prettier@2.7.3': resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + '@types/react-dom@19.0.4': + resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} + peerDependencies: + '@types/react': ^19.0.0 + + '@types/react@19.0.10': + resolution: {integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==} + '@types/resolve@1.17.1': resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} @@ -3534,6 +4251,35 @@ packages: '@vitest/utils@2.1.3': resolution: {integrity: sha512-xpiVfDSg1RrYT0tX6czgerkpcKFmFOF/gCr30+Mve5V2kewCy4Prn1/NDMSRwaSmT7PRaOF83wu+bEtsY1wrvA==} + '@volar/language-core@2.4.12': + resolution: {integrity: sha512-RLrFdXEaQBWfSnYGVxvR2WrO6Bub0unkdHYIdC31HzIEqATIuuhRRzYu76iGPZ6OtA4Au1SnW0ZwIqPP217YhA==} + + '@volar/source-map@2.4.12': + resolution: {integrity: sha512-bUFIKvn2U0AWojOaqf63ER0N/iHIBYZPpNGogfLPQ68F5Eet6FnLlyho7BS0y2HJ1jFhSif7AcuTx1TqsCzRzw==} + + '@volar/typescript@2.4.12': + resolution: {integrity: sha512-HJB73OTJDgPc80K30wxi3if4fSsZZAOScbj2fcicMuOPoOkcf9NNAINb33o+DzhBdF9xTKC1gnPmIRDous5S0g==} + + '@vue/compiler-core@3.5.13': + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + + '@vue/compiler-dom@3.5.13': + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + + '@vue/language-core@2.2.0': + resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/shared@3.5.13': + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + '@webassemblyjs/ast@1.12.1': resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} @@ -3665,6 +4411,9 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + alien-signals@0.4.14: + resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -3980,6 +4729,9 @@ packages: resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} engines: {node: '>= 0.4'} + base64-js@1.3.1: + resolution: {integrity: sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -4036,6 +4788,10 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + bytes-iec@3.1.1: resolution: {integrity: sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA==} engines: {node: '>= 0.8'} @@ -4163,6 +4919,9 @@ packages: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} @@ -4206,6 +4965,13 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -4220,12 +4986,21 @@ packages: commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + component-emitter@1.3.1: resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.1: + resolution: {integrity: sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==} + confusing-browser-globals@1.0.11: resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} @@ -4267,6 +5042,10 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} @@ -4291,6 +5070,9 @@ packages: resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} engines: {node: '>=8'} + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + curp@1.2.3: resolution: {integrity: sha512-o/NZE+1A1y77orlN8kBRa4+yG4m1owVI9V2KzEpHDV1z2k90rPCHuECYmXLyW4bcYOHdTf36EJuz6KWLn/hyKg==} engines: {npm: '>= 8.0.0'} @@ -4324,6 +5106,9 @@ packages: resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} engines: {node: '>= 0.4'} + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} @@ -4339,6 +5124,15 @@ packages: supports-color: optional: true + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} @@ -4373,6 +5167,10 @@ packages: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} + deep-equal@1.1.2: + resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==} + engines: {node: '>= 0.4'} + deep-equal@2.2.3: resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} engines: {node: '>= 0.4'} @@ -4411,6 +5209,15 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -4513,6 +5320,10 @@ packages: resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} engines: {node: '>=10.13.0'} + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} + enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -4523,6 +5334,10 @@ packages: entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -4698,6 +5513,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.25.1: + resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -4724,6 +5544,15 @@ packages: engines: {node: '>=6.0'} hasBin: true + eslint-config-next@15.2.1: + resolution: {integrity: sha512-mhsprz7l0no8X+PdDnVHF4dZKu9YBJp2Rf6ztWbXBLJ4h6gxmW//owbbGJMBVUU+PibGJDAqZhW4pt8SC8HSow==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + eslint-config-prettier@6.15.0: resolution: {integrity: sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==} hasBin: true @@ -4759,6 +5588,19 @@ packages: eslint: '*' eslint-plugin-import: '*' + eslint-import-resolver-typescript@3.8.3: + resolution: {integrity: sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + eslint-module-utils@2.12.0: resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} engines: {node: '>=4'} @@ -4839,6 +5681,12 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + eslint-plugin-react@7.33.2: resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} engines: {node: '>=4'} @@ -4868,6 +5716,10 @@ packages: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-utils@1.4.3: resolution: {integrity: sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==} engines: {node: '>=6'} @@ -4884,6 +5736,10 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint@6.8.0: resolution: {integrity: sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -4896,6 +5752,20 @@ packages: deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true + eslint@9.21.0: + resolution: {integrity: sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@6.2.1: resolution: {integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==} engines: {node: '>=6.0.0'} @@ -4931,6 +5801,9 @@ packages: estree-walker@1.0.1: resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -4988,6 +5861,9 @@ packages: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + exsolve@1.0.4: + resolution: {integrity: sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==} + extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} @@ -5017,6 +5893,10 @@ packages: fast-diff@1.3.0: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -5048,6 +5928,14 @@ packages: picomatch: optional: true + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fetch-mock-jest@1.5.1: resolution: {integrity: sha512-+utwzP8C+Pax1GSka3nFXILWMY3Er2L+s090FOgqVNrNCPp0fDqgXnAHAJf12PLHi0z4PhcTaZNTz8e7K3fjqQ==} engines: {node: '>=8.0.0'} @@ -5081,6 +5969,10 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + file-saver@2.0.5: resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} @@ -5115,6 +6007,10 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + flatted@2.0.2: resolution: {integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==} @@ -5162,6 +6058,10 @@ packages: resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} engines: {node: '>=0.10.0'} + fs-extra@11.3.0: + resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + engines: {node: '>=14.14'} + fs-extra@3.0.1: resolution: {integrity: sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==} @@ -5242,6 +6142,9 @@ packages: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} + get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + get-uri@2.0.4: resolution: {integrity: sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q==} @@ -5300,6 +6203,10 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -5553,6 +6460,9 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + is-async-function@2.0.0: resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} engines: {node: '>= 0.4'} @@ -5586,6 +6496,9 @@ packages: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} + is-bun-module@1.3.0: + resolution: {integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==} + is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -6227,9 +7140,16 @@ packages: node-notifier: optional: true + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + jpeg-exif@1.1.4: + resolution: {integrity: sha512-a+bKEcCjtuW5WTdgeXFzswSrdqi0jk4XlEtZlx5A94wCoBpFjfFTbo/Tra5SpNCl/YFZPvcV1dJc+TAYeg6ROQ==} + jpjs@1.2.1: resolution: {integrity: sha512-GxJWybWU4NV0RNKi6EIqk6IRPOTqd/h+U7sbtyuD7yUISUzV78LdHnq2xkevJsTlz/EImux4sWj+wfMiwKLkiw==} @@ -6352,6 +7272,9 @@ packages: known-css-properties@0.21.0: resolution: {integrity: sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==} + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -6371,20 +7294,88 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - - linebreak@1.1.0: - resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==} + lightningcss-darwin-arm64@1.29.1: + resolution: {integrity: sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lightningcss-darwin-x64@1.29.1: + resolution: {integrity: sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] - loader-runner@4.3.0: + lightningcss-freebsd-x64@1.29.1: + resolution: {integrity: sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.29.1: + resolution: {integrity: sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.29.1: + resolution: {integrity: sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.29.1: + resolution: {integrity: sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.29.1: + resolution: {integrity: sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.29.1: + resolution: {integrity: sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.29.1: + resolution: {integrity: sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.29.1: + resolution: {integrity: sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.29.1: + resolution: {integrity: sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==} + engines: {node: '>= 12.0.0'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + linebreak@1.1.0: + resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} + local-pkg@1.1.1: + resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} + engines: {node: '>=14'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -6466,6 +7457,9 @@ packages: magic-string@0.30.12: resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} @@ -6541,6 +7535,11 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + mimic-fn@1.2.0: resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} engines: {node: '>=4'} @@ -6557,6 +7556,9 @@ packages: resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} engines: {node: 20 || >=22} + minimatch@3.0.8: + resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -6592,6 +7594,9 @@ packages: engines: {node: '>=10'} hasBin: true + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + moment-timezone@0.5.46: resolution: {integrity: sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==} @@ -6612,6 +7617,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} @@ -6620,6 +7628,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + nanomatch@1.2.13: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} @@ -6636,6 +7649,27 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + next@15.2.3: + resolution: {integrity: sha512-x6eDkZxk2rPpu46E1ZVUWIBhYCLszmUY6fvHBFcbzJ9dD+qRX6vcHusaqqDlnY+VngKzKbAiG2iRCkPbmi8f7w==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + nice-napi@1.0.2: resolution: {integrity: sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==} os: ['!win32'] @@ -6861,6 +7895,9 @@ packages: resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} engines: {node: '>=0.10.0'} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -6898,6 +7935,9 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pathval@2.0.0: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} @@ -6913,6 +7953,10 @@ packages: resolution: {integrity: sha512-xZrPS+Safjf1I8ZYtMoXX83E6C6Pd1zFwa168yNTeeJWHclqf1z9DoYajjlY2uviN7gGyxwVZeou39uSk1oh1g==} engines: {node: '>=8'} + pdfmake@0.2.18: + resolution: {integrity: sha512-Fe+GnMS8EVZu5rci/CDaQ+xmUoHvx8P+rvIlrwSYM6A5c7Aik8G6lpJbddhjBE2jXGjv6WcUCFCB06uZbjxkMw==} + engines: {node: '>=18'} + performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} @@ -6941,6 +7985,12 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.1.0: + resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} + pn@1.1.0: resolution: {integrity: sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==} @@ -7006,10 +8056,18 @@ packages: resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} engines: {node: '>=6.0.0'} + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + postcss@8.4.47: resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} @@ -7087,6 +8145,9 @@ packages: resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} engines: {node: '>=0.6'} + quansync@0.2.10: + resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + querystring@0.2.1: resolution: {integrity: sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==} engines: {node: '>=0.4.x'} @@ -7105,6 +8166,11 @@ packages: randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + react-dom@19.0.0: + resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} + peerDependencies: + react: ^19.0.0 + react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -7114,6 +8180,10 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react@19.0.0: + resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} + engines: {node: '>=0.10.0'} + read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} @@ -7259,6 +8329,9 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve-url@0.2.1: resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} deprecated: https://github.com/lydell/resolve-url#deprecated @@ -7358,6 +8431,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.36.0: + resolution: {integrity: sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + rsvp@4.8.5: resolution: {integrity: sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==} engines: {node: 6.* || >= 7.*} @@ -7417,6 +8495,9 @@ packages: resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} engines: {node: '>=10'} + scheduler@0.25.0: + resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} @@ -7444,6 +8525,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + serialize-javascript@4.0.0: resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} @@ -7465,6 +8551,10 @@ packages: resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} engines: {node: '>=0.10.0'} + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -7507,6 +8597,9 @@ packages: resolution: {integrity: sha512-2EoTElzj77w0hV4lW6nWdA+MR+81hviMBhEc/ppUi0+Q311EFCvwKrGS7dcxqvGRKnUdbAyqPJtBQbRYgmtmvQ==} engines: {'0': node >= 0.2.0} + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + sirv@2.0.4: resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} engines: {node: '>= 10'} @@ -7535,6 +8628,9 @@ packages: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} + smob@1.5.0: + resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + snapdragon-node@2.1.1: resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} engines: {node: '>=0.10.0'} @@ -7613,6 +8709,9 @@ packages: engines: {node: '>=0.10.0'} hasBin: true + stable-hash@0.0.4: + resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} + stack-utils@1.0.5: resolution: {integrity: sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==} engines: {node: '>=8'} @@ -7639,6 +8738,10 @@ packages: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} engines: {node: '>= 0.4'} + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -7748,6 +8851,19 @@ packages: style-search@0.1.0: resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==} + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + stylelint-config-recommended@5.0.0: resolution: {integrity: sha512-c8aubuARSu5A3vEHLBeOSJt1udOdS+1iue7BmJDTSXoCBmfEQmmWX+59vYIj3NQdJBY6a/QRv1ozVFpaB9jaqA==} peerDependencies: @@ -7811,6 +8927,9 @@ packages: resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} engines: {node: '>=10.0.0'} + tailwindcss@4.0.9: + resolution: {integrity: sha512-12laZu+fv1ONDRoNR9ipTOpUD7RN9essRVkX36sjxuRUInpN7hIiHN4lBd/SIFjbISvnXzp8h/hXzmU8SQQYhw==} + tapable@1.1.3: resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} engines: {node: '>=6'} @@ -7878,6 +8997,10 @@ packages: tinyexec@0.3.1: resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} + tinyglobby@0.2.9: resolution: {integrity: sha512-8or1+BGEdk1Zkkw2ii16qSS7uVrQJPre5A9o/XkWPATkk23FZh/15BKFxPnlTy6vkljZxLqYCzzBMj30ZrSvjw==} engines: {node: '>=12.0.0'} @@ -8033,6 +9156,9 @@ packages: tslib@2.8.0: resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsutils@3.21.0: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -8110,12 +9236,28 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.7.2: + resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.8.2: + resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} engines: {node: '>=4'} @@ -8237,6 +9379,15 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true + vite-plugin-dts@4.5.3: + resolution: {integrity: sha512-P64VnD00dR+e8S26ESoFELqc17+w7pKkwlBpgXteOljFyT0zDwD8hH4zXp49M/kciy//7ZbVXIwQCekBJjfWzA==} + peerDependencies: + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: + optional: true + vite-tsconfig-paths@4.2.3: resolution: {integrity: sha512-xVsA2xe6QSlzBujtWF8q2NYexh7PAUYfzJ4C8Axpe/7d2pcERYxuxGgph9F4f0iQO36g5tyGq6eBUYIssdUrVw==} peerDependencies: @@ -8304,6 +9455,46 @@ packages: terser: optional: true + vite@6.2.2: + resolution: {integrity: sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vitest@2.1.3: resolution: {integrity: sha512-Zrxbg/WiIvUP2uEzelDNTXmEMJXuzJ1kCpbDvaKByFA9MNeO95V+7r/3ti0qzJzrxdyuUw5VduN7k+D3VmVOSA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -8329,6 +9520,9 @@ packages: jsdom: optional: true + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + w3c-hr-time@1.0.2: resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} deprecated: Use your platform's native performance.now() and performance.timeOrigin. @@ -8601,6 +9795,8 @@ snapshots: '@adobe/css-tools@4.4.0': {} + '@alloc/quick-lru@5.2.0': {} + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.5 @@ -9374,6 +10570,11 @@ snapshots: exec-sh: 0.3.6 minimist: 1.2.8 + '@emnapi/runtime@1.3.1': + dependencies: + tslib: 2.8.1 + optional: true + '@es-joy/jsdoccomment@0.36.1': dependencies: comment-parser: 1.3.1 @@ -9383,66 +10584,99 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true + '@esbuild/aix-ppc64@0.25.1': + optional: true + '@esbuild/android-arm64@0.18.20': optional: true '@esbuild/android-arm64@0.21.5': optional: true + '@esbuild/android-arm64@0.25.1': + optional: true + '@esbuild/android-arm@0.18.20': optional: true '@esbuild/android-arm@0.21.5': optional: true + '@esbuild/android-arm@0.25.1': + optional: true + '@esbuild/android-x64@0.18.20': optional: true '@esbuild/android-x64@0.21.5': optional: true + '@esbuild/android-x64@0.25.1': + optional: true + '@esbuild/darwin-arm64@0.18.20': optional: true '@esbuild/darwin-arm64@0.21.5': optional: true + '@esbuild/darwin-arm64@0.25.1': + optional: true + '@esbuild/darwin-x64@0.18.20': optional: true '@esbuild/darwin-x64@0.21.5': optional: true + '@esbuild/darwin-x64@0.25.1': + optional: true + '@esbuild/freebsd-arm64@0.18.20': optional: true '@esbuild/freebsd-arm64@0.21.5': optional: true + '@esbuild/freebsd-arm64@0.25.1': + optional: true + '@esbuild/freebsd-x64@0.18.20': optional: true '@esbuild/freebsd-x64@0.21.5': optional: true + '@esbuild/freebsd-x64@0.25.1': + optional: true + '@esbuild/linux-arm64@0.18.20': optional: true '@esbuild/linux-arm64@0.21.5': optional: true + '@esbuild/linux-arm64@0.25.1': + optional: true + '@esbuild/linux-arm@0.18.20': optional: true '@esbuild/linux-arm@0.21.5': optional: true + '@esbuild/linux-arm@0.25.1': + optional: true + '@esbuild/linux-ia32@0.18.20': optional: true '@esbuild/linux-ia32@0.21.5': optional: true + '@esbuild/linux-ia32@0.25.1': + optional: true + '@esbuild/linux-loong64@0.14.54': optional: true @@ -9452,79 +10686,138 @@ snapshots: '@esbuild/linux-loong64@0.21.5': optional: true + '@esbuild/linux-loong64@0.25.1': + optional: true + '@esbuild/linux-mips64el@0.18.20': optional: true '@esbuild/linux-mips64el@0.21.5': optional: true + '@esbuild/linux-mips64el@0.25.1': + optional: true + '@esbuild/linux-ppc64@0.18.20': optional: true '@esbuild/linux-ppc64@0.21.5': optional: true + '@esbuild/linux-ppc64@0.25.1': + optional: true + '@esbuild/linux-riscv64@0.18.20': optional: true '@esbuild/linux-riscv64@0.21.5': optional: true + '@esbuild/linux-riscv64@0.25.1': + optional: true + '@esbuild/linux-s390x@0.18.20': optional: true '@esbuild/linux-s390x@0.21.5': optional: true + '@esbuild/linux-s390x@0.25.1': + optional: true + '@esbuild/linux-x64@0.18.20': optional: true '@esbuild/linux-x64@0.21.5': optional: true + '@esbuild/linux-x64@0.25.1': + optional: true + + '@esbuild/netbsd-arm64@0.25.1': + optional: true + '@esbuild/netbsd-x64@0.18.20': optional: true '@esbuild/netbsd-x64@0.21.5': optional: true + '@esbuild/netbsd-x64@0.25.1': + optional: true + + '@esbuild/openbsd-arm64@0.25.1': + optional: true + '@esbuild/openbsd-x64@0.18.20': optional: true '@esbuild/openbsd-x64@0.21.5': optional: true + '@esbuild/openbsd-x64@0.25.1': + optional: true + '@esbuild/sunos-x64@0.18.20': optional: true '@esbuild/sunos-x64@0.21.5': optional: true + '@esbuild/sunos-x64@0.25.1': + optional: true + '@esbuild/win32-arm64@0.18.20': optional: true '@esbuild/win32-arm64@0.21.5': optional: true + '@esbuild/win32-arm64@0.25.1': + optional: true + '@esbuild/win32-ia32@0.18.20': optional: true '@esbuild/win32-ia32@0.21.5': optional: true + '@esbuild/win32-ia32@0.25.1': + optional: true + '@esbuild/win32-x64@0.18.20': optional: true '@esbuild/win32-x64@0.21.5': optional: true + '@esbuild/win32-x64@0.25.1': + optional: true + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.1)': dependencies: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.4.0(eslint@9.21.0(jiti@2.4.2))': + dependencies: + eslint: 9.21.0(jiti@2.4.2) + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.12.1': {} + '@eslint/config-array@0.19.2': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.3.7(supports-color@9.4.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/core@0.12.0': + dependencies: + '@types/json-schema': 7.0.15 + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 @@ -9539,8 +10832,31 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/eslintrc@3.3.0': + dependencies: + ajv: 6.12.6 + debug: 4.3.7(supports-color@9.4.0) + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + '@eslint/js@8.57.1': {} + '@eslint/js@9.21.0': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.2.7': + dependencies: + '@eslint/core': 0.12.0 + levn: 0.4.1 + '@esm2cjs/execa@6.1.1-cjs.1': dependencies: '@esm2cjs/human-signals': 3.0.1 @@ -9571,6 +10887,39 @@ snapshots: '@esm2cjs/strip-final-newline@3.0.1-cjs.0': {} + '@foliojs-fork/fontkit@1.9.2': + dependencies: + '@foliojs-fork/restructure': 2.0.2 + brotli: 1.3.3 + clone: 1.0.4 + deep-equal: 1.1.2 + dfa: 1.2.0 + tiny-inflate: 1.0.3 + unicode-properties: 1.4.1 + unicode-trie: 2.0.0 + + '@foliojs-fork/linebreak@1.1.2': + dependencies: + base64-js: 1.3.1 + unicode-trie: 2.0.0 + + '@foliojs-fork/pdfkit@0.15.3': + dependencies: + '@foliojs-fork/fontkit': 1.9.2 + '@foliojs-fork/linebreak': 1.1.2 + crypto-js: 4.2.0 + jpeg-exif: 1.1.4 + png-js: 1.0.0 + + '@foliojs-fork/restructure@2.0.2': {} + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -9583,9 +10932,88 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.2': {} + + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.3.1 + optional: true + + '@img/sharp-win32-ia32@0.33.5': + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 string-width-cjs: string-width@4.2.3 strip-ansi: 7.1.0 strip-ansi-cjs: strip-ansi@6.0.1 @@ -9613,7 +11041,7 @@ snapshots: '@jest/console@28.1.3': dependencies: '@jest/types': 28.1.3 - '@types/node': 18.19.57 + '@types/node': 20.17.23 chalk: 4.1.2 jest-message-util: 28.1.3 jest-util: 28.1.3 @@ -9622,7 +11050,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 18.19.57 + '@types/node': 20.17.23 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -9671,14 +11099,14 @@ snapshots: '@jest/test-result': 28.1.3 '@jest/transform': 28.1.3(supports-color@9.4.0) '@jest/types': 28.1.3 - '@types/node': 18.19.57 + '@types/node': 20.17.23 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 28.1.3 - jest-config: 28.1.3(@types/node@18.19.57) + jest-config: 28.1.3(@types/node@20.17.23) jest-haste-map: 28.1.3 jest-message-util: 28.1.3 jest-regex-util: 28.0.2 @@ -9706,14 +11134,14 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.5.0 '@jest/types': 29.6.3 - '@types/node': 18.19.57 + '@types/node': 20.17.23 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.5.0(@types/node@18.19.57) + jest-config: 29.5.0(@types/node@20.17.23) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -9744,14 +11172,14 @@ snapshots: dependencies: '@jest/fake-timers': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 18.19.57 + '@types/node': 20.17.23 jest-mock: 28.1.3 '@jest/environment@29.7.0': dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.57 + '@types/node': 20.17.23 jest-mock: 29.7.0 '@jest/expect-utils@28.1.3': @@ -9788,7 +11216,7 @@ snapshots: dependencies: '@jest/types': 28.1.3 '@sinonjs/fake-timers': 9.1.2 - '@types/node': 18.19.57 + '@types/node': 20.17.23 jest-message-util: 28.1.3 jest-mock: 28.1.3 jest-util: 28.1.3 @@ -9797,7 +11225,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 18.19.57 + '@types/node': 20.17.23 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -9864,7 +11292,7 @@ snapshots: '@jest/transform': 28.1.3(supports-color@9.4.0) '@jest/types': 28.1.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 18.19.57 + '@types/node': 20.17.23 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -9894,7 +11322,7 @@ snapshots: '@jest/transform': 29.5.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 18.19.57 + '@types/node': 20.17.23 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -10082,7 +11510,7 @@ snapshots: '@jest/schemas': 28.1.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 18.19.57 + '@types/node': 20.17.23 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -10091,7 +11519,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 18.19.57 + '@types/node': 20.17.23 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -10125,6 +11553,32 @@ snapshots: dependencies: jsep: 1.4.0 + '@microsoft/api-extractor-model@7.30.4(@types/node@20.17.23)': + dependencies: + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.12.0(@types/node@20.17.23) + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.52.1(@types/node@20.17.23)': + dependencies: + '@microsoft/api-extractor-model': 7.30.4(@types/node@20.17.23) + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.12.0(@types/node@20.17.23) + '@rushstack/rig-package': 0.5.3 + '@rushstack/terminal': 0.15.1(@types/node@20.17.23) + '@rushstack/ts-command-line': 4.23.6(@types/node@20.17.23) + lodash: 4.17.21 + minimatch: 3.0.8 + resolve: 1.22.8 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.8.2 + transitivePeerDependencies: + - '@types/node' + '@microsoft/tsdoc-config@0.17.0': dependencies: '@microsoft/tsdoc': 0.15.0 @@ -10132,8 +11586,47 @@ snapshots: jju: 1.4.0 resolve: 1.22.8 + '@microsoft/tsdoc-config@0.17.1': + dependencies: + '@microsoft/tsdoc': 0.15.1 + ajv: 8.12.0 + jju: 1.4.0 + resolve: 1.22.8 + '@microsoft/tsdoc@0.15.0': {} + '@microsoft/tsdoc@0.15.1': {} + + '@next/env@15.2.3': {} + + '@next/eslint-plugin-next@15.2.1': + dependencies: + fast-glob: 3.3.1 + + '@next/swc-darwin-arm64@15.2.3': + optional: true + + '@next/swc-darwin-x64@15.2.3': + optional: true + + '@next/swc-linux-arm64-gnu@15.2.3': + optional: true + + '@next/swc-linux-arm64-musl@15.2.3': + optional: true + + '@next/swc-linux-x64-gnu@15.2.3': + optional: true + + '@next/swc-linux-x64-musl@15.2.3': + optional: true + + '@next/swc-win32-arm64-msvc@15.2.3': + optional: true + + '@next/swc-win32-x64-msvc@15.2.3': + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -10146,6 +11639,8 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@nolyfill/is-core-module@1.0.39': {} + '@pkgjs/parseargs@0.11.0': optional: true @@ -10194,6 +11689,22 @@ snapshots: magic-string: 0.25.9 rollup: 1.32.1 + '@rollup/plugin-terser@0.4.4(rollup@4.36.0)': + dependencies: + serialize-javascript: 6.0.2 + smob: 1.5.0 + terser: 5.36.0 + optionalDependencies: + rollup: 4.36.0 + + '@rollup/plugin-url@8.0.2(rollup@4.36.0)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.36.0) + make-dir: 3.1.0 + mime: 3.0.0 + optionalDependencies: + rollup: 4.36.0 + '@rollup/pluginutils@3.1.0(rollup@1.32.1)': dependencies: '@types/estree': 0.0.39 @@ -10201,54 +11712,119 @@ snapshots: picomatch: 2.3.1 rollup: 1.32.1 + '@rollup/pluginutils@5.1.4(rollup@4.36.0)': + dependencies: + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.36.0 + '@rollup/rollup-android-arm-eabi@4.24.0': optional: true + '@rollup/rollup-android-arm-eabi@4.36.0': + optional: true + '@rollup/rollup-android-arm64@4.24.0': optional: true + '@rollup/rollup-android-arm64@4.36.0': + optional: true + '@rollup/rollup-darwin-arm64@4.24.0': optional: true + '@rollup/rollup-darwin-arm64@4.36.0': + optional: true + '@rollup/rollup-darwin-x64@4.24.0': optional: true + '@rollup/rollup-darwin-x64@4.36.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.36.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.36.0': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.24.0': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.36.0': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.24.0': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.36.0': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.24.0': optional: true + '@rollup/rollup-linux-arm64-gnu@4.36.0': + optional: true + '@rollup/rollup-linux-arm64-musl@4.24.0': optional: true + '@rollup/rollup-linux-arm64-musl@4.36.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.36.0': + optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.36.0': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.24.0': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.36.0': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.24.0': optional: true + '@rollup/rollup-linux-s390x-gnu@4.36.0': + optional: true + '@rollup/rollup-linux-x64-gnu@4.24.0': optional: true + '@rollup/rollup-linux-x64-gnu@4.36.0': + optional: true + '@rollup/rollup-linux-x64-musl@4.24.0': optional: true + '@rollup/rollup-linux-x64-musl@4.36.0': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.24.0': optional: true + '@rollup/rollup-win32-arm64-msvc@4.36.0': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.24.0': optional: true + '@rollup/rollup-win32-ia32-msvc@4.36.0': + optional: true + '@rollup/rollup-win32-x64-msvc@4.24.0': optional: true + '@rollup/rollup-win32-x64-msvc@4.36.0': + optional: true + '@rtsao/scc@1.1.0': {} '@rushstack/eslint-config@4.0.2(eslint@8.57.1)(typescript@5.6.3)': @@ -10307,16 +11883,25 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@rushstack/heft-jest-plugin@0.12.18(@rushstack/heft@0.68.6(@types/node@18.19.57))(@types/node@18.19.57)(jest-environment-node@29.7.0)': + '@rushstack/heft-config-file@0.15.8(@types/node@20.17.23)': + dependencies: + '@rushstack/node-core-library': 5.9.0(@types/node@20.17.23) + '@rushstack/rig-package': 0.5.3 + '@rushstack/terminal': 0.14.2(@types/node@20.17.23) + jsonpath-plus: 10.1.0 + transitivePeerDependencies: + - '@types/node' + + '@rushstack/heft-jest-plugin@0.12.18(@rushstack/heft@0.68.6(@types/node@20.17.23))(@types/node@20.17.23)(jest-environment-node@29.7.0)': dependencies: '@jest/core': 29.5.0 '@jest/reporters': 29.5.0 '@jest/transform': 29.5.0 - '@rushstack/heft': 0.68.6(@types/node@18.19.57) - '@rushstack/heft-config-file': 0.15.8(@types/node@18.19.57) - '@rushstack/node-core-library': 5.9.0(@types/node@18.19.57) - '@rushstack/terminal': 0.14.2(@types/node@18.19.57) - jest-config: 29.5.0(@types/node@18.19.57) + '@rushstack/heft': 0.68.6(@types/node@20.17.23) + '@rushstack/heft-config-file': 0.15.8(@types/node@20.17.23) + '@rushstack/node-core-library': 5.9.0(@types/node@20.17.23) + '@rushstack/terminal': 0.14.2(@types/node@20.17.23) + jest-config: 29.5.0(@types/node@20.17.23) jest-resolve: 29.5.0 jest-snapshot: 29.5.0 lodash: 4.17.21 @@ -10346,6 +11931,36 @@ snapshots: transitivePeerDependencies: - '@types/node' + '@rushstack/heft@0.68.6(@types/node@20.17.23)': + dependencies: + '@rushstack/heft-config-file': 0.15.8(@types/node@20.17.23) + '@rushstack/node-core-library': 5.9.0(@types/node@20.17.23) + '@rushstack/operation-graph': 0.2.33(@types/node@20.17.23) + '@rushstack/rig-package': 0.5.3 + '@rushstack/terminal': 0.14.2(@types/node@20.17.23) + '@rushstack/ts-command-line': 4.23.0(@types/node@20.17.23) + '@types/tapable': 1.0.6 + fast-glob: 3.3.2 + git-repo-info: 2.1.1 + ignore: 5.1.9 + tapable: 1.1.3 + watchpack: 2.4.0 + transitivePeerDependencies: + - '@types/node' + + '@rushstack/node-core-library@5.12.0(@types/node@20.17.23)': + dependencies: + ajv: 8.13.0 + ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv-formats: 3.0.1 + fs-extra: 11.3.0 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.8 + semver: 7.5.4 + optionalDependencies: + '@types/node': 20.17.23 + '@rushstack/node-core-library@5.9.0(@types/node@18.19.57)': dependencies: ajv: 8.13.0 @@ -10359,6 +11974,19 @@ snapshots: optionalDependencies: '@types/node': 18.19.57 + '@rushstack/node-core-library@5.9.0(@types/node@20.17.23)': + dependencies: + ajv: 8.13.0 + ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv-formats: 3.0.1 + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.8 + semver: 7.5.4 + optionalDependencies: + '@types/node': 20.17.23 + '@rushstack/operation-graph@0.2.33(@types/node@18.19.57)': dependencies: '@rushstack/node-core-library': 5.9.0(@types/node@18.19.57) @@ -10366,6 +11994,13 @@ snapshots: optionalDependencies: '@types/node': 18.19.57 + '@rushstack/operation-graph@0.2.33(@types/node@20.17.23)': + dependencies: + '@rushstack/node-core-library': 5.9.0(@types/node@20.17.23) + '@rushstack/terminal': 0.14.2(@types/node@20.17.23) + optionalDependencies: + '@types/node': 20.17.23 + '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.8 @@ -10378,6 +12013,20 @@ snapshots: optionalDependencies: '@types/node': 18.19.57 + '@rushstack/terminal@0.14.2(@types/node@20.17.23)': + dependencies: + '@rushstack/node-core-library': 5.9.0(@types/node@20.17.23) + supports-color: 8.1.1 + optionalDependencies: + '@types/node': 20.17.23 + + '@rushstack/terminal@0.15.1(@types/node@20.17.23)': + dependencies: + '@rushstack/node-core-library': 5.12.0(@types/node@20.17.23) + supports-color: 8.1.1 + optionalDependencies: + '@types/node': 20.17.23 + '@rushstack/tree-pattern@0.3.4': {} '@rushstack/ts-command-line@4.23.0(@types/node@18.19.57)': @@ -10389,6 +12038,24 @@ snapshots: transitivePeerDependencies: - '@types/node' + '@rushstack/ts-command-line@4.23.0(@types/node@20.17.23)': + dependencies: + '@rushstack/terminal': 0.14.2(@types/node@20.17.23) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + + '@rushstack/ts-command-line@4.23.6(@types/node@20.17.23)': + dependencies: + '@rushstack/terminal': 0.15.1(@types/node@20.17.23) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + '@sinclair/typebox@0.24.51': {} '@sinclair/typebox@0.27.8': {} @@ -10443,10 +12110,78 @@ snapshots: transitivePeerDependencies: - supports-color + '@swc/counter@0.1.3': {} + '@swc/helpers@0.3.17': dependencies: tslib: 2.8.0 + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + + '@tailwindcss/node@4.0.9': + dependencies: + enhanced-resolve: 5.18.1 + jiti: 2.4.2 + tailwindcss: 4.0.9 + + '@tailwindcss/oxide-android-arm64@4.0.9': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.0.9': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.0.9': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.0.9': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.9': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.0.9': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.0.9': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.0.9': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.0.9': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.0.9': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.0.9': + optional: true + + '@tailwindcss/oxide@4.0.9': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.0.9 + '@tailwindcss/oxide-darwin-arm64': 4.0.9 + '@tailwindcss/oxide-darwin-x64': 4.0.9 + '@tailwindcss/oxide-freebsd-x64': 4.0.9 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.0.9 + '@tailwindcss/oxide-linux-arm64-gnu': 4.0.9 + '@tailwindcss/oxide-linux-arm64-musl': 4.0.9 + '@tailwindcss/oxide-linux-x64-gnu': 4.0.9 + '@tailwindcss/oxide-linux-x64-musl': 4.0.9 + '@tailwindcss/oxide-win32-arm64-msvc': 4.0.9 + '@tailwindcss/oxide-win32-x64-msvc': 4.0.9 + + '@tailwindcss/postcss@4.0.9': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.0.9 + '@tailwindcss/oxide': 4.0.9 + lightningcss: 1.29.1 + postcss: 8.5.3 + tailwindcss: 4.0.9 + '@testing-library/dom@8.20.1': dependencies: '@babel/code-frame': 7.25.7 @@ -10507,7 +12242,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 18.19.57 + '@types/node': 20.17.23 '@types/istanbul-lib-coverage@2.0.6': {} @@ -10536,7 +12271,7 @@ snapshots: '@types/jsdom@16.2.15': dependencies: - '@types/node': 18.19.57 + '@types/node': 20.17.23 '@types/parse5': 6.0.3 '@types/tough-cookie': 4.0.5 @@ -10558,6 +12293,10 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/node@20.17.23': + dependencies: + undici-types: 6.19.8 + '@types/normalize-package-data@2.4.4': {} '@types/parse-json@4.0.2': {} @@ -10568,20 +12307,33 @@ snapshots: '@types/pdfkit@0.13.5': dependencies: - '@types/node': 18.19.57 + '@types/node': 20.17.23 '@types/pdfmake@0.1.21': dependencies: '@types/node': 18.19.57 '@types/pdfkit': 0.13.5 + '@types/pdfmake@0.2.11': + dependencies: + '@types/node': 20.17.23 + '@types/pdfkit': 0.13.5 + '@types/prettier@1.19.1': {} '@types/prettier@2.7.3': {} + '@types/react-dom@19.0.4(@types/react@19.0.10)': + dependencies: + '@types/react': 19.0.10 + + '@types/react@19.0.10': + dependencies: + csstype: 3.1.3 + '@types/resolve@1.17.1': dependencies: - '@types/node': 18.19.57 + '@types/node': 20.17.23 '@types/semver@7.5.8': {} @@ -10658,6 +12410,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.13.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.13.0 + '@typescript-eslint/type-utils': 8.13.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/utils': 8.13.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.13.0 + eslint: 9.21.0(jiti@2.4.2) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.4.0(typescript@5.7.2) + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/experimental-utils@2.34.0(eslint@6.8.0)(typescript@3.9.10)': dependencies: '@types/json-schema': 7.0.15 @@ -10707,6 +12477,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@8.13.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.2)': + dependencies: + '@typescript-eslint/scope-manager': 8.13.0 + '@typescript-eslint/types': 8.13.0 + '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.13.0 + debug: 4.3.7(supports-color@9.4.0) + eslint: 9.21.0(jiti@2.4.2) + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@6.19.1': dependencies: '@typescript-eslint/types': 6.19.1 @@ -10746,6 +12529,18 @@ snapshots: - eslint - supports-color + '@typescript-eslint/type-utils@8.13.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.2)': + dependencies: + '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.7.2) + '@typescript-eslint/utils': 8.13.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.2) + debug: 4.3.7(supports-color@9.4.0) + ts-api-utils: 1.4.0(typescript@5.7.2) + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - eslint + - supports-color + '@typescript-eslint/types@6.19.1': {} '@typescript-eslint/types@8.1.0': {} @@ -10759,7 +12554,7 @@ snapshots: glob: 7.2.3 is-glob: 4.0.3 lodash: 4.17.21 - semver: 7.6.3 + semver: 7.7.1 tsutils: 3.21.0(typescript@3.9.10) optionalDependencies: typescript: 3.9.10 @@ -10774,7 +12569,7 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.6.3 + semver: 7.7.1 ts-api-utils: 1.4.0(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 @@ -10811,6 +12606,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.13.0(typescript@5.7.2)': + dependencies: + '@typescript-eslint/types': 8.13.0 + '@typescript-eslint/visitor-keys': 8.13.0 + debug: 4.3.7(supports-color@9.4.0) + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.4.0(typescript@5.7.2) + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@6.19.1(eslint@8.57.1)(typescript@5.6.3)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) @@ -10820,7 +12630,7 @@ snapshots: '@typescript-eslint/types': 6.19.1 '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.6.3) eslint: 8.57.1 - semver: 7.6.3 + semver: 7.7.1 transitivePeerDependencies: - supports-color - typescript @@ -10847,6 +12657,17 @@ snapshots: - supports-color - typescript + '@typescript-eslint/utils@8.13.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.2)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.21.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.13.0 + '@typescript-eslint/types': 8.13.0 + '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.7.2) + eslint: 9.21.0(jiti@2.4.2) + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/visitor-keys@6.19.1': dependencies: '@typescript-eslint/types': 6.19.1 @@ -10864,7 +12685,25 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitest/coverage-v8@2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0))': + '@vitest/coverage-v8@2.1.3(vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.3.7(supports-color@9.4.0) + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magic-string: 0.30.12 + magicast: 0.3.5 + std-env: 3.7.0 + test-exclude: 7.0.1 + tinyrainbow: 1.2.0 + vitest: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) + transitivePeerDependencies: + - supports-color + + '@vitest/coverage-v8@2.1.3(vitest@2.1.3(@types/node@20.17.23)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -10878,7 +12717,7 @@ snapshots: std-env: 3.7.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0) + vitest: 2.1.3(@types/node@20.17.23)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) transitivePeerDependencies: - supports-color @@ -10889,13 +12728,21 @@ snapshots: chai: 5.1.1 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.3(vite@5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0))': + '@vitest/mocker@2.1.3(vite@5.4.9(@types/node@18.19.57)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0))': + dependencies: + '@vitest/spy': 2.1.3 + estree-walker: 3.0.3 + magic-string: 0.30.12 + optionalDependencies: + vite: 5.4.9(@types/node@18.19.57)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) + + '@vitest/mocker@2.1.3(vite@5.4.9(@types/node@20.17.23)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0))': dependencies: '@vitest/spy': 2.1.3 estree-walker: 3.0.3 magic-string: 0.30.12 optionalDependencies: - vite: 5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0) + vite: 5.4.9(@types/node@20.17.23)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) '@vitest/pretty-format@2.1.3': dependencies: @@ -10925,7 +12772,7 @@ snapshots: sirv: 2.0.4 tinyglobby: 0.2.9 tinyrainbow: 1.2.0 - vitest: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0) + vitest: 2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) '@vitest/utils@2.1.3': dependencies: @@ -10933,6 +12780,51 @@ snapshots: loupe: 3.1.2 tinyrainbow: 1.2.0 + '@volar/language-core@2.4.12': + dependencies: + '@volar/source-map': 2.4.12 + + '@volar/source-map@2.4.12': {} + + '@volar/typescript@2.4.12': + dependencies: + '@volar/language-core': 2.4.12 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue/compiler-core@3.5.13': + dependencies: + '@babel/parser': 7.25.8 + '@vue/shared': 3.5.13 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.13': + dependencies: + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + '@vue/language-core@2.2.0(typescript@5.7.2)': + dependencies: + '@volar/language-core': 2.4.12 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.13 + alien-signals: 0.4.14 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.7.2 + + '@vue/shared@3.5.13': {} + '@webassemblyjs/ast@1.12.1': dependencies: '@webassemblyjs/helper-numbers': 1.11.6 @@ -11095,6 +12987,8 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + alien-signals@0.4.14: {} + ansi-colors@4.1.3: {} ansi-escapes@3.2.0: {} @@ -11474,6 +13368,8 @@ snapshots: base64-js@0.0.8: {} + base64-js@1.3.1: {} + base64-js@1.5.1: {} base@0.11.2: @@ -11547,6 +13443,10 @@ snapshots: builtin-modules@3.3.0: {} + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + bytes-iec@3.1.1: {} cac@6.7.14: {} @@ -11672,6 +13572,8 @@ snapshots: cli-width@3.0.0: {} + client-only@0.0.1: {} + cliui@6.0.0: dependencies: string-width: 4.2.3 @@ -11713,6 +13615,18 @@ snapshots: color-name@1.1.4: {} + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + optional: true + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + optional: true + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -11723,10 +13637,16 @@ snapshots: commondir@1.0.1: {} + compare-versions@6.1.1: {} + component-emitter@1.3.1: {} concat-map@0.0.1: {} + confbox@0.1.8: {} + + confbox@0.2.1: {} + confusing-browser-globals@1.0.11: {} convert-source-map@1.9.0: {} @@ -11775,6 +13695,12 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + crypto-js@4.2.0: {} css.escape@1.5.1: {} @@ -11791,6 +13717,8 @@ snapshots: dependencies: cssom: 0.3.8 + csstype@3.1.3: {} + curp@1.2.3: {} damerau-levenshtein@1.0.8: {} @@ -11831,6 +13759,8 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.1 + de-indent@1.0.2: {} + debug@2.6.9: dependencies: ms: 2.0.0 @@ -11845,6 +13775,10 @@ snapshots: optionalDependencies: supports-color: 9.4.0 + debug@4.4.0: + dependencies: + ms: 2.1.3 + decamelize-keys@1.1.1: dependencies: decamelize: 1.2.0 @@ -11866,6 +13800,15 @@ snapshots: deep-eql@5.0.2: {} + deep-equal@1.1.2: + dependencies: + is-arguments: 1.1.1 + is-date-object: 1.0.5 + is-regex: 1.1.4 + object-is: 1.1.6 + object-keys: 1.1.1 + regexp.prototype.flags: 1.5.3 + deep-equal@2.2.3: dependencies: array-buffer-byte-length: 1.0.1 @@ -11922,6 +13865,11 @@ snapshots: delayed-stream@1.0.0: {} + detect-libc@1.0.3: {} + + detect-libc@2.0.3: + optional: true + detect-newline@3.1.0: {} dfa@1.2.0: {} @@ -12006,6 +13954,11 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.1 + enhanced-resolve@5.18.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -12015,6 +13968,8 @@ snapshots: entities@2.2.0: {} + entities@4.5.0: {} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -12260,6 +14215,34 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 + esbuild@0.25.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.1 + '@esbuild/android-arm': 0.25.1 + '@esbuild/android-arm64': 0.25.1 + '@esbuild/android-x64': 0.25.1 + '@esbuild/darwin-arm64': 0.25.1 + '@esbuild/darwin-x64': 0.25.1 + '@esbuild/freebsd-arm64': 0.25.1 + '@esbuild/freebsd-x64': 0.25.1 + '@esbuild/linux-arm': 0.25.1 + '@esbuild/linux-arm64': 0.25.1 + '@esbuild/linux-ia32': 0.25.1 + '@esbuild/linux-loong64': 0.25.1 + '@esbuild/linux-mips64el': 0.25.1 + '@esbuild/linux-ppc64': 0.25.1 + '@esbuild/linux-riscv64': 0.25.1 + '@esbuild/linux-s390x': 0.25.1 + '@esbuild/linux-x64': 0.25.1 + '@esbuild/netbsd-arm64': 0.25.1 + '@esbuild/netbsd-x64': 0.25.1 + '@esbuild/openbsd-arm64': 0.25.1 + '@esbuild/openbsd-x64': 0.25.1 + '@esbuild/sunos-x64': 0.25.1 + '@esbuild/win32-arm64': 0.25.1 + '@esbuild/win32-ia32': 0.25.1 + '@esbuild/win32-x64': 0.25.1 + escalade@3.2.0: {} escape-string-regexp@1.0.5: {} @@ -12285,6 +14268,25 @@ snapshots: optionalDependencies: source-map: 0.6.1 + eslint-config-next@15.2.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.2): + dependencies: + '@next/eslint-plugin-next': 15.2.1 + '@rushstack/eslint-patch': 1.10.4 + '@typescript-eslint/eslint-plugin': 8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/parser': 8.13.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.2) + eslint: 9.21.0(jiti@2.4.2) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0(eslint@9.21.0(jiti@2.4.2)))(eslint@9.21.0(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(eslint@9.21.0(jiti@2.4.2)) + eslint-plugin-jsx-a11y: 6.10.0(eslint@9.21.0(jiti@2.4.2)) + eslint-plugin-react: 7.37.1(eslint@9.21.0(jiti@2.4.2)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.21.0(jiti@2.4.2)) + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - eslint-plugin-import-x + - supports-color + eslint-config-prettier@6.15.0(eslint@6.8.0): dependencies: eslint: 6.8.0 @@ -12325,6 +14327,21 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0(eslint@9.21.0(jiti@2.4.2)))(eslint@9.21.0(jiti@2.4.2)): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.3.7(supports-color@9.4.0) + enhanced-resolve: 5.17.1 + eslint: 9.21.0(jiti@2.4.2) + get-tsconfig: 4.10.0 + is-bun-module: 1.3.0 + stable-hash: 0.0.4 + tinyglobby: 0.2.12 + optionalDependencies: + eslint-plugin-import: 2.31.0(eslint@9.21.0(jiti@2.4.2)) + transitivePeerDependencies: + - supports-color + eslint-module-utils@2.12.0(eslint@6.8.0): dependencies: debug: 3.2.7 @@ -12337,6 +14354,12 @@ snapshots: optionalDependencies: eslint: 8.57.1 + eslint-module-utils@2.12.0(eslint@9.21.0(jiti@2.4.2)): + dependencies: + debug: 3.2.7 + optionalDependencies: + eslint: 9.21.0(jiti@2.4.2) + eslint-plugin-flowtype@3.13.0(eslint@6.8.0): dependencies: eslint: 6.8.0 @@ -12388,6 +14411,29 @@ snapshots: string.prototype.trimend: 1.0.8 tsconfig-paths: 3.15.0 + eslint-plugin-import@2.31.0(eslint@9.21.0(jiti@2.4.2)): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.21.0(jiti@2.4.2) + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(eslint@9.21.0(jiti@2.4.2)) + hasown: 2.0.2 + is-core-module: 2.15.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + string.prototype.trimend: 1.0.8 + tsconfig-paths: 3.15.0 + eslint-plugin-jest@28.9.0(@typescript-eslint/eslint-plugin@8.13.0(@typescript-eslint/parser@8.13.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(jest@28.1.3)(typescript@5.6.3): dependencies: '@typescript-eslint/utils': 8.13.0(eslint@8.57.1)(typescript@5.6.3) @@ -12452,6 +14498,26 @@ snapshots: safe-regex-test: 1.0.3 string.prototype.includes: 2.0.1 + eslint-plugin-jsx-a11y@6.10.0(eslint@9.21.0(jiti@2.4.2)): + dependencies: + aria-query: 5.1.3 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.2 + ast-types-flow: 0.0.8 + axe-core: 4.10.1 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + es-iterator-helpers: 1.1.0 + eslint: 9.21.0(jiti@2.4.2) + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + safe-regex-test: 1.0.3 + string.prototype.includes: 2.0.1 + eslint-plugin-prettier@3.4.1(eslint-config-prettier@6.15.0(eslint@6.8.0))(eslint@6.8.0)(prettier@1.19.1): dependencies: eslint: 6.8.0 @@ -12476,6 +14542,10 @@ snapshots: dependencies: eslint: 6.8.0 + eslint-plugin-react-hooks@5.2.0(eslint@9.21.0(jiti@2.4.2)): + dependencies: + eslint: 9.21.0(jiti@2.4.2) + eslint-plugin-react@7.33.2(eslint@8.57.1): dependencies: array-includes: 3.1.8 @@ -12518,6 +14588,28 @@ snapshots: string.prototype.matchall: 4.0.11 string.prototype.repeat: 1.0.0 + eslint-plugin-react@7.37.1(eslint@9.21.0(jiti@2.4.2)): + dependencies: + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.2 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.1.0 + eslint: 9.21.0(jiti@2.4.2) + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.values: 1.2.0 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.11 + string.prototype.repeat: 1.0.0 + eslint-plugin-sort-destructure-keys@1.6.0(eslint@8.57.1): dependencies: eslint: 8.57.1 @@ -12538,6 +14630,11 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 + eslint-scope@8.2.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + eslint-utils@1.4.3: dependencies: eslint-visitor-keys: 1.3.0 @@ -12550,6 +14647,8 @@ snapshots: eslint-visitor-keys@3.4.3: {} + eslint-visitor-keys@4.2.0: {} + eslint@6.8.0: dependencies: '@babel/code-frame': 7.25.7 @@ -12635,6 +14734,53 @@ snapshots: transitivePeerDependencies: - supports-color + eslint@9.21.0(jiti@2.4.2): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.21.0(jiti@2.4.2)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.19.2 + '@eslint/core': 0.12.0 + '@eslint/eslintrc': 3.3.0 + '@eslint/js': 9.21.0 + '@eslint/plugin-kit': 0.2.7 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.2 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.3.7(supports-color@9.4.0) + escape-string-regexp: 4.0.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.4.2 + transitivePeerDependencies: + - supports-color + + espree@10.3.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + espree@6.2.1: dependencies: acorn: 7.4.1 @@ -12665,6 +14811,8 @@ snapshots: estree-walker@1.0.1: {} + estree-walker@2.0.2: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.6 @@ -12765,6 +14913,8 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 + exsolve@1.0.4: {} + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 @@ -12799,6 +14949,14 @@ snapshots: fast-diff@1.3.0: {} + fast-glob@3.3.1: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -12827,6 +14985,10 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + fetch-mock-jest@1.5.1(node-fetch@2.7.0): dependencies: fetch-mock: 9.11.0(node-fetch@2.7.0) @@ -12866,6 +15028,10 @@ snapshots: dependencies: flat-cache: 3.2.0 + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + file-saver@2.0.5: {} file-uri-to-path@1.0.0: {} @@ -12909,6 +15075,11 @@ snapshots: keyv: 4.5.4 rimraf: 3.0.2 + flat-cache@4.0.1: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + flatted@2.0.2: {} flatted@3.3.1: {} @@ -12960,6 +15131,12 @@ snapshots: dependencies: map-cache: 0.2.2 + fs-extra@11.3.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + fs-extra@3.0.1: dependencies: graceful-fs: 4.2.11 @@ -13042,6 +15219,10 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.2.4 + get-tsconfig@4.10.0: + dependencies: + resolve-pkg-maps: 1.0.0 + get-uri@2.0.4: dependencies: data-uri-to-buffer: 1.2.0 @@ -13116,6 +15297,8 @@ snapshots: dependencies: type-fest: 0.20.2 + globals@14.0.0: {} + globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -13363,6 +15546,9 @@ snapshots: is-arrayish@0.2.1: {} + is-arrayish@0.3.2: + optional: true + is-async-function@2.0.0: dependencies: has-tostringtag: 1.0.2 @@ -13390,6 +15576,10 @@ snapshots: is-buffer@2.0.5: {} + is-bun-module@1.3.0: + dependencies: + semver: 7.7.1 + is-callable@1.2.7: {} is-ci@2.0.0: @@ -13647,7 +15837,7 @@ snapshots: '@jest/expect': 28.1.3(supports-color@9.4.0) '@jest/test-result': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 18.19.57 + '@types/node': 20.17.23 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -13671,7 +15861,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.57 + '@types/node': 20.17.23 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.3 @@ -13788,7 +15978,36 @@ snapshots: transitivePeerDependencies: - supports-color - jest-config@29.5.0(@types/node@18.19.57): + jest-config@28.1.3(@types/node@20.17.23): + dependencies: + '@babel/core': 7.25.8(supports-color@9.4.0) + '@jest/test-sequencer': 28.1.3 + '@jest/types': 28.1.3 + babel-jest: 28.1.3(@babel/core@7.25.8) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 28.1.3(supports-color@9.4.0) + jest-environment-node: 28.1.3 + jest-get-type: 28.0.2 + jest-regex-util: 28.0.2 + jest-resolve: 28.1.3 + jest-runner: 28.1.3 + jest-util: 28.1.3 + jest-validate: 28.1.3 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 28.1.3 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.17.23 + transitivePeerDependencies: + - supports-color + + jest-config@29.5.0(@types/node@20.17.23): dependencies: '@babel/core': 7.25.8(supports-color@9.4.0) '@jest/test-sequencer': 29.7.0 @@ -13813,7 +16032,7 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 18.19.57 + '@types/node': 20.17.23 transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -13925,7 +16144,7 @@ snapshots: '@jest/environment': 28.1.3 '@jest/fake-timers': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 18.19.57 + '@types/node': 20.17.23 jest-mock: 28.1.3 jest-util: 28.1.3 @@ -13934,7 +16153,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.57 + '@types/node': 20.17.23 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -13967,7 +16186,7 @@ snapshots: dependencies: '@jest/types': 28.1.3 '@types/graceful-fs': 4.1.9 - '@types/node': 18.19.57 + '@types/node': 20.17.23 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -13983,7 +16202,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 18.19.57 + '@types/node': 20.17.23 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -14116,12 +16335,12 @@ snapshots: jest-mock@28.1.3: dependencies: '@jest/types': 28.1.3 - '@types/node': 18.19.57 + '@types/node': 20.17.23 jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 18.19.57 + '@types/node': 20.17.23 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@25.5.1): @@ -14248,7 +16467,7 @@ snapshots: '@jest/test-result': 28.1.3 '@jest/transform': 28.1.3(supports-color@9.4.0) '@jest/types': 28.1.3 - '@types/node': 18.19.57 + '@types/node': 20.17.23 chalk: 4.1.2 emittery: 0.10.2 graceful-fs: 4.2.11 @@ -14274,7 +16493,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.57 + '@types/node': 20.17.23 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -14363,7 +16582,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.57 + '@types/node': 20.17.23 chalk: 4.1.2 cjs-module-lexer: 1.4.1 collect-v8-coverage: 1.0.2 @@ -14427,7 +16646,7 @@ snapshots: jest-util: 28.1.3 natural-compare: 1.4.0 pretty-format: 28.1.3 - semver: 7.6.3 + semver: 7.7.1 transitivePeerDependencies: - supports-color @@ -14480,7 +16699,7 @@ snapshots: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.6.3 + semver: 7.7.1 transitivePeerDependencies: - supports-color @@ -14495,7 +16714,7 @@ snapshots: jest-util@28.1.3: dependencies: '@jest/types': 28.1.3 - '@types/node': 18.19.57 + '@types/node': 20.17.23 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -14504,7 +16723,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 18.19.57 + '@types/node': 20.17.23 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -14571,7 +16790,7 @@ snapshots: dependencies: '@jest/test-result': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 18.19.57 + '@types/node': 20.17.23 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.10.2 @@ -14582,7 +16801,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.57 + '@types/node': 20.17.23 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -14601,19 +16820,19 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 18.19.57 + '@types/node': 20.17.23 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@28.1.3: dependencies: - '@types/node': 18.19.57 + '@types/node': 20.17.23 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 18.19.57 + '@types/node': 20.17.23 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -14640,8 +16859,12 @@ snapshots: - supports-color - ts-node + jiti@2.4.2: {} + jju@1.4.0: {} + jpeg-exif@1.1.4: {} + jpjs@1.2.1: {} js-tokens@4.0.0: {} @@ -14694,7 +16917,7 @@ snapshots: jsdom@19.0.0: dependencies: abab: 2.0.6 - acorn: 8.13.0 + acorn: 8.14.0 acorn-globals: 6.0.0 cssom: 0.5.0 cssstyle: 2.3.0 @@ -14801,6 +17024,8 @@ snapshots: known-css-properties@0.21.0: {} + kolorist@1.8.0: {} + language-subtag-registry@0.3.23: {} language-tags@1.0.9: @@ -14819,6 +17044,51 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lightningcss-darwin-arm64@1.29.1: + optional: true + + lightningcss-darwin-x64@1.29.1: + optional: true + + lightningcss-freebsd-x64@1.29.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.29.1: + optional: true + + lightningcss-linux-arm64-gnu@1.29.1: + optional: true + + lightningcss-linux-arm64-musl@1.29.1: + optional: true + + lightningcss-linux-x64-gnu@1.29.1: + optional: true + + lightningcss-linux-x64-musl@1.29.1: + optional: true + + lightningcss-win32-arm64-msvc@1.29.1: + optional: true + + lightningcss-win32-x64-msvc@1.29.1: + optional: true + + lightningcss@1.29.1: + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.29.1 + lightningcss-darwin-x64: 1.29.1 + lightningcss-freebsd-x64: 1.29.1 + lightningcss-linux-arm-gnueabihf: 1.29.1 + lightningcss-linux-arm64-gnu: 1.29.1 + lightningcss-linux-arm64-musl: 1.29.1 + lightningcss-linux-x64-gnu: 1.29.1 + lightningcss-linux-x64-musl: 1.29.1 + lightningcss-win32-arm64-msvc: 1.29.1 + lightningcss-win32-x64-msvc: 1.29.1 + lilconfig@2.1.0: {} linebreak@1.1.0: @@ -14830,6 +17100,12 @@ snapshots: loader-runner@4.3.0: {} + local-pkg@1.1.1: + dependencies: + mlly: 1.7.4 + pkg-types: 2.1.0 + quansync: 0.2.10 + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -14905,6 +17181,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + magicast@0.3.5: dependencies: '@babel/parser': 7.25.8 @@ -15011,6 +17291,8 @@ snapshots: dependencies: mime-db: 1.52.0 + mime@3.0.0: {} + mimic-fn@1.2.0: {} mimic-fn@2.1.0: {} @@ -15021,6 +17303,10 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimatch@3.0.8: + dependencies: + brace-expansion: 1.1.11 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -15054,6 +17340,13 @@ snapshots: mkdirp@1.0.4: {} + mlly@1.7.4: + dependencies: + acorn: 8.14.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.5.4 + moment-timezone@0.5.46: dependencies: moment: 2.30.1 @@ -15068,10 +17361,14 @@ snapshots: ms@2.1.3: {} + muggle-string@0.4.1: {} + mute-stream@0.0.8: {} nanoid@3.3.7: {} + nanoid@3.3.8: {} + nanomatch@1.2.13: dependencies: arr-diff: 4.0.0 @@ -15096,6 +17393,31 @@ snapshots: neo-async@2.6.2: {} + next@15.2.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + '@next/env': 15.2.3 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.15 + busboy: 1.6.0 + caniuse-lite: 1.0.30001669 + postcss: 8.4.31 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + styled-jsx: 5.1.6(react@19.0.0) + optionalDependencies: + '@next/swc-darwin-arm64': 15.2.3 + '@next/swc-darwin-x64': 15.2.3 + '@next/swc-linux-arm64-gnu': 15.2.3 + '@next/swc-linux-arm64-musl': 15.2.3 + '@next/swc-linux-x64-gnu': 15.2.3 + '@next/swc-linux-x64-musl': 15.2.3 + '@next/swc-win32-arm64-msvc': 15.2.3 + '@next/swc-win32-x64-msvc': 15.2.3 + sharp: 0.33.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + nice-napi@1.0.2: dependencies: node-addon-api: 3.2.1 @@ -15147,7 +17469,7 @@ snapshots: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.15.1 - semver: 7.6.3 + semver: 7.7.1 validate-npm-package-license: 3.0.4 normalize-path@2.1.1: @@ -15341,6 +17663,8 @@ snapshots: pascalcase@0.1.1: {} + path-browserify@1.0.1: {} + path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -15367,6 +17691,8 @@ snapshots: pathe@1.1.2: {} + pathe@2.0.3: {} + pathval@2.0.0: {} pdf-parse@1.1.1: @@ -15389,6 +17715,13 @@ snapshots: svg-to-pdfkit: 0.1.8 xmldoc: 1.3.0 + pdfmake@0.2.18: + dependencies: + '@foliojs-fork/linebreak': 1.1.2 + '@foliojs-fork/pdfkit': 0.15.3 + iconv-lite: 0.6.3 + xmldoc: 1.3.0 + performance-now@2.1.0: {} picocolors@0.2.1: {} @@ -15413,6 +17746,18 @@ snapshots: dependencies: find-up: 4.1.0 + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 + + pkg-types@2.1.0: + dependencies: + confbox: 0.2.1 + exsolve: 1.0.4 + pathe: 2.0.3 + pn@1.1.0: {} png-js@1.0.0: {} @@ -15471,12 +17816,24 @@ snapshots: picocolors: 0.2.1 source-map: 0.6.1 + postcss@8.4.31: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postcss@8.4.47: dependencies: nanoid: 3.3.7 picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.3: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + prelude-ls@1.1.2: {} prelude-ls@1.2.1: {} @@ -15556,6 +17913,8 @@ snapshots: qs@6.5.3: {} + quansync@0.2.10: {} + querystring@0.2.1: {} querystringify@2.2.0: {} @@ -15568,12 +17927,19 @@ snapshots: dependencies: safe-buffer: 5.2.1 + react-dom@19.0.0(react@19.0.0): + dependencies: + react: 19.0.0 + scheduler: 0.25.0 + react-is@16.13.1: {} react-is@17.0.2: {} react-is@18.3.1: {} + react@19.0.0: {} + read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 @@ -15755,6 +18121,8 @@ snapshots: resolve-from@5.0.0: {} + resolve-pkg-maps@1.0.0: {} + resolve-url@0.2.1: {} resolve.exports@1.1.1: {} @@ -15842,7 +18210,7 @@ snapshots: rollup@1.32.1: dependencies: '@types/estree': 1.0.6 - '@types/node': 18.19.57 + '@types/node': 20.17.23 acorn: 7.4.1 rollup@3.29.5: @@ -15871,6 +18239,31 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.24.0 fsevents: 2.3.3 + rollup@4.36.0: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.36.0 + '@rollup/rollup-android-arm64': 4.36.0 + '@rollup/rollup-darwin-arm64': 4.36.0 + '@rollup/rollup-darwin-x64': 4.36.0 + '@rollup/rollup-freebsd-arm64': 4.36.0 + '@rollup/rollup-freebsd-x64': 4.36.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.36.0 + '@rollup/rollup-linux-arm-musleabihf': 4.36.0 + '@rollup/rollup-linux-arm64-gnu': 4.36.0 + '@rollup/rollup-linux-arm64-musl': 4.36.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.36.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.36.0 + '@rollup/rollup-linux-riscv64-gnu': 4.36.0 + '@rollup/rollup-linux-s390x-gnu': 4.36.0 + '@rollup/rollup-linux-x64-gnu': 4.36.0 + '@rollup/rollup-linux-x64-musl': 4.36.0 + '@rollup/rollup-win32-arm64-msvc': 4.36.0 + '@rollup/rollup-win32-ia32-msvc': 4.36.0 + '@rollup/rollup-win32-x64-msvc': 4.36.0 + fsevents: 2.3.3 + rsvp@4.8.5: {} run-async@2.4.1: {} @@ -15941,6 +18334,8 @@ snapshots: dependencies: xmlchars: 2.2.0 + scheduler@0.25.0: {} + schema-utils@3.3.0: dependencies: '@types/json-schema': 7.0.15 @@ -15961,6 +18356,8 @@ snapshots: semver@7.6.3: {} + semver@7.7.1: {} + serialize-javascript@4.0.0: dependencies: randombytes: 2.1.0 @@ -15994,6 +18391,33 @@ snapshots: is-plain-object: 2.0.4 split-string: 3.1.0 + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.7.1 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + optional: true + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 @@ -16030,6 +18454,11 @@ snapshots: simple-mime@0.1.0: {} + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + optional: true + sirv@2.0.4: dependencies: '@polka/url': 1.0.0-next.28 @@ -16065,6 +18494,8 @@ snapshots: astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 + smob@1.5.0: {} + snapdragon-node@2.1.1: dependencies: define-property: 1.0.0 @@ -16155,6 +18586,8 @@ snapshots: safer-buffer: 2.1.2 tweetnacl: 0.14.5 + stable-hash@0.0.4: {} + stack-utils@1.0.5: dependencies: escape-string-regexp: 2.0.0 @@ -16178,6 +18611,8 @@ snapshots: dependencies: internal-slot: 1.0.7 + streamsearch@1.1.0: {} + string-argv@0.3.2: {} string-length@3.1.0: @@ -16310,6 +18745,11 @@ snapshots: style-search@0.1.0: {} + styled-jsx@5.1.6(react@19.0.0): + dependencies: + client-only: 0.0.1 + react: 19.0.0 + stylelint-config-recommended@5.0.0(stylelint@13.13.1): dependencies: stylelint: 13.13.1 @@ -16426,6 +18866,8 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + tailwindcss@4.0.9: {} + tapable@1.1.3: {} tapable@2.2.1: {} @@ -16486,6 +18928,11 @@ snapshots: tinyexec@0.3.1: {} + tinyglobby@0.2.12: + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + tinyglobby@0.2.9: dependencies: fdir: 6.4.2(picomatch@4.0.2) @@ -16569,6 +19016,10 @@ snapshots: dependencies: typescript: 5.6.3 + ts-api-utils@1.4.0(typescript@5.7.2): + dependencies: + typescript: 5.7.2 + ts-jest@25.5.1(jest@25.5.4)(typescript@3.9.10): dependencies: bs-logger: 0.2.6 @@ -16705,6 +19156,8 @@ snapshots: tslib@2.8.0: {} + tslib@2.8.1: {} + tsutils@3.21.0(typescript@3.9.10): dependencies: tslib: 1.14.1 @@ -16778,6 +19231,12 @@ snapshots: typescript@5.6.3: {} + typescript@5.7.2: {} + + typescript@5.8.2: {} + + ufo@1.5.4: {} + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.7 @@ -16787,6 +19246,8 @@ snapshots: undici-types@5.26.5: {} + undici-types@6.19.8: {} + unicode-canonical-property-names-ecmascript@2.0.1: {} unicode-match-property-ecmascript@2.0.0: @@ -16911,12 +19372,29 @@ snapshots: unist-util-stringify-position: 2.0.3 vfile-message: 2.0.4 - vite-node@2.1.3(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0): + vite-node@2.1.3(@types/node@18.19.57)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0): + dependencies: + cac: 6.7.14 + debug: 4.3.7(supports-color@9.4.0) + pathe: 1.1.2 + vite: 5.4.9(@types/node@18.19.57)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite-node@2.1.3(@types/node@20.17.23)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0): dependencies: cac: 6.7.14 debug: 4.3.7(supports-color@9.4.0) pathe: 1.1.2 - vite: 5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0) + vite: 5.4.9(@types/node@20.17.23)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) transitivePeerDependencies: - '@types/node' - less @@ -16928,54 +19406,114 @@ snapshots: - supports-color - terser - vite-tsconfig-paths@4.2.3(typescript@5.6.3)(vite@4.5.5(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0)): + vite-plugin-dts@4.5.3(@types/node@20.17.23)(rollup@4.36.0)(typescript@5.7.2)(vite@6.2.2(@types/node@20.17.23)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)): + dependencies: + '@microsoft/api-extractor': 7.52.1(@types/node@20.17.23) + '@rollup/pluginutils': 5.1.4(rollup@4.36.0) + '@volar/typescript': 2.4.12 + '@vue/language-core': 2.2.0(typescript@5.7.2) + compare-versions: 6.1.1 + debug: 4.4.0 + kolorist: 1.8.0 + local-pkg: 1.1.1 + magic-string: 0.30.17 + typescript: 5.7.2 + optionalDependencies: + vite: 6.2.2(@types/node@20.17.23)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + + vite-tsconfig-paths@4.2.3(typescript@5.6.3)(vite@4.5.5(@types/node@20.17.23)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)): dependencies: debug: 4.3.7(supports-color@9.4.0) globrex: 0.1.2 tsconfck: 2.1.2(typescript@5.6.3) optionalDependencies: - vite: 4.5.5(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0) + vite: 4.5.5(@types/node@20.17.23)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) transitivePeerDependencies: - supports-color - typescript - vite-tsconfig-paths@4.2.3(typescript@5.6.3)(vite@5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0)): + vite-tsconfig-paths@4.2.3(typescript@5.6.3)(vite@6.2.2(@types/node@18.19.57)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)): dependencies: debug: 4.3.7(supports-color@9.4.0) globrex: 0.1.2 tsconfck: 2.1.2(typescript@5.6.3) optionalDependencies: - vite: 5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0) + vite: 6.2.2(@types/node@18.19.57)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) transitivePeerDependencies: - supports-color - typescript - vite@4.5.5(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0): + vite@4.5.5(@types/node@20.17.23)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0): dependencies: esbuild: 0.18.20 postcss: 8.4.47 rollup: 3.29.5 + optionalDependencies: + '@types/node': 20.17.23 + fsevents: 2.3.3 + lightningcss: 1.29.1 + sugarss: 2.0.0 + terser: 5.36.0 + + vite@5.4.9(@types/node@18.19.57)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.3 + rollup: 4.24.0 optionalDependencies: '@types/node': 18.19.57 fsevents: 2.3.3 + lightningcss: 1.29.1 sugarss: 2.0.0 terser: 5.36.0 - vite@5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0): + vite@5.4.9(@types/node@20.17.23)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0): dependencies: esbuild: 0.21.5 - postcss: 8.4.47 + postcss: 8.5.3 rollup: 4.24.0 + optionalDependencies: + '@types/node': 20.17.23 + fsevents: 2.3.3 + lightningcss: 1.29.1 + sugarss: 2.0.0 + terser: 5.36.0 + + vite@6.2.2(@types/node@18.19.57)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0): + dependencies: + esbuild: 0.25.1 + postcss: 8.5.3 + rollup: 4.36.0 optionalDependencies: '@types/node': 18.19.57 fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.29.1 + sugarss: 2.0.0 + terser: 5.36.0 + optional: true + + vite@6.2.2(@types/node@20.17.23)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0): + dependencies: + esbuild: 0.25.1 + postcss: 8.5.3 + rollup: 4.36.0 + optionalDependencies: + '@types/node': 20.17.23 + fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.29.1 sugarss: 2.0.0 terser: 5.36.0 - vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(sugarss@2.0.0)(terser@5.36.0): + vitest@2.1.3(@types/node@18.19.57)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0): dependencies: '@vitest/expect': 2.1.3 - '@vitest/mocker': 2.1.3(vite@5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0)) + '@vitest/mocker': 2.1.3(vite@5.4.9(@types/node@18.19.57)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) '@vitest/pretty-format': 2.1.3 '@vitest/runner': 2.1.3 '@vitest/snapshot': 2.1.3 @@ -16990,8 +19528,8 @@ snapshots: tinyexec: 0.3.1 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.9(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0) - vite-node: 2.1.3(@types/node@18.19.57)(sugarss@2.0.0)(terser@5.36.0) + vite: 5.4.9(@types/node@18.19.57)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) + vite-node: 2.1.3(@types/node@18.19.57)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 18.19.57 @@ -17008,6 +19546,44 @@ snapshots: - supports-color - terser + vitest@2.1.3(@types/node@20.17.23)(@vitest/ui@2.1.3)(jsdom@19.0.0)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0): + dependencies: + '@vitest/expect': 2.1.3 + '@vitest/mocker': 2.1.3(vite@5.4.9(@types/node@20.17.23)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0)) + '@vitest/pretty-format': 2.1.3 + '@vitest/runner': 2.1.3 + '@vitest/snapshot': 2.1.3 + '@vitest/spy': 2.1.3 + '@vitest/utils': 2.1.3 + chai: 5.1.1 + debug: 4.3.7(supports-color@9.4.0) + magic-string: 0.30.12 + pathe: 1.1.2 + std-env: 3.7.0 + tinybench: 2.9.0 + tinyexec: 0.3.1 + tinypool: 1.0.1 + tinyrainbow: 1.2.0 + vite: 5.4.9(@types/node@20.17.23)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) + vite-node: 2.1.3(@types/node@20.17.23)(lightningcss@1.29.1)(sugarss@2.0.0)(terser@5.36.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.17.23 + '@vitest/ui': 2.1.3(vitest@2.1.3) + jsdom: 19.0.0 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vscode-uri@3.1.0: {} + w3c-hr-time@1.0.2: dependencies: browser-process-hrtime: 1.0.0 diff --git a/common/config/rush/version-policies.json b/common/config/rush/version-policies.json index aef78d3..e8a6037 100644 --- a/common/config/rush/version-policies.json +++ b/common/config/rush/version-policies.json @@ -100,5 +100,11 @@ "definitionName": "lockStepVersion", "version": "4.0.13", "nextBump": "patch" + }, + { + "policyName": "designs", + "definitionName": "lockStepVersion", + "version": "4.0.13", + "nextBump": "patch" } ] diff --git a/common/scripts/github-actions.js b/common/scripts/github-actions.js index 9247836..4871752 100644 --- a/common/scripts/github-actions.js +++ b/common/scripts/github-actions.js @@ -92,13 +92,16 @@ function getDependences(scope) { }, '2json': { '2json': true + }, + designs: { + designs: true } }; return dependencies[scope] || {}; } function getScopes(commits = []) { - const list = ['catalogs','csd','csf','curp','pdf','rfc','utils','xml','complementos','openssl','saxon','xsd'] + const list = ['catalogs','csd','csf','curp','pdf','rfc','utils','xml','complementos','openssl','saxon','xsd', '2json','designs'] const onlys = { 'only-complementos': 'complementos' } diff --git a/packages/files/xml/conceptos.xml b/packages/files/xml/conceptos.xml new file mode 100644 index 0000000..1619d84 --- /dev/null +++ b/packages/files/xml/conceptos.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/files/xml/dos-conceptos.xml b/packages/files/xml/dos-conceptos.xml new file mode 100644 index 0000000..98fa6e1 --- /dev/null +++ b/packages/files/xml/dos-conceptos.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/packages/files/xml/dos-impuestos.xml b/packages/files/xml/dos-impuestos.xml new file mode 100644 index 0000000..8ece1ac --- /dev/null +++ b/packages/files/xml/dos-impuestos.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/packages/files/xml/emisor-receptor.xml b/packages/files/xml/emisor-receptor.xml new file mode 100644 index 0000000..ff34efa --- /dev/null +++ b/packages/files/xml/emisor-receptor.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/packages/files/xml/un-concepto.xml b/packages/files/xml/un-concepto.xml new file mode 100644 index 0000000..6eea5a1 --- /dev/null +++ b/packages/files/xml/un-concepto.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/packages/files/xml/un-impuesto.xml b/packages/files/xml/un-impuesto.xml new file mode 100644 index 0000000..1a89d30 --- /dev/null +++ b/packages/files/xml/un-impuesto.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/packages/server/.gitignore b/packages/server/.gitignore new file mode 100644 index 0000000..5ef6a52 --- /dev/null +++ b/packages/server/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/packages/server/README.md b/packages/server/README.md new file mode 100644 index 0000000..e215bc4 --- /dev/null +++ b/packages/server/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/packages/server/eslint.config.mjs b/packages/server/eslint.config.mjs new file mode 100644 index 0000000..c85fb67 --- /dev/null +++ b/packages/server/eslint.config.mjs @@ -0,0 +1,16 @@ +import { dirname } from "path"; +import { fileURLToPath } from "url"; +import { FlatCompat } from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const compat = new FlatCompat({ + baseDirectory: __dirname, +}); + +const eslintConfig = [ + ...compat.extends("next/core-web-vitals", "next/typescript"), +]; + +export default eslintConfig; diff --git a/packages/server/next.config.ts b/packages/server/next.config.ts new file mode 100644 index 0000000..e10954b --- /dev/null +++ b/packages/server/next.config.ts @@ -0,0 +1,8 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ + +}; + +export default nextConfig; diff --git a/packages/server/package-lock.json b/packages/server/package-lock.json new file mode 100644 index 0000000..3340574 --- /dev/null +++ b/packages/server/package-lock.json @@ -0,0 +1,5469 @@ +{ + "name": "server", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "server", + "version": "0.1.0", + "dependencies": { + "next": "15.2.1", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@eslint/eslintrc": "^3", + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "eslint": "^9", + "eslint-config-next": "15.2.1", + "tailwindcss": "^4", + "typescript": "^5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", + "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", + "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", + "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.0.tgz", + "integrity": "sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.21.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.21.0.tgz", + "integrity": "sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", + "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.12.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@next/env": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.2.1.tgz", + "integrity": "sha512-JmY0qvnPuS2NCWOz2bbby3Pe0VzdAQ7XpEB6uLIHmtXNfAsAO0KLQLkuAoc42Bxbo3/jMC3dcn9cdf+piCcG2Q==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.2.1.tgz", + "integrity": "sha512-6ppeToFd02z38SllzWxayLxjjNfzvc7Wm07gQOKSLjyASvKcXjNStZrLXMHuaWkhjqxe+cnhb2uzfWXm1VEj/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.1.tgz", + "integrity": "sha512-aWXT+5KEREoy3K5AKtiKwioeblmOvFFjd+F3dVleLvvLiQ/mD//jOOuUcx5hzcO9ISSw4lrqtUPntTpK32uXXQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.1.tgz", + "integrity": "sha512-E/w8ervu4fcG5SkLhvn1NE/2POuDCDEy5gFbfhmnYXkyONZR68qbUlJlZwuN82o7BrBVAw+tkR8nTIjGiMW1jQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.1.tgz", + "integrity": "sha512-gXDX5lIboebbjhiMT6kFgu4svQyjoSed6dHyjx5uZsjlvTwOAnZpn13w9XDaIMFFHw7K8CpBK7HfDKw0VZvUXQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.1.tgz", + "integrity": "sha512-3v0pF/adKZkBWfUffmB/ROa+QcNTrnmYG4/SS+r52HPwAK479XcWoES2I+7F7lcbqc7mTeVXrIvb4h6rR/iDKg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.1.tgz", + "integrity": "sha512-RbsVq2iB6KFJRZ2cHrU67jLVLKeuOIhnQB05ygu5fCNgg8oTewxweJE8XlLV+Ii6Y6u4EHwETdUiRNXIAfpBww==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.1.tgz", + "integrity": "sha512-QHsMLAyAIu6/fWjHmkN/F78EFPKmhQlyX5C8pRIS2RwVA7z+t9cTb0IaYWC3EHLOTjsU7MNQW+n2xGXr11QPpg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.1.tgz", + "integrity": "sha512-Gk42XZXo1cE89i3hPLa/9KZ8OuupTjkDmhLaMKFohjf9brOeZVEa3BQy1J9s9TWUqPhgAEbwv6B2+ciGfe54Vw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.1.tgz", + "integrity": "sha512-YjqXCl8QGhVlMR8uBftWk0iTmvtntr41PhG1kvzGp0sUP/5ehTM+cwx25hKE54J0CRnHYjSGjSH3gkHEaHIN9g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.5.tgz", + "integrity": "sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.9.tgz", + "integrity": "sha512-tOJvdI7XfJbARYhxX+0RArAhmuDcczTC46DGCEziqxzzbIaPnfYaIyRT31n4u8lROrsO7Q6u/K9bmQHL2uL1bQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "tailwindcss": "4.0.9" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.9.tgz", + "integrity": "sha512-eLizHmXFqHswJONwfqi/WZjtmWZpIalpvMlNhTM99/bkHtUs6IqgI1XQ0/W5eO2HiRQcIlXUogI2ycvKhVLNcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.0.9", + "@tailwindcss/oxide-darwin-arm64": "4.0.9", + "@tailwindcss/oxide-darwin-x64": "4.0.9", + "@tailwindcss/oxide-freebsd-x64": "4.0.9", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.9", + "@tailwindcss/oxide-linux-arm64-gnu": "4.0.9", + "@tailwindcss/oxide-linux-arm64-musl": "4.0.9", + "@tailwindcss/oxide-linux-x64-gnu": "4.0.9", + "@tailwindcss/oxide-linux-x64-musl": "4.0.9", + "@tailwindcss/oxide-win32-arm64-msvc": "4.0.9", + "@tailwindcss/oxide-win32-x64-msvc": "4.0.9" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.9.tgz", + "integrity": "sha512-YBgy6+2flE/8dbtrdotVInhMVIxnHJPbAwa7U1gX4l2ThUIaPUp18LjB9wEH8wAGMBZUb//SzLtdXXNBHPUl6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.9.tgz", + "integrity": "sha512-pWdl4J2dIHXALgy2jVkwKBmtEb73kqIfMpYmcgESr7oPQ+lbcQ4+tlPeVXaSAmang+vglAfFpXQCOvs/aGSqlw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.9.tgz", + "integrity": "sha512-4Dq3lKp0/C7vrRSkNPtBGVebEyWt9QPPlQctxJ0H3MDyiQYvzVYf8jKow7h5QkWNe8hbatEqljMj/Y0M+ERYJg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.9.tgz", + "integrity": "sha512-k7U1RwRODta8x0uealtVt3RoWAWqA+D5FAOsvVGpYoI6ObgmnzqWW6pnVwz70tL8UZ/QXjeMyiICXyjzB6OGtQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.9.tgz", + "integrity": "sha512-NDDjVweHz2zo4j+oS8y3KwKL5wGCZoXGA9ruJM982uVJLdsF8/1AeKvUwKRlMBpxHt1EdWJSAh8a0Mfhl28GlQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.9.tgz", + "integrity": "sha512-jk90UZ0jzJl3Dy1BhuFfRZ2KP9wVKMXPjmCtY4U6fF2LvrjP5gWFJj5VHzfzHonJexjrGe1lMzgtjriuZkxagg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.9.tgz", + "integrity": "sha512-3eMjyTC6HBxh9nRgOHzrc96PYh1/jWOwHZ3Kk0JN0Kl25BJ80Lj9HEvvwVDNTgPg154LdICwuFLuhfgH9DULmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.9.tgz", + "integrity": "sha512-v0D8WqI/c3WpWH1kq/HP0J899ATLdGZmENa2/emmNjubT0sWtEke9W9+wXeEoACuGAhF9i3PO5MeyditpDCiWQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.9.tgz", + "integrity": "sha512-Kvp0TCkfeXyeehqLJr7otsc4hd/BUPfcIGrQiwsTVCfaMfjQZCG7DjI+9/QqPZha8YapLA9UoIcUILRYO7NE1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.9.tgz", + "integrity": "sha512-m3+60T/7YvWekajNq/eexjhV8z10rswcz4BC9bioJ7YaN+7K8W2AmLmG0B79H14m6UHE571qB0XsPus4n0QVgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.9.tgz", + "integrity": "sha512-dpc05mSlqkwVNOUjGu/ZXd5U1XNch1kHFJ4/cHkZFvaW1RzbHmRt24gvM8/HC6IirMxNarzVw4IXVtvrOoZtxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.0.9.tgz", + "integrity": "sha512-BT/E+pdMqulavEAVM5NCpxmGEwHiLDPpkmg/c/X25ZBW+izTe+aZ+v1gf/HXTrihRoCxrUp5U4YyHsBTzspQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.0.9", + "@tailwindcss/oxide": "4.0.9", + "lightningcss": "^1.29.1", + "postcss": "^8.4.41", + "tailwindcss": "4.0.9" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.17.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.23.tgz", + "integrity": "sha512-8PCGZ1ZJbEZuYNTMqywO+Sj4vSKjSjT6Ua+6RFOYlEvIvKQABPtrNkoVSLSKDb4obYcMhspVKmsw8Cm10NFRUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/react": { + "version": "19.0.10", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.10.tgz", + "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.4.tgz", + "integrity": "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.26.0.tgz", + "integrity": "sha512-cLr1J6pe56zjKYajK6SSSre6nl1Gj6xDp1TY0trpgPzjVbgDwd09v2Ws37LABxzkicmUjhEeg/fAUjPJJB1v5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.26.0", + "@typescript-eslint/type-utils": "8.26.0", + "@typescript-eslint/utils": "8.26.0", + "@typescript-eslint/visitor-keys": "8.26.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.26.0.tgz", + "integrity": "sha512-mNtXP9LTVBy14ZF3o7JG69gRPBK/2QWtQd0j0oH26HcY/foyJJau6pNUez7QrM5UHnSvwlQcJXKsk0I99B9pOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.26.0", + "@typescript-eslint/types": "8.26.0", + "@typescript-eslint/typescript-estree": "8.26.0", + "@typescript-eslint/visitor-keys": "8.26.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.26.0.tgz", + "integrity": "sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.26.0", + "@typescript-eslint/visitor-keys": "8.26.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.26.0.tgz", + "integrity": "sha512-ruk0RNChLKz3zKGn2LwXuVoeBcUMh+jaqzN461uMMdxy5H9epZqIBtYj7UiPXRuOpaALXGbmRuZQhmwHhaS04Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.26.0", + "@typescript-eslint/utils": "8.26.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.26.0.tgz", + "integrity": "sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.26.0.tgz", + "integrity": "sha512-tiJ1Hvy/V/oMVRTbEOIeemA2XoylimlDQ03CgPPNaHYZbpsc78Hmngnt+WXZfJX1pjQ711V7g0H7cSJThGYfPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.26.0", + "@typescript-eslint/visitor-keys": "8.26.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.26.0.tgz", + "integrity": "sha512-2L2tU3FVwhvU14LndnQCA2frYC8JnPDVKyQtWFPf8IYFMt/ykEN1bPolNhNbCVgOmdzTlWdusCTKA/9nKrf8Ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.26.0", + "@typescript-eslint/types": "8.26.0", + "@typescript-eslint/typescript-estree": "8.26.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.26.0.tgz", + "integrity": "sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.26.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz", + "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001702", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001702.tgz", + "integrity": "sha512-LoPe/D7zioC0REI5W73PeR1e1MLCipRGq/VkovJnd6Df+QVqT+vT33OXCp8QUd7kA7RZrHWxb1B36OQKI/0gOA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-abstract": { + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.21.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.21.0.tgz", + "integrity": "sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.2", + "@eslint/core": "^0.12.0", + "@eslint/eslintrc": "^3.3.0", + "@eslint/js": "9.21.0", + "@eslint/plugin-kit": "^0.2.7", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-next": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.2.1.tgz", + "integrity": "sha512-mhsprz7l0no8X+PdDnVHF4dZKu9YBJp2Rf6ztWbXBLJ4h6gxmW//owbbGJMBVUU+PibGJDAqZhW4pt8SC8HSow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "15.2.1", + "@rushstack/eslint-patch": "^1.10.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^5.0.0" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.8.3.tgz", + "integrity": "sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.3.7", + "enhanced-resolve": "^5.15.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^1.0.2", + "stable-hash": "^0.0.4", + "tinyglobby": "^0.2.12" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz", + "integrity": "sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", + "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT", + "optional": true + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.3.0.tgz", + "integrity": "sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.6.3" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.1.tgz", + "integrity": "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.29.1", + "lightningcss-darwin-x64": "1.29.1", + "lightningcss-freebsd-x64": "1.29.1", + "lightningcss-linux-arm-gnueabihf": "1.29.1", + "lightningcss-linux-arm64-gnu": "1.29.1", + "lightningcss-linux-arm64-musl": "1.29.1", + "lightningcss-linux-x64-gnu": "1.29.1", + "lightningcss-linux-x64-musl": "1.29.1", + "lightningcss-win32-arm64-msvc": "1.29.1", + "lightningcss-win32-x64-msvc": "1.29.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.1.tgz", + "integrity": "sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.1.tgz", + "integrity": "sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.1.tgz", + "integrity": "sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.1.tgz", + "integrity": "sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.1.tgz", + "integrity": "sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.1.tgz", + "integrity": "sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.1.tgz", + "integrity": "sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.1.tgz", + "integrity": "sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.1.tgz", + "integrity": "sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.1.tgz", + "integrity": "sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/next": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/next/-/next-15.2.1.tgz", + "integrity": "sha512-zxbsdQv3OqWXybK5tMkPCBKyhIz63RstJ+NvlfkaLMc/m5MwXgz2e92k+hSKcyBpyADhMk2C31RIiaDjUZae7g==", + "license": "MIT", + "dependencies": { + "@next/env": "15.2.1", + "@swc/counter": "0.1.3", + "@swc/helpers": "0.5.15", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "15.2.1", + "@next/swc-darwin-x64": "15.2.1", + "@next/swc-linux-arm64-gnu": "15.2.1", + "@next/swc-linux-arm64-musl": "15.2.1", + "@next/swc-linux-x64-gnu": "15.2.1", + "@next/swc-linux-x64-musl": "15.2.1", + "@next/swc-win32-arm64-msvc": "15.2.1", + "@next/swc-win32-x64-msvc": "15.2.1", + "sharp": "^0.33.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", + "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", + "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.25.0" + }, + "peerDependencies": { + "react": "^19.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", + "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "devOptional": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "node_modules/sharp/node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable-hash": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz", + "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.9.tgz", + "integrity": "sha512-12laZu+fv1ONDRoNR9ipTOpUD7RN9essRVkX36sjxuRUInpN7hIiHN4lBd/SIFjbISvnXzp8h/hXzmU8SQQYhw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", + "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", + "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/packages/server/package.json b/packages/server/package.json new file mode 100644 index 0000000..65f2bc0 --- /dev/null +++ b/packages/server/package.json @@ -0,0 +1,32 @@ +{ + "name": "server", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0", + "next": "15.2.3", + "@cfdi/designs": "workspace:*", + "@cfdi/pdf": "workspace:*", + "@cfdi/catalogos": "workspace:*", + "@cfdi/utils": "workspace:*", + "@cfdi/2json": "workspace:*" + }, + "devDependencies": { + "typescript": "^5", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "@tailwindcss/postcss": "^4", + "tailwindcss": "^4", + "eslint": "^9", + "eslint-config-next": "15.2.1", + "@eslint/eslintrc": "^3" + } +} diff --git a/packages/server/postcss.config.mjs b/packages/server/postcss.config.mjs new file mode 100644 index 0000000..c7bcb4b --- /dev/null +++ b/packages/server/postcss.config.mjs @@ -0,0 +1,5 @@ +const config = { + plugins: ["@tailwindcss/postcss"], +}; + +export default config; diff --git a/packages/server/public/file.svg b/packages/server/public/file.svg new file mode 100644 index 0000000..004145c --- /dev/null +++ b/packages/server/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/server/public/globe.svg b/packages/server/public/globe.svg new file mode 100644 index 0000000..567f17b --- /dev/null +++ b/packages/server/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/server/public/next.svg b/packages/server/public/next.svg new file mode 100644 index 0000000..5174b28 --- /dev/null +++ b/packages/server/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/server/public/vercel.svg b/packages/server/public/vercel.svg new file mode 100644 index 0000000..7705396 --- /dev/null +++ b/packages/server/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/server/public/window.svg b/packages/server/public/window.svg new file mode 100644 index 0000000..b2b2a44 --- /dev/null +++ b/packages/server/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/server/src/app/cfdi/pdf/route.ts b/packages/server/src/app/cfdi/pdf/route.ts new file mode 100644 index 0000000..7f8ff57 --- /dev/null +++ b/packages/server/src/app/cfdi/pdf/route.ts @@ -0,0 +1,22 @@ + +import {PDF117} from '@cfdi/designs/dist/index.cjs' + +export async function GET(request: Request) { + /* const a = new PDF117( + '/Users/amir/Documents/proyectos/amir/node/cfdi/packages/files/xml/5E2D6AFF-2DD7-43D1-83D3-14C1ACA396D9.xml', + ); */ + const pdf = new PDF117() + pdf.design() + //console.log(pdf.design()) + // pdf.design() + const pdfBuffer = await pdf.getPDF().getBuffer() + console.log(pdfBuffer) + //return Response.json({ message: 'Hello World' }) + + return new Response(pdfBuffer, { + headers: { + 'Content-Type': 'application/pdf', + 'Content-Disposition': 'inline; filename="documento.pdf"', + }, + }); +} \ No newline at end of file diff --git a/packages/server/src/app/favicon.ico b/packages/server/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 zcmeHv30#a{`}aL_*G&7qml|y<+KVaDM2m#dVr!KsA!#An?kSQM(q<_dDNCpjEux83 zLb9Z^XxbDl(w>%i@8hT6>)&Gu{h#Oeyszu?xtw#Zb1mO{pgX9699l+Qppw7jXaYf~-84xW z)w4x8?=youko|}Vr~(D$UXIbiXABHh`p1?nn8Po~fxRJv}|0e(BPs|G`(TT%kKVJAdg5*Z|x0leQq0 zkdUBvb#>9F()jo|T~kx@OM8$9wzs~t2l;K=woNssA3l6|sx2r3+kdfVW@e^8e*E}v zA1y5{bRi+3Z`uD3{F7LgFJDdvm;nJilkzDku>BwXH(8ItVCXk*-lSJnR?-2UN%hJ){&rlvg`CDTj z)Bzo!3v7Ou#83zEDEFcKt(f1E0~=rqeEbTnMvWR#{+9pg%7G8y>u1OVRUSoox-ovF z2Ydma(;=YuBY(eI|04{hXzZD6_f(v~H;C~y5=DhAC{MMS>2fm~1H_t2$56pc$NH8( z5bH|<)71dV-_oCHIrzrT`2s-5w_+2CM0$95I6X8p^r!gHp+j_gd;9O<1~CEQQGS8) zS9Qh3#p&JM-G8rHekNmKVewU;pJRcTAog68KYo^dRo}(M>36U4Us zfgYWSiHZL3;lpWT=zNAW>Dh#mB!_@Lg%$ms8N-;aPqMn+C2HqZgz&9~Eu z4|Kp<`$q)Uw1R?y(~S>ePdonHxpV1#eSP1B;Ogo+-Pk}6#0GsZZ5!||ev2MGdh}_m z{DeR7?0-1^zVs&`AV6Vt;r3`I`OI_wgs*w=eO%_#7Kepl{B@xiyCANc(l zzIyd4y|c6PXWq9-|KM8(zIk8LPk(>a)zyFWjhT!$HJ$qX1vo@d25W<fvZQ2zUz5WRc(UnFMKHwe1| zWmlB1qdbiA(C0jmnV<}GfbKtmcu^2*P^O?MBLZKt|As~ge8&AAO~2K@zbXelK|4T<{|y4`raF{=72kC2Kn(L4YyenWgrPiv z@^mr$t{#X5VuIMeL!7Ab6_kG$&#&5p*Z{+?5U|TZ`B!7llpVmp@skYz&n^8QfPJzL z0G6K_OJM9x+Wu2gfN45phANGt{7=C>i34CV{Xqlx(fWpeAoj^N0Biu`w+MVcCUyU* zDZuzO0>4Z6fbu^T_arWW5n!E45vX8N=bxTVeFoep_G#VmNlQzAI_KTIc{6>c+04vr zx@W}zE5JNSU>!THJ{J=cqjz+4{L4A{Ob9$ZJ*S1?Ggg3klFp!+Y1@K+pK1DqI|_gq z5ZDXVpge8-cs!o|;K73#YXZ3AShj50wBvuq3NTOZ`M&qtjj#GOFfgExjg8Gn8>Vq5 z`85n+9|!iLCZF5$HJ$Iu($dm?8~-ofu}tEc+-pyke=3!im#6pk_Wo8IA|fJwD&~~F zc16osQ)EBo58U7XDuMexaPRjU@h8tXe%S{fA0NH3vGJFhuyyO!Uyl2^&EOpX{9As0 zWj+P>{@}jxH)8|r;2HdupP!vie{sJ28b&bo!8`D^x}TE$%zXNb^X1p@0PJ86`dZyj z%ce7*{^oo+6%&~I!8hQy-vQ7E)0t0ybH4l%KltWOo~8cO`T=157JqL(oq_rC%ea&4 z2NcTJe-HgFjNg-gZ$6!Y`SMHrlj}Etf7?r!zQTPPSv}{so2e>Fjs1{gzk~LGeesX%r(Lh6rbhSo_n)@@G-FTQy93;l#E)hgP@d_SGvyCp0~o(Y;Ee8{ zdVUDbHm5`2taPUOY^MAGOw*>=s7=Gst=D+p+2yON!0%Hk` zz5mAhyT4lS*T3LS^WSxUy86q&GnoHxzQ6vm8)VS}_zuqG?+3td68_x;etQAdu@sc6 zQJ&5|4(I?~3d-QOAODHpZ=hlSg(lBZ!JZWCtHHSj`0Wh93-Uk)_S%zsJ~aD>{`A0~ z9{AG(e|q3g5B%wYKRxiL2Y$8(4w6bzchKuloQW#e&S3n+P- z8!ds-%f;TJ1>)v)##>gd{PdS2Oc3VaR`fr=`O8QIO(6(N!A?pr5C#6fc~Ge@N%Vvu zaoAX2&(a6eWy_q&UwOhU)|P3J0Qc%OdhzW=F4D|pt0E4osw;%<%Dn58hAWD^XnZD= z>9~H(3bmLtxpF?a7su6J7M*x1By7YSUbxGi)Ot0P77`}P3{)&5Un{KD?`-e?r21!4vTTnN(4Y6Lin?UkSM z`MXCTC1@4A4~mvz%Rh2&EwY))LeoT=*`tMoqcEXI>TZU9WTP#l?uFv+@Dn~b(>xh2 z;>B?;Tz2SR&KVb>vGiBSB`@U7VIWFSo=LDSb9F{GF^DbmWAfpms8Sx9OX4CnBJca3 zlj9(x!dIjN?OG1X4l*imJNvRCk}F%!?SOfiOq5y^mZW)jFL@a|r-@d#f7 z2gmU8L3IZq0ynIws=}~m^#@&C%J6QFo~Mo4V`>v7MI-_!EBMMtb%_M&kvAaN)@ZVw z+`toz&WG#HkWDjnZE!6nk{e-oFdL^$YnbOCN}JC&{$#$O27@|Tn-skXr)2ml2~O!5 zX+gYoxhoc7qoU?C^3~&!U?kRFtnSEecWuH0B0OvLodgUAi}8p1 zrO6RSXHH}DMc$&|?D004DiOVMHV8kXCP@7NKB zgaZq^^O<7PoKEp72kby@W0Z!Y*Ay{&vfg#C&gG@YVR9g?FEocMUi1gSN$+V+ayF45{a zuDZDTN}mS|;BO%gEf}pjBfN2-gIrU#G5~cucA;dokXW89%>AyXJJI z9X4UlIWA|ZYHgbI z5?oFk@A=Ik7lrEQPDH!H+b`7_Y~aDb_qa=B2^Y&Ow41cU=4WDd40dp5(QS-WMN-=Y z9g;6_-JdNU;|6cPwf$ak*aJIcwL@1n$#l~zi{c{EW?T;DaW*E8DYq?Umtz{nJ&w-M zEMyTDrC&9K$d|kZe2#ws6)L=7K+{ zQw{XnV6UC$6-rW0emqm8wJoeZK)wJIcV?dST}Z;G0Arq{dVDu0&4kd%N!3F1*;*pW zR&qUiFzK=@44#QGw7k1`3t_d8&*kBV->O##t|tonFc2YWrL7_eqg+=+k;!F-`^b8> z#KWCE8%u4k@EprxqiV$VmmtiWxDLgnGu$Vs<8rppV5EajBXL4nyyZM$SWVm!wnCj-B!Wjqj5-5dNXukI2$$|Bu3Lrw}z65Lc=1G z^-#WuQOj$hwNGG?*CM_TO8Bg-1+qc>J7k5c51U8g?ZU5n?HYor;~JIjoWH-G>AoUP ztrWWLbRNqIjW#RT*WqZgPJXU7C)VaW5}MiijYbABmzoru6EmQ*N8cVK7a3|aOB#O& zBl8JY2WKfmj;h#Q!pN%9o@VNLv{OUL?rixHwOZuvX7{IJ{(EdPpuVFoQqIOa7giLVkBOKL@^smUA!tZ1CKRK}#SSM)iQHk)*R~?M!qkCruaS!#oIL1c z?J;U~&FfH#*98^G?i}pA{ z9Jg36t4=%6mhY(quYq*vSxptes9qy|7xSlH?G=S@>u>Ebe;|LVhs~@+06N<4CViBk zUiY$thvX;>Tby6z9Y1edAMQaiH zm^r3v#$Q#2T=X>bsY#D%s!bhs^M9PMAcHbCc0FMHV{u-dwlL;a1eJ63v5U*?Q_8JO zT#50!RD619#j_Uf))0ooADz~*9&lN!bBDRUgE>Vud-i5ck%vT=r^yD*^?Mp@Q^v+V zG#-?gKlr}Eeqifb{|So?HM&g91P8|av8hQoCmQXkd?7wIJwb z_^v8bbg`SAn{I*4bH$u(RZ6*xUhuA~hc=8czK8SHEKTzSxgbwi~9(OqJB&gwb^l4+m`k*Q;_?>Y-APi1{k zAHQ)P)G)f|AyjSgcCFps)Fh6Bca*Xznq36!pV6Az&m{O8$wGFD? zY&O*3*J0;_EqM#jh6^gMQKpXV?#1?>$ml1xvh8nSN>-?H=V;nJIwB07YX$e6vLxH( zqYwQ>qxwR(i4f)DLd)-$P>T-no_c!LsN@)8`e;W@)-Hj0>nJ-}Kla4-ZdPJzI&Mce zv)V_j;(3ERN3_@I$N<^|4Lf`B;8n+bX@bHbcZTopEmDI*Jfl)-pFDvo6svPRoo@(x z);_{lY<;);XzT`dBFpRmGrr}z5u1=pC^S-{ce6iXQlLGcItwJ^mZx{m$&DA_oEZ)B{_bYPq-HA zcH8WGoBG(aBU_j)vEy+_71T34@4dmSg!|M8Vf92Zj6WH7Q7t#OHQqWgFE3ARt+%!T z?oLovLVlnf?2c7pTc)~cc^($_8nyKwsN`RA-23ed3sdj(ys%pjjM+9JrctL;dy8a( z@en&CQmnV(()bu|Y%G1-4a(6x{aLytn$T-;(&{QIJB9vMox11U-1HpD@d(QkaJdEb zG{)+6Dos_L+O3NpWo^=gR?evp|CqEG?L&Ut#D*KLaRFOgOEK(Kq1@!EGcTfo+%A&I z=dLbB+d$u{sh?u)xP{PF8L%;YPPW53+@{>5W=Jt#wQpN;0_HYdw1{ksf_XhO4#2F= zyPx6Lx2<92L-;L5PD`zn6zwIH`Jk($?Qw({erA$^bC;q33hv!d!>%wRhj# zal^hk+WGNg;rJtb-EB(?czvOM=H7dl=vblBwAv>}%1@{}mnpUznfq1cE^sgsL0*4I zJ##!*B?=vI_OEVis5o+_IwMIRrpQyT_Sq~ZU%oY7c5JMIADzpD!Upz9h@iWg_>>~j zOLS;wp^i$-E?4<_cp?RiS%Rd?i;f*mOz=~(&3lo<=@(nR!_Rqiprh@weZlL!t#NCc zO!QTcInq|%#>OVgobj{~ixEUec`E25zJ~*DofsQdzIa@5^nOXj2T;8O`l--(QyU^$t?TGY^7#&FQ+2SS3B#qK*k3`ye?8jUYSajE5iBbJls75CCc(m3dk{t?- zopcER9{Z?TC)mk~gpi^kbbu>b-+a{m#8-y2^p$ka4n60w;Sc2}HMf<8JUvhCL0B&Btk)T`ctE$*qNW8L$`7!r^9T+>=<=2qaq-;ll2{`{Rg zc5a0ZUI$oG&j-qVOuKa=*v4aY#IsoM+1|c4Z)<}lEDvy;5huB@1RJPquU2U*U-;gu z=En2m+qjBzR#DEJDO`WU)hdd{Vj%^0V*KoyZ|5lzV87&g_j~NCjwv0uQVqXOb*QrQ zy|Qn`hxx(58c70$E;L(X0uZZ72M1!6oeg)(cdKO ze0gDaTz+ohR-#d)NbAH4x{I(21yjwvBQfmpLu$)|m{XolbgF!pmsqJ#D}(ylp6uC> z{bqtcI#hT#HW=wl7>p!38sKsJ`r8}lt-q%Keqy%u(xk=yiIJiUw6|5IvkS+#?JTBl z8H5(Q?l#wzazujH!8o>1xtn8#_w+397*_cy8!pQGP%K(Ga3pAjsaTbbXJlQF_+m+-UpUUent@xM zg%jqLUExj~o^vQ3Gl*>wh=_gOr2*|U64_iXb+-111aH}$TjeajM+I20xw(((>fej-@CIz4S1pi$(#}P7`4({6QS2CaQS4NPENDp>sAqD z$bH4KGzXGffkJ7R>V>)>tC)uax{UsN*dbeNC*v}#8Y#OWYwL4t$ePR?VTyIs!wea+ z5Urmc)X|^`MG~*dS6pGSbU+gPJoq*^a=_>$n4|P^w$sMBBy@f*Z^Jg6?n5?oId6f{ z$LW4M|4m502z0t7g<#Bx%X;9<=)smFolV&(V^(7Cv2-sxbxopQ!)*#ZRhTBpx1)Fc zNm1T%bONzv6@#|dz(w02AH8OXe>kQ#1FMCzO}2J_mST)+ExmBr9cva-@?;wnmWMOk z{3_~EX_xadgJGv&H@zK_8{(x84`}+c?oSBX*Ge3VdfTt&F}yCpFP?CpW+BE^cWY0^ zb&uBN!Ja3UzYHK-CTyA5=L zEMW{l3Usky#ly=7px648W31UNV@K)&Ub&zP1c7%)`{);I4b0Q<)B}3;NMG2JH=X$U zfIW4)4n9ZM`-yRj67I)YSLDK)qfUJ_ij}a#aZN~9EXrh8eZY2&=uY%2N0UFF7<~%M zsB8=erOWZ>Ct_#^tHZ|*q`H;A)5;ycw*IcmVxi8_0Xk}aJA^ath+E;xg!x+As(M#0=)3!NJR6H&9+zd#iP(m0PIW8$ z1Y^VX`>jm`W!=WpF*{ioM?C9`yOR>@0q=u7o>BP-eSHqCgMDj!2anwH?s%i2p+Q7D zzszIf5XJpE)IG4;d_(La-xenmF(tgAxK`Y4sQ}BSJEPs6N_U2vI{8=0C_F?@7<(G; zo$~G=8p+076G;`}>{MQ>t>7cm=zGtfbdDXm6||jUU|?X?CaE?(<6bKDYKeHlz}DA8 zXT={X=yp_R;HfJ9h%?eWvQ!dRgz&Su*JfNt!Wu>|XfU&68iRikRrHRW|ZxzRR^`eIGt zIeiDgVS>IeExKVRWW8-=A=yA`}`)ZkWBrZD`hpWIxBGkh&f#ijr449~m`j6{4jiJ*C!oVA8ZC?$1RM#K(_b zL9TW)kN*Y4%^-qPpMP7d4)o?Nk#>aoYHT(*g)qmRUb?**F@pnNiy6Fv9rEiUqD(^O zzyS?nBrX63BTRYduaG(0VVG2yJRe%o&rVrLjbxTaAFTd8s;<<@Qs>u(<193R8>}2_ zuwp{7;H2a*X7_jryzriZXMg?bTuegABb^87@SsKkr2)0Gyiax8KQWstw^v#ix45EVrcEhr>!NMhprl$InQMzjSFH54x5k9qHc`@9uKQzvL4ihcq{^B zPrVR=o_ic%Y>6&rMN)hTZsI7I<3&`#(nl+3y3ys9A~&^=4?PL&nd8)`OfG#n zwAMN$1&>K++c{^|7<4P=2y(B{jJsQ0a#U;HTo4ZmWZYvI{+s;Td{Yzem%0*k#)vjpB zia;J&>}ICate44SFYY3vEelqStQWFihx%^vQ@Do(sOy7yR2@WNv7Y9I^yL=nZr3mb zXKV5t@=?-Sk|b{XMhA7ZGB@2hqsx}4xwCW!in#C zI@}scZlr3-NFJ@NFaJlhyfcw{k^vvtGl`N9xSo**rDW4S}i zM9{fMPWo%4wYDG~BZ18BD+}h|GQKc-g^{++3MY>}W_uq7jGHx{mwE9fZiPCoxN$+7 zrODGGJrOkcPQUB(FD5aoS4g~7#6NR^ma7-!>mHuJfY5kTe6PpNNKC9GGRiu^L31uG z$7v`*JknQHsYB!Tm_W{a32TM099djW%5e+j0Ve_ct}IM>XLF1Ap+YvcrLV=|CKo6S zb+9Nl3_YdKP6%Cxy@6TxZ>;4&nTneadr z_ES90ydCev)LV!dN=#(*f}|ZORFdvkYBni^aLbUk>BajeWIOcmHP#8S)*2U~QKI%S zyrLmtPqb&TphJ;>yAxri#;{uyk`JJqODDw%(Z=2`1uc}br^V%>j!gS)D*q*f_-qf8&D;W1dJgQMlaH5er zN2U<%Smb7==vE}dDI8K7cKz!vs^73o9f>2sgiTzWcwY|BMYHH5%Vn7#kiw&eItCqa zIkR2~Q}>X=Ar8W|^Ms41Fm8o6IB2_j60eOeBB1Br!boW7JnoeX6Gs)?7rW0^5psc- zjS16yb>dFn>KPOF;imD}e!enuIniFzv}n$m2#gCCv4jM#ArwlzZ$7@9&XkFxZ4n!V zj3dyiwW4Ki2QG{@i>yuZXQizw_OkZI^-3otXC{!(lUpJF33gI60ak;Uqitp74|B6I zgg{b=Iz}WkhCGj1M=hu4#Aw173YxIVbISaoc z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S(O(a0e7oY=E( zAyS;Ow?6Q&XA+cnkCb{28_1N8H#?J!*$MmIwLq^*T_9-z^&UE@A(z9oGYtFy6EZef LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/packages/server/src/app/globals.css b/packages/server/src/app/globals.css new file mode 100644 index 0000000..a2dc41e --- /dev/null +++ b/packages/server/src/app/globals.css @@ -0,0 +1,26 @@ +@import "tailwindcss"; + +:root { + --background: #ffffff; + --foreground: #171717; +} + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --font-sans: var(--font-geist-sans); + --font-mono: var(--font-geist-mono); +} + +@media (prefers-color-scheme: dark) { + :root { + --background: #0a0a0a; + --foreground: #ededed; + } +} + +body { + background: var(--background); + color: var(--foreground); + font-family: Arial, Helvetica, sans-serif; +} diff --git a/packages/server/src/app/layout.tsx b/packages/server/src/app/layout.tsx new file mode 100644 index 0000000..f7fa87e --- /dev/null +++ b/packages/server/src/app/layout.tsx @@ -0,0 +1,34 @@ +import type { Metadata } from "next"; +import { Geist, Geist_Mono } from "next/font/google"; +import "./globals.css"; + +const geistSans = Geist({ + variable: "--font-geist-sans", + subsets: ["latin"], +}); + +const geistMono = Geist_Mono({ + variable: "--font-geist-mono", + subsets: ["latin"], +}); + +export const metadata: Metadata = { + title: "Create Next App", + description: "Generated by create next app", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + {children} + + + ); +} diff --git a/packages/server/src/app/page.tsx b/packages/server/src/app/page.tsx new file mode 100644 index 0000000..3eee014 --- /dev/null +++ b/packages/server/src/app/page.tsx @@ -0,0 +1,101 @@ +import Image from "next/image"; + +export default function Home() { + return ( +
+
+ Next.js logo +
    +
  1. + Get started by editing{" "} + + src/app/page.tsx + + . +
  2. +
  3. Save and see your changes instantly.
  4. +
+ + +
+ +
+ ); +} diff --git a/packages/server/tsconfig.json b/packages/server/tsconfig.json new file mode 100644 index 0000000..a1b8679 --- /dev/null +++ b/packages/server/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"], + "@cfdi/utils": ["./node_modules/@cfdi/utils/src"], + "@cfdi/utils/*": ["./node_modules/@cfdi/utils/src/*"], + "@cfdi/2json/*": ["./node_modules/@cfdi/2json/src/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/rigs/typescript/profiles/default/tsconfig-base.json b/rigs/typescript/profiles/default/tsconfig-base.json index 75f39e5..95a44e3 100644 --- a/rigs/typescript/profiles/default/tsconfig-base.json +++ b/rigs/typescript/profiles/default/tsconfig-base.json @@ -85,6 +85,7 @@ "./node_modules/@saxon-he/cli/src" ], "@cfdi/utils/*": [ + "./node_modules/@cfdi/utils/src", "./node_modules/@cfdi/utils/src/*" ], "@cfdi/utils": [ diff --git a/rush.json b/rush.json index e6cd8e5..f0b23a7 100644 --- a/rush.json +++ b/rush.json @@ -202,6 +202,20 @@ "versionPolicyName": "elements", "reviewCategory": "libraries", "shouldPublish": true + }, + { + "packageName": "@cfdi/designs", + "projectFolder": "packages/cfdi/designs", + "versionPolicyName": "designs", + "reviewCategory": "libraries", + "shouldPublish": true + }, + { + "packageName": "server", + "projectFolder": "packages/server", + "reviewCategory": "private", + "shouldPublish": false, + "skipRushCheck": true } ] } \ No newline at end of file From 6ef050cab8a64ac4f6ef9c0cdd75af4281c243b2 Mon Sep 17 00:00:00 2001 From: MisaelMa Date: Fri, 27 Jun 2025 17:02:10 -0500 Subject: [PATCH 4/9] feat(core): free packages --- .github/actions/cfdi/action.yml | 28 +- .gitignore | 4 +- .vscode/settings.json | 3 +- packages/cfdi/designs/.gitignore | 70 + packages/cfdi/designs/README.md | 0 packages/cfdi/designs/dist/index.cjs.js | 1 + packages/cfdi/designs/dist/index.es.js | 1 + packages/cfdi/designs/package-lock.json | 962 + packages/cfdi/designs/package.json | 25 + packages/cfdi/designs/pnpm-lock.yaml | 955 + packages/cfdi/designs/src/A111/index.ts | 153 + packages/cfdi/designs/src/A117/index.ts | 412 + packages/cfdi/designs/src/B111/index.ts | 443 + packages/cfdi/designs/src/B112/index.ts | 458 + packages/cfdi/designs/src/B123/index.ts | 420 + packages/cfdi/designs/src/B222/index.ts | 528 + packages/cfdi/designs/src/B333/index.ts | 535 + .../cfdi/designs/src/abstract-cfdi-pdf.ts | 41 + packages/cfdi/designs/src/index.ts | 3 + packages/cfdi/designs/src/pdf/Cell.ts | 39 + packages/cfdi/designs/src/pdf/Column.ts | 54 + packages/cfdi/designs/src/pdf/Grid.ts | 20 + packages/cfdi/designs/src/pdf/Image.ts | 53 + packages/cfdi/designs/src/pdf/PDF.ts | 109 + packages/cfdi/designs/src/pdf/Row.ts | 30 + packages/cfdi/designs/src/pdf/Style.ts | 69 + packages/cfdi/designs/src/pdf/Table.ts | 76 + packages/cfdi/designs/src/pdf/Text.ts | 48 + packages/cfdi/designs/tsconfig.json | 22 + packages/cfdi/designs/vite.config.ts | 43 + packages/cfdi/pdf/src/abstract-cfdi-pdf.ts | 183 - packages/cfdi/pdf/src/templates/index.ts | 8 - packages/cfdi/schema/.eslintrc.js | 30 + packages/cfdi/schema/.gitignore | 4 + packages/cfdi/schema/.npmignore | 8 + packages/cfdi/schema/LICENSE | 21 + packages/cfdi/schema/README.md | 15 + packages/cfdi/schema/jest.config.js | 5 + packages/cfdi/schema/package.json | 97 + packages/cfdi/schema/src/CatalogProcess.ts | 43 + packages/cfdi/schema/src/CfdiProcess.ts | 174 + .../cfdi/schema/src/common/const/structure.ts | 14 + .../src/complementos/complementos.process.ts | 53 + .../schema/src/complementos/iedu.process.ts | 28 + .../cfdi/schema/src/complementos/process.ts | 28 + packages/cfdi/schema/src/files/catCFDI.xsd | 162337 +++++++++++++++ packages/cfdi/schema/src/files/cfdv40.xsd | 850 + .../schema/src/files/complementos/iedu.xsd | 69 + .../schema/src/files/complementos/iedu.xslt | 26 + .../schema/src/files/complementos/iedu2.xsd | 84 + .../src/files/schema/catalogos/catalogos.json | 1566 + .../src/files/schema/catalogos/tipodatos.json | 135 + .../cfdi/schema/src/files/schema/cfdi.json | 129 + .../cfdirelacionados/cfdirelacionado.json | 18 + .../cfdirelacionados/cfdirelacionados.json | 14 + .../src/files/schema/complementos/iedu.json | 53 + .../files/schema/comprobante/comprobante.json | 105 + .../schema/conceptos/acuentaterceros.json | 1 + .../src/files/schema/conceptos/concepto.json | 63 + .../files/schema/conceptos/cuentapredial.json | 1 + .../schema/conceptos/informacionaduanera.json | 1 + .../src/files/schema/conceptos/parte.json | 1 + .../src/files/schema/conceptos/retencion.json | 36 + .../src/files/schema/conceptos/traslado.json | 34 + .../src/files/schema/emisor/emisor.json | 35 + .../src/files/schema/impuestos/impuestos.json | 16 + .../src/files/schema/impuestos/retencion.json | 20 + .../src/files/schema/impuestos/traslado.json | 28 + .../informacionglobal/informacionglobal.json | 1 + .../src/files/schema/receptor/receptor.json | 43 + packages/cfdi/schema/src/files/tdCFDI.xsd | 157 + packages/cfdi/schema/src/index.ts | 4 + packages/cfdi/schema/src/schema.xsd.ts | 163 + packages/cfdi/schema/src/utils/manager.ts | 3 + packages/cfdi/schema/src/utils/xsdElements.ts | 8 + packages/cfdi/schema/test/blah.test.ts | 7 + packages/cfdi/schema/tsconfig.json | 14 + packages/cfdi/schema/vitest.config.mts | 7 + packages/cfdi/xml2json/src/backup.ts | 157 - packages/cfdi/xml2json/src/backup2.ts | 101 - packages/cfdi/xml2json/src/cfdi/catalogo.ts | 12 + .../cfdi/xml2json/src/cfdi/cfdi.factory.ts | 15 + .../xml2json/src/cfdi/concepto.factory.ts | 15 + packages/cfdi/xml2json/src/cfdi/concepto.ts | 36 + .../xml2json/src/cfdi/impuestos.factory.ts | 15 + packages/cfdi/xml2json/src/cfdi/impuestos.ts | 8 + packages/cfdi/xml2json/src/cfdi/index.ts | 41 + packages/cfdi/xml2json/src/xmlToJson.ts | 5 +- .../cfdi/xml2json/test/cfdi-class.test.ts | 31 + packages/server/src/app/cfdi/pdf/route.ts | 5 +- 90 files changed, 172315 insertions(+), 471 deletions(-) create mode 100644 packages/cfdi/designs/.gitignore create mode 100644 packages/cfdi/designs/README.md create mode 100644 packages/cfdi/designs/dist/index.cjs.js create mode 100644 packages/cfdi/designs/dist/index.es.js create mode 100644 packages/cfdi/designs/package-lock.json create mode 100644 packages/cfdi/designs/package.json create mode 100644 packages/cfdi/designs/pnpm-lock.yaml create mode 100644 packages/cfdi/designs/src/A111/index.ts create mode 100644 packages/cfdi/designs/src/A117/index.ts create mode 100644 packages/cfdi/designs/src/B111/index.ts create mode 100644 packages/cfdi/designs/src/B112/index.ts create mode 100644 packages/cfdi/designs/src/B123/index.ts create mode 100644 packages/cfdi/designs/src/B222/index.ts create mode 100644 packages/cfdi/designs/src/B333/index.ts create mode 100644 packages/cfdi/designs/src/abstract-cfdi-pdf.ts create mode 100644 packages/cfdi/designs/src/index.ts create mode 100644 packages/cfdi/designs/src/pdf/Cell.ts create mode 100644 packages/cfdi/designs/src/pdf/Column.ts create mode 100644 packages/cfdi/designs/src/pdf/Grid.ts create mode 100644 packages/cfdi/designs/src/pdf/Image.ts create mode 100644 packages/cfdi/designs/src/pdf/PDF.ts create mode 100644 packages/cfdi/designs/src/pdf/Row.ts create mode 100644 packages/cfdi/designs/src/pdf/Style.ts create mode 100644 packages/cfdi/designs/src/pdf/Table.ts create mode 100644 packages/cfdi/designs/src/pdf/Text.ts create mode 100644 packages/cfdi/designs/tsconfig.json create mode 100644 packages/cfdi/designs/vite.config.ts delete mode 100644 packages/cfdi/pdf/src/abstract-cfdi-pdf.ts delete mode 100644 packages/cfdi/pdf/src/templates/index.ts create mode 100644 packages/cfdi/schema/.eslintrc.js create mode 100644 packages/cfdi/schema/.gitignore create mode 100644 packages/cfdi/schema/.npmignore create mode 100644 packages/cfdi/schema/LICENSE create mode 100644 packages/cfdi/schema/README.md create mode 100644 packages/cfdi/schema/jest.config.js create mode 100644 packages/cfdi/schema/package.json create mode 100644 packages/cfdi/schema/src/CatalogProcess.ts create mode 100644 packages/cfdi/schema/src/CfdiProcess.ts create mode 100644 packages/cfdi/schema/src/common/const/structure.ts create mode 100644 packages/cfdi/schema/src/complementos/complementos.process.ts create mode 100644 packages/cfdi/schema/src/complementos/iedu.process.ts create mode 100644 packages/cfdi/schema/src/complementos/process.ts create mode 100644 packages/cfdi/schema/src/files/catCFDI.xsd create mode 100644 packages/cfdi/schema/src/files/cfdv40.xsd create mode 100644 packages/cfdi/schema/src/files/complementos/iedu.xsd create mode 100644 packages/cfdi/schema/src/files/complementos/iedu.xslt create mode 100644 packages/cfdi/schema/src/files/complementos/iedu2.xsd create mode 100644 packages/cfdi/schema/src/files/schema/catalogos/catalogos.json create mode 100644 packages/cfdi/schema/src/files/schema/catalogos/tipodatos.json create mode 100644 packages/cfdi/schema/src/files/schema/cfdi.json create mode 100644 packages/cfdi/schema/src/files/schema/cfdirelacionados/cfdirelacionado.json create mode 100644 packages/cfdi/schema/src/files/schema/cfdirelacionados/cfdirelacionados.json create mode 100644 packages/cfdi/schema/src/files/schema/complementos/iedu.json create mode 100644 packages/cfdi/schema/src/files/schema/comprobante/comprobante.json create mode 100644 packages/cfdi/schema/src/files/schema/conceptos/acuentaterceros.json create mode 100644 packages/cfdi/schema/src/files/schema/conceptos/concepto.json create mode 100644 packages/cfdi/schema/src/files/schema/conceptos/cuentapredial.json create mode 100644 packages/cfdi/schema/src/files/schema/conceptos/informacionaduanera.json create mode 100644 packages/cfdi/schema/src/files/schema/conceptos/parte.json create mode 100644 packages/cfdi/schema/src/files/schema/conceptos/retencion.json create mode 100644 packages/cfdi/schema/src/files/schema/conceptos/traslado.json create mode 100644 packages/cfdi/schema/src/files/schema/emisor/emisor.json create mode 100644 packages/cfdi/schema/src/files/schema/impuestos/impuestos.json create mode 100644 packages/cfdi/schema/src/files/schema/impuestos/retencion.json create mode 100644 packages/cfdi/schema/src/files/schema/impuestos/traslado.json create mode 100644 packages/cfdi/schema/src/files/schema/informacionglobal/informacionglobal.json create mode 100644 packages/cfdi/schema/src/files/schema/receptor/receptor.json create mode 100644 packages/cfdi/schema/src/files/tdCFDI.xsd create mode 100644 packages/cfdi/schema/src/index.ts create mode 100644 packages/cfdi/schema/src/schema.xsd.ts create mode 100644 packages/cfdi/schema/src/utils/manager.ts create mode 100644 packages/cfdi/schema/src/utils/xsdElements.ts create mode 100644 packages/cfdi/schema/test/blah.test.ts create mode 100644 packages/cfdi/schema/tsconfig.json create mode 100644 packages/cfdi/schema/vitest.config.mts delete mode 100644 packages/cfdi/xml2json/src/backup.ts delete mode 100644 packages/cfdi/xml2json/src/backup2.ts create mode 100644 packages/cfdi/xml2json/src/cfdi/catalogo.ts create mode 100644 packages/cfdi/xml2json/src/cfdi/cfdi.factory.ts create mode 100644 packages/cfdi/xml2json/src/cfdi/concepto.factory.ts create mode 100644 packages/cfdi/xml2json/src/cfdi/concepto.ts create mode 100644 packages/cfdi/xml2json/src/cfdi/impuestos.factory.ts create mode 100644 packages/cfdi/xml2json/src/cfdi/impuestos.ts create mode 100644 packages/cfdi/xml2json/src/cfdi/index.ts create mode 100644 packages/cfdi/xml2json/test/cfdi-class.test.ts diff --git a/.github/actions/cfdi/action.yml b/.github/actions/cfdi/action.yml index 76a2fe4..ec44807 100644 --- a/.github/actions/cfdi/action.yml +++ b/.github/actions/cfdi/action.yml @@ -9,20 +9,20 @@ inputs: runs: using: 'composite' steps: - - name: Schema - uses: actions/checkout@v4 - with: - repository: MisaelMa/cfdi-schema - branch: main - path: packages/cfdi/schema - token: ${{ inputs.token }} - - name: Desings - uses: actions/checkout@v4 - with: - repository: MisaelMa/designs - branch: main - path: packages/cfdi/designs - token: ${{ inputs.token }} + # - name: Schema + # uses: actions/checkout@v4 + # with: + # repository: MisaelMa/cfdi-schema + # branch: main + # path: packages/cfdi/schema + # token: ${{ inputs.token }} + # - name: Desings + # uses: actions/checkout@v4 + # with: + # repository: MisaelMa/designs + # branch: main + # path: packages/cfdi/designs + # token: ${{ inputs.token }} - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v1 diff --git a/.gitignore b/.gitignore index e9ddf8f..a41042e 100644 --- a/.gitignore +++ b/.gitignore @@ -33,8 +33,8 @@ build/Release # Dependency directories node_modules/ jspm_packages/ -packages/cfdi/schema/ -packages/cfdi/designs +# packages/cfdi/schema +# packages/cfdi/designs # Optional npm cache directory .npm diff --git a/.vscode/settings.json b/.vscode/settings.json index 3b29883..6b0f34b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,7 @@ { "cSpell.words": [ "cfdi", - "recreando" + "recreando", + "Trasladados" ] } diff --git a/packages/cfdi/designs/.gitignore b/packages/cfdi/designs/.gitignore new file mode 100644 index 0000000..6f51bfd --- /dev/null +++ b/packages/cfdi/designs/.gitignore @@ -0,0 +1,70 @@ +# Logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.npmrc +# Runtime data +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ +packages/cfdi/schema/ +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# next.js build output +.next + +# OS X temporary files +.DS_Store + +# Rush temporary files +common/deploy/ +common/temp/ +common/autoinstallers/*/.npmrc +**/.rush/temp/ + +# Heft +.heft +maca961017759.cer +wsi1503194j6.cer diff --git a/packages/cfdi/designs/README.md b/packages/cfdi/designs/README.md new file mode 100644 index 0000000..e69de29 diff --git a/packages/cfdi/designs/dist/index.cjs.js b/packages/cfdi/designs/dist/index.cjs.js new file mode 100644 index 0000000..31fc47e --- /dev/null +++ b/packages/cfdi/designs/dist/index.cjs.js @@ -0,0 +1 @@ +"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("pdfmake/build/pdfmake"),e=require("pdfmake/build/vfs_fonts"),n=require("@cfdi/utils");class o{columnConfig={width:"auto",text:[]};mode="text";constructor(t){const{children:e=[],width:n="auto",mode:o="text"}=t||{};this.mode=o,this.columnConfig[this.mode]=[],this.columnConfig.width=n,this.addContent(e)}addContent(t){if(Array.isArray(t)){const e=this.columnConfig[this.mode];this.columnConfig[this.mode]=[...e,...t]}else this.columnConfig[this.mode].push(t);return this}setContent(t){return this.addContent(t),this}setStack(t){return this.addContent(t),this}setWidth(t){return this.columnConfig.width=t,this}setStyle(t){return this.columnConfig.style=t,this}toJSON(){return this.columnConfig}}t.addVirtualFileSystem(e);class s{definition={content:[]};setContent(t){return this.definition.content=Array.isArray(t)?t:[t],this}addContent(t){return this.definition.content.push(t),this}setStyles(t){return this.definition.styles=t,this}setDefaultStyle(t){return this.definition.defaultStyle=t,this}toJSON(){return this.definition}getDocument(){return t.createPdf(this.definition)}async save(t,e){const n=t+`${e.replace(".pdf","")}.pdf`;try{return await this.getBuffer(),function(){throw new Error("Function not implemented.")}(),{save:!0,path:n}}catch(t){return{save:!1,error:t}}}async getBlob(t){return new Promise((async e=>{(await this.getDocument()).getBlob((t=>{e(t)}),t)}))}async getBase64(t){return new Promise((async e=>{(await this.getDocument()).getBase64((t=>{e(t)}),t)}))}async getBuffer(t){return new Promise((async e=>{(await this.getDocument()).getBuffer((t=>{e(t)}),t)}))}async getDataUrl(t){return new Promise((async e=>{(await this.getDocument()).getDataUrl((t=>{e(t)}),t)}))}async getStream(t){return(await this.getDocument()).getStream(t)}}class i{columns=[];columnGap=10;addColumn(t){return this.columns.push(t.toJSON()),this}setGap(t){return this.columnGap=t,this}toJSON(){return{columns:this.columns,columnGap:this.columnGap}}}class r{style={};constructor(t={}){this.style=t}setFont(t){return this.style.font=t,this}setFontSize(t){return this.style.fontSize=t,this}setLineHeight(t){return this.style.lineHeight=t,this}setBold(t=!0){return this.style.bold=t,this}setItalic(t=!0){return this.style.italics=t,this}setAlignment(t){return this.style.alignment=t,this}setColor(t){return this.style.color=t,this}setBackground(t){return this.style.background=t,this}setMargin(t){return this.style.margin=t,this}setOpacity(t){return this.style.opacity=t,this}setCharacterSpacing(t){return this.style.characterSpacing=t,this}toJSON(){return this.style}}class d{content;constructor(t){this.content={image:t}}setWidth(t){return this.content.width=t,this}setHeight(t){return this.content.height=t,this}setFit(t,e){return this.content.fit=[t,e],this}setAlignment(t){return this.content.alignment=t,this}setMargin(t){return this.content.margin=t,this}setOpacity(t){return this.content.opacity=t,this}setStyle(t){return this.content.style=t,this}toJSON(){return this.content}}class l{content;constructor(t,e){this.content={text:t},e&&(this.content.style=e.toJSON())}setBold(t){return this.content.bold=t,this}setMargin(t){return this.content.margin=t,this}setStyle(t){return this.content.style=t.toJSON(),this}addText(t,e){if(!Array.isArray(this.content.text)){let t=this.content.text,e=this.content.style??{};delete this.content.style,this.content.text=[{text:t,style:e}]}const n={text:t,...e??{}};return this.content.text.push(n),this}toJSON(){return this.content}}class a{content;constructor(){this.content={table:{body:[]}}}setHeader(t,e){const n=t.map((t=>{if("string"==typeof t)return{text:t,...e??{}};{const n=e?e.toJSON():{};return{...t,style:{...n,...t.style??{}}}}}));return this.content.table.body.unshift(n),this}addRow(t,e){const n=t.map((t=>{if("string"==typeof t)return{text:t,...e??{}};{const n=e?e.toJSON():{};return{...t,style:{...n,...t.style??{}}}}}));return this.content.table.body.push(n),this}setLayout(t){return this.content.layout=t,this}setStyle(t){return this.content={...this.content,style:t.toJSON()},this}setMargin(t){return this.content.margin=t,this}setWidths(t){return this.content.table.widths=t,this}toJSON(){return this.content}}class c{cell={};constructor(t,e){this.cell="string"==typeof t?{text:t,...e??{}}:{text:t.toJSON(),...e??{}}}setColSpan(t){return this.cell.colSpan=t,this}setStyle(t){return this.cell={...this.cell,...t.toJSON()},this}setBorder(t){return this.cell.border=t,this}setAlignment(t){return this.cell.alignment=t,this}toJSON(){return this.cell}}exports.PDF117=class{pdf=new s;design(){const t=(new i).setGap(10).addColumn(new o({mode:"stack",children:new d(n.logo).setHeight(100).setWidth(100).setAlignment("left").toJSON()})).addColumn(new o({children:"",width:40})).addColumn(new o({width:200}).setContent({text:"HERRERIA & ELECTRICOS S DE CV\n",style:{bold:!0,color:"#a76d09"}}).setContent({text:[{text:"R.F.C: ",style:{bold:!0,color:"#a76d09"}},{text:"H&E951128469\n"}]}).setContent({text:[{text:"REGIMEN: ",style:{bold:!0,color:"#a76d09"}},{text:"601 - GENERAL DE LEY PERSONAS MORALES\n"}]}).setContent({text:[{text:"LUGAR DE EXPEDICION: ",style:{bold:!0,color:"#a76d09"}},{text:"CONSTITUYENTES y 115 AV MZA.25 LT.2 Y 3, EJIDO NORTE, 77714 PLAYA DEL CARMEN, Q.R.\n"}]}).setStyle(new r({fontSize:9,color:"#a76d09"}))).addColumn(new o({width:200,mode:"stack"}).setContent([{alignment:"center",margin:[100,0,0,0],text:"FACTURA",style:{fontSize:9,bold:!0,color:"#FF5733"}},{margin:[80,0,0,10],alignment:"center",width:10,table:{body:[[{text:"FOLIO",style:{bold:!0,fontSize:9,alignment:"center",color:"#a76d09",margin:[0,0,0,0]}}],[{text:"A - MYLF-26"}]]},layout:{paddingLeft:(t,e)=>20,paddingRight:(t,e)=>20,paddingTop:(t,e)=>0,paddingBottom:(t,e)=>0,fillColor:(t,e,n)=>0===t?"#eeeeee":null}},{alignment:"center",margin:[80,0,0,0],table:{heights:10,body:[[{text:"FECHA",style:{bold:!0,fontSize:9,alignment:"center",margin:[0,0,0,0]}}],[{text:"2022-02-26T06:06:26"}]]},layout:{paddingTop:(t,e)=>0,paddingBottom:(t,e)=>0,fillColor:(t,e,n)=>0===t?"#eeeeee":null}}])),e=new r({bold:!0,color:"purple"}),s=new r({bold:!0,color:"#a76d09"}),h=new l("Datos del Cliente\n").setBold(!0).setMargin([0,20,0,10]).setStyle(new r({fontSize:10,color:"#0941a7"})).addText("Razon Social: ",s).addText("PUBLIC EN GENERAL\n",e).addText("R.F.C.: ",s).addText("XAXX010101000\n",e).addText("Uso CFDI: ",s).addText("P01\n",e),S=new a;S.setStyle(new r({fontSize:9})),S.setWidths([45,10,50,160,40,50,53,40]),S.setMargin([0,7,0,7]),S.setHeader([new c("CANTIDAD").setColSpan(2).toJSON(),new c("").toJSON(),new l("CLAVE SAT",new r({fillColor:"#C0C0C0"})).toJSON(),new c("CONCEPTO/DESCRIPCIÓN").toJSON(),new l("UNIDAD").toJSON(),new l("P.UNITARIO").toJSON(),new l("DESCUENTO").toJSON(),new l("IMPORTE").toJSON()],new r({fillColor:"black",color:"#a76d09",fontSize:9})),S.addRow([new c("1",new r({fillColor:"red"})).toJSON(),new c("2").toJSON(),new l("10001000",new r({fillColor:"purple"})).toJSON(),new l("HERRERIA & ELECTRICOS S DE CV").toJSON(),new l("UNIDAD").toJSON(),new l("100.00").toJSON(),new l("0.00").toJSON(),new l("100.00").toJSON()]),S.addRow([new c("1",new r({fillColor:"red"})).toJSON(),new c("2").toJSON(),new l("10001000",new r({fillColor:"purple"})).toJSON(),new l("HERRERIA & ELECTRICOS S DE CV").toJSON(),new l("UNIDAD").toJSON(),new l("100.00").toJSON(),new l("0.00").toJSON(),new l("100.00").toJSON()]);const u=new r({fontSize:9,bold:!0}),w=new l("CANTIDAD CON LETRA:\n",u).addText("OCHOCIENTOS TREINTA Y NUEVE PESOS 99/100 M.N.",new r({fontSize:9})),g=new l("SUBTOTAL: ",u).addText("$17240009.13\n",new r({fontSize:9})).addText("DESCUENTO: ",u).addText("$0.00\n",new r({fontSize:9})).addText("IMPUESTOS: ",u).addText("$275.87\n",new r({fontSize:9})).addText("TOTAL: ",u).addText("$2000.00",new r({fontSize:9}));S.addRow([new c(w).setColSpan(6).toJSON(),new c("2",new r({fillColor:"red"})).toJSON(),new l("10001000",new r({fillColor:"purple"})).toJSON(),new l("HERRERIA & ELECTRICOS S DE CV").toJSON(),new l("UNIDAD").toJSON(),new l("100.00").toJSON(),new c(g).setColSpan(2).toJSON(),new l("100.00").toJSON()]);const C=new r({bold:!0,color:"#a76d09"}),O=(new i).addColumn(new o({width:"50%",mode:"stack"}).setContent(new l("Forma de pago: ",C).addText("Efectivo").toJSON()).setContent(new l("Método de pago: ",C).addText("PUE - Pago en una sola exhibición").toJSON()).setContent(new l("No. de cuenta: ",C).addText("123456789").toJSON())).addColumn(new o({width:"50%",mode:"stack"}).setContent(new l("Moneda:",C).addText("MXN").toJSON()).setContent(new l("Tipo de comprobante: ",C).addText("I - Ingreso").toJSON())),N=new a;N.setWidths([250,250]),N.setStyle(new r({fontSize:9})),N.addRow([new c("No. CSD del Emisor").setBorder([!1,!1,!1,!1]).setStyle(new r({bold:!0,color:"orange"})).setAlignment("center").toJSON(),new c("Fecha y hora de certificacion").setBorder([!1,!1,!1,!1]).setStyle(new r({bold:!0,color:"green"})).setAlignment("center").toJSON()],new r({color:"#a76d09",fontSize:9})),N.addRow([new c("30001000000400002463").setBorder([!1,!0,!1,!1]).setAlignment("center").toJSON(),new c("2022-02-26T18:05:05").setBorder([!1,!0,!1,!1]).setAlignment("center").toJSON()],new r({color:"#a76d09",fontSize:9})),N.addRow([new c("Folio Fiscal").setBorder([!1,!1,!1,!1]).setAlignment("center").toJSON(),new c("No. CSD del SAT").setBorder([!1,!1,!1,!1]).setAlignment("center").toJSON()],new r({color:"#a76d09",fontSize:9})),N.addRow([new c("DC2ED983-D108-402E-A2FD-C08EDDA23C47").setBorder([!1,!0,!1,!1]).setAlignment("center").toJSON(),new c("30001000000400002495").setBorder([!1,!0,!1,!1]).setAlignment("center").toJSON()],new r({color:"#a76d09",fontSize:9}));const m=new r({bold:!0,fontSize:7,margin:[50,50,100,50]}),f=new r({fontSize:7}),E=(new i).addColumn(new o({width:"20%",mode:"stack"}).setContent({qr:"https://verificacfdi.facturaelectronica.sat.gob.mx/default.aspx?id=dc2ed983-d108-402e-a2fd-c08edda23c47&re=H&E951128469&rr=XAXX010101000&tt=000000000000002000.000000&fe=h8ZyAw==",fit:100,foreground:"#0941a7",alignment:"left"})).addColumn(new o({width:"80%",mode:"stack"}).setContent(new l("SELLO DIGITAL DEL EMISOR\n",m).addText("YHV2O4OPL7jZIQiuKTgygUb75wrYXRNkgQjKWXPUr19MRfE60v+ug5xHe/bb8hW3DK8Iw9MGiqh/+z5dM2ACWlFk77SqJpEMnBVRkgwmWA/84ltCtSmtQP8roBJHy3JarVPVXwNWgo2qVAaK9Hch5XJZbASlMnPp0JESkze6deZTB22XJRdKkXa1kKZcSx/v/X/+5m99RMUNjtOKerU4jpG0cigO0M/q3j0evKjR6f1uTtW77nYEHZc/++PaExEgO7CaK4Hvk5QNHLD3gngd8UZEG5gTCcZm45B7EyiKJOSOKlF7CEXc7UgY1mYQhbeFQht2+AB9fHYIF1Zzh8ZyAw==\n",f).addText("SELLO DEL SAT\n",m).addText("IUgJIUBUfH6d\n +AmgqQMM370OpyNnlFwLguCoSHJ5qPmPdVjymZjvji1gQiEJSroQXtrZIOQzlADTjsBDespCLE9CQSIaGLJFrUsaH7tJXibft+cBwcLDbZ/\n TTsuff8AV87f06GcVDSXSm6EZKp/dbOVh3lA6/c3QqVCESfKDY+5XLwmG4CkQWlRGEcx7tCVOCLVICNUloz6tGkaHjNOFocKk/\n DFrrvN0fBy8U1vqXK438WIbTqbRNvgGF2Wzkv8GJuiDPjMJEiiHv5Vi0Al26nAZaFFhgu5k1dcfQwxjRgMc7hmEidJ2ngb+96VFhuqlM\n +8lHkfoeFoprXjt+Zu4g==\n",f).addText("CADENA ORIGINAL DEL COMPLEMENTO DE CERTIFICACION DIGITAL DEL SAT\n",m).addText("||1.1|dc2ed983-d108-402e-a2fd-c08edda23c47|2022-02-26T18:05:05|SPR190613I52|\n YHV2O4OPL7jZIQiuKTgygUb75wrYXRNkgQjKWXPUr19MRfE60v+ug5xHe/bb8hW3DK8Iw9MGiqh/\n +z5dM2ACWlFk77SqJpEMnBVRkgwmWA/84ltCtSmtQP8roBJHy3JarVPVXwNWgo2qVAaK9Hch5XJZbASlMnPp0JESkze6deZTB22XJR\n dKkXa1kKZcSx/v/X/+5m99RMUNjtOKerU4jpG0cigO0M/q3j0evKjR6f1uTtW77nYEHZc/+\n +PaExEgO7CaK4Hvk5QNHLD3gngd8UZEG5gTCcZm45B7EyiKJOSOKlF7CEXc7UgY1mYQhbeFQht2+AB9fHYIF1Zzh8ZyAw==|\n 30001000000400002495||",f).toJSON()));this.pdf.addContent(t.toJSON()).addContent(h.toJSON()).addContent(S.toJSON()).addContent(O.toJSON()).addContent(N.toJSON()).addContent(E.toJSON()).setStyles({header:{fontSize:18,bold:!0}}).setDefaultStyle({fontSize:12})}getPDF(){return this.pdf}}; diff --git a/packages/cfdi/designs/dist/index.es.js b/packages/cfdi/designs/dist/index.es.js new file mode 100644 index 0000000..7599999 --- /dev/null +++ b/packages/cfdi/designs/dist/index.es.js @@ -0,0 +1 @@ +import t from"pdfmake/build/pdfmake";import e from"pdfmake/build/vfs_fonts";import{logo as n}from"@cfdi/utils";class o{columnConfig={width:"auto",text:[]};mode="text";constructor(t){const{children:e=[],width:n="auto",mode:o="text"}=t||{};this.mode=o,this.columnConfig[this.mode]=[],this.columnConfig.width=n,this.addContent(e)}addContent(t){if(Array.isArray(t)){const e=this.columnConfig[this.mode];this.columnConfig[this.mode]=[...e,...t]}else this.columnConfig[this.mode].push(t);return this}setContent(t){return this.addContent(t),this}setStack(t){return this.addContent(t),this}setWidth(t){return this.columnConfig.width=t,this}setStyle(t){return this.columnConfig.style=t,this}toJSON(){return this.columnConfig}}t.addVirtualFileSystem(e);class s{definition={content:[]};setContent(t){return this.definition.content=Array.isArray(t)?t:[t],this}addContent(t){return this.definition.content.push(t),this}setStyles(t){return this.definition.styles=t,this}setDefaultStyle(t){return this.definition.defaultStyle=t,this}toJSON(){return this.definition}getDocument(){return t.createPdf(this.definition)}async save(t,e){const n=t+`${e.replace(".pdf","")}.pdf`;try{return await this.getBuffer(),function(){throw new Error("Function not implemented.")}(),{save:!0,path:n}}catch(t){return{save:!1,error:t}}}async getBlob(t){return new Promise((async e=>{(await this.getDocument()).getBlob((t=>{e(t)}),t)}))}async getBase64(t){return new Promise((async e=>{(await this.getDocument()).getBase64((t=>{e(t)}),t)}))}async getBuffer(t){return new Promise((async e=>{(await this.getDocument()).getBuffer((t=>{e(t)}),t)}))}async getDataUrl(t){return new Promise((async e=>{(await this.getDocument()).getDataUrl((t=>{e(t)}),t)}))}async getStream(t){return(await this.getDocument()).getStream(t)}}class i{columns=[];columnGap=10;addColumn(t){return this.columns.push(t.toJSON()),this}setGap(t){return this.columnGap=t,this}toJSON(){return{columns:this.columns,columnGap:this.columnGap}}}class r{style={};constructor(t={}){this.style=t}setFont(t){return this.style.font=t,this}setFontSize(t){return this.style.fontSize=t,this}setLineHeight(t){return this.style.lineHeight=t,this}setBold(t=!0){return this.style.bold=t,this}setItalic(t=!0){return this.style.italics=t,this}setAlignment(t){return this.style.alignment=t,this}setColor(t){return this.style.color=t,this}setBackground(t){return this.style.background=t,this}setMargin(t){return this.style.margin=t,this}setOpacity(t){return this.style.opacity=t,this}setCharacterSpacing(t){return this.style.characterSpacing=t,this}toJSON(){return this.style}}class d{content;constructor(t){this.content={image:t}}setWidth(t){return this.content.width=t,this}setHeight(t){return this.content.height=t,this}setFit(t,e){return this.content.fit=[t,e],this}setAlignment(t){return this.content.alignment=t,this}setMargin(t){return this.content.margin=t,this}setOpacity(t){return this.content.opacity=t,this}setStyle(t){return this.content.style=t,this}toJSON(){return this.content}}class l{content;constructor(t,e){this.content={text:t},e&&(this.content.style=e.toJSON())}setBold(t){return this.content.bold=t,this}setMargin(t){return this.content.margin=t,this}setStyle(t){return this.content.style=t.toJSON(),this}addText(t,e){if(!Array.isArray(this.content.text)){let t=this.content.text,e=this.content.style??{};delete this.content.style,this.content.text=[{text:t,style:e}]}const n={text:t,...e??{}};return this.content.text.push(n),this}toJSON(){return this.content}}class a{content;constructor(){this.content={table:{body:[]}}}setHeader(t,e){const n=t.map((t=>{if("string"==typeof t)return{text:t,...e??{}};{const n=e?e.toJSON():{};return{...t,style:{...n,...t.style??{}}}}}));return this.content.table.body.unshift(n),this}addRow(t,e){const n=t.map((t=>{if("string"==typeof t)return{text:t,...e??{}};{const n=e?e.toJSON():{};return{...t,style:{...n,...t.style??{}}}}}));return this.content.table.body.push(n),this}setLayout(t){return this.content.layout=t,this}setStyle(t){return this.content={...this.content,style:t.toJSON()},this}setMargin(t){return this.content.margin=t,this}setWidths(t){return this.content.table.widths=t,this}toJSON(){return this.content}}class c{cell={};constructor(t,e){this.cell="string"==typeof t?{text:t,...e??{}}:{text:t.toJSON(),...e??{}}}setColSpan(t){return this.cell.colSpan=t,this}setStyle(t){return this.cell={...this.cell,...t.toJSON()},this}setBorder(t){return this.cell.border=t,this}setAlignment(t){return this.cell.alignment=t,this}toJSON(){return this.cell}}class h{pdf=new s;design(){const t=(new i).setGap(10).addColumn(new o({mode:"stack",children:new d(n).setHeight(100).setWidth(100).setAlignment("left").toJSON()})).addColumn(new o({children:"",width:40})).addColumn(new o({width:200}).setContent({text:"HERRERIA & ELECTRICOS S DE CV\n",style:{bold:!0,color:"#a76d09"}}).setContent({text:[{text:"R.F.C: ",style:{bold:!0,color:"#a76d09"}},{text:"H&E951128469\n"}]}).setContent({text:[{text:"REGIMEN: ",style:{bold:!0,color:"#a76d09"}},{text:"601 - GENERAL DE LEY PERSONAS MORALES\n"}]}).setContent({text:[{text:"LUGAR DE EXPEDICION: ",style:{bold:!0,color:"#a76d09"}},{text:"CONSTITUYENTES y 115 AV MZA.25 LT.2 Y 3, EJIDO NORTE, 77714 PLAYA DEL CARMEN, Q.R.\n"}]}).setStyle(new r({fontSize:9,color:"#a76d09"}))).addColumn(new o({width:200,mode:"stack"}).setContent([{alignment:"center",margin:[100,0,0,0],text:"FACTURA",style:{fontSize:9,bold:!0,color:"#FF5733"}},{margin:[80,0,0,10],alignment:"center",width:10,table:{body:[[{text:"FOLIO",style:{bold:!0,fontSize:9,alignment:"center",color:"#a76d09",margin:[0,0,0,0]}}],[{text:"A - MYLF-26"}]]},layout:{paddingLeft:(t,e)=>20,paddingRight:(t,e)=>20,paddingTop:(t,e)=>0,paddingBottom:(t,e)=>0,fillColor:(t,e,n)=>0===t?"#eeeeee":null}},{alignment:"center",margin:[80,0,0,0],table:{heights:10,body:[[{text:"FECHA",style:{bold:!0,fontSize:9,alignment:"center",margin:[0,0,0,0]}}],[{text:"2022-02-26T06:06:26"}]]},layout:{paddingTop:(t,e)=>0,paddingBottom:(t,e)=>0,fillColor:(t,e,n)=>0===t?"#eeeeee":null}}])),e=new r({bold:!0,color:"purple"}),s=new r({bold:!0,color:"#a76d09"}),h=new l("Datos del Cliente\n").setBold(!0).setMargin([0,20,0,10]).setStyle(new r({fontSize:10,color:"#0941a7"})).addText("Razon Social: ",s).addText("PUBLIC EN GENERAL\n",e).addText("R.F.C.: ",s).addText("XAXX010101000\n",e).addText("Uso CFDI: ",s).addText("P01\n",e),S=new a;S.setStyle(new r({fontSize:9})),S.setWidths([45,10,50,160,40,50,53,40]),S.setMargin([0,7,0,7]),S.setHeader([new c("CANTIDAD").setColSpan(2).toJSON(),new c("").toJSON(),new l("CLAVE SAT",new r({fillColor:"#C0C0C0"})).toJSON(),new c("CONCEPTO/DESCRIPCIÓN").toJSON(),new l("UNIDAD").toJSON(),new l("P.UNITARIO").toJSON(),new l("DESCUENTO").toJSON(),new l("IMPORTE").toJSON()],new r({fillColor:"black",color:"#a76d09",fontSize:9})),S.addRow([new c("1",new r({fillColor:"red"})).toJSON(),new c("2").toJSON(),new l("10001000",new r({fillColor:"purple"})).toJSON(),new l("HERRERIA & ELECTRICOS S DE CV").toJSON(),new l("UNIDAD").toJSON(),new l("100.00").toJSON(),new l("0.00").toJSON(),new l("100.00").toJSON()]),S.addRow([new c("1",new r({fillColor:"red"})).toJSON(),new c("2").toJSON(),new l("10001000",new r({fillColor:"purple"})).toJSON(),new l("HERRERIA & ELECTRICOS S DE CV").toJSON(),new l("UNIDAD").toJSON(),new l("100.00").toJSON(),new l("0.00").toJSON(),new l("100.00").toJSON()]);const u=new r({fontSize:9,bold:!0}),w=new l("CANTIDAD CON LETRA:\n",u).addText("OCHOCIENTOS TREINTA Y NUEVE PESOS 99/100 M.N.",new r({fontSize:9})),g=new l("SUBTOTAL: ",u).addText("$17240009.13\n",new r({fontSize:9})).addText("DESCUENTO: ",u).addText("$0.00\n",new r({fontSize:9})).addText("IMPUESTOS: ",u).addText("$275.87\n",new r({fontSize:9})).addText("TOTAL: ",u).addText("$2000.00",new r({fontSize:9}));S.addRow([new c(w).setColSpan(6).toJSON(),new c("2",new r({fillColor:"red"})).toJSON(),new l("10001000",new r({fillColor:"purple"})).toJSON(),new l("HERRERIA & ELECTRICOS S DE CV").toJSON(),new l("UNIDAD").toJSON(),new l("100.00").toJSON(),new c(g).setColSpan(2).toJSON(),new l("100.00").toJSON()]);const C=new r({bold:!0,color:"#a76d09"}),O=(new i).addColumn(new o({width:"50%",mode:"stack"}).setContent(new l("Forma de pago: ",C).addText("Efectivo").toJSON()).setContent(new l("Método de pago: ",C).addText("PUE - Pago en una sola exhibición").toJSON()).setContent(new l("No. de cuenta: ",C).addText("123456789").toJSON())).addColumn(new o({width:"50%",mode:"stack"}).setContent(new l("Moneda:",C).addText("MXN").toJSON()).setContent(new l("Tipo de comprobante: ",C).addText("I - Ingreso").toJSON())),m=new a;m.setWidths([250,250]),m.setStyle(new r({fontSize:9})),m.addRow([new c("No. CSD del Emisor").setBorder([!1,!1,!1,!1]).setStyle(new r({bold:!0,color:"orange"})).setAlignment("center").toJSON(),new c("Fecha y hora de certificacion").setBorder([!1,!1,!1,!1]).setStyle(new r({bold:!0,color:"green"})).setAlignment("center").toJSON()],new r({color:"#a76d09",fontSize:9})),m.addRow([new c("30001000000400002463").setBorder([!1,!0,!1,!1]).setAlignment("center").toJSON(),new c("2022-02-26T18:05:05").setBorder([!1,!0,!1,!1]).setAlignment("center").toJSON()],new r({color:"#a76d09",fontSize:9})),m.addRow([new c("Folio Fiscal").setBorder([!1,!1,!1,!1]).setAlignment("center").toJSON(),new c("No. CSD del SAT").setBorder([!1,!1,!1,!1]).setAlignment("center").toJSON()],new r({color:"#a76d09",fontSize:9})),m.addRow([new c("DC2ED983-D108-402E-A2FD-C08EDDA23C47").setBorder([!1,!0,!1,!1]).setAlignment("center").toJSON(),new c("30001000000400002495").setBorder([!1,!0,!1,!1]).setAlignment("center").toJSON()],new r({color:"#a76d09",fontSize:9}));const N=new r({bold:!0,fontSize:7,margin:[50,50,100,50]}),f=new r({fontSize:7}),E=(new i).addColumn(new o({width:"20%",mode:"stack"}).setContent({qr:"https://verificacfdi.facturaelectronica.sat.gob.mx/default.aspx?id=dc2ed983-d108-402e-a2fd-c08edda23c47&re=H&E951128469&rr=XAXX010101000&tt=000000000000002000.000000&fe=h8ZyAw==",fit:100,foreground:"#0941a7",alignment:"left"})).addColumn(new o({width:"80%",mode:"stack"}).setContent(new l("SELLO DIGITAL DEL EMISOR\n",N).addText("YHV2O4OPL7jZIQiuKTgygUb75wrYXRNkgQjKWXPUr19MRfE60v+ug5xHe/bb8hW3DK8Iw9MGiqh/+z5dM2ACWlFk77SqJpEMnBVRkgwmWA/84ltCtSmtQP8roBJHy3JarVPVXwNWgo2qVAaK9Hch5XJZbASlMnPp0JESkze6deZTB22XJRdKkXa1kKZcSx/v/X/+5m99RMUNjtOKerU4jpG0cigO0M/q3j0evKjR6f1uTtW77nYEHZc/++PaExEgO7CaK4Hvk5QNHLD3gngd8UZEG5gTCcZm45B7EyiKJOSOKlF7CEXc7UgY1mYQhbeFQht2+AB9fHYIF1Zzh8ZyAw==\n",f).addText("SELLO DEL SAT\n",N).addText("IUgJIUBUfH6d\n +AmgqQMM370OpyNnlFwLguCoSHJ5qPmPdVjymZjvji1gQiEJSroQXtrZIOQzlADTjsBDespCLE9CQSIaGLJFrUsaH7tJXibft+cBwcLDbZ/\n TTsuff8AV87f06GcVDSXSm6EZKp/dbOVh3lA6/c3QqVCESfKDY+5XLwmG4CkQWlRGEcx7tCVOCLVICNUloz6tGkaHjNOFocKk/\n DFrrvN0fBy8U1vqXK438WIbTqbRNvgGF2Wzkv8GJuiDPjMJEiiHv5Vi0Al26nAZaFFhgu5k1dcfQwxjRgMc7hmEidJ2ngb+96VFhuqlM\n +8lHkfoeFoprXjt+Zu4g==\n",f).addText("CADENA ORIGINAL DEL COMPLEMENTO DE CERTIFICACION DIGITAL DEL SAT\n",N).addText("||1.1|dc2ed983-d108-402e-a2fd-c08edda23c47|2022-02-26T18:05:05|SPR190613I52|\n YHV2O4OPL7jZIQiuKTgygUb75wrYXRNkgQjKWXPUr19MRfE60v+ug5xHe/bb8hW3DK8Iw9MGiqh/\n +z5dM2ACWlFk77SqJpEMnBVRkgwmWA/84ltCtSmtQP8roBJHy3JarVPVXwNWgo2qVAaK9Hch5XJZbASlMnPp0JESkze6deZTB22XJR\n dKkXa1kKZcSx/v/X/+5m99RMUNjtOKerU4jpG0cigO0M/q3j0evKjR6f1uTtW77nYEHZc/+\n +PaExEgO7CaK4Hvk5QNHLD3gngd8UZEG5gTCcZm45B7EyiKJOSOKlF7CEXc7UgY1mYQhbeFQht2+AB9fHYIF1Zzh8ZyAw==|\n 30001000000400002495||",f).toJSON()));this.pdf.addContent(t.toJSON()).addContent(h.toJSON()).addContent(S.toJSON()).addContent(O.toJSON()).addContent(m.toJSON()).addContent(E.toJSON()).setStyles({header:{fontSize:18,bold:!0}}).setDefaultStyle({fontSize:12})}getPDF(){return this.pdf}}export{h as PDF117}; diff --git a/packages/cfdi/designs/package-lock.json b/packages/cfdi/designs/package-lock.json new file mode 100644 index 0000000..223df3c --- /dev/null +++ b/packages/cfdi/designs/package-lock.json @@ -0,0 +1,962 @@ +{ + "name": "design", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "design", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "esbuild": "^0.25.1", + "typescript": "^5.8.2", + "vite": "^6.2.2" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", + "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", + "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", + "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", + "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", + "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", + "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", + "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", + "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", + "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", + "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", + "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", + "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", + "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", + "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", + "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", + "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", + "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", + "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", + "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", + "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", + "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", + "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", + "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", + "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", + "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.36.0.tgz", + "integrity": "sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.36.0.tgz", + "integrity": "sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.36.0.tgz", + "integrity": "sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.36.0.tgz", + "integrity": "sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.36.0.tgz", + "integrity": "sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.36.0.tgz", + "integrity": "sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.36.0.tgz", + "integrity": "sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.36.0.tgz", + "integrity": "sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.36.0.tgz", + "integrity": "sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.36.0.tgz", + "integrity": "sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.36.0.tgz", + "integrity": "sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.36.0.tgz", + "integrity": "sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.36.0.tgz", + "integrity": "sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.36.0.tgz", + "integrity": "sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.36.0.tgz", + "integrity": "sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.36.0.tgz", + "integrity": "sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.36.0.tgz", + "integrity": "sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.36.0.tgz", + "integrity": "sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.36.0.tgz", + "integrity": "sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", + "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.1", + "@esbuild/android-arm": "0.25.1", + "@esbuild/android-arm64": "0.25.1", + "@esbuild/android-x64": "0.25.1", + "@esbuild/darwin-arm64": "0.25.1", + "@esbuild/darwin-x64": "0.25.1", + "@esbuild/freebsd-arm64": "0.25.1", + "@esbuild/freebsd-x64": "0.25.1", + "@esbuild/linux-arm": "0.25.1", + "@esbuild/linux-arm64": "0.25.1", + "@esbuild/linux-ia32": "0.25.1", + "@esbuild/linux-loong64": "0.25.1", + "@esbuild/linux-mips64el": "0.25.1", + "@esbuild/linux-ppc64": "0.25.1", + "@esbuild/linux-riscv64": "0.25.1", + "@esbuild/linux-s390x": "0.25.1", + "@esbuild/linux-x64": "0.25.1", + "@esbuild/netbsd-arm64": "0.25.1", + "@esbuild/netbsd-x64": "0.25.1", + "@esbuild/openbsd-arm64": "0.25.1", + "@esbuild/openbsd-x64": "0.25.1", + "@esbuild/sunos-x64": "0.25.1", + "@esbuild/win32-arm64": "0.25.1", + "@esbuild/win32-ia32": "0.25.1", + "@esbuild/win32-x64": "0.25.1" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.10.tgz", + "integrity": "sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.36.0.tgz", + "integrity": "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.36.0", + "@rollup/rollup-android-arm64": "4.36.0", + "@rollup/rollup-darwin-arm64": "4.36.0", + "@rollup/rollup-darwin-x64": "4.36.0", + "@rollup/rollup-freebsd-arm64": "4.36.0", + "@rollup/rollup-freebsd-x64": "4.36.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.36.0", + "@rollup/rollup-linux-arm-musleabihf": "4.36.0", + "@rollup/rollup-linux-arm64-gnu": "4.36.0", + "@rollup/rollup-linux-arm64-musl": "4.36.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.36.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.36.0", + "@rollup/rollup-linux-riscv64-gnu": "4.36.0", + "@rollup/rollup-linux-s390x-gnu": "4.36.0", + "@rollup/rollup-linux-x64-gnu": "4.36.0", + "@rollup/rollup-linux-x64-musl": "4.36.0", + "@rollup/rollup-win32-arm64-msvc": "4.36.0", + "@rollup/rollup-win32-ia32-msvc": "4.36.0", + "@rollup/rollup-win32-x64-msvc": "4.36.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/typescript": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/vite": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.2.tgz", + "integrity": "sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "postcss": "^8.5.3", + "rollup": "^4.30.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + } + } +} diff --git a/packages/cfdi/designs/package.json b/packages/cfdi/designs/package.json new file mode 100644 index 0000000..a99b3ac --- /dev/null +++ b/packages/cfdi/designs/package.json @@ -0,0 +1,25 @@ +{ + "name": "@cfdi/designs", + "version": "1.0.0", + "description": "Un paquete para Node con Vite y TypeScript", + "main": "dist/index.cjs.js", + "module": "dist/index.es.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "vite build", + "dev": "vite" + }, + "dependencies": { + "@types/pdfmake": "^0.2.11", + "pdfmake": "^0.2.18", + "vite-plugin-dts": "^4.5.3", + "@rollup/plugin-terser": "^0.4.4", + "@rollup/plugin-url":"^8.0.2", + "@cfdi/2json": "workspace:*", + "@cfdi/utils": "workspace:*" + }, + "devDependencies": { + "typescript": "^5.0.0", + "vite": "^6.2.2" + } +} diff --git a/packages/cfdi/designs/pnpm-lock.yaml b/packages/cfdi/designs/pnpm-lock.yaml new file mode 100644 index 0000000..a9f505e --- /dev/null +++ b/packages/cfdi/designs/pnpm-lock.yaml @@ -0,0 +1,955 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@types/pdfmake': + specifier: ^0.2.11 + version: 0.2.11 + pdfmake: + specifier: ^0.2.18 + version: 0.2.18 + devDependencies: + typescript: + specifier: ^5.0.0 + version: 5.8.2 + vite: + specifier: ^5.0.0 + version: 5.4.14(@types/node@22.13.10) + +packages: + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@foliojs-fork/fontkit@1.9.2': + resolution: {integrity: sha512-IfB5EiIb+GZk+77TRB86AHroVaqfq8JRFlUbz0WEwsInyCG0epX2tCPOy+UfaWPju30DeVoUAXfzWXmhn753KA==} + + '@foliojs-fork/linebreak@1.1.2': + resolution: {integrity: sha512-ZPohpxxbuKNE0l/5iBJnOAfUaMACwvUIKCvqtWGKIMv1lPYoNjYXRfhi9FeeV9McBkBLxsMFWTVVhHJA8cyzvg==} + + '@foliojs-fork/pdfkit@0.15.3': + resolution: {integrity: sha512-Obc0Wmy3bm7BINFVvPhcl2rnSSK61DQrlHU8aXnAqDk9LCjWdUOPwhgD8Ywz5VtuFjRxmVOM/kQ/XLIBjDvltw==} + + '@foliojs-fork/restructure@2.0.2': + resolution: {integrity: sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA==} + + '@rollup/rollup-android-arm-eabi@4.36.0': + resolution: {integrity: sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.36.0': + resolution: {integrity: sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.36.0': + resolution: {integrity: sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.36.0': + resolution: {integrity: sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.36.0': + resolution: {integrity: sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.36.0': + resolution: {integrity: sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.36.0': + resolution: {integrity: sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.36.0': + resolution: {integrity: sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.36.0': + resolution: {integrity: sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.36.0': + resolution: {integrity: sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.36.0': + resolution: {integrity: sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.36.0': + resolution: {integrity: sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.36.0': + resolution: {integrity: sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.36.0': + resolution: {integrity: sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.36.0': + resolution: {integrity: sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.36.0': + resolution: {integrity: sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.36.0': + resolution: {integrity: sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.36.0': + resolution: {integrity: sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.36.0': + resolution: {integrity: sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==} + cpu: [x64] + os: [win32] + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/node@22.13.10': + resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==} + + '@types/pdfkit@0.13.9': + resolution: {integrity: sha512-RDG8Yb1zT7I01FfpwK7nMSA433XWpblMqSCtA5vJlSyavWZb303HUYPCel6JTiDDFqwGLvtAnYbH8N/e0Cb89g==} + + '@types/pdfmake@0.2.11': + resolution: {integrity: sha512-gglgMQhnG6C2kco13DJlvokqTxL+XKxHwCejElH8fSCNF9ZCkRK6Mzo011jQ0zuug+YlIgn6BpcpZrARyWdW3Q==} + + base64-js@1.3.1: + resolution: {integrity: sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + brotli@1.3.3: + resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + + deep-equal@1.1.2: + resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==} + engines: {node: '>= 0.4'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + dfa@1.2.0: + resolution: {integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + jpeg-exif@1.1.4: + resolution: {integrity: sha512-a+bKEcCjtuW5WTdgeXFzswSrdqi0jk4XlEtZlx5A94wCoBpFjfFTbo/Tra5SpNCl/YFZPvcV1dJc+TAYeg6ROQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + nanoid@3.3.10: + resolution: {integrity: sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + + pdfmake@0.2.18: + resolution: {integrity: sha512-Fe+GnMS8EVZu5rci/CDaQ+xmUoHvx8P+rvIlrwSYM6A5c7Aik8G6lpJbddhjBE2jXGjv6WcUCFCB06uZbjxkMw==} + engines: {node: '>=18'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + png-js@1.0.0: + resolution: {integrity: sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==} + + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + rollup@4.36.0: + resolution: {integrity: sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + + typescript@5.8.2: + resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + unicode-properties@1.4.1: + resolution: {integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==} + + unicode-trie@2.0.0: + resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} + + vite@5.4.14: + resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + xmldoc@1.3.0: + resolution: {integrity: sha512-y7IRWW6PvEnYQZNZFMRLNJw+p3pezM4nKYPfr15g4OOW9i8VpeydycFuipE2297OvZnh3jSb2pxOt9QpkZUVng==} + +snapshots: + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@foliojs-fork/fontkit@1.9.2': + dependencies: + '@foliojs-fork/restructure': 2.0.2 + brotli: 1.3.3 + clone: 1.0.4 + deep-equal: 1.1.2 + dfa: 1.2.0 + tiny-inflate: 1.0.3 + unicode-properties: 1.4.1 + unicode-trie: 2.0.0 + + '@foliojs-fork/linebreak@1.1.2': + dependencies: + base64-js: 1.3.1 + unicode-trie: 2.0.0 + + '@foliojs-fork/pdfkit@0.15.3': + dependencies: + '@foliojs-fork/fontkit': 1.9.2 + '@foliojs-fork/linebreak': 1.1.2 + crypto-js: 4.2.0 + jpeg-exif: 1.1.4 + png-js: 1.0.0 + + '@foliojs-fork/restructure@2.0.2': {} + + '@rollup/rollup-android-arm-eabi@4.36.0': + optional: true + + '@rollup/rollup-android-arm64@4.36.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.36.0': + optional: true + + '@rollup/rollup-darwin-x64@4.36.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.36.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.36.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.36.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.36.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.36.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.36.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.36.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.36.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.36.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.36.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.36.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.36.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.36.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.36.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.36.0': + optional: true + + '@types/estree@1.0.6': {} + + '@types/node@22.13.10': + dependencies: + undici-types: 6.20.0 + + '@types/pdfkit@0.13.9': + dependencies: + '@types/node': 22.13.10 + + '@types/pdfmake@0.2.11': + dependencies: + '@types/node': 22.13.10 + '@types/pdfkit': 0.13.9 + + base64-js@1.3.1: {} + + base64-js@1.5.1: {} + + brotli@1.3.3: + dependencies: + base64-js: 1.5.1 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + clone@1.0.4: {} + + crypto-js@4.2.0: {} + + deep-equal@1.1.2: + dependencies: + is-arguments: 1.2.0 + is-date-object: 1.1.0 + is-regex: 1.2.1 + object-is: 1.1.6 + object-keys: 1.1.1 + regexp.prototype.flags: 1.5.4 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + dfa@1.2.0: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + functions-have-names@1.2.3: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + gopd@1.2.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + is-arguments@1.2.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + jpeg-exif@1.1.4: {} + + math-intrinsics@1.1.0: {} + + nanoid@3.3.10: {} + + object-is@1.1.6: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + + object-keys@1.1.1: {} + + pako@0.2.9: {} + + pdfmake@0.2.18: + dependencies: + '@foliojs-fork/linebreak': 1.1.2 + '@foliojs-fork/pdfkit': 0.15.3 + iconv-lite: 0.6.3 + xmldoc: 1.3.0 + + picocolors@1.1.1: {} + + png-js@1.0.0: {} + + postcss@8.5.3: + dependencies: + nanoid: 3.3.10 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + rollup@4.36.0: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.36.0 + '@rollup/rollup-android-arm64': 4.36.0 + '@rollup/rollup-darwin-arm64': 4.36.0 + '@rollup/rollup-darwin-x64': 4.36.0 + '@rollup/rollup-freebsd-arm64': 4.36.0 + '@rollup/rollup-freebsd-x64': 4.36.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.36.0 + '@rollup/rollup-linux-arm-musleabihf': 4.36.0 + '@rollup/rollup-linux-arm64-gnu': 4.36.0 + '@rollup/rollup-linux-arm64-musl': 4.36.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.36.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.36.0 + '@rollup/rollup-linux-riscv64-gnu': 4.36.0 + '@rollup/rollup-linux-s390x-gnu': 4.36.0 + '@rollup/rollup-linux-x64-gnu': 4.36.0 + '@rollup/rollup-linux-x64-musl': 4.36.0 + '@rollup/rollup-win32-arm64-msvc': 4.36.0 + '@rollup/rollup-win32-ia32-msvc': 4.36.0 + '@rollup/rollup-win32-x64-msvc': 4.36.0 + fsevents: 2.3.3 + + safer-buffer@2.1.2: {} + + sax@1.4.1: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + source-map-js@1.2.1: {} + + tiny-inflate@1.0.3: {} + + typescript@5.8.2: {} + + undici-types@6.20.0: {} + + unicode-properties@1.4.1: + dependencies: + base64-js: 1.5.1 + unicode-trie: 2.0.0 + + unicode-trie@2.0.0: + dependencies: + pako: 0.2.9 + tiny-inflate: 1.0.3 + + vite@5.4.14(@types/node@22.13.10): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.3 + rollup: 4.36.0 + optionalDependencies: + '@types/node': 22.13.10 + fsevents: 2.3.3 + + xmldoc@1.3.0: + dependencies: + sax: 1.4.1 diff --git a/packages/cfdi/designs/src/A111/index.ts b/packages/cfdi/designs/src/A111/index.ts new file mode 100644 index 0000000..3d52398 --- /dev/null +++ b/packages/cfdi/designs/src/A111/index.ts @@ -0,0 +1,153 @@ +import { PDF } from '../pdf/PDF'; +import { Style } from '../pdf/Style'; +import { Text } from '../pdf/Text'; +import { Column } from '../pdf/Column'; +import { Row } from '../pdf/Row'; +import { Table } from '../pdf/Table'; +import { Cell } from '../pdf/Cell'; + +export default class PDF111 { + public pdf = new PDF(); + + public design(): void { + const boldStyle = new Style({ fontSize: 10, bold: true }); + const regularStyle = new Style({ fontSize: 10 }); + + const text = new Text('\nORDEN DE COMPRA', new Style({ fontSize: 13 })); + + const text2 = new Text('\nSolicitante:', boldStyle).addText( + ' Sistemas', + regularStyle + ); + const text3 = new Text('\nProveedor:', boldStyle).addText( + ' Coppe', + regularStyle + ); + const text4 = new Text('\nEmpresa:', boldStyle).addText( + ' driana Salvador Jeronimo', + regularStyle + ); + + const column1 = new Column({ width: 200 }) + .setContent(text2.toJSON()) + .setContent(text3.toJSON()) + .setContent(text4.toJSON()); + + const text5 = new Text('\nArticulos Solicitados:', boldStyle).addText( + ' 1', + regularStyle + ); + const text6 = new Text('\nFecha de Pedido:', boldStyle).addText( + ' 06/07/2020', + regularStyle + ); + const text7 = new Text('\nFecha de Entrega:', boldStyle).addText( + ' 06/07/2020', + regularStyle + ); + + const column2 = new Column({ width: 250 }) + .setContent(new Text('').toJSON()) + .setContent(text5.toJSON()) + .setContent(text6.toJSON()) + .setContent(text7.toJSON()); + + const table = new Table(); + table.setHeader([ + new Cell('Folio').setBorder([true, true, true, true]).toJSON(), + ]); + table.addRow([new Cell('109209437').toJSON()]); + const column3 = new Column({ width: 150, mode: 'stack' }).setContent( + table.toJSON() + ); + + const row = new Row({ + children: [column1.toJSON(), column2.toJSON(), column3.toJSON()], + }); + + const table2 = new Table(); + table2.setWidths([40, 153, 50, 80, 60, 50, 50]); + table2.setHeaderRow(1); + table2.setHeader([ + new Cell('N') + .setStyle(new Style({ fillColor: '#dddddd' })) + .setBorder([true, true, true, true]) + .toJSON(), + new Cell('Concepto/Descricion') + .setStyle(new Style({ fillColor: '#dddddd' })) + .setBorder([true, true, true, true]) + .toJSON(), + + new Cell('C.pedida') + .setStyle(new Style({ fillColor: '#dddddd' })) + .setBorder([true, true, true, true]) + .toJSON(), + + new Cell('Unidad') + .setStyle(new Style({ fillColor: '#dddddd' })) + .setBorder([true, true, true, true]) + .toJSON(), + + new Cell('C.Recibida') + .setStyle(new Style({ fillColor: '#dddddd' })) + .setBorder([true, true, true, true]) + .toJSON(), + + new Cell('Precio') + .setStyle(new Style({ fillColor: '#dddddd' })) + .setBorder([true, true, true, true]) + .toJSON(), + new Cell('Valor') + .setStyle(new Style({ fillColor: '#dddddd' })) + .setBorder([true, true, true, true]) + .toJSON(), + + ]); + table2.addRow(['1', 'cat', 'nomina', 'servicio', '19891', '090', '090']) + + const header = new Text('\n\n\n\n ', new Style({ fontSize: 10, bold: true, color: '#a76d09' })); + const table3 = new Table(); + table3.setWidths([500]); + table3.setHeader([ + new Cell(header).setBorder( [false, false, false, true]).setAlignment('center').toJSON(), + ]); + this.pdf.addContent(text.toJSON()).addContent(row.toJSON()).addContent(table2.toJSON()).addContent(table3.toJSON()).addContent({ + style: 'tableExample', + table: { + widths: [280, 240], + body: [ + [ + { + border: [false, false, false, false], + text: [ + { + alignment: 'left', + text: 'AUTORIZADO POR (Nombre y Firma) ', + style: { + bold: true, + }, + }, + ], + }, + { + border: [false, false, false, false], + text: [ + { + alignment: 'right', + text: 'SOLICITADO POR (Nombre y Firma) ', + style: { + bold: true, + }, + }, + ], + }, + ], + ], + }, + },) + } + + public getPDF(): PDF { + return this.pdf; + } +} diff --git a/packages/cfdi/designs/src/A117/index.ts b/packages/cfdi/designs/src/A117/index.ts new file mode 100644 index 0000000..6bee48b --- /dev/null +++ b/packages/cfdi/designs/src/A117/index.ts @@ -0,0 +1,412 @@ +import { Column } from '../pdf/Column'; +import { PDF } from '../pdf/PDF'; +import { Row } from '../pdf/Row'; +import { Style } from '../pdf/Style'; +import { Image } from '../pdf/Image'; +import { Text } from '../pdf/Text'; +import { Table } from '../pdf/Table'; +import { Cell } from '../pdf/Cell'; +import { logo} from '@cfdi/utils' +export default class PDF117 { + public pdf = new PDF(); + public design() { + const row = new Row() + .setGap(10) + .addColumn( + new Column({ + mode: 'stack', + children: new Image(logo) + .setHeight(100) + .setWidth(100) + .setAlignment('left') + .toJSON(), + }) + ) + .addColumn(new Column({ children: '', width: 40 })) + .addColumn( + new Column({ width: 200 }) + .setContent({ + text: 'HERRERIA & ELECTRICOS S DE CV\n', + style: { + bold: true, + color: '#a76d09', + }, + }) + .setContent({ + text: [ + { + text: 'R.F.C: ', + style: { + bold: true, + color: '#a76d09', + }, + }, + { text: 'H&E951128469\n' }, + ], + }) + .setContent({ + text: [ + { + text: 'REGIMEN: ', + style: { + bold: true, + color: '#a76d09', + }, + }, + { text: '601 - GENERAL DE LEY PERSONAS MORALES\n' }, + ], + }) + .setContent({ + text: [ + { + text: 'LUGAR DE EXPEDICION: ', + style: { + bold: true, + color: '#a76d09', + }, + }, + { + text: 'CONSTITUYENTES y 115 AV MZA.25 LT.2 Y 3, EJIDO NORTE, 77714 PLAYA DEL CARMEN, Q.R.\n', + }, + ], + }) + .setStyle(new Style({ fontSize: 9, color: '#a76d09' })) + ) + .addColumn( + new Column({ width: 200, mode: 'stack' }).setContent([ + { + alignment: 'center', + margin: [100, 0, 0, 0], + text: 'FACTURA', + style: { + fontSize: 9, + bold: true, + color: '#FF5733', + }, + }, + { + margin: [80, 0, 0, 10], + alignment: 'center', + width: 10, + table: { + body: [ + [ + { + text: 'FOLIO', + style: { + bold: true, + fontSize: 9, + alignment: 'center', + color: '#a76d09', + margin: [0, 0, 0, 0], + }, + }, + ], + [ + { + text: 'A - MYLF-26', + }, + ], + ], + }, + layout: { + // @ts-ignore + paddingLeft: (i: any, node: any) => { + return 20; + }, + // @ts-ignore + paddingRight: (i: any, node: any) => { + return 20; + }, + // @ts-ignore + paddingTop: (i: any, node: any) => { + return 0; + }, + // @ts-ignore + paddingBottom: (i: any, node: any) => { + return 0; + }, + // @ts-ignore + fillColor: (rowIndex: number, node: any, columnIndex: any) => { + return rowIndex === 0 ? '#eeeeee' : null; + }, + }, + }, + { + alignment: 'center', + margin: [80, 0, 0, 0], + table: { + heights: 10, + body: [ + [ + { + text: 'FECHA', + style: { + bold: true, + fontSize: 9, + alignment: 'center', + margin: [0, 0, 0, 0], + }, + }, + ], + [ + { + text: '2022-02-26T06:06:26', + }, + ], + ], + }, + layout: { + // @ts-ignore + paddingTop: (i: any, node: any) => { + return 0; + }, + // @ts-ignore + paddingBottom: (i: any, node: any) => { + return 0; + }, + // @ts-ignore + fillColor: (rowIndex: number, node: any, columnIndex: any) => { + return rowIndex === 0 ? '#eeeeee' : null; + }, + }, + }, + ]) + ); + + const styleInfo = new Style({ bold: true, color: 'purple' }); + const styleLabel = new Style({ bold: true, color: '#a76d09' }); + + const text = new Text('Datos del Cliente\n') + .setBold(true) + .setMargin([0, 20, 0, 10]) + .setStyle(new Style({ fontSize: 10, color: '#0941a7' })) + .addText('Razon Social: ', styleLabel) + .addText('PUBLIC EN GENERAL\n', styleInfo) + .addText('R.F.C.: ', styleLabel) + .addText('XAXX010101000\n', styleInfo) + .addText('Uso CFDI: ', styleLabel) + .addText('P01\n', styleInfo); + + const table = new Table(); + table.setStyle(new Style({ fontSize: 9 })); + table.setWidths([45, 10, 50, 160, 40, 50, 53, 40]); + table.setMargin([0, 7, 0, 7]); + + table.setHeader( + [ + new Cell('CANTIDAD').setColSpan(2).toJSON(), + new Cell('').toJSON(), + new Text('CLAVE SAT', new Style({ fillColor: '#C0C0C0' })).toJSON(), + new Cell('CONCEPTO/DESCRIPCIÓN').toJSON(), + new Text('UNIDAD').toJSON(), + new Text('P.UNITARIO').toJSON(), + new Text('DESCUENTO').toJSON(), + new Text('IMPORTE').toJSON(), + ], + new Style({ + fillColor: 'black', + color: '#a76d09', + fontSize: 9, + }) + ); + + table.addRow([ + new Cell('1', new Style({ fillColor: 'red' })).toJSON(), + new Cell('2').toJSON(), + new Text('10001000', new Style({ fillColor: 'purple' })).toJSON(), + new Text('HERRERIA & ELECTRICOS S DE CV').toJSON(), + new Text('UNIDAD').toJSON(), + new Text('100.00').toJSON(), + new Text('0.00').toJSON(), + new Text('100.00').toJSON(), + ]); + table.addRow([ + new Cell('1', new Style({ fillColor: 'red' })).toJSON(), + new Cell('2').toJSON(), + new Text('10001000', new Style({ fillColor: 'purple' })).toJSON(), + new Text('HERRERIA & ELECTRICOS S DE CV').toJSON(), + new Text('UNIDAD').toJSON(), + new Text('100.00').toJSON(), + new Text('0.00').toJSON(), + new Text('100.00').toJSON(), + ]); + + const labelStrong = new Style({ fontSize: 9, bold: true }); + const quality = new Text('CANTIDAD CON LETRA:\n', labelStrong).addText( + 'OCHOCIENTOS TREINTA Y NUEVE PESOS 99/100 M.N.', + new Style({ fontSize: 9 }) + ); + + const desglose = new Text('SUBTOTAL: ', labelStrong) + .addText('$17240009.13\n', new Style({ fontSize: 9 })) + .addText('DESCUENTO: ', labelStrong) + .addText('$0.00\n', new Style({ fontSize: 9 })) + .addText('IMPUESTOS: ', labelStrong) + .addText('$275.87\n', new Style({ fontSize: 9 })) + .addText('TOTAL: ', labelStrong) + .addText('$2000.00', new Style({ fontSize: 9 })); + + table.addRow([ + new Cell(quality).setColSpan(6).toJSON(), + new Cell('2', new Style({ fillColor: 'red' })).toJSON(), + new Text('10001000', new Style({ fillColor: 'purple' })).toJSON(), + new Text('HERRERIA & ELECTRICOS S DE CV').toJSON(), + new Text('UNIDAD').toJSON(), + new Text('100.00').toJSON(), + new Cell(desglose).setColSpan(2).toJSON(), + new Text('100.00').toJSON(), + ]); + + const styleDetails = new Style({ bold: true, color: '#a76d09' }); + const details = new Row() + .addColumn( + new Column({ width: '50%', mode: 'stack' }) + .setContent( + new Text('Forma de pago: ', styleDetails) + .addText('Efectivo') + .toJSON() + ) + .setContent( + new Text('Método de pago: ', styleDetails) + .addText('PUE - Pago en una sola exhibición') + .toJSON() + ) + .setContent( + new Text('No. de cuenta: ', styleDetails) + .addText('123456789') + .toJSON() + ) + ) + .addColumn( + new Column({ width: '50%', mode: 'stack' }) + .setContent(new Text('Moneda:', styleDetails).addText('MXN').toJSON()) + .setContent( + new Text('Tipo de comprobante: ', styleDetails) + .addText('I - Ingreso') + .toJSON() + ) + ); + + const table2 = new Table(); + table2.setWidths([250, 250]); + table2.setStyle(new Style({ fontSize: 9 })); + + table2.addRow( + [ + new Cell('No. CSD del Emisor') + .setBorder([false, false, false, false]) + .setStyle(new Style({ bold: true, color: 'orange' })) + .setAlignment('center') + .toJSON(), + new Cell('Fecha y hora de certificacion') + .setBorder([false, false, false, false]) + .setStyle(new Style({ bold: true, color: 'green' })) + .setAlignment('center') + .toJSON(), + ], + new Style({ + color: '#a76d09', + fontSize: 9, + }) + ); + table2.addRow( + [ + new Cell('30001000000400002463') + .setBorder([false, true, false, false]) + .setAlignment('center') + .toJSON(), + new Cell('2022-02-26T18:05:05') + .setBorder([false, true, false, false]) + .setAlignment('center') + .toJSON(), + ], + new Style({ + color: '#a76d09', + fontSize: 9, + }) + ); + + table2.addRow( + [ + new Cell('Folio Fiscal') + .setBorder([false, false, false, false]) + .setAlignment('center') + .toJSON(), + new Cell('No. CSD del SAT') + .setBorder([false, false, false, false]) + .setAlignment('center') + .toJSON(), + ], + new Style({ + color: '#a76d09', + fontSize: 9, + }) + ); + + table2.addRow( + [ + new Cell('DC2ED983-D108-402E-A2FD-C08EDDA23C47') + .setBorder([false, true, false, false]) + .setAlignment('center') + .toJSON(), + new Cell('30001000000400002495') + .setBorder([false, true, false, false]) + .setAlignment('center') + .toJSON(), + ], + new Style({ + color: '#a76d09', + fontSize: 9, + }) + ); + + const styleLabelDetailsSat = new Style({ bold: true, fontSize: 7, margin: [50, 50, 100, 50] }); + const styleDetailsSat = new Style({ fontSize: 7 }); + const detailsSat = new Row() + .addColumn( + new Column({ width: '20%', mode: 'stack' }) + .setContent({ + qr: 'https://verificacfdi.facturaelectronica.sat.gob.mx/default.aspx?id=dc2ed983-d108-402e-a2fd-c08edda23c47&re=H&E951128469&rr=XAXX010101000&tt=000000000000002000.000000&fe=h8ZyAw==', + "fit": 100, // Tamaño en puntos (100pt = ~35mm) + "foreground": "#0941a7", // Color del QR + "alignment": "left" // Alineación opcional + }) + ) + .addColumn( + new Column({ width: '80%', mode: 'stack' }) + .setContent( + new Text('SELLO DIGITAL DEL EMISOR\n', styleLabelDetailsSat) + .addText(`YHV2O4OPL7jZIQiuKTgygUb75wrYXRNkgQjKWXPUr19MRfE60v+ug5xHe/bb8hW3DK8Iw9MGiqh/+z5dM2ACWlFk77SqJpEMnBVRkgwmWA/84ltCtSmtQP8roBJHy3JarVPVXwNWgo2qVAaK9Hch5XJZbASlMnPp0JESkze6deZTB22XJRdKkXa1kKZcSx/v/X/+5m99RMUNjtOKerU4jpG0cigO0M/q3j0evKjR6f1uTtW77nYEHZc/++PaExEgO7CaK4Hvk5QNHLD3gngd8UZEG5gTCcZm45B7EyiKJOSOKlF7CEXc7UgY1mYQhbeFQht2+AB9fHYIF1Zzh8ZyAw==\n`, styleDetailsSat) + .addText('SELLO DEL SAT\n', styleLabelDetailsSat) + .addText(`IUgJIUBUfH6d + +AmgqQMM370OpyNnlFwLguCoSHJ5qPmPdVjymZjvji1gQiEJSroQXtrZIOQzlADTjsBDespCLE9CQSIaGLJFrUsaH7tJXibft+cBwcLDbZ/ + TTsuff8AV87f06GcVDSXSm6EZKp/dbOVh3lA6/c3QqVCESfKDY+5XLwmG4CkQWlRGEcx7tCVOCLVICNUloz6tGkaHjNOFocKk/ + DFrrvN0fBy8U1vqXK438WIbTqbRNvgGF2Wzkv8GJuiDPjMJEiiHv5Vi0Al26nAZaFFhgu5k1dcfQwxjRgMc7hmEidJ2ngb+96VFhuqlM + +8lHkfoeFoprXjt+Zu4g==\n`, styleDetailsSat) + .addText(`CADENA ORIGINAL DEL COMPLEMENTO DE CERTIFICACION DIGITAL DEL SAT\n`, styleLabelDetailsSat) + .addText(`||1.1|dc2ed983-d108-402e-a2fd-c08edda23c47|2022-02-26T18:05:05|SPR190613I52| + YHV2O4OPL7jZIQiuKTgygUb75wrYXRNkgQjKWXPUr19MRfE60v+ug5xHe/bb8hW3DK8Iw9MGiqh/ + +z5dM2ACWlFk77SqJpEMnBVRkgwmWA/84ltCtSmtQP8roBJHy3JarVPVXwNWgo2qVAaK9Hch5XJZbASlMnPp0JESkze6deZTB22XJR + dKkXa1kKZcSx/v/X/+5m99RMUNjtOKerU4jpG0cigO0M/q3j0evKjR6f1uTtW77nYEHZc/+ + +PaExEgO7CaK4Hvk5QNHLD3gngd8UZEG5gTCcZm45B7EyiKJOSOKlF7CEXc7UgY1mYQhbeFQht2+AB9fHYIF1Zzh8ZyAw==| + 30001000000400002495||`, styleDetailsSat) + .toJSON() + ) + ); + + this.pdf + .addContent(row.toJSON()) + .addContent(text.toJSON()) + .addContent(table.toJSON()) + .addContent(details.toJSON()) + .addContent(table2.toJSON()) + .addContent(detailsSat.toJSON()) + .setStyles({ header: { fontSize: 18, bold: true } }) + .setDefaultStyle({ fontSize: 12 }); + } + + public getPDF(): PDF { + return this.pdf; + } +} diff --git a/packages/cfdi/designs/src/B111/index.ts b/packages/cfdi/designs/src/B111/index.ts new file mode 100644 index 0000000..9bb3053 --- /dev/null +++ b/packages/cfdi/designs/src/B111/index.ts @@ -0,0 +1,443 @@ +import { PDF } from '../pdf/PDF'; +import { Style } from '../pdf/Style'; +import { Text } from '../pdf/Text'; +import { Column } from '../pdf/Column'; +import { Row } from '../pdf/Row'; +import { Table } from '../pdf/Table'; +import { Cell } from '../pdf/Cell'; +import { logo } from '@cfdi/utils'; + +export default class PDFB111 { + public pdf = new PDF(); + + public design(): void { + const table = new Table(); + table.setWidths([230, 100, 200]); + + this.pdf.setContent({ + style: 'tableExample', + table: { + widths: [230, 100, 200], + body: [ + [ + { + text: [ + { + text: 'Datos de la empresa\n\n\n\n', + style: { + bold: true, + color: '#a76d09', + }, + }, + { + text: 'Nombre o razon social\n', + style: { + bold: true, + color: '#a76d09', + }, + }, + { + text: [ + { + text: 'Dirrecion\n', + style: { + bold: true, + color: '#a76d09', + }, + }, + ], + }, + { + text: [ + { + text: 'Telefonos\n', + style: { + bold: true, + color: '#a76d09', + }, + }, + ], + }, + { + text: [ + { + text: 'pagina web', + style: { + bold: true, + color: '#a76d09', + }, + }, + ], + }, + ], + }, + + [ + { + alignment: 'center', + border: [false, false, false, true], + table: { + body: [ + [ + { + image: logo, + width: 80, + height: 80, + }, + ], + ], + }, + layout: 'noBorders', + }, + ], + + { + style: 'tableExample', + table: { + headerRows: 1, + alignment: 'center', + border: [false, false, false, false], + body: [ + [ + { + text: 'FACTURA', + alignment: 'center', + style: { bold: true, color: '#a76d09' }, + }, + ], + [{ text: 'F3EE54R', alignment: 'center' }], + [ + { + text: 'FOLIO FISCAL', + alignment: 'center', + style: { bold: true, color: '#a76d09' }, + }, + ], + + [ + { + text: 'N° DE SERIE DE CERTIFICACION', + alignment: 'center', + style: { bold: true, color: '#a76d09' }, + }, + ], + [ + { + text: 'F3EE54R', + alignment: 'center', + style: { color: 'red' }, + }, + ], + [ + { + text: 'FECHA Y HORA DE CERTIFICACION', + alignment: 'center', + style: { bold: true, color: '#a76d09' }, + }, + ], + [ + { + text: '18:12:12 02/07/2020', + alignment: 'center', + style: { color: 'red' }, + }, + ], + ], + }, + layout: { + // @ts-ignore + fillColor: function (rowIndex, node, columnIndex) { + return rowIndex % 2 === 0 ? '#CCCCCC' : null; + }, + }, + }, + ], + ], + }, + }); + + this.pdf.addContent({ + style: 'tableExample', + table: { + widths: [270, 269], + body: [ + [ + { + text: [ + { + text: 'Datos del Emisor\n\n', + style: { + bold: true, + color: '#a76d09', + }, + }, + { + text: 'Nombre fiscal:', + style: { + bold: true, + color: '#a76d09', + }, + }, + { text: 'nombre fiscal\n' }, + { + text: [ + { + text: 'Rfc:', + style: { + bold: true, + color: '#a76d09', + }, + }, + ], + }, + { text: 'rfc\n' }, + { + text: [ + { + text: 'Dirección: ', + style: { + bold: true, + color: '#a76d09', + }, + }, + ], + }, + { text: 'Dirrrecion\n' }, + { + text: [ + { + text: 'Regimen fiscal:', + style: { + bold: true, + color: '#a76d09', + }, + }, + ], + }, + { text: 'regimen fiscal\n' }, + ], + }, + { + text: [ + { + text: 'Datos del Cliente\n\n', + style: { + bold: true, + color: '#a76d09', + }, + }, + { + text: 'Nombre Fiscal: ', + style: { + bold: true, + color: '#a76d09', + }, + }, + + { text: 'nombre fiscal\n' }, + { + text: [ + { + text: 'Rfc:', + style: { + bold: true, + color: '#a76d09', + }, + }, + ], + }, + + { text: 'Rfc\n' }, + { + text: [ + { + text: 'Dirección:', + style: { + bold: true, + color: '#a76d09', + }, + }, + ], + }, + + { text: 'Dirrecion\n' }, + { + text: [ + { + text: 'Regimen Fiscal:', + style: { + bold: true, + color: '#a76d09', + }, + }, + ], + }, + + { text: 'regimen fiscal\n' }, + ], + }, + ], + ], + }, + }); + + this.pdf.addContent({ + style: 'tableExample', + table: { + widths: [50, 40, 173, 120, 60, 60], + body: [ + [ + { + text: 'cantidad', + fillColor: '#dddddd', + border: [true, true, true, true], + }, + { + text: 'Unidad', + style: 'tableHeader', + fillColor: '#dddddd', + border: [true, true, true, true], + }, + { + text: 'descricion', + style: 'tableHeader', + fillColor: '#dddddd', + border: [true, true, true, true], + }, + { + text: 'Clave servicio/producto', + style: 'tableHeader', + fillColor: '#dddddd', + border: [true, true, true, true], + }, + { + text: 'Precio Unitario', + style: 'tableHeader', + fillColor: '#dddddd', + border: [true, true, true, true], + }, + { + text: 'Importe', + style: 'tableHeader', + fillColor: '#dddddd', + border: [true, true, true, true], + }, + ], + ['1', 'cat', 'nomina', 'servicio', '19891', '090'], + ['1', 'cat', 'nomina', 'servicio', '19891', '090'], + ['1', 'cat', 'nomina', 'servicio', '19891', '090'], + ['1', 'cat', 'nomina', 'servicio', '19891', '090'], + ], + }, + }) + + this.pdf.addContent({ + table: { + widths: [99, 302, 129], + + body: [ + [ + { + alignment: 'center', + + table: { + body: [ + [ + { + image: logo, + width: 50, + height: 50, + }, + ], + ], + }, + layout: 'noBorders', + }, + { + text: 'Cantidad con letras:\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor', + }, + { + style: 'tableExample', + table: { + alignment: 'center', + body: [ + [ + { text: 'Subtotal', alignment: 'center' }, + { text: 'FACTURA', alignment: 'center' }, + ], + [ + { text: 'Descuento', alignment: 'center' }, + { text: 'F3EE54R', alignment: 'center' }, + ], + [ + { text: 'I.V.A 16%', alignment: 'center' }, + { text: 'F3EE54R', alignment: 'center' }, + ], + [ + { text: 'Total', alignment: 'center' }, + { text: 'F3EE54R', alignment: 'center' }, + ], + ], + }, + }, + ], + ], + }, + }); + + this.pdf.addContent( { + style: 'tableExample', + table: { + widths: [548], + body: [ + [ + { + text: [ + { + text: 'SELLO DIGITAL\n', + style: { + bold: true, + color: '#0941a7', + }, + }, + { + text: 'aYjYNUhTvNVosLnPJsV5h/lAW/HSs45Qzhl2W5V2DPqrdoFfp9mH7wUcS5v3jP6Oql4Y7ncYOcLqakqfGeclJJP/6T1XmbcvPPdBq1DGWh6DaisHS2QCMOW3MGuv8Hc/0j7JwYbXFpTKKM3cudwTmzh76MUoqnssDUfuFIVJ8=`,\n\n', + }, + { + text: 'SELLO SAT\n', + style: { + bold: true, + color: '#0941a7', + }, + }, + { + text: 'GlU7AYil3GqVeUD9oJvqVKc2Uq/K2R7lkc2m6WPuhddjYvWm0foFfMVwzn2KfS7o6KZIddDXdAglhknZsz3ub3X0/aPW4DSwvDYXOF2yCCqd64vbt5MfWqpPqN2zmjzJVFe5ntIPQ21jveXAjR44pJIHNG3rUUUdhVnag6NFTqviaAV75z6OywesoMQCFcsoEjvKozzKGpT7Imuoa94aGIhj0TP5m1hk4OnROOcEBPo11mPf4elDKBDzk+iuCw4wiV/GHaeL0D4zBcVOL/Igz12MKRmYtNdmBfSCv3TI7bJ7qQUV1RckO2Rj1CpFrpa7xr/Vw6lEwitpkCwQ00SKBg==\n\n', + }, + { + text: [ + { + text: 'CADENA ORIGINAL DEL COMPLEMENTO DE CERTIFICACION DIGITAL DEL SAT\n', + style: { + bold: true, + color: '#0941a7', + }, + }, + ], + }, + { + text: + '||1.1|5D178E7E-C81C-11E8-89A8-237CD11664D5|2018-10-04T16:27:58|FMO1007168C6|eaYjYNUhTvNVosLnPJsV5h/xlAW/HSs45Qzhl2W5V2DPqrdoFfp9mH7wUcS5v3jP6Oql4Y7ncYOcLqakqfGeclJJP/6T1XmbcvPPdBq1DGWh6DaisHS2QCMOW3MG\n' + + 'uv8Hc/0j7JwYbXFpTKKM3cudwTmzh76MUoqnssDUfuFIVJ8=|00001000000401477845||', + }, + ], + }, + ], + ], + }, + }) + } + + public getPDF(): PDF { + return this.pdf; + } +} diff --git a/packages/cfdi/designs/src/B112/index.ts b/packages/cfdi/designs/src/B112/index.ts new file mode 100644 index 0000000..407d54c --- /dev/null +++ b/packages/cfdi/designs/src/B112/index.ts @@ -0,0 +1,458 @@ +import { PDF } from '../pdf/PDF'; +import { Style } from '../pdf/Style'; +import { Text } from '../pdf/Text'; +import { Column } from '../pdf/Column'; +import { Row } from '../pdf/Row'; +import { Table } from '../pdf/Table'; +import { Cell } from '../pdf/Cell'; +import { logo } from '@cfdi/utils'; +export default class PDFB112 { + public pdf = new PDF(); + + public design(): void { + + this.pdf.setContent({ + + + style: 'tableExample', + table: { + + widths: [545], + body: [ + [ + { + border: [false, false, false, false], + fillColor: '#000080', + text: [ + + { + alignment: 'center', + text: 'FACTURA ELECTRÓNICA (CFDI)', + style: { + bold: true, + color: '#00FFFF', + fontSize: 13, + } + }, + + ] + } + ] + ] + } + }) + + + + this.pdf.addContent( + + { + + style: 'tableExample', + table: { + + widths: [545], + body: [ + [ + { + border: [false, false, false, false], + text: [ + + { + alignment: 'left', + text: '\nNOMBRE O RAZON SOCIAL DE LA EMPRESA', + style: { + bold: true, + fontSize: 12, + } + }, + + ] + } + ] + ] + } + }).addContent( + { + columns: [ + { + width: 100, + image: logo, + height: 100, + alignment: 'left' + }, + { + width: 20, + text: '' + }, + { + margin: [0, 0, 0, 0], + width: 243, + text: [ + + { + text: [ + { + text: 'R.F.C:\n ', + style: { + bold: true, + color: '#a76d09', + } + }, + { text: ' GUCE910701NHA\n' } + ] + }, + { + text: [ + { + text: 'Dirrecion:\n', + style: { + bold: true, + color: '#a76d09', + } + }, + { text: ' av oquideas entre ruta5\n' } + ] + }, + { + text: [ + { + text: 'Telefono:\n', + style: { + bold: true, + color: '#a76d09', + } + }, + { text: ' 98765436899\n' } + ] + }, + ] + }, + { + width: 500, + + style: 'tableExample', + table: { + body: [ + [{ text: 'FACTURA', alignment: 'right', style: { bold: true, color: '#a76d09' } }], + [{ text: 'F3EE54R', alignment: 'right' }], + [{ text: 'FOLIO FISCAL', alignment: 'right', style: { bold: true, color: '#a76d09' } }], + [{ text: 'XXXXXXXXXX', alignment: 'right' }], + [{ text: 'N° DE SERIE DE CERTIFICACION', alignment: 'right', style: { bold: true, color: '#a76d09' } }], + [{ text: 'XXXXXXXXX', alignment: 'right' }], + [{ text: 'FECHA Y HORA DE CERTIFICACION', alignment: 'right', style: { bold: true, color: '#a76d09' } }], + [{ text: '18:12:12 02/07/2020', alignment: 'right' }], + ] + }, + layout: 'noBorders' + }, + + + ] + }).addContent( + { + style: 'tableExample', + table: { + + body: [ + [ + { + border: [false, false, false, false], + style: { bold: true, color: '#a76d09' }, + text: 'Lugar de Expedicion: ' + }, + { + border: [false, false, false, false], + + text: 'solidaridad,playa del carmen ' + }, + ] + ] + } + }).addContent( + + { + + style: 'tableExample', + table: { + + widths: [545], + body: [ + [ + { + border: [false, true, false, false], + text: [ + { + border: [false, true, false, false], + linecolors: '#000080', + style: { bold: true, color: '#a76d09' }, + text: 'Receptor: ' + }, + { + border: [false, false, false, false], + text: 'PEMEX GAS Y PETROQUIMICA BASICA\n ' + }, + { + border: [false, false, false, false], + linecolors: '#000080', + style: { bold: true, color: '#a76d09' }, + text: 'RFC del Clinete: ' + }, + { + border: [false, false, false, false], + text: 'PGP920716MT6\n ' + }, + { + border: [false, false, false, false], + linecolors: '#000080', + style: { bold: true, color: '#a76d09' }, + text: 'Dirrecion: ' + }, + { + border: [false, false, false, false], + text: 'AVENIDA MARINA NACIONAL 329 PETROLEOS MEXICANOS,Distrito Federal C.P. 86125, México \n' + }, + { + border: [false, false, false, false], + linecolors: '#000080', + style: { bold: true, color: '#a76d09' }, + text: 'Telefono: ' + }, + { + border: [false, false, false, false], + text: '9890808090 \n' + }, + ] + } + ] + ] + } + }).addContent( + { + style: 'tableExample', + table: { + widths: [50, 40, 173, 120, 60, 60], + headerRows: 1, + body: [ + + [{ text: 'cantidad', fillColor: '#dddddd', border: [true, true, true, true] }, { text: 'Unidad', style: 'tableHeader', fillColor: '#dddddd', border: [true, true, true, true] }, { text: 'descricion', style: 'tableHeader', fillColor: '#dddddd', border: [true, true, true, true] }, { text: 'Clave servicio/producto', style: 'tableHeader', fillColor: '#dddddd', border: [true, true, true, true] }, { text: 'Precio Unitario', style: 'tableHeader', fillColor: '#dddddd', border: [true, true, true, true] }, { text: 'Importe', style: 'tableHeader', fillColor: '#dddddd', border: [true, true, true, true] }], + ['1', 'cat', 'nomina', 'servicio', '19891', '090'], + ['1', 'cat', 'nomina', 'servicio', '19891', '090'], + ['1', 'cat', 'nomina', 'servicio', '19891', '090'], + ['1', 'cat', 'nomina', 'servicio', '19891', '090'], + + ] + }, + + + }).addContent( + { + margin: [0, 7, 0, 7], + table: { + + widths: ['auto', '*', 'auto'], + body: [ + [ + { + border: [false, false, false, false], + alignment: 'center', + + table: { + body: [ + [ + + { + image: logo, + width: 100, + height: 100, + }, + + + ], + ] + }, + layout: 'noBorders' + }, + { + border: [false, false, false, false], + stack: [ + { + text: 'CANTIDAD CON LETRA', + style: { + bold: true, + fontSize: 9 + } + }, + { + text: 'OCHOCIENTOS TREINTA Y NUEVE PESOS 99/100 M.N.\n\n', + style: { + fontSize: 9 + } + }, + { + text: 'METODO DE PAGO', + style: { + bold: true, + fontSize: 9 + } + }, + { + text: 'NO INDENTIFICADO\n', + style: { + fontSize: 9 + } + }, + { + text: 'REGIMEN', + style: { + bold: true, + fontSize: 9 + } + }, + { + text: 'PERSONA MORAL', + style: { + fontSize: 9 + } + } + ] + }, + { + border: [false, false, false, false], + style: 'tableExample', + table: { + headerRows: 1, + alignment: 'center', + body: [ + [{ text: 'Subtotal', alignment: 'center', }, { text: 'FACTURA', alignment: 'center' }], + [{ text: 'Descuento', alignment: 'center' }, { text: 'F3EE54R', alignment: 'center' }], + [{ text: 'I.V.A 16%', alignment: 'center' }, { text: 'F3EE54R', alignment: 'center' }], + [{ text: 'Total', alignment: 'center' }, { text: 'F3EE54R', alignment: 'center' }], + + + ] + }, + layout: 'lightHorizontalLines' + + } + ], + ] + } + }).addContent( + { + style: 'tableExample', + table: { + widths: [548], + + body: [ + [{ + border: [false, false, false, false], + text: [ + + { + text: 'SELLO DIGITAL\n', + style: { + bold: true, + color: '#0941a7', + fontSize: 10, + } + }, + { fontSize: 10, text: 'aYjYNUhTvNVosLnPJsV5h/lAW/HSs45Qzhl2W5V2DPqrdoFfp9mH7wUcS5v3jP6Oql4Y7ncYOcLqakqfGeclJJP/6T1XmbcvPPdBq1DGWh6DaisHS2QCMOW3MGuv8Hc/0j7JwYbXFpTKKM3cudwTmzh76MUoqnssDUfuFIVJ8=`,\n\n' }, + { + text: 'SELLO SAT\n', + style: { + fontSize: 10, + bold: true, + color: '#0941a7', + } + + }, + { fontSize: 10, text: 'GlU7AYil3GqVeUD9oJvqVKc2Uq/K2R7lkc2m6WPuhddjYvWm0foFfMVwzn2KfS7o6KZIddDXdAglhknZsz3ub3X0/aPW4DSwvDYXOF2yCCqd64vbt5MfWqpPqN2zmjzJVFe5ntIPQ21jveXAjR44pJIHNG3rUUUdhVnag6NFTqviaAV75z6OywesoMQCFcsoEjvKozzKGpT7Imuoa94aGIhj0TP5m1hk4OnROOcEBPo11mPf4elDKBDzk+iuCw4wiV/GHaeL0D4zBcVOL/Igz12MKRmYtNdmBfSCv3TI7bJ7qQUV1RckO2Rj1CpFrpa7xr/Vw6lEwitpkCwQ00SKBg==\n\n' }, + { + text: [ + { + text: 'CADENA ORIGINAL DEL COMPLEMENTO DE CERTIFICACION DIGITAL DEL SAT\n', + style: { + bold: true, + color: '#0941a7', + fontSize: 10, + } + }, + ] + }, + { + fontSize: 10, text: '||1.1|5D178E7E-C81C-11E8-89A8-237CD11664D5|2018-10-04T16:27:58|FMO1007168C6|eaYjYNUhTvNVosLnPJsV5h/xlAW/HSs45Qzhl2W5V2DPqrdoFfp9mH7wUcS5v3jP6Oql4Y7ncYOcLqakqfGeclJJP/6T1XmbcvPPdBq1DGWh6DaisHS2QCMOW3MG\n' + + 'uv8Hc/0j7JwYbXFpTKKM3cudwTmzh76MUoqnssDUfuFIVJ8=|00001000000401477845||' + }, + + + ] + }, + ] + ] + } + }).addContent( + { + + style: 'tableExample', + table: { + + widths: [548], + + body: [ + [ + { + border: [false, false, false, true], + alignment: 'center', + text: [ + { + border: [false, false, true, false], + linecolors: '#000080', + style: { fontSize: 10, bold: true, color: '#a76d09' }, + text: ' N° DE SERIE DE CERTIFICACION:', + }, + { + border: [false, false, false, false], + fontSize: 10, + text: 'XXXXXXXXX\n ' + }, + { + border: [false, false, false, false], + linecolors: '#000080', + style: { fontSize: 10, bold: true, color: '#a76d09' }, + text: 'FECHA Y HORA DE CERTIFICACION:' + }, + { + border: [false, false, false, false], + fontSize: 10, + text: '03/07/2020\n ' + }, + ] + } + ] + ] + } + }).addContent( + { + style: 'tableExample', + table: { + widths: [180, 200, 150], + headerRows: 1, + body: [ + + [{ text: ' PAGO EN UNA SOLA EXHIBICION', fontSize: 7, alignment: 'left', border: [false, false, false, false] }, + { text: 'Esta es una representación impresa de un CFDI', fontSize: 7, alignment: 'center', border: [false, false, false, false] }, + { text: 'Efectos fscales al pago', fontSize: 7, alignment: 'right', border: [false, false, false, false] }] + + + ] + }, + + + }) + } + + public getPDF(): PDF { + return this.pdf; + } +} diff --git a/packages/cfdi/designs/src/B123/index.ts b/packages/cfdi/designs/src/B123/index.ts new file mode 100644 index 0000000..3957705 --- /dev/null +++ b/packages/cfdi/designs/src/B123/index.ts @@ -0,0 +1,420 @@ +import { PDF } from '../pdf/PDF'; +import { Style } from '../pdf/Style'; +import { Text } from '../pdf/Text'; +import { Column } from '../pdf/Column'; +import { Row } from '../pdf/Row'; +import { Table } from '../pdf/Table'; +import { Cell } from '../pdf/Cell'; +import { logo } from '@cfdi/utils'; +export default class PDFB123 { + public pdf = new PDF(); + public design(): void { + + this.pdf.setContent({ + columns: [ + { + text: [ + { + text: 'Folio Fiscal', + style: { + bold: true, + color: '#a76d09', + } + }, + { text: 'foliofiscal\n' }, + + ] + }, + + + { + text: [ + { + alignment: 'right', + text: '098675 ', + style: { + bold: true, + color: '#a76d09', + } + + }, + + + ] + } + ] + }).addContent( + + { + columns: [ + { + text: [ + { + text: 'No. CSD del Emisor:', + style: { + bold: true, + color: '#a76d09', + } + }, + { text: 'No. CSD del Emisor:\n' }, + + ] + }, + + + { + text: [ + { + alignment: 'right', + text: 'palya del carmen ', + style: { + bold: true, + color: '#a76d09', + } + + }, + + + ] + } + ] + }).addContent( + { + alignment: 'right', + text: 'hora', + style: { + bold: true, + color: '#a76d09', + } + + }).addContent( + { + columns: [ + { + width: 100, + image: logo, + height: 100, + alignment: 'left' + }, + { + width: 40, + text: '' + }, + { + margin: [0, 0, 0, 0], + width: 200, + text: [ + { + text: 'Nombre Razon social empresa\n', + style: { + bold: true, + color: '#a76d09', + }, + + + }, + { + text: [ + { + text: 'R.F.C: ', + style: { + bold: true, + color: '#a76d09', + } + }, + { text: 'rfc empresa\n' }, + + ] + }, + + { + text: [ + { + text: 'Domicilio empresa: ', + style: { + bold: true, + color: '#a76d09', + } + }, + { text: ' MZA 026 LOTE 003 EJIDO PLAYA DEL CARMEN, QROO, ENTRE CALLE 74 NORTE Y CALLE 72 NORTE, 77710\n' } + + ] + }, + { + text: [ + { + text: 'Cliente: ', + style: { + bold: true, + color: '#a76d09', + } + }, + { text: ' jose alberto\n' } + ] + }, + { + text: [ + { + text: 'Rfc cliente ', + style: { + bold: true, + color: '#a76d09', + } + }, + { text: ' rfcjose\n' } + ] + }, + { + text: [ + { + text: 'domicilio cliente: ', + style: { + bold: true, + color: '#a76d09', + } + }, + { text: ' Avenida ordieas\n' } + ] + } + ], + style: { + fontSize: 9, + } + }, + ], + + }).addContent( + { + style: 'tableExample', + table: { + widths: [50, 40, 180, 120, 60, 60], + headerRows: 1, + body: [ + + [{ + text: 'cantidad', + fillColor: '#dddddd', + border: [false, false, false, false] + }, { + text: 'Unidad', + style: 'tableHeader', + fillColor: '#dddddd', + border: [false, false, false, false] + }, { + text: 'descricion', + style: 'tableHeader', + fillColor: '#dddddd', + border: [false, false, false, false] + }, { + text: 'Clave servicio/producto', + style: 'tableHeader', + fillColor: '#dddddd', + border: [false, false, false, false] + }, { + text: 'Precio Unitario', + style: 'tableHeader', + fillColor: '#dddddd', + border: [false, false, false, false] + }, { + text: 'Importe', + style: 'tableHeader', + fillColor: '#dddddd', + border: [false, false, false, false] + }], + ['1', 'cat', 'nomina', 'servicio', '19891', '090'], + + ] + }, + layout: 'noBorders' + + }).addContent( + { + style: 'tableExample', + color: '#444', + table: { + widths: [250, 200, 60], + headerRows: 1, + // keepWithHeaderRows: 1, + body: [ + + [ + { + text: 'Cantidad con letras:\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor', + border: [false, true, false, false] + }, + { + + + text: 'Subtotal:', + style: 'tableHeader', + border: [false, true, false, false], + alignment: 'center' + + + }, + { + text: '090', + style: 'tableHeader', + border: [false, true, false, false], + alignment: 'center' + } + ], + + ] + } + }).addContent( + { + style: 'tableExample', + color: '#444', + table: { + widths: [250, 200, 60], + headerRows: 1, + // keepWithHeaderRows: 1, + body: [ + + [ + { + text: 'Cantidad con letras:\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor', + border: [false, false, false, false] + }, + { + border: [false, true, false, true], + text: [ + + + { + text: 'DESCUENTO:\n ', + style: 'tableHeader', + + }, + + { + text: 'IMPUESTOS:\n ', + style: 'tableHeader', + }, + + { + text: 'TOTAL: ', + style: 'tableHeader', + }, + ], + style: { + fontSize: 9 + } + }, + { + border: [false, true, false, true], + text: [ + + + { text: ' $ 310.35\n', style: 'tableHeader', }, + { text: ' $ 115.86\n', style: 'tableHeader', }, + { text: ' $ 839.99', style: 'tableHeader', } + ], + style: { + fontSize: 9 + } + } + ], + ] + } + }).addContent( + { + alignment: 'justify', + + columns: [ + + { + + + style: 'tableExample', + fontSize: 9, + table: { + widths: [410, 200], + headerRows: 1, + body: [ + [{ text: '', style: 'tableHeader', border: [false, false, false, false] }, { + text: '', + style: 'tableHeader', + border: [false, false, false, false] + }], + ['', '',], + ], + + + }, + layout: 'noBorders' + }, + + + ] + }).addContent( + { + alignment: 'justify', + + columns: [ + + { + width: 430, + fontSize: 9, + table: { + widths: [410, 200], + headerRows: 1, + body: [ + [{ + text: 'SELLO DIGITAL DEL EMISOR', + color: '#0941a7', + alignment: 'justify', + style: 'tableHeader', + border: [false, false, false, false] + }], + ['aYjYNUhTvNVosLnPJsV5h/lAW/HSs45Qzhl2W5V2DPqrdoFfp9mH7wUcS5v3jP6Oql4Y7ncYOcLqakqfGeclJJP/6T1XmbcvPPdBq1DGWh6DaisHS2QCMOW3MGuv8Hc/0j7JwYbXFpTKKM3cudwTmzh76MUoqnssDUfuFIVJ8=`,'], + [{ + text: 'SELLO SAT', + color: '#0941a7', + style: 'tableHeader', + border: [false, false, false, false] + }], + ['GlU7AYil3GqVeUD9oJvqVKc2Uq/K2R7lkc2m6WPuhddjYvWm0foFfMVwzn2KfS7o6KZIddDXdAglhknZsz3ub3X0/aPW4DSwvDYXOF2yCCqd64vbt5MfWqpPqN2zmjzJVFe5ntIPQ21jveXAjR44pJIHNG3rUUUdhVnag6NFTqviaAV75z6OywesoMQCFcsoEjvKozzKGpT7Imuoa94aGIhj0TP5m1hk4OnROOcEBPo11mPf4elDKBDzk+iuCw4wiV/GHaeL0D4zBcVOL/Igz12MKRmYtNdmBfSCv3TI7bJ7qQUV1RckO2Rj1CpFrpa7xr/Vw6lEwitpkCwQ00SKBg==',], + [{ + text: 'CADENA ORIGINAL DEL COMPLEMENTO DE CERTIFICACION DIGITAL DEL SAT', + color: '#0941a7', + style: 'tableHeader', + border: [false, false, false, false] + }], + ['||1.1|5D178E7E-C81C-11E8-89A8-237CD11664D5|2018-10-04T16:27:58|FMO1007168C6|eaYjYNUhTvNVosLnPJsV5h/xlAW/HSs45Qzhl2W5V2DPqrdoFfp9mH7wUcS5v3jP6Oql4Y7ncYOcLqakqfGeclJJP/6T1XmbcvPPdBq1DGWh6DaisHS2QCMOW3MG\n' + + 'uv8Hc/0j7JwYbXFpTKKM3cudwTmzh76MUoqnssDUfuFIVJ8=|00001000000401477845||',], + ] + + }, + layout: 'noBorders' + }, + { + stack: [ + { + image: logo, + width: 100, + height: 100 + }, + { + text: [ + { + text: 'Fecha y hora de certificacion\n', + style: { + bold: true, + color: '#a76d09', + } + }, + { text: 'fechay horal\n' }, + + ] + } + ] + }, + ] + }) + } + public getPDF(): PDF { + return this.pdf; + } +} diff --git a/packages/cfdi/designs/src/B222/index.ts b/packages/cfdi/designs/src/B222/index.ts new file mode 100644 index 0000000..5df5e0c --- /dev/null +++ b/packages/cfdi/designs/src/B222/index.ts @@ -0,0 +1,528 @@ +import { PDF } from '../pdf/PDF'; +import { Style } from '../pdf/Style'; +import { Text } from '../pdf/Text'; +import { Column } from '../pdf/Column'; +import { Row } from '../pdf/Row'; +import { Table } from '../pdf/Table'; +import { Cell } from '../pdf/Cell'; +import { logo } from '@cfdi/utils'; +export default class PDFB222 { + public pdf = new PDF(); + + public design(): void { + + this.pdf.setContent( { + + + style: 'tableExample', + table: { + + widths: [545], + body: [ + [ + { + border: [false, false, false, false], + text: [ + + { + alignment: 'center', + text: 'Nombre de la Empresa o Razon social\n', + style: { + bold: true, + fontSize: 13, + } + }, + { + alignment: 'center', + text: 'MAPA234564A3', + style: { + bold: true, + fontSize: 10, + } + }, + + + ] + } + ] + ] + } + }).addContent( + { + columns: [ + + { + + text: [ + + { + text: [ + { + text: 'FACTURA\n ', + style: { + bold: true, + color: '#a76d09', + } + }, + + ] + }, + { + text: [ + { + text: 'Domicilio y lugar de expedicion:\n', + style: { + bold: true, + color: '#a76d09', + fontSize: 10, + } + }, + { text: ' av oquideas entre ruta5\n', fontSize: 10, } + ] + }, + + + ] + }, + { + width: 100, + image: logo, + height: 100, + alignment: 'left' + }, + { + width: 50, + text: '' + }, + ] + }).addContent( + { + columns: [ + + { + + text: [ + + { + text: [ + { + text: 'lugar de expedicion: ', + style: { + bold: true, + color: '#a76d09', + fontSize: 10 + } + }, + { text: ' av oquideas entre ruta5\n', fontSize: 10, } + ] + }, + { + text: [ + { + text: 'Datos del Receptro\n', + style: { + bold: true, + color: '#a76d09', + fontSize: 11, + } + }, + + ] + }, + { + text: [ + { + text: 'Cliente: ', + style: { + bold: true, + color: '#a76d09', + fontSize: 10 + } + }, + { text: ' jose alberto\n\n', fontSize: 10, } + ] + }, + + { + text: [ + { + text: 'RFC: ', + style: { + bold: true, + color: '#a76d09', + fontSize: 10 + } + }, + { text: ' PAPA90820082A\n', fontSize: 10, } + ] + }, + { + text: [ + { + text: 'Uso CFDI:', + style: { + bold: true, + color: '#a76d09', + fontSize: 10 + } + }, + { text: ' G03 Gastos en general\n', fontSize: 10, } + ] + }, + { + text: [ + { + text: 'Domicilio:', + style: { + bold: true, + color: '#a76d09', + fontSize: 10 + } + }, + { text: '28 sn ,col. montes otoch ncancun,qroo\n\n ', fontSize: 10, } + ] + }, + + + { + + text: [ + + { + text: [ + { + alignment: 'left', + text: 'MONEDA: ', + style: { + bold: true, + fontSize: 10 + } + }, + { text: ' MXN, ', fontSize: 10 } + ] + }, + ] + }, + { + text: [ + { + alignment: 'right', + text: 'TIPO DE CAMBIO:', + style: { + bold: true, + fontSize: 10 + + } + }, + { text: '0.0000', fontSize: 10 } + ] + }, + + { + text: [ + { + text: '\n\nTIPO DE COMPROBANTE:', + style: { + bold: true, + fontSize: 10 + + } + }, + { text: ' INGRESO', fontSize: 10 } + ] + }, + + + + + ] + }, + + { + width: 50, + text: '' + }, + { + + text: [ + + { + text: [ + { + text: '\nComprobante Fiscal Digital Por Internet\n ', + style: { + bold: true, + color: '#a76d09', + fontSize: 10 + } + }, + + ] + }, + { + text: [ + { + text: 'Folio Fiscal', + style: { + bold: true, + color: '#a76d09', + fontSize: 10, + } + }, + { text: 'xxxxxxxxxxxxxxx\n', fontSize: 10, } + ] + }, + { + text: [ + { + text: 'Numero de Comprobante', + style: { + bold: true, + color: '#a76d09', + fontSize: 10, + } + }, + { text: 'xxxxxxx\n', fontSize: 10, } + ] + }, + { + text: [ + { + text: 'Forma de Pago:', + style: { + bold: true, + color: '#a76d09', + fontSize: 10, + } + }, + { text: 'Por Defionir\n', fontSize: 10, } + ] + }, + { + text: [ + { + text: 'Fecha de Comprobante: ', + style: { + bold: true, + color: '#a76d09', + fontSize: 10, + } + }, + { text: '07/07/2020\n', fontSize: 10, } + ] + }, + { + text: [ + { + text: 'Fecha y hora de Certificacion: ', + style: { + bold: true, + color: '#a76d09', + fontSize: 10, + } + }, + { text: '07/07/2020 13:00:01\n', fontSize: 10, } + ] + }, + { + text: [ + { + text: 'Metodo de Pago\n', + style: { + bold: true, + color: '#a76d09', + fontSize: 10, + } + }, + + ] + }, + { + text: [ + { + text: 'Pago de una sola exihbicion\n', + style: { + bold: true, + color: '#a76d09', + fontSize: 10, + } + }, + + ] + }, + { + text: [ + { + text: 'Regimen Fiscal: ', + style: { + bold: true, + color: '#a76d09', + fontSize: 10, + } + }, + { text: '601 General de ley de personas morales \n', fontSize: 10, } + ] + }, + + ] + }, + + ] + }).addContent( + { + width: 50, + text: '\n' + }).addContent( + { + style: 'tableExample', + table: { + widths: [50, 40, 173, 120, 60, 60], + + body: [ + + [{ text: 'cantidad', border: [false, true, false, true] }, { text: 'Unidad', style: 'tableHeader', border: [false, true, false, true] }, { text: 'descricion', style: 'tableHeader', border: [false, true, false, true] }, { text: 'Clave servicio/producto', style: 'tableHeader', border: [false, true, false, true] }, { text: 'Precio Unitario', style: 'tableHeader', border: [false, true, false, true] }, { text: 'Importe', style: 'tableHeader', border: [false, true, false, true] }], + [{ text: '1', border: [false, true, false, true] }, { text: 'lt', style: 'tableHeader', border: [false, true, false, true] }, { text: 'juete de niña\n\n\n\nxxxxxxxx', style: 'tableHeader', border: [false, true, false, true] }, { text: 'Clave servicio/producto', style: 'tableHeader', border: [false, true, false, true] }, { text: 'Precio Unitario', style: 'tableHeader', border: [false, true, false, true] }, { text: 'Importe', style: 'tableHeader', border: [false, true, false, true] }], + ] + }, + + + }).addContent( + { + style: 'tableExample', + + table: { + widths: [412, 129], + + body: [ + [ + { + text: 'Cantidad con letras:\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor', + + }, + { + style: 'tableExample', + table: { + headerRows: 1, + alignment: 'center', + body: [ + [{ text: 'Subtotal', alignment: 'center', }, { text: 'FACTURA', alignment: 'center' }], + [{ text: 'Descuento', alignment: 'center' }, { text: 'F3EE54R', alignment: 'center' }], + [{ text: 'I.V.A 16%', alignment: 'center' }, { text: 'F3EE54R', alignment: 'center' }], + [{ text: 'Total', alignment: 'center' }, { text: 'F3EE54R', alignment: 'center' }], + + ] + }, + layout: 'lightHorizontalLines' + + + }], + + ] + }, + layout: 'noBorders' + + }).addContent( + { + text: [ + { + text: '*Este documento es una representacion impresa de un CFDI\n ', + style: { + bold: true, + color: '#a76d09', + fontSize: 10, + } + }, + + ] + }).addContent( + { + columns: [ + + { + text: [ + { + text: 'Numero de serie del Certificado de sello digital:\n ', + style: { + bold: true, + color: '#a76d09', + fontSize: 10, + } + }, + { text: 'xxxxxxxxxxxxxxxxxxx', fontSize: 10, } + ] + }, + { + text: [ + { + text: 'Numero de serie del Certificado de sello digital:\n', + style: { + bold: true, + color: '#a76d09', + fontSize: 10, + } + }, + { text: 'xxxxxxxxxxxxxxxxxxxxx\n', fontSize: 10, } + ] + }, + ] + }).addContent( + { + alignment: 'justify', + + columns: [ + + { + width: 430, + fontSize: 9, + table: { + widths: [410, 200], + headerRows: 1, + body: [ + [{ + text: 'SELLO DIGITAL DEL EMISOR', + color: '#0941a7', + alignment: 'justify', + style: 'tableHeader', + border: [false, false, false, false] + }], + ['aYjYNUhTvNVosLnPJsV5h/lAW/HSs45Qzhl2W5V2DPqrdoFfp9mH7wUcS5v3jP6Oql4Y7ncYOcLqakqfGeclJJP/6T1XmbcvPPdBq1DGWh6DaisHS2QCMOW3MGuv8Hc/0j7JwYbXFpTKKM3cudwTmzh76MUoqnssDUfuFIVJ8=`,'], + [{ + text: 'SELLO SAT', + color: '#0941a7', + style: 'tableHeader', + border: [false, false, false, false] + }], + ['GlU7AYil3GqVeUD9oJvqVKc2Uq/K2R7lkc2m6WPuhddjYvWm0foFfMVwzn2KfS7o6KZIddDXdAglhknZsz3ub3X0/aPW4DSwvDYXOF2yCCqd64vbt5MfWqpPqN2zmjzJVFe5ntIPQ21jveXAjR44pJIHNG3rUUUdhVnag6NFTqviaAV75z6OywesoMQCFcsoEjvKozzKGpT7Imuoa94aGIhj0TP5m1hk4OnROOcEBPo11mPf4elDKBDzk+iuCw4wiV/GHaeL0D4zBcVOL/Igz12MKRmYtNdmBfSCv3TI7bJ7qQUV1RckO2Rj1CpFrpa7xr/Vw6lEwitpkCwQ00SKBg==',], + [{ + text: 'CADENA ORIGINAL DEL COMPLEMENTO DE CERTIFICACION DIGITAL DEL SAT', + color: '#0941a7', + style: 'tableHeader', + border: [false, false, false, false] + }], + ['||1.1|5D178E7E-C81C-11E8-89A8-237CD11664D5|2018-10-04T16:27:58|FMO1007168C6|eaYjYNUhTvNVosLnPJsV5h/xlAW/HSs45Qzhl2W5V2DPqrdoFfp9mH7wUcS5v3jP6Oql4Y7ncYOcLqakqfGeclJJP/6T1XmbcvPPdBq1DGWh6DaisHS2QCMOW3MG\n' + + 'uv8Hc/0j7JwYbXFpTKKM3cudwTmzh76MUoqnssDUfuFIVJ8=|00001000000401477845||',], + ] + + }, + layout: 'noBorders' + }, + { + stack: [ + { + image: logo, + width: 100, + height: 100 + }, + + ] + }, + + ] + }) + } + + public getPDF(): PDF { + return this.pdf; + } +} + diff --git a/packages/cfdi/designs/src/B333/index.ts b/packages/cfdi/designs/src/B333/index.ts new file mode 100644 index 0000000..a8f9748 --- /dev/null +++ b/packages/cfdi/designs/src/B333/index.ts @@ -0,0 +1,535 @@ +import { PDF } from '../pdf/PDF'; +import { Style } from '../pdf/Style'; +import { Text } from '../pdf/Text'; +import { Column } from '../pdf/Column'; +import { Row } from '../pdf/Row'; +import { Table } from '../pdf/Table'; +import { Cell } from '../pdf/Cell'; +import { logo } from '@cfdi/utils'; +export default class PDFB333 { + public pdf = new PDF(); + + public design(): void { + + this.pdf.setContent( + + { + style: 'tableExample', + table: { + widths: ['*', 'auto'], + body: [ + [{ + columns: [ + { + width: 100, + image: logo, + height: 100, + alignment: 'left' + }, + { + width: 50, + text: '' + }, + { + margin: [0, 0, 0, 0], + width: 243, + text: [ + + { + text: [ + { + text: 'NOMBRE O RAZON SOCIAL DE LA EMPRESA\n\n ', + style: { + bold: true, + color: '#a76d09', + } + }, + + ] + }, + { + text: [ + { + text: 'DOMICILIO FISCAL:\n', + style: { + bold: true, + color: '#a76d09', + fontSize: 10, + + } + }, + { fontSize: 10, text: ' av oquideas entre ruta5\nCANCUN QUINTANRRO\n ' } + ] + }, + { + text: [ + { + text: 'RFC:\n', + style: { + fontSize: 10, + + bold: true, + color: '#a76d09', + } + }, + { text: ' 98765436899\n', fontSize: 10, } + ] + }, + { + text: [ + { + text: 'REGIMEN FISCAL:\n', + style: { + bold: true, + color: '#a76d09', + fontSize: 10, + + } + }, + { text: '601 General de ley de personas morales\n', fontSize: 10, } + ] + }, + ] + }, + ] + }, + + { + margin: [0, 0, 0, 0], + width: 243, + text: [ + + { + text: [ + { + text: 'FACTURA\n ', + style: { + alignment: 'center', + bold: true, + color: '#a76d09', + fontSize: 10 + } + }, + + ] + }, + { + text: [ + { + text: 'Tipo De Comprobante: ', + style: { + bold: true, + color: '#a76d09', + fontSize: 8 + } + }, + { fontSize: 8, text: ' Ingreso\n' } + ] + }, + { + text: [ + { + text: 'Fecha: ', + style: { + fontSize: 8, + bold: true, + color: '#a76d09', + } + }, + { fontSize: 8, text: ' 2020/07/08 13:28:12\n' } + ] + }, + { + text: [ + { + text: 'Lugar de expedicon:\n', + style: { + fontSize: 8, + bold: true, + color: '#a76d09', + } + }, + { fontSize: 8, text: 'Playa del carmen, solidaridad,quintan Roo\n' } + ] + }, + { + text: [ + { + text: 'Forma De Pago:\n', + style: { + fontSize: 8, + bold: true, + color: '#a76d09', + } + }, + { fontSize: 8, text: 'Pago en una sola Exhibicion\n' } + ] + }, + { + text: [ + { + text: 'Metodo de pago:\n', + style: { + fontSize: 8, + bold: true, + color: '#a76d09', + } + }, + { fontSize: 8, text: 'Tranferencia electronica\n' } + ] + }, + { + text: [ + { + text: 'Forma de pago Sat:', + style: { + fontSize: 8, + bold: true, + color: '#a76d09', + } + }, + { fontSize: 8, text: '\n' } + ] + }, + { + text: [ + { + text: 'Uso CFDI:', + style: { + fontSize: 8, + bold: true, + color: '#a76d09', + } + }, + { fontSize: 8, text: '\n' } + ] + }, + + + ] + },], + ] + } + }).addContent( + { + style: 'tableExample', + table: { + widths: [546], + + body: [ + + [{ text: 'Facturado a: ( 1) Industrial azteca s.a de cv', fillColor: '#eeeeee', border: [true, true, true, true] }], + [{ + margin: [0, 0, 0, 0], + width: 243, + text: [ + + { + text: [ + + + { text: '\nCalle: avenida granjas no 17 entre san sebastian \n' }, + { + text: [ + { + text: 'RFC:', + style: { + bold: true, + color: '#a76d09', + } + }, + { text: 'JACE34567MJ5\n' } + ] + }, + + + ] + }, + ], + } + + ] + ] + }, + }).addContent( + { + style: 'tableExample', + table: { + widths: [546], + + body: [ + + [{ text: 'Enviar a:', fillColor: '#eeeeee', border: [true, true, true, true] }], + [{ + margin: [0, 0, 0, 0], + width: 243, + text: [ + + { + text: [ + + + { text: '\nCalle: avenida granjas no 17 entre san sebastian \n' }, + { + text: [ + { + text: 'RFC:', + style: { + + bold: true, + color: '#a76d09', + } + }, + { text: 'JACE34567MJ5\n' } + ] + }, + + + ] + }, + ], + } + + ] + ] + }, + }).addContent( + { + + text: '\n' + }).addContent( + { + style: 'tableExample', + table: { + widths: [50, 40, 162, 120, 70, 60], + + body: [ + + [{ fontSize: 10, text: 'cantidad', border: [true, true, false, true], fillColor: '#eeeeee', }, { fontSize: 10, text: 'Unidad', style: 'tableHeader', fillColor: '#eeeeee', border: [false, true, false, true] }, { fontSize: 10, text: 'descricion', fillColor: '#eeeeee', style: 'tableHeader', border: [false, true, false, true] }, { fontSize: 10, text: 'Clave servicio/producto', style: 'tableHeader', fillColor: '#eeeeee', border: [false, true, false, true] }, { fontSize: 10, text: 'Precio Unitario', style: 'tableHeader', fillColor: '#eeeeee', border: [false, true, false, true] }, { fontSize: 10, text: 'Importe', style: 'tableHeader', fillColor: '#eeeeee', border: [false, true, true, true] }], + [{ alignment: 'center', text: '1', border: [false, true, false, true] }, { text: 'lt', style: 'tableHeader', border: [false, true, false, true] }, { text: 'juete de niña', style: 'tableHeader', border: [false, true, false, true] }, { text: 'Clave servicio/producto', style: 'tableHeader', border: [false, true, false, true] }, { text: 'Precio Unitario', style: 'tableHeader', border: [false, true, false, true] }, { text: 'Importe', style: 'tableHeader', border: [false, true, false, true] }], + [{ alignment: 'center', text: '1', border: [false, true, false, true] }, { text: 'lt', style: 'tableHeader', border: [false, true, false, true] }, { text: 'juete de niña', style: 'tableHeader', border: [false, true, false, true] }, { text: 'Clave servicio/producto', style: 'tableHeader', border: [false, true, false, true] }, { text: 'Precio Unitario', style: 'tableHeader', border: [false, true, false, true] }, { text: 'Importe', style: 'tableHeader', border: [false, true, false, true] }], + ] + + }, + + + }).addContent( + { + margin: [0, 7, 0, 7], + table: { + + widths: ['auto', '*', 'auto'], + body: [ + [ + { + border: [false, false, false, false], + alignment: 'center', + + table: { + body: [ + [ + + { + image: logo, + width: 100, + height: 100, + }, + + + ], + ] + }, + layout: 'noBorders' + }, + { + border: [false, false, false, false], + style: 'tableExample', + table: { + + + body: [ + + [{ text: 'Cantidad con Letras', fillColor: '#eeeeee', border: [true, true, true, true] }], + [{ + margin: [0, 0, 0, 0], + width: 243, + text: [ + + { + text: [ + + + { text: '\nOCHOCIENTOS TREINTA Y NUEVE PESOS 99/100 M.N.\n\n' }, + + + + ] + }, + ], + } + + ] + ] + }, + }, + + { + border: [false, false, false, false], + style: 'tableExample', + table: { + headerRows: 1, + alignment: 'center', + body: [ + [{ text: 'Subtotal', alignment: 'center', }, { text: 'FACTURA', alignment: 'center' }], + [{ text: 'Descuento', alignment: 'center' }, { text: 'F3EE54R', alignment: 'center' }], + [{ text: 'I.V.A 16%', alignment: 'center' }, { text: 'F3EE54R', alignment: 'center' }], + [{ text: 'Total', alignment: 'center' }, { text: 'F3EE54R', alignment: 'center' }], + + + ] + }, + layout: 'lightHorizontalLines' + + } + ], + ] + } + }).addContent( + { + style: 'tableExample', + table: { + widths: [546], + + body: [ + + [{ text: 'Este Documento es una Representacion Impresa de un CFDI', alignment: 'center', fillColor: '#eeeeee', border: [true, true, true, true] }], + + ] + }, + }).addContent( + { + style: 'tableExample', + table: { + widths: [81, 143, 155, 140], + + body: [ + + [{ text: 'Folio Fiscal:', alignment: 'center', fillColor: '#eeeeee', border: [true, true, true, true] }, { text: 'xxxxxxxxxxxxxxxx', border: [true, true, true, true] }, { text: 'Fecha y Hora de Expedicon', alignment: 'center', fillColor: '#eeeeee', border: [true, true, true, true] }, { text: '08/07/2020 17:16:10', border: [true, true, true, true] }], + + ] + }, + }).addContent( + { + style: 'tableExample', + table: { + widths: [546], + + body: [ + + [{ text: 'Sello Digital del CFDI', alignment: 'center', fillColor: '#eeeeee', border: [true, true, true, true] }], + [{ + margin: [0, 0, 0, 0], + width: 243, + text: [ + + { + alignment: 'justify', + text: [ + + + { text: 'eaYjYNUhTvNVosLnPJsV5h/xlAW/HSs45Qzhl2W5V2DPqrdoFfp9mH7wUcS5v3jP6Oql4Y7ncYOcLqakqfGeclJJP/6T1XmbcvPPdBq1DGWh6DaisHS2QCMOW3MGuv8Hc/0j7JwYbXFpTKKM3cudwTmzh76MUoqnssDUfuFIVJ8= \n' }, + + + + ] + }, + ], + } + + ] + ] + }, + }).addContent( + { + style: 'tableExample', + table: { + widths: [270, 267], + + body: [ + + [{ fontSize: 10, text: 'Numero de Serie del Certificado de Sello Digital', alignment: 'center', fillColor: '#eeeeee', border: [true, true, true, true] }, { fontSize: 10, text: 'Numero de Serie del Certificado de Sello Digital del Sat', alignment: 'center', fillColor: '#eeeeee', border: [true, true, true, true] },], + [{ text: 'xxxxxxxxxxxxxxxx', alignment: 'center', border: [true, true, true, true] }, { text: 'xxxxxxxxxxxxxx', alignment: 'center', border: [true, true, true, true] }] + ] + }, + }).addContent( + { + style: 'tableExample', + table: { + widths: [546], + + body: [ + + [{ text: 'Cadena Orginal del Complemento de Certificacion Digital del SAT', alignment: 'center', fillColor: '#eeeeee', border: [true, true, true, true] }], + [{ + margin: [0, 0, 0, 0], + width: 243, + text: [ + + { + alignment: 'justify', + text: [ + + + { text: 'eaYjYNUhTvNVosLnPJsV5h/xlAW/HSs45Qzhl2W5V2DPqrdoFfp9mH7wUcS5v3jP6Oql4Y7ncYOcLqakqfGeclJJP/6T1XmbcvPPdBq1DGWh6DaisHS2QCMOW3MGuv8Hc/0j7JwYbXFpTKKM3cudwTmzh76MUoqnssDUfuFIVJ8= \n' }, + + + + ] + }, + ], + } + + ] + ] + }, + }).addContent( + { + style: 'tableExample', + table: { + widths: [546], + + body: [ + + [{ text: 'Sello Digital del SAT', alignment: 'center', fillColor: '#eeeeee', border: [true, true, true, true] }], + [{ + margin: [0, 0, 0, 0], + width: 243, + text: [ + + { + alignment: 'justify', + text: [ + + + { text: 'eaYjYNUhTvNVosLnPJsV5h/xlAW/HSs45Qzhl2W5V2DPqrdoFfp9mH7wUcS5v3jP6Oql4Y7ncYOcLqakqfGeclJJP/6T1XmbcvPPdBq1DGWh6DaisHS2QCMOW3MGuv8Hc/0j7JwYbXFpTKKM3cudwTmzh76MUoqnssDUfuFIVJ8= \n' }, + + + + ] + }, + ], + } + + ] + ] + }, + }) + + } + + public getPDF(): PDF { + return this.pdf; + } + } + + diff --git a/packages/cfdi/designs/src/abstract-cfdi-pdf.ts b/packages/cfdi/designs/src/abstract-cfdi-pdf.ts new file mode 100644 index 0000000..e5f1be8 --- /dev/null +++ b/packages/cfdi/designs/src/abstract-cfdi-pdf.ts @@ -0,0 +1,41 @@ +export abstract class GeneradorPdf { + + constructor(xml: string) { + + } + + protected abstract logo(): void; + protected abstract folio(comprobante: CFDIComprobante): void; + protected abstract datosEmisor(emisor: XmlEmisorAttribute, lugarExpedicion: string): void; + protected abstract fecha(fecha: string): void; + protected abstract receptor(receptor: XmlReceptor): void; + protected abstract fechaTimbrado(tfd: XmlTfd): void; + protected abstract totales(comprobante: CFDIComprobante): void; + protected abstract impuestos(impuesto: XmlImpuestos): void; + protected abstract totalEnLetras(total: number): void; + protected abstract certificadoEmisor(noCertificado: string): void; + protected abstract detalles(concepto: XmlConcepto): void; + protected abstract formaPago(forma: string): void; + protected abstract metodoPago(metodo: string): void; + protected abstract moneda(moneda: string): void; + protected abstract tipoComprobante(tipo: string): void; + protected abstract certificadoSat(tfd: XmlTfd): void; + protected abstract folioFiscal(tfd: XmlTfd): void; + protected abstract selloEmisor(tfd: XmlTfd): void; + protected abstract selloSat(tfd: XmlTfd): void; + protected abstract cadenaOriginal(tfd: XmlTfd): void; + protected abstract qr( + tfd: XmlTfd, + emisor?: XmlEmisor, + receptor?: XmlReceptor, + total?: string + ): void; + + public async obtenerDocumento() { + /* const fuentesCombinadas = { ...this.fuentes, ...Pd.fonts, ...this.opciones.fuentes }; + console.log(fuentesCombinadas); + return createPdf(this.definicionDocumento); */ + } + + +} diff --git a/packages/cfdi/designs/src/index.ts b/packages/cfdi/designs/src/index.ts new file mode 100644 index 0000000..25aa617 --- /dev/null +++ b/packages/cfdi/designs/src/index.ts @@ -0,0 +1,3 @@ +import PDF117 from './A117/index'; + +export { PDF117 }; \ No newline at end of file diff --git a/packages/cfdi/designs/src/pdf/Cell.ts b/packages/cfdi/designs/src/pdf/Cell.ts new file mode 100644 index 0000000..351c498 --- /dev/null +++ b/packages/cfdi/designs/src/pdf/Cell.ts @@ -0,0 +1,39 @@ +import { Content, TableCell, TableCellProperties } from 'pdfmake/interfaces'; +import { Text } from './Text'; +import { Style } from './Style'; +type ICell = Content & TableCellProperties +export class Cell { + private cell: Partial = { + + } + + constructor(text: string | Text, style?: Style) { + this.cell = typeof text === 'string' ? { text, ...(style ?? {})} : { text: text.toJSON(), ...(style ?? {}) }; + } + + setColSpan(colSpan: number): this { + // @ts-ignore + this.cell.colSpan = colSpan; + return this; + } + + setStyle(style: Style): this { + // @ts-ignore + this.cell = { ...this.cell, ...style.toJSON() }; + return this; + } + + setBorder(border: [boolean, boolean, boolean, boolean]): this { + this.cell.border = border; + return this; + } + + setAlignment(alignment: 'left' | 'center' | 'right'): this { + // @ts-ignore + this.cell.alignment = alignment; + return this; + } + toJSON(): TableCell { + return this.cell; + } +} diff --git a/packages/cfdi/designs/src/pdf/Column.ts b/packages/cfdi/designs/src/pdf/Column.ts new file mode 100644 index 0000000..8ca236e --- /dev/null +++ b/packages/cfdi/designs/src/pdf/Column.ts @@ -0,0 +1,54 @@ +import { Content, ContentColumns, ContentStack } from 'pdfmake/interfaces'; +import { Style } from './Style'; +interface IColumn { + width: string | number; + text: Content; + style?: Style; +} +export class Column { + private columnConfig: IColumn = { width: 'auto', text: [] }; + private mode: 'text' | 'stack' | 'image' = 'text'; + constructor(options?: { + children?: Content | Content[]; + width?: string | number; + mode?: 'text' | 'stack' ; + }) { + const { children = [], width = 'auto', mode = 'text' } = options || {}; + this.mode = mode; + this.columnConfig[this.mode] = []; + this.columnConfig.width = width; + this.addContent(children); + } + + private addContent(content: Content | Content[]): this { + if (Array.isArray(content)) { + const currentContent = this.columnConfig[this.mode]; + this.columnConfig[this.mode] = [...currentContent, ...content]; + } else { + this.columnConfig[this.mode].push(content); + } + return this; + } + setContent(content: Content | Content[]): this { + this.addContent(content); + return this; + } + + setStack(content: Content | Content[]): this { + this.addContent(content); + return this; + } + setWidth(width: string | number): this { + this.columnConfig.width = width; + return this; + } + + setStyle(style: Style): this { + this.columnConfig.style = style; + return this; + } + + toJSON(): IColumn { + return this.columnConfig; + } +} diff --git a/packages/cfdi/designs/src/pdf/Grid.ts b/packages/cfdi/designs/src/pdf/Grid.ts new file mode 100644 index 0000000..70b1861 --- /dev/null +++ b/packages/cfdi/designs/src/pdf/Grid.ts @@ -0,0 +1,20 @@ +import { Content } from "pdfmake/interfaces"; +import { Row } from "./Row"; + +export class Grid { + private content: Content[] = []; + + addRow(row: Row): this { + this.content.push(row.toJSON()); + return this; + } + + addContent(content: string): this { + this.content.push(content); + return this; + } + + toJSON(): Content[] { + return this.content; + } + } \ No newline at end of file diff --git a/packages/cfdi/designs/src/pdf/Image.ts b/packages/cfdi/designs/src/pdf/Image.ts new file mode 100644 index 0000000..1c7b102 --- /dev/null +++ b/packages/cfdi/designs/src/pdf/Image.ts @@ -0,0 +1,53 @@ +import { ContentImage } from 'pdfmake/interfaces'; + +export class Image { + private content: ContentImage; + + constructor(src: string) { + this.content = { image: src }; + } + + setWidth(width: number): this { + this.content.width = width; + return this; + } + + setHeight(height: number): this { + this.content.height = height; + return this; + } + + setFit(width: number, height: number): this { + this.content.fit = [width, height]; + return this; + } + + setAlignment(alignment: 'left' | 'center' | 'right'): this { + this.content.alignment = alignment; + return this; + } + + setMargin(margin: [number, number, number, number]): this { + this.content.margin = margin; + return this; + } + + setOpacity(opacity: number): this { + this.content.opacity = opacity; + return this; + } + + /* setBorder(top: boolean, right: boolean, bottom: boolean, left: boolean): this { + this.content.border = [top, right, bottom, left]; + return this; + } */ + + setStyle(style: string): this { + this.content.style = style; + return this; + } + + toJSON(): ContentImage { + return this.content; + } +} diff --git a/packages/cfdi/designs/src/pdf/PDF.ts b/packages/cfdi/designs/src/pdf/PDF.ts new file mode 100644 index 0000000..99d2edb --- /dev/null +++ b/packages/cfdi/designs/src/pdf/PDF.ts @@ -0,0 +1,109 @@ +import { TDocumentDefinitions, Content, BufferOptions } from 'pdfmake/interfaces'; +import pdfMake from "pdfmake/build/pdfmake"; +import pdfFonts from "pdfmake/build/vfs_fonts"; +// @ts-ignore +pdfMake.addVirtualFileSystem(pdfFonts); + + +interface ContentPDF extends TDocumentDefinitions{ + content: Content[]; +} +export class PDF { + definition: ContentPDF = { + pageSize: 'A4', + pageMargins: [20, 25, 20, 25], + content: [], + }; + + setContent(content: Content | Content[]): this { + this.definition.content = Array.isArray(content) ? content : [content]; + return this; + } + + addContent(content: Content | any): this { + this.definition.content.push(content); + return this; + } + + setStyles(styles: Record): this { + this.definition.styles = styles; + return this; + } + + setDefaultStyle(style: Record): this { + this.definition.defaultStyle = style; + return this; + } + + toJSON(): TDocumentDefinitions { + return this.definition; + } + + getDocument() { + //return pdfMake.createPdf(this.definition); + return pdfMake.createPdf(this.definition ); + + } + + public async save(path: string, name: string) { + const dir = path + `${name.replace('.pdf', '')}.pdf`; + try { + const buffer = await this.getBuffer(); + writeFileSync(dir, buffer, { encoding: 'binary' }); + return { + save: true, + path: dir, + }; + } catch (e) { + return { + save: false, + error: e, + }; + } + } + + public async getBlob(options?: BufferOptions): Promise { + return new Promise(async (resolve) => { + const doc = await this.getDocument(); + doc!.getBlob((result) => { + resolve(result); + }, options); + }); + } + + public async getBase64(options?: BufferOptions): Promise { + return new Promise(async (resolve) => { + const doc = await this.getDocument(); + doc!.getBase64((result) => { + resolve(result); + }, options); + }); + } + + public async getBuffer(options?: BufferOptions): Promise { + return new Promise(async (resolve) => { + const doc = await this.getDocument(); + doc!.getBuffer((result) => { + resolve(result); + }, options); + }); + } + + public async getDataUrl(options?: BufferOptions): Promise { + return new Promise(async (resolve) => { + const doc = await this.getDocument(); + doc!.getDataUrl((result) => { + resolve(result); + }, options); + }); + } + + public async getStream(options?: BufferOptions) { + const doc = await this.getDocument(); + return doc!.getStream(options); + } +} +function writeFileSync(dir: string, buffer: Buffer, arg2: { encoding: string; }) { + throw new Error('Function not implemented.'); +} + diff --git a/packages/cfdi/designs/src/pdf/Row.ts b/packages/cfdi/designs/src/pdf/Row.ts new file mode 100644 index 0000000..17cc2e5 --- /dev/null +++ b/packages/cfdi/designs/src/pdf/Row.ts @@ -0,0 +1,30 @@ +import { Content, ContentColumns, ContentStack } from 'pdfmake/interfaces'; +import { Column } from './Column'; + + +export class Row { + private columns: any[] = []; + private columnGap: number = 10; + + constructor(options?: any) { + if (options.children) { + this.columns = options.children; + } + } + addColumn(column: Column): this { + this.columns.push(column.toJSON()); + return this; + } + + setGap(gap: number): this { + + this.columnGap = gap + return this; + } + + toJSON(): Content { + return { columns: this.columns, columnGap: this.columnGap }; + } +} + + diff --git a/packages/cfdi/designs/src/pdf/Style.ts b/packages/cfdi/designs/src/pdf/Style.ts new file mode 100644 index 0000000..cc9dcb8 --- /dev/null +++ b/packages/cfdi/designs/src/pdf/Style.ts @@ -0,0 +1,69 @@ +import { Style as PdfStyle, ContentText } from 'pdfmake/interfaces'; + +export class Style { + private style: Partial = {}; + constructor(style: Partial = {}) { + this.style = style + } + + setFont(font: string): this { + this.style.font = font; + return this; + } + + setFontSize(size: number): this { + this.style.fontSize = size; + return this; + } + + setLineHeight(lineHeight: number): this { + this.style.lineHeight = lineHeight; + return this; + } + + setBold(isBold: boolean = true): this { + this.style.bold = isBold; + return this; + } + + setItalic(isItalic: boolean = true): this { + this.style.italics = isItalic; + return this; + } + + setAlignment(alignment: 'left' | 'right' | 'center' | 'justify'): this { + this.style.alignment = alignment; + return this; + } + + setColor(color: string): this { + this.style.color = color; + return this; + } + + setBackground(color: string): this { + this.style.background = color; + return this; + } + + setMargin(margin: number | [number, number, number, number]): this { + this.style.margin = margin; + return this; + } + + setOpacity(opacity: number): this { + this.style.opacity = opacity; + return this; + } + + setCharacterSpacing(spacing: number): this { + this.style.characterSpacing = spacing; + return this; + } + + toJSON(): Partial { + return this.style; + } +} + + diff --git a/packages/cfdi/designs/src/pdf/Table.ts b/packages/cfdi/designs/src/pdf/Table.ts new file mode 100644 index 0000000..f021989 --- /dev/null +++ b/packages/cfdi/designs/src/pdf/Table.ts @@ -0,0 +1,76 @@ +import { ContentTable, Size, TableCell, TableLayout } from 'pdfmake/interfaces'; +import { Style } from './Style'; + +export class Table { + private content: ContentTable; + + constructor() { + this.content = { + table: { + body: [], + }, + }; + } + + setHeaderRow(headers: number): this { + this.content.table.headerRows = headers; + return this; + } + + setHeader(headers: (string | TableCell)[], style?: Style): this { + const headerRow = headers.map(cell => { + if (typeof cell === 'string') { + return { text: cell, ...(style ?? {}) }; + } else { + const cellStyle = style ? style.toJSON() : {}; + return { + ...(cell as unknown as Object), + // @ts-ignore + style: { ...cellStyle, ...(cell.style ?? {}) }, + }; + } + }); + this.content.table.body.unshift(headerRow); + return this; + } + + addRow(cells: (string | TableCell)[], style?: Style): this { + const rows = cells.map(cell => { + if (typeof cell === 'string') { + return { text: cell, ...(style ?? {}) }; + } else { + const cellStyle = style ? style.toJSON() : {}; + return { + ...(cell as unknown as Object), + // @ts-ignore + style: { ...cellStyle, ...(cell.style ?? {}) }, + }; + } + }); + this.content.table.body.push(rows); + return this; + } + + setLayout(layout: TableLayout): this { + this.content.layout = layout; + return this; + } + + setStyle(style: Style): this { + this.content = { ...this.content, style : style.toJSON()}; + return this; + } + + setMargin(margin: number | [number, number, number, number]): this { + this.content.margin = margin; + return this; + } + setWidths(widths: "*" | "auto" | Size[] | undefined ): this { + this.content.table.widths = widths; + return this; + } + + toJSON(): ContentTable { + return this.content; + } +} diff --git a/packages/cfdi/designs/src/pdf/Text.ts b/packages/cfdi/designs/src/pdf/Text.ts new file mode 100644 index 0000000..bcebe04 --- /dev/null +++ b/packages/cfdi/designs/src/pdf/Text.ts @@ -0,0 +1,48 @@ +import { ContentText } from 'pdfmake/interfaces'; +import { Style } from './Style'; + +export class Text { + private content: ContentText; + + constructor(text: string, style?: Style) { + this.content = { text }; + if (style) { + this.content.style = style.toJSON(); + } + } + + setBold(bold: boolean): this { + this.content.bold = bold; + return this; + } + + setMargin(margin: [number, number, number, number]): this { + this.content.margin = margin; + return this; + } + + + + setStyle(style: Style): this { + this.content.style = style.toJSON(); + return this; + } + + addText(text: string, style?: Style): this { + if (!Array.isArray(this.content.text)) { + let previousText = this.content.text; + let previousStyle = this.content.style ?? {}; + delete this.content.style; + this.content.text = [{ text: previousText, style: previousStyle }]; + } + + const fragment: ContentText = { text, ...(style ?? {}) }; + (this.content.text as ContentText[]).push(fragment); + + return this; + } + + toJSON(): ContentText { + return this.content; + } + } \ No newline at end of file diff --git a/packages/cfdi/designs/tsconfig.json b/packages/cfdi/designs/tsconfig.json new file mode 100644 index 0000000..1c6a17c --- /dev/null +++ b/packages/cfdi/designs/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "outDir": "dist", + "module": "ESNext", + "target": "ESNext", + "declaration": true, + "declarationDir": "dist", + "moduleResolution": "node", + "esModuleInterop": true, + "paths": { + "@cfdi/utils/*": [ + "./node_modules/@cfdi/utils/src", + "./node_modules/@cfdi/utils/src/*" + ], + "@cfdi/utils": [ + "./node_modules/@cfdi/utils/src" + ], + } + }, + "include": ["src"] + } + \ No newline at end of file diff --git a/packages/cfdi/designs/vite.config.ts b/packages/cfdi/designs/vite.config.ts new file mode 100644 index 0000000..ab07a91 --- /dev/null +++ b/packages/cfdi/designs/vite.config.ts @@ -0,0 +1,43 @@ +import { defineConfig } from "vite"; +import dts from "vite-plugin-dts"; +import terser from "@rollup/plugin-terser"; +import url from '@rollup/plugin-url'; + +export default defineConfig({ + build: { + //assetsInlineLimit: 0, + lib: { + entry: "src/index.ts", + formats: ["es", "cjs"], + fileName: (format) => `index.${format}.js`, + }, + rollupOptions: { + external: ['@cfdi/utils', 'pdfmake/build/pdfmake', 'pdfmake/interfaces', "pdfmake/build/vfs_fonts"], // Dependencias externas + plugins: [ + terser({ + compress: { + drop_console: true, // Elimina console.log + drop_debugger: true, // Elimina debugger + passes: 2, // Más agresivo + }, + mangle: { + properties: false, // Ofusca propiedades + keep_classnames: false, // No mantiene nombres de clases + keep_fnames: false, // No mantiene nombres de funciones + }, + format: { + comments: false, // Elimina comentarios + }, + }), + ], + }, + minify: "terser", + sourcemap: false, + target: "esnext", + }, + /* plugins: [ + dts({ + insertTypesEntry: true, + }) + ], */ +}); diff --git a/packages/cfdi/pdf/src/abstract-cfdi-pdf.ts b/packages/cfdi/pdf/src/abstract-cfdi-pdf.ts deleted file mode 100644 index a47a2bc..0000000 --- a/packages/cfdi/pdf/src/abstract-cfdi-pdf.ts +++ /dev/null @@ -1,183 +0,0 @@ -import * as Pd from 'pdfmake/build/pdfmake'; - -import { BufferOptions, TDocumentDefinitions } from 'pdfmake/interfaces'; -import { - CFDIComprobante, - XmlCdfi, - XmlConcepto, - XmlEmisor, - XmlEmisorAttribute, - XmlImpuestos, - XmlReceptor, -} from '@cfdi/xml'; -import { TCreatedPdf, createPdf } from 'pdfmake/build/pdfmake'; - -import { OptionsPdf } from './types'; -import { XmlTfd } from '@cfdi/complementos/types/complements/tfd/tfd.com'; -import { XmlToJson } from '@cfdi/2json'; -import path from 'path'; -// import PdfPrinter from 'pdfmake'; -// @ts-ignore -import pdfFonts from 'pdfmake/build/vfs_fonts'; -import pdfMake from 'pdfmake/build/pdfmake'; -import { writeFileSync } from 'fs'; - -pdfMake.vfs = pdfFonts.pdfMake.vfs; - -export abstract class RPDF { - public xml: XmlCdfi = {} as XmlCdfi; - public options: OptionsPdf; - public docDefinition: TDocumentDefinitions | any = {}; - public fonts = { - // Roboto: { - // normal: path.resolve(__dirname, '..', 'src', 'fonts', 'Roboto-Regular.ttf'), - // bold: path.resolve(__dirname, '..', 'src', 'fonts', 'Roboto-Regular.ttf'), - // italics: path.resolve(__dirname, '..', 'src', 'fonts', 'Roboto-Regular.ttf'), - // bolditalics: path.resolve(__dirname, '..', 'src', 'fonts', 'Roboto-Regular.ttf') - // }, - }; - constructor(xml: string, options: OptionsPdf = {} as OptionsPdf) { - // @ts-ignore - this.xml = XmlToJson(xml); - this.options = options; - } - setEskeleton(body: TDocumentDefinitions): void { - this.docDefinition = body; - } - protected abstract addLogo(): void; - protected abstract addFolio(c: CFDIComprobante): void; - protected abstract addEmisorData(emisor: XmlEmisorAttribute, expedido: string): void; - protected abstract addDate(date: string): void; - protected abstract addReceptor(receptor: XmlReceptor): void; - protected abstract fechaTimbrado(tfd: XmlTfd): void; - protected abstract addCatidad(comprobante: CFDIComprobante): void; - protected abstract addImpuesto(impuesto: XmlImpuestos): void; - protected abstract addNumberToLetter(total: number): void; - protected abstract addCSDEmisor(NoCertificado: string): void; - protected abstract addDetalles(detalles: XmlConcepto): void; - protected abstract addFormaDePago(forma: string): void; - protected abstract addMetodoDePago(metodo: string): void; - protected abstract addMoneda(moneda: string): void; - protected abstract addTipoComprobante(tipo: string): void; - protected abstract addCSDSat(tfd: XmlTfd): void; - protected abstract folioFiscal(tfd: XmlTfd): void; - protected abstract addSelloDgtEmisor(tfd: XmlTfd): void; - protected abstract addSelloDelSat(tfd: XmlTfd): void; - protected abstract addCadenaOriginal(tfd: XmlTfd): void; - protected abstract addQr( - tfd: XmlTfd, - emisor: XmlEmisor | undefined, - receptor: XmlReceptor | undefined, - total: string - ): void; - public async getDocument(): Promise { - /* if (this.xml.Comprobante.Emisor) { - this.addEmisorData( - this.xml.Comprobante.Emisor, - this.xml.Comprobante.LugarExpedicion - ); - } - await this.addLogo(); - this.addFolio(this.xml.Comprobante); - this.addDate(this.xml.Comprobante.Fecha); */ - // @ts-ignore - /*this.addReceptor(this.xml['cfdi:Comprobante']['cfdi:Receptor']); - this.addDetalles(this.xml['cfdi:Comprobante']['cfdi:Conceptos']); - this.addCatidad(this.xml['cfdi:Comprobante']._attributes); - // @ts-ignore - this.addImpuesto(this.xml['cfdi:Comprobante']['cfdi:Impuestos']); - this.addNumberToLetter(+this.xml['cfdi:Comprobante']._attributes.Total); - // @ts-ignore - this.addCSDEmisor(this.xml['cfdi:Comprobante']._attributes.NoCertificado); - // @ts-ignore - this.addFormaDePago(this.xml['cfdi:Comprobante']._attributes.FormaPago); - // @ts-ignore - this.addMetodoDePago(this.xml['cfdi:Comprobante']._attributes.MetodoPago); - // @ts-ignore - this.addMoneda(this.xml['cfdi:Comprobante']._attributes.Moneda); - // @ts-ignore - this.addTipoComprobante( - this.xml['cfdi:Comprobante']._attributes.TipoDeComprobante - ); - - if (this.xml['cfdi:Comprobante']!['cfdi:Complemento']) { - const complements = this.xml['cfdi:Comprobante']['cfdi:Complemento']; - if (complements['tfd:TimbreFiscalDigital']) { - const tfd = complements['tfd:TimbreFiscalDigital']; - this.fechaTimbrado(tfd); - this.addCSDSat(tfd); - this.folioFiscal(tfd); - this.addSelloDgtEmisor(tfd); - this.addSelloDelSat(tfd); - this.addCadenaOriginal(tfd); - await this.addQr( - tfd, - this.xml['cfdi:Comprobante']['cfdi:Emisor'], - this.xml['cfdi:Comprobante']['cfdi:Receptor'], - this.xml['cfdi:Comprobante']._attributes.Total as string - ); - } - } */ - const fo = { ...this.fonts, ...Pd.fonts, ...this.options.fonts }; - console.log(fo); - return createPdf(this.docDefinition); - } - - public async save(path: string, name: string) { - const dir = path + `${name.replace('.pdf', '')}.pdf`; - try { - const buffer = await this.getBuffer(); - writeFileSync(dir, buffer, { encoding: 'binary' }); - return { - save: true, - path: dir, - }; - } catch (e) { - return { - save: false, - error: e, - }; - } - } - - public async getBlob(options?: BufferOptions): Promise { - return new Promise(async (resolve) => { - const doc = await this.getDocument(); - doc!.getBlob((result) => { - resolve(result); - }, options); - }); - } - - public async getBase64(options?: BufferOptions): Promise { - return new Promise(async (resolve) => { - const doc = await this.getDocument(); - doc!.getBase64((result) => { - resolve(result); - }, options); - }); - } - - public async getBuffer(options?: BufferOptions): Promise { - return new Promise(async (resolve) => { - const doc = await this.getDocument(); - doc!.getBuffer((result) => { - resolve(result); - }, options); - }); - } - - public async getDataUrl(options?: BufferOptions): Promise { - return new Promise(async (resolve) => { - const doc = await this.getDocument(); - doc!.getDataUrl((result) => { - resolve(result); - }, options); - }); - } - - public async getStream(options?: BufferOptions) { - const doc = await this.getDocument(); - return doc!.getStream(options); - } -} diff --git a/packages/cfdi/pdf/src/templates/index.ts b/packages/cfdi/pdf/src/templates/index.ts deleted file mode 100644 index 61271f4..0000000 --- a/packages/cfdi/pdf/src/templates/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -/*export { A117 } from './A117'; - export { B123 } from './B123'; -export { B111 } from './B111' -export { B112 } from './B112'; -export { B222 } from './B222'; -export { A111 } from './A111'; -export { B333 } from './B333'; - */ \ No newline at end of file diff --git a/packages/cfdi/schema/.eslintrc.js b/packages/cfdi/schema/.eslintrc.js new file mode 100644 index 0000000..1c7b139 --- /dev/null +++ b/packages/cfdi/schema/.eslintrc.js @@ -0,0 +1,30 @@ +// This is a workaround for https://github.com/eslint/eslint/issues/3458 +require("@rushstack/eslint-config/patch/modern-module-resolution"); + +module.exports = { + extends: [ + "./node_modules/@recreando/eslint-settings/react", + ], + parserOptions: { tsconfigRootDir: __dirname, }, + rules: { + "no-unused-expressions": "off", + "sort-imports": "off", + "no-unused-vars": "off", + "import/no-cycle": "off", + "@typescript-eslint/no-unused-vars": ["error", { "varsIgnorePattern": "React" }], + "@typescript-eslint/no-unused-expressions": "off", + "@typescript-eslint/no-unsafe-assignment": "off", + "@typescript-eslint/no-unsafe-argument":"off", + "@typescript-eslint/await-thenable": "off", + "@typescript-eslint/no-misused-promises": "off", + "no-async-promise-executor":"off", + "noUnusedLocals": "off", + "no-unused-vars": "off", + "noUnusedParameters": "off", + "no-unused-variable":1, + "class-methods-use-this":"off", + "react/no-multi-comp": "off", + "guard-for-in": "off", + "no-restricted-syntax":"off" + }, +}; diff --git a/packages/cfdi/schema/.gitignore b/packages/cfdi/schema/.gitignore new file mode 100644 index 0000000..4c9d7c3 --- /dev/null +++ b/packages/cfdi/schema/.gitignore @@ -0,0 +1,4 @@ +*.log +.DS_Store +node_modules +dist diff --git a/packages/cfdi/schema/.npmignore b/packages/cfdi/schema/.npmignore new file mode 100644 index 0000000..956a745 --- /dev/null +++ b/packages/cfdi/schema/.npmignore @@ -0,0 +1,8 @@ +src +tsconfig.json +tslint.json +.prettierrc +test +resources +jest.config.js +.eslintrc.js diff --git a/packages/cfdi/schema/LICENSE b/packages/cfdi/schema/LICENSE new file mode 100644 index 0000000..5d5ce6d --- /dev/null +++ b/packages/cfdi/schema/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 MisaelMa + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/packages/cfdi/schema/README.md b/packages/cfdi/schema/README.md new file mode 100644 index 0000000..b3a2438 --- /dev/null +++ b/packages/cfdi/schema/README.md @@ -0,0 +1,15 @@ +utils +change this line in node_modules +xsd2jsonschema/src/converterDraft04.js + +534 this.addProperty(targetSchema, propertyName, oneOfSchema, minOccursAttr); + +534 this.addProperty(targetSchema, propertyName, customType, minOccursAttr); + + + + +497 // this.workingJsonSchema = this.namespaceManager.getType(nameAttr, jsonSchema, jsonSchema, xsd); +498 // jsonSchema.setSubSchema(nameAttr,jsonSchema); + +700 /xsd2jsonschema/src/jsonschema/jsonSchemaFile.js diff --git a/packages/cfdi/schema/jest.config.js b/packages/cfdi/schema/jest.config.js new file mode 100644 index 0000000..e9a29ce --- /dev/null +++ b/packages/cfdi/schema/jest.config.js @@ -0,0 +1,5 @@ +const baseConfig = require('@recreando/jest/jestConfig'); + +module.exports = { + ...baseConfig, +}; diff --git a/packages/cfdi/schema/package.json b/packages/cfdi/schema/package.json new file mode 100644 index 0000000..7a90b3b --- /dev/null +++ b/packages/cfdi/schema/package.json @@ -0,0 +1,97 @@ +{ + "name": "@cfdi/schema", + "version": "0.0.13", + "license": "MIT", + "main": "./dist/index.js", + "typings": "./dist/index.d.ts", + "module": "./dist/schema.esm.js", + "source": "./src/index.ts", + "files": [ + "dist" + ], + "engines": { + "node": ">=10" + }, + "scripts": { + "start": "tsdx watch", + "build": "echo 'Realizando build...'", + "test": "vitest", + "test:ci": "vitest run", + "test:coverage": "vitest --coverage run", + "test:ui": "vitest --ui", + "lint": "tsdx lint", + "prepare": "echo 'Realizando build...'", + "size": "size-limit", + "analyze": "size-limit --why" + }, + "husky": { + "hooks": { + "pre-commit": "tsdx lint" + } + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/", + "tag": "latest", + "access": "public" + }, + "repository": { + "type": "git", + "url": "https://github.com/MisaelMa/recreando" + }, + "prettier": { + "printWidth": 80, + "semi": true, + "singleQuote": true, + "trailingComma": "es5" + }, + "author": { + "name": "Amir Misael Marin Coh, Signati", + "email": "amisael.amir.misae@gmail.com, signatidev@gmail.com,", + "url": "" + }, + "size-limit": [ + { + "path": "dist/schema.cjs.production.min.js", + "limit": "10 KB" + }, + { + "path": "dist/schema.esm.js", + "limit": "10 KB" + } + ], + "dependencies": { + "xsd2jsonschema": "^0.3.7", + "xml-js": "^1.6.11", + "xslt-processor": "^0.11.7", + "ajv": "^8.12.0", + "xslt": "^0.9.1" + }, + "devDependencies": { + "@recreando/eslint-settings": "workspace:*", + "@recreando/jest": "workspace:*", + "@recreando/vite": "workspace:*", + "@recreando/typescript-settings": "workspace:*", + "@rushstack/eslint-config": "^4.0.2", + "@rushstack/heft": "^0.68.6", + "@size-limit/preset-small-lib": "^7.0.8", + "@testing-library/dom": "^8.19.0", + "@testing-library/jest-dom": "^5.16.1", + "@types/deep-freeze": "^0.1.2", + "@types/jest": "^27.5.0", + "@types/node": "^18.11.3", + "@types/testing-library__jest-dom": "^5.9.1", + "chalk": "^4.0.0", + "chokidar": "^3.5.2", + "eslint": "^8.57.0", + "husky": "^8.0.1", + "jest": "^28.1.2", + "size-limit": "^7.0.8", + "tsdx": "^0.14.1", + "tslib": "^2.4.0", + "typescript": "^5.6.3", + "vitest": "2.1.3", + "vite-tsconfig-paths": "~4.2.1", + "@vitest/coverage-v8": "2.1.3", + "@vitest/ui": "2.1.3" + } +} \ No newline at end of file diff --git a/packages/cfdi/schema/src/CatalogProcess.ts b/packages/cfdi/schema/src/CatalogProcess.ts new file mode 100644 index 0000000..a4b0faa --- /dev/null +++ b/packages/cfdi/schema/src/CatalogProcess.ts @@ -0,0 +1,43 @@ +import { ElementCompact, js2xml, xml2js } from 'xml-js'; + +import { readFileSync } from 'fs'; +import { Process } from './complementos/process'; + +export class Catalogs extends Process { + catalogPath: string = ''; + private static instance: Catalogs; + + public static of(): Catalogs { + if (!Catalogs.instance) { + Catalogs.instance = new Catalogs(); + } + return Catalogs.instance; + } + + async process() { + const xsd = await this.read(); + return { catalogos: xsd }; + } + + xsd(target: ElementCompact) { + const catalogos = target['xs:schema']['xs:simpleType'] as any[]; + this.removePropertiesCatalog(catalogos, [ + 'c_CodigoPostal', + 'c_ClaveProdServ', + 'c_ClaveUnidad', + 'c_Colonia', + ]); + return target; + } + + removePropertiesCatalog(catalogos: any[], properties: string[]) { + properties.forEach((property) => { + const index = catalogos.findIndex( + (ct) => ct._attributes.name === property + ); + if (index !== -1) { + catalogos[index]['xs:restriction']['xs:enumeration'] = []; + } + }); + } +} diff --git a/packages/cfdi/schema/src/CfdiProcess.ts b/packages/cfdi/schema/src/CfdiProcess.ts new file mode 100644 index 0000000..c3462e8 --- /dev/null +++ b/packages/cfdi/schema/src/CfdiProcess.ts @@ -0,0 +1,174 @@ +import { ElementCompact, js2xml, xml2js } from 'xml-js'; + +import { readFileSync } from 'fs'; + +export class CfdiProcess { + private static instance: CfdiProcess; + cfdiPath: string = ''; + public static of(): CfdiProcess { + if (!CfdiProcess.instance) { + CfdiProcess.instance = new CfdiProcess(); + } + return CfdiProcess.instance; + } + + setConfig(options: any) { + const { path } = options; + path && (this.cfdiPath = path); + // path && (this.catalogPath = path); + } + + async process() { + const targetXsd = this.readXsd(); + const xsd: any = []; + this.schemaWrap(targetXsd, xsd, null, 'comprobante', 'comprobante'); + + const comprobante = this.comprobante(targetXsd); + xsd.unshift({ + name: 'comprobante', + path: 'comprobante', + key: 'comprobante', + folder: 'comprobante', + xsd: comprobante, + }); + + return xsd.map((x: any) => ({ ...x, xsd: this.toXsd(x.xsd) })); + } + + schemaWrap( + xsd: Record, + base: any[] = [], + folder = null, + path = '', + key = '' + ) { + const schema = xsd['xs:schema']['xs:element']['xs:complexType'][ + 'xs:sequence' + ]['xs:element'] as Array; + const items = Array.isArray(schema) ? schema : [schema]; + + items.forEach((e) => { + const name = e?._attributes?.name || 'unknow'; + const newXsd = this.generateXsd( + e, + 'json', + folder || name, + path, + `${key}_${name}` + ); + const isOnlyAttribute = + !!newXsd.xsd['xs:schema']?.['xs:element']?.['xs:complexType']?.[ + 'xs:sequence' + ]; + + if (!isOnlyAttribute) { + base.push(newXsd); + } else { + const newXsdElement = { ...newXsd }; + + this.schemaWrap( + newXsdElement.xsd, + base, + folder || name, + `${path}_${name}` || name, + `${path}_${name}` + ); + delete newXsd.xsd['xs:schema']?.['xs:element']['xs:complexType'][ + 'xs:sequence' + ]; + + base.push(newXsd); + } + }); + } + + comprobante(xsd: Record) { + const comprobante = { ...xsd }; + delete comprobante['xs:schema']['xs:element']['xs:complexType'][ + 'xs:sequence' + ]; + return comprobante; + } + + readXsd() { + const xsd = readFileSync(this.cfdiPath, 'utf-8'); + var options = { compact: true, ignoreComment: true, alwaysChildren: true }; + return xml2js(xsd, options) as ElementCompact; + } + + generateSchemas(schemas: any[]) { + const schemasB: any = {}; + schemas.forEach((schema) => { + schemasB[schema.name] = schema.xsd; + }); + return schemasB; + } + + isOnlyAttribute(element: any) { + return ( + !!element?.['xs:complexType']['xs:attribute'] && + !element['xs:complexType']['xs:sequence'] + ); + } + + generateXsd( + element: any, + type: 'xsd' | 'json' = 'xsd', + folder: string, + path = '', + key = '' + ): any { + delete element?.['xs:annotation']; + + const name = element?._attributes?.name || 'unknow'; + + const newElement = { + 'xs:schema': { + _attributes: { + 'xmlns:cfdi': 'http://www.sat.gob.mx/cfd/4', + 'xmlns:xs': 'http://www.w3.org/2001/XMLSchema', + 'xmlns:catCFDI': 'http://www.sat.gob.mx/sitio_internet/cfd/catalogos', + 'xmlns:tdCFDI': + 'http://www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI', + targetNamespace: 'http://www.sat.gob.mx/cfd/4', + elementFormDefault: 'qualified', + attributeFormDefault: 'unqualified', + }, + 'xs:import': [ + { + _attributes: { + namespace: 'http://www.sat.gob.mx/sitio_internet/cfd/catalogos', + schemaLocation: + 'http://www.sat.gob.mx/sitio_internet/cfd/catalogos/catCFDI.xsd', + }, + }, + { + _attributes: { + namespace: + 'http://www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI', + schemaLocation: + 'http://www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI/tdCFDI.xsd', + }, + }, + ], + 'xs:element': element, + }, + }; + + return { + name, + folder, + path: path ? path : name, + key, + xsd: type === 'xsd' ? this.toXsd(newElement) : newElement, + }; + } + + toXsd(newElement: any) { + return js2xml(newElement, { + compact: true, + ignoreComment: true, + spaces: 4, + }); + } +} diff --git a/packages/cfdi/schema/src/common/const/structure.ts b/packages/cfdi/schema/src/common/const/structure.ts new file mode 100644 index 0000000..05a5302 --- /dev/null +++ b/packages/cfdi/schema/src/common/const/structure.ts @@ -0,0 +1,14 @@ +export const STRUCTURE: Record = { + tipoDatos: 'catalogos', + catalogos: 'catalogos', + InformacionGlobal: 'comprobante', + CfdiRelacionados: 'comprobante', + Emisor: 'comprobante', + Receptor: 'comprobante', + Impuestos: 'comprobante', + Complemento: 'comprobante', + Addenda: 'comprobante', + Comprobante: 'comprobante', + Conceptos: 'comprobante', + ine: 'complementos', +}; diff --git a/packages/cfdi/schema/src/complementos/complementos.process.ts b/packages/cfdi/schema/src/complementos/complementos.process.ts new file mode 100644 index 0000000..f83ecfb --- /dev/null +++ b/packages/cfdi/schema/src/complementos/complementos.process.ts @@ -0,0 +1,53 @@ +import { readFileSync } from 'fs'; +import { js2xml } from 'xml-js'; +import { Iedu } from './iedu.process'; +interface ComplementoData { + name: string; + path: string; +} +export class Complementos { + complementos: ComplementoData[] = []; + private static instance: Complementos; + + public static of(): Complementos { + if (!Complementos.instance) { + Complementos.instance = new Complementos(); + } + return Complementos.instance; + } + + setConfig(options: any) { + const { path } = options; + path && (this.complementos = path); + } + + async process() { + return this.getComplementos(); + } + + getComplementos() { + const xsd = this.complementos.map(async (c) => { + return { + name: c.name, + key: c.name, + folder: 'complementos', + type: 'complementos', + xsd: await this.createComplemento(c), + }; + }); + + return Promise.all(xsd); + } + + createComplemento(data: ComplementoData) { + switch (data.name) { + case 'iedu': + return Iedu.of().setConfig(data.path).process(); + case 'pago': + //return new PagoComplemento(data); + // Agrega más casos según sea necesario para otros tipos de complementos + default: + throw new Error(`Tipo de complemento desconocido: ${data.name}`); + } + } +} diff --git a/packages/cfdi/schema/src/complementos/iedu.process.ts b/packages/cfdi/schema/src/complementos/iedu.process.ts new file mode 100644 index 0000000..6d347ef --- /dev/null +++ b/packages/cfdi/schema/src/complementos/iedu.process.ts @@ -0,0 +1,28 @@ +import { readFileSync } from 'fs'; +import { Process } from './process'; +import { ElementCompact } from 'xml-js'; + +export class Iedu extends Process { + private static instance: Iedu; + + constructor() { + super(); + } + public static of(): Iedu { + if (!Iedu.instance) { + // ¡Usa la clase concreta aquí! + Iedu.instance = new Iedu(); + } + return Iedu.instance; + } + process() { + const xsd = this.read(); + return xsd; + } + + xsd(content: ElementCompact) { + console.log(content); + + return content; + } +} diff --git a/packages/cfdi/schema/src/complementos/process.ts b/packages/cfdi/schema/src/complementos/process.ts new file mode 100644 index 0000000..5e5ef70 --- /dev/null +++ b/packages/cfdi/schema/src/complementos/process.ts @@ -0,0 +1,28 @@ +import { readFileSync } from 'fs'; +import { ElementCompact, js2xml, xml2js } from 'xml-js'; + +export abstract class Process { + xsdPath: string = ''; + async read() { + const xsdContent = readFileSync(this.xsdPath, 'utf-8'); + const options = { + compact: true, + ignoreComment: true, + alwaysChildren: true, + }; + const xsd = xml2js(xsdContent, options) as ElementCompact; + const xsdCompact = await this.xsd(xsd); + return js2xml(xsdCompact, { + compact: true, + ignoreComment: true, + spaces: 4, + }); + } + + setConfig(path: string): this { + this.xsdPath = path; + return this; + } + + protected abstract xsd(xsd: ElementCompact): any; +} diff --git a/packages/cfdi/schema/src/files/catCFDI.xsd b/packages/cfdi/schema/src/files/catCFDI.xsd new file mode 100644 index 0000000..a531454 --- /dev/null +++ b/packages/cfdi/schema/src/files/catCFDI.xsd @@ -0,0 +1,162337 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/cfdi/schema/src/files/cfdv40.xsd b/packages/cfdi/schema/src/files/cfdv40.xsd new file mode 100644 index 0000000..9d51308 --- /dev/null +++ b/packages/cfdi/schema/src/files/cfdv40.xsd @@ -0,0 +1,850 @@ + + + + + + + Estándar de Comprobante Fiscal Digital por Internet. + + + + + + Nodo condicional para precisar la información relacionada con el comprobante global. + + + + + Atributo requerido para expresar el período al que corresponde la información del comprobante global. + + + + + Atributo requerido para expresar el mes o los meses al que corresponde la información del comprobante global. + + + + + Atributo requerido para expresar el año al que corresponde la información del comprobante global. + + + + + + + + + + + + + Nodo opcional para precisar la información de los comprobantes relacionados. + + + + + + Nodo requerido para precisar la información de los comprobantes relacionados. + + + + + Atributo requerido para registrar el folio fiscal (UUID) de un CFDI relacionado con el presente comprobante, por ejemplo: Si el CFDI relacionado es un comprobante de traslado que sirve para registrar el movimiento de la mercancía. Si este comprobante se usa como nota de crédito o nota de débito del comprobante relacionado. Si este comprobante es una devolución sobre el comprobante relacionado. Si éste sustituye a una factura cancelada. + + + + + + + + + + + + + + + Atributo requerido para indicar la clave de la relación que existe entre éste que se está generando y el o los CFDI previos. + + + + + + + Nodo requerido para expresar la información del contribuyente emisor del comprobante. + + + + + Atributo requerido para registrar la Clave del Registro Federal de Contribuyentes correspondiente al contribuyente emisor del comprobante. + + + + + Atributo requerido para registrar el nombre, denominación o razón social del contribuyente inscrito en el RFC, del emisor del comprobante. + + + + + + + + + + + + + Atributo requerido para incorporar la clave del régimen del contribuyente emisor al que aplicará el efecto fiscal de este comprobante. + + + + + Atributo condicional para expresar el número de operación proporcionado por el SAT cuando se trate de un comprobante a través de un PCECFDI o un PCGCFDISP. + + + + + + + + + + + + + + Nodo requerido para precisar la información del contribuyente receptor del comprobante. + + + + + Atributo requerido para registrar la Clave del Registro Federal de Contribuyentes correspondiente al contribuyente receptor del comprobante. + + + + + Atributo requerido para registrar el nombre(s), primer apellido, segundo apellido, según corresponda, denominación o razón social del contribuyente, inscrito en el RFC, del receptor del comprobante. + + + + + + + + + + + + + Atributo requerido para registrar el código postal del domicilio fiscal del receptor del comprobante. + + + + + + + + + + + + Atributo condicional para registrar la clave del país de residencia para efectos fiscales del receptor del comprobante, cuando se trate de un extranjero, y que es conforme con la especificación ISO 3166-1 alpha-3. Es requerido cuando se incluya el complemento de comercio exterior o se registre el atributo NumRegIdTrib. + + + + + Atributo condicional para expresar el número de registro de identidad fiscal del receptor cuando sea residente en el extranjero. Es requerido cuando se incluya el complemento de comercio exterior. + + + + + + + + + + + + Atributo requerido para incorporar la clave del régimen fiscal del contribuyente receptor al que aplicará el efecto fiscal de este comprobante. + + + + + Atributo requerido para expresar la clave del uso que dará a esta factura el receptor del CFDI. + + + + + + + Nodo requerido para listar los conceptos cubiertos por el comprobante. + + + + + + Nodo requerido para registrar la información detallada de un bien o servicio amparado en el comprobante. + + + + + + Nodo condicional para capturar los impuestos aplicables al presente concepto. + + + + + + Nodo opcional para asentar los impuestos trasladados aplicables al presente concepto. + + + + + + Nodo requerido para asentar la información detallada de un traslado de impuestos aplicable al presente concepto. + + + + + Atributo requerido para señalar la base para el cálculo del impuesto, la determinación de la base se realiza de acuerdo con las disposiciones fiscales vigentes. No se permiten valores negativos. + + + + + + + + + + + + Atributo requerido para señalar la clave del tipo de impuesto trasladado aplicable al concepto. + + + + + Atributo requerido para señalar la clave del tipo de factor que se aplica a la base del impuesto. + + + + + Atributo condicional para señalar el valor de la tasa o cuota del impuesto que se traslada para el presente concepto. Es requerido cuando el atributo TipoFactor tenga una clave que corresponda a Tasa o Cuota. + + + + + + + + + + + + Atributo condicional para señalar el importe del impuesto trasladado que aplica al concepto. No se permiten valores negativos. Es requerido cuando TipoFactor sea Tasa o Cuota. + + + + + + + + + + Nodo opcional para asentar los impuestos retenidos aplicables al presente concepto. + + + + + + Nodo requerido para asentar la información detallada de una retención de impuestos aplicable al presente concepto. + + + + + Atributo requerido para señalar la base para el cálculo de la retención, la determinación de la base se realiza de acuerdo con las disposiciones fiscales vigentes. No se permiten valores negativos. + + + + + + + + + + + + Atributo requerido para señalar la clave del tipo de impuesto retenido aplicable al concepto. + + + + + Atributo requerido para señalar la clave del tipo de factor que se aplica a la base del impuesto. + + + + + Atributo requerido para señalar la tasa o cuota del impuesto que se retiene para el presente concepto. + + + + + + + + + + + + Atributo requerido para señalar el importe del impuesto retenido que aplica al concepto. No se permiten valores negativos. + + + + + + + + + + + + + Nodo opcional para registrar información del contribuyente Tercero, a cuenta del que se realiza la operación. + + + + + Atributo requerido para registrar la Clave del Registro Federal de Contribuyentes del contribuyente Tercero, a cuenta del que se realiza la operación. + + + + + Atributo requerido para registrar el nombre, denominación o razón social del contribuyente Tercero correspondiente con el Rfc, a cuenta del que se realiza la operación. + + + + + + + + + + + + + Atributo requerido para incorporar la clave del régimen del contribuyente Tercero, a cuenta del que se realiza la operación. + + + + + Atributo requerido para incorporar el código postal del domicilio fiscal del Tercero, a cuenta del que se realiza la operación. + + + + + + + + + + + + + + Nodo opcional para introducir la información aduanera aplicable cuando se trate de ventas de primera mano de mercancías importadas o se trate de operaciones de comercio exterior con bienes o servicios. + + + + + Atributo requerido para expresar el número del pedimento que ampara la importación del bien que se expresa en el siguiente formato: últimos 2 dígitos del año de validación seguidos por dos espacios, 2 dígitos de la aduana de despacho seguidos por dos espacios, 4 dígitos del número de la patente seguidos por dos espacios, 1 dígito que corresponde al último dígito del año en curso, salvo que se trate de un pedimento consolidado iniciado en el año inmediato anterior o del pedimento original de una rectificación, seguido de 6 dígitos de la numeración progresiva por aduana. + + + + + + + + + + + + + Nodo opcional para asentar el número de cuenta predial con el que fue registrado el inmueble, en el sistema catastral de la entidad federativa de que trate, o bien para incorporar los datos de identificación del certificado de participación inmobiliaria no amortizable. + + + + + Atributo requerido para precisar el número de la cuenta predial del inmueble cubierto por el presente concepto, o bien para incorporar los datos de identificación del certificado de participación inmobiliaria no amortizable, tratándose de arrendamiento. + + + + + + + + + + + + + + + Nodo opcional donde se incluyen los nodos complementarios de extensión al concepto definidos por el SAT, de acuerdo con las disposiciones particulares para un sector o actividad específica. + + + + + + + + + + Nodo opcional para expresar las partes o componentes que integran la totalidad del concepto expresado en el comprobante fiscal digital por Internet. + + + + + + Nodo opcional para introducir la información aduanera aplicable cuando se trate de ventas de primera mano de mercancías importadas o se trate de operaciones de comercio exterior con bienes o servicios. + + + + + Atributo requerido para expresar el número del pedimento que ampara la importación del bien que se expresa en el siguiente formato: últimos 2 dígitos del año de validación seguidos por dos espacios, 2 dígitos de la aduana de despacho seguidos por dos espacios, 4 dígitos del número de la patente seguidos por dos espacios, 1 dígito que corresponde al último dígito del año en curso, salvo que se trate de un pedimento consolidado iniciado en el año inmediato anterior o del pedimento original de una rectificación, seguido de 6 dígitos de la numeración progresiva por aduana. + + + + + + + + + + + + + + Atributo requerido para expresar la clave del producto o del servicio amparado por la presente parte. Es requerido y deben utilizar las claves del catálogo de productos y servicios, cuando los conceptos que registren por sus actividades correspondan con dichos conceptos. + + + + + Atributo opcional para expresar el número de serie, número de parte del bien o identificador del producto o del servicio amparado por la presente parte. Opcionalmente se puede utilizar claves del estándar GTIN. + + + + + + + + + + + + + Atributo requerido para precisar la cantidad de bienes o servicios del tipo particular definido por la presente parte. + + + + + + + + + + + + Atributo opcional para precisar la unidad de medida propia de la operación del emisor, aplicable para la cantidad expresada en la parte. La unidad debe corresponder con la descripción de la parte. + + + + + + + + + + + + + Atributo requerido para precisar la descripción del bien o servicio cubierto por la presente parte. + + + + + + + + + + + + + Atributo opcional para precisar el valor o precio unitario del bien o servicio cubierto por la presente parte. No se permiten valores negativos. + + + + + Atributo opcional para precisar el importe total de los bienes o servicios de la presente parte. Debe ser equivalente al resultado de multiplicar la cantidad por el valor unitario expresado en la parte. No se permiten valores negativos. + + + + + + + + Atributo requerido para expresar la clave del producto o del servicio amparado por el presente concepto. Es requerido y deben utilizar las claves del catálogo de productos y servicios, cuando los conceptos que registren por sus actividades correspondan con dichos conceptos. + + + + + Atributo opcional para expresar el número de parte, identificador del producto o del servicio, la clave de producto o servicio, SKU o equivalente, propia de la operación del emisor, amparado por el presente concepto. Opcionalmente se puede utilizar claves del estándar GTIN. + + + + + + + + + + + + + Atributo requerido para precisar la cantidad de bienes o servicios del tipo particular definido por el presente concepto. + + + + + + + + + + + + Atributo requerido para precisar la clave de unidad de medida estandarizada aplicable para la cantidad expresada en el concepto. La unidad debe corresponder con la descripción del concepto. + + + + + Atributo opcional para precisar la unidad de medida propia de la operación del emisor, aplicable para la cantidad expresada en el concepto. La unidad debe corresponder con la descripción del concepto. + + + + + + + + + + + + + Atributo requerido para precisar la descripción del bien o servicio cubierto por el presente concepto. + + + + + + + + + + + + + Atributo requerido para precisar el valor o precio unitario del bien o servicio cubierto por el presente concepto. + + + + + Atributo requerido para precisar el importe total de los bienes o servicios del presente concepto. Debe ser equivalente al resultado de multiplicar la cantidad por el valor unitario expresado en el concepto. No se permiten valores negativos. + + + + + Atributo opcional para representar el importe de los descuentos aplicables al concepto. No se permiten valores negativos. + + + + + Atributo requerido para expresar si la operación comercial es objeto o no de impuesto. + + + + + + + + + + Nodo condicional para expresar el resumen de los impuestos aplicables. + + + + + + Nodo condicional para capturar los impuestos retenidos aplicables. Es requerido cuando en los conceptos se registre algún impuesto retenido. + + + + + + Nodo requerido para la información detallada de una retención de impuesto específico. + + + + + Atributo requerido para señalar la clave del tipo de impuesto retenido. + + + + + Atributo requerido para señalar el monto del impuesto retenido. No se permiten valores negativos. + + + + + + + + + + Nodo condicional para capturar los impuestos trasladados aplicables. Es requerido cuando en los conceptos se registre un impuesto trasladado. + + + + + + Nodo requerido para la información detallada de un traslado de impuesto específico. + + + + + Atributo requerido para señalar la suma de los atributos Base de los conceptos del impuesto trasladado. No se permiten valores negativos. + + + + + Atributo requerido para señalar la clave del tipo de impuesto trasladado. + + + + + Atributo requerido para señalar la clave del tipo de factor que se aplica a la base del impuesto. + + + + + Atributo condicional para señalar el valor de la tasa o cuota del impuesto que se traslada por los conceptos amparados en el comprobante. + + + + + + + + + + + + Atributo condicional para señalar la suma del importe del impuesto trasladado, agrupado por impuesto, TipoFactor y TasaOCuota. No se permiten valores negativos. + + + + + + + + + + + Atributo condicional para expresar el total de los impuestos retenidos que se desprenden de los conceptos expresados en el comprobante fiscal digital por Internet. No se permiten valores negativos. Es requerido cuando en los conceptos se registren impuestos retenidos. + + + + + Atributo condicional para expresar el total de los impuestos trasladados que se desprenden de los conceptos expresados en el comprobante fiscal digital por Internet. No se permiten valores negativos. Es requerido cuando en los conceptos se registren impuestos trasladados. + + + + + + + Nodo opcional donde se incluye el complemento Timbre Fiscal Digital de manera obligatoria y los nodos complementarios determinados por el SAT, de acuerdo con las disposiciones particulares para un sector o actividad específica. + + + + + + + + + + Nodo opcional para recibir las extensiones al presente formato que sean de utilidad al contribuyente. Para las reglas de uso del mismo, referirse al formato origen. + + + + + + + + + + + Atributo requerido con valor prefijado a 4.0 que indica la versión del estándar bajo el que se encuentra expresado el comprobante. + + + + + + + + + + Atributo opcional para precisar la serie para control interno del contribuyente. Este atributo acepta una cadena de caracteres. + + + + + + + + + + + + + Atributo opcional para control interno del contribuyente que expresa el folio del comprobante, acepta una cadena de caracteres. + + + + + + + + + + + + + Atributo requerido para la expresión de la fecha y hora de expedición del Comprobante Fiscal Digital por Internet. Se expresa en la forma AAAA-MM-DDThh:mm:ss y debe corresponder con la hora local donde se expide el comprobante. + + + + + Atributo requerido para contener el sello digital del comprobante fiscal, al que hacen referencia las reglas de resolución miscelánea vigente. El sello debe ser expresado como una cadena de texto en formato Base 64. + + + + + + + + + + Atributo condicional para expresar la clave de la forma de pago de los bienes o servicios amparados por el comprobante. + + + + + Atributo requerido para expresar el número de serie del certificado de sello digital que ampara al comprobante, de acuerdo con el acuse correspondiente a 20 posiciones otorgado por el sistema del SAT. + + + + + + + + + + + + Atributo requerido que sirve para incorporar el certificado de sello digital que ampara al comprobante, como texto en formato base 64. + + + + + + + + + + Atributo condicional para expresar las condiciones comerciales aplicables para el pago del comprobante fiscal digital por Internet. Este atributo puede ser condicionado mediante atributos o complementos. + + + + + + + + + + + + + Atributo requerido para representar la suma de los importes de los conceptos antes de descuentos e impuesto. No se permiten valores negativos. + + + + + Atributo condicional para representar el importe total de los descuentos aplicables antes de impuestos. No se permiten valores negativos. Se debe registrar cuando existan conceptos con descuento. + + + + + Atributo requerido para identificar la clave de la moneda utilizada para expresar los montos, cuando se usa moneda nacional se registra MXN. Conforme con la especificación ISO 4217. + + + + + Atributo condicional para representar el tipo de cambio FIX conforme con la moneda usada. Es requerido cuando la clave de moneda es distinta de MXN y de XXX. El valor debe reflejar el número de pesos mexicanos que equivalen a una unidad de la divisa señalada en el atributo moneda. Si el valor está fuera del porcentaje aplicable a la moneda tomado del catálogo c_Moneda, el emisor debe obtener del PAC que vaya a timbrar el CFDI, de manera no automática, una clave de confirmación para ratificar que el valor es correcto e integrar dicha clave en el atributo Confirmacion. + + + + + + + + + + + + Atributo requerido para representar la suma del subtotal, menos los descuentos aplicables, más las contribuciones recibidas (impuestos trasladados - federales y/o locales, derechos, productos, aprovechamientos, aportaciones de seguridad social, contribuciones de mejoras) menos los impuestos retenidos federales y/o locales. Si el valor es superior al límite que establezca el SAT en la Resolución Miscelánea Fiscal vigente, el emisor debe obtener del PAC que vaya a timbrar el CFDI, de manera no automática, una clave de confirmación para ratificar que el valor es correcto e integrar dicha clave en el atributo Confirmacion. No se permiten valores negativos. + + + + + Atributo requerido para expresar la clave del efecto del comprobante fiscal para el contribuyente emisor. + + + + + Atributo requerido para expresar si el comprobante ampara una operación de exportación. + + + + + Atributo condicional para precisar la clave del método de pago que aplica para este comprobante fiscal digital por Internet, conforme al Artículo 29-A fracción VII incisos a y b del CFF. + + + + + Atributo requerido para incorporar el código postal del lugar de expedición del comprobante (domicilio de la matriz o de la sucursal). + + + + + Atributo condicional para registrar la clave de confirmación que entregue el PAC para expedir el comprobante con importes grandes, con un tipo de cambio fuera del rango establecido o con ambos casos. Es requerido cuando se registra un tipo de cambio o un total fuera del rango establecido. + + + + + + + + + + + + diff --git a/packages/cfdi/schema/src/files/complementos/iedu.xsd b/packages/cfdi/schema/src/files/complementos/iedu.xsd new file mode 100644 index 0000000..32bdf24 --- /dev/null +++ b/packages/cfdi/schema/src/files/complementos/iedu.xsd @@ -0,0 +1,69 @@ + + + + + + Atributo requerido con valor prefijado a 1.0 que indica la versión del estándar bajo el que se encuentra expresado el complemento concepto al comprobante. + + + + + + + + + + Atributo requerido para indicar el nombre del Alumno + + + + + + + + + + + + + + + + + Atributo requerido para indicar el nivel educativo que cursa el alumno + + + + + + + + + + + + + + Atributo requerido para especificar la clave del centro de trabajo o el reconocimiento de validez oficial de estudios en los términos de la Ley General de Educación que tenga la institución educativa privada donde se realiza el pago. + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/cfdi/schema/src/files/complementos/iedu.xslt b/packages/cfdi/schema/src/files/complementos/iedu.xslt new file mode 100644 index 0000000..63ee02f --- /dev/null +++ b/packages/cfdi/schema/src/files/complementos/iedu.xslt @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/cfdi/schema/src/files/complementos/iedu2.xsd b/packages/cfdi/schema/src/files/complementos/iedu2.xsd new file mode 100644 index 0000000..16f867d --- /dev/null +++ b/packages/cfdi/schema/src/files/complementos/iedu2.xsd @@ -0,0 +1,84 @@ + + + + + Complemento concepto para la expedición de comprobantes fiscales por parte de Instituciones Educativas Privadas, para los efectos del artículo primero y cuarto del decreto por el que se otorga un estímulo fiscal a las personas físicas en relación con los pagos por servicios educativos + + + + + Atributo requerido con valor prefijado a 1.0 que indica la versión del estándar bajo el que se encuentra expresado el complemento concepto al comprobante. + + + + + + + + + + Atributo requerido para indicar el nombre del Alumno + + + + + + + + Atributo requerido para indicar la CURP del alumno de la institución educativa + + + + + Atributo requerido para indicar el nivel educativo que cursa el alumno + + + + + + + + + + + + + + Atributo requerido para especificar la clave del centro de trabajo o el reconocimiento de validez oficial de estudios en los términos de la Ley General de Educación que tenga la institución educativa privada donde se realiza el pago. + + + + + + + + + + + Atributo opcional para indicar el RFC de quien realiza el pago cuando sea diferente a quien recibe el servicio + + + + + + + Tipo definido para la expresión de RFC's de contribuyentes. Cabe hacer la mención que debido a las reglas definidas por el estándar XML en el caso de que un RFC dado incluya un caracter ampersand, dicho caracter deberá ser expresado mediante la secuencia de escape especificado como parte del estándar. En la definición del tipo se expresa una longitud mínima y máxima, sin embargo la longitud puede ser redefinida como una extensión según se determina el uso particular + + + + + + + + + + + Tipo definido para la expresión de una CURP. + + + + + + + + diff --git a/packages/cfdi/schema/src/files/schema/catalogos/catalogos.json b/packages/cfdi/schema/src/files/schema/catalogos/catalogos.json new file mode 100644 index 0000000..9af11b8 --- /dev/null +++ b/packages/cfdi/schema/src/files/schema/catalogos/catalogos.json @@ -0,0 +1,1566 @@ +{ + "$id": "catalogos.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "This JSON Schema file was generated from catalogos on Tue Dec 26 2023 19:00:38 GMT-0500 (Eastern Standard Time). For more information please see http://www.xsd2jsonschema.org", + "description": "Schema tag attributes: xmlns:catCFDI='http://www.sat.gob.mx/sitio_internet/cfd/catalogos' xmlns:xs='http://www.w3.org/2001/XMLSchema' targetNamespace='http://www.sat.gob.mx/sitio_internet/cfd/catalogos' elementFormDefault='unqualified' attributeFormDefault='unqualified'", + "properties": { + "c_FormaPago": { + "$ref": "#/definitions/c_FormaPago" + }, + "c_Moneda": { + "$ref": "#/definitions/c_Moneda" + }, + "c_TipoDeComprobante": { + "$ref": "#/definitions/c_TipoDeComprobante" + }, + "c_Exportacion": { + "$ref": "#/definitions/c_Exportacion" + }, + "c_MetodoPago": { + "$ref": "#/definitions/c_MetodoPago" + }, + "c_CodigoPostal": { + "$ref": "#/definitions/c_CodigoPostal" + }, + "c_Periodicidad": { + "$ref": "#/definitions/c_Periodicidad" + }, + "c_Meses": { + "$ref": "#/definitions/c_Meses" + }, + "c_TipoRelacion": { + "$ref": "#/definitions/c_TipoRelacion" + }, + "c_RegimenFiscal": { + "$ref": "#/definitions/c_RegimenFiscal" + }, + "c_Pais": { + "$ref": "#/definitions/c_Pais" + }, + "c_UsoCFDI": { + "$ref": "#/definitions/c_UsoCFDI" + }, + "c_ClaveProdServ": { + "$ref": "#/definitions/c_ClaveProdServ" + }, + "c_ClaveUnidad": { + "$ref": "#/definitions/c_ClaveUnidad" + }, + "c_ObjetoImp": { + "$ref": "#/definitions/c_ObjetoImp" + }, + "c_Impuesto": { + "$ref": "#/definitions/c_Impuesto" + }, + "c_TipoFactor": { + "$ref": "#/definitions/c_TipoFactor" + }, + "c_Estado": { + "$ref": "#/definitions/c_Estado" + }, + "c_Colonia": { + "$ref": "#/definitions/c_Colonia" + }, + "c_Localidad": { + "$ref": "#/definitions/c_Localidad" + }, + "c_Municipio": { + "$ref": "#/definitions/c_Municipio" + } + }, + "type": "object", + "anyOf": [ + { + "required": [ + "c_FormaPago" + ] + }, + { + "required": [ + "c_Moneda" + ] + }, + { + "required": [ + "c_TipoDeComprobante" + ] + }, + { + "required": [ + "c_Exportacion" + ] + }, + { + "required": [ + "c_MetodoPago" + ] + }, + { + "required": [ + "c_CodigoPostal" + ] + }, + { + "required": [ + "c_Periodicidad" + ] + }, + { + "required": [ + "c_Meses" + ] + }, + { + "required": [ + "c_TipoRelacion" + ] + }, + { + "required": [ + "c_RegimenFiscal" + ] + }, + { + "required": [ + "c_Pais" + ] + }, + { + "required": [ + "c_UsoCFDI" + ] + }, + { + "required": [ + "c_ClaveProdServ" + ] + }, + { + "required": [ + "c_ClaveUnidad" + ] + }, + { + "required": [ + "c_ObjetoImp" + ] + }, + { + "required": [ + "c_Impuesto" + ] + }, + { + "required": [ + "c_TipoFactor" + ] + }, + { + "required": [ + "c_Estado" + ] + }, + { + "required": [ + "c_Colonia" + ] + }, + { + "required": [ + "c_Localidad" + ] + }, + { + "required": [ + "c_Municipio" + ] + } + ], + "definitions": { + "c_FormaPago": { + "enum": [ + "01", + "02", + "03", + "04", + "05", + "06", + "08", + "12", + "13", + "14", + "15", + "17", + "23", + "24", + "25", + "26", + "27", + "28", + "29", + "30", + "31", + "99" + ], + "type": "string" + }, + "c_Moneda": { + "enum": [ + "AED", + "AFN", + "ALL", + "AMD", + "ANG", + "AOA", + "ARS", + "AUD", + "AWG", + "AZN", + "BAM", + "BBD", + "BDT", + "BGN", + "BHD", + "BIF", + "BMD", + "BND", + "BOB", + "BOV", + "BRL", + "BSD", + "BTN", + "BWP", + "BYR", + "BZD", + "CAD", + "CDF", + "CHE", + "CHF", + "CHW", + "CLF", + "CLP", + "CNH", + "CNY", + "COP", + "COU", + "CRC", + "CUC", + "CUP", + "CVE", + "CZK", + "DJF", + "DKK", + "DOP", + "DZD", + "EGP", + "ERN", + "ESD", + "ETB", + "EUR", + "FJD", + "FKP", + "GBP", + "GEL", + "GHS", + "GIP", + "GMD", + "GNF", + "GTQ", + "GYD", + "HKD", + "HNL", + "HRK", + "HTG", + "HUF", + "IDR", + "ILS", + "INR", + "IQD", + "IRR", + "ISK", + "JMD", + "JOD", + "JPY", + "KES", + "KGS", + "KHR", + "KMF", + "KPW", + "KRW", + "KWD", + "KYD", + "KZT", + "LAK", + "LBP", + "LKR", + "LRD", + "LSL", + "LYD", + "MAD", + "MDL", + "MGA", + "MKD", + "MMK", + "MNT", + "MOP", + "MRO", + "MUR", + "MVR", + "MWK", + "MXN", + "MXV", + "MYR", + "MZN", + "NAD", + "NGN", + "NIC", + "NIO", + "NOK", + "NPR", + "NZD", + "OMR", + "PAB", + "PEN", + "PGK", + "PHP", + "PKR", + "PLN", + "PYG", + "QAR", + "RON", + "RSD", + "RUB", + "RWF", + "SAR", + "SBD", + "SCR", + "SDG", + "SEK", + "SGD", + "SHP", + "SLL", + "SOS", + "SRD", + "SSP", + "STD", + "SVC", + "SYP", + "SZL", + "THB", + "TJS", + "TMT", + "TND", + "TOP", + "TRY", + "TTD", + "TWD", + "TZS", + "UAH", + "UGX", + "USD", + "USN", + "UYI", + "UYP", + "UYU", + "UZS", + "VEF", + "VES", + "VND", + "VUV", + "WST", + "XAF", + "XAG", + "XAU", + "XBA", + "XBB", + "XBC", + "XBD", + "XCD", + "XDR", + "XOF", + "XPD", + "XPF", + "XPT", + "XSU", + "XTS", + "XUA", + "XXX", + "YER", + "ZAR", + "ZMW", + "ZWL" + ], + "type": "string" + }, + "c_TipoDeComprobante": { + "enum": [ + "I", + "E", + "T", + "N", + "P" + ], + "type": "string" + }, + "c_Exportacion": { + "enum": [ + "01", + "02", + "03", + "04" + ], + "type": "string" + }, + "c_MetodoPago": { + "enum": [ + "PUE", + "PPD" + ], + "type": "string" + }, + "c_CodigoPostal": { + "type": "string" + }, + "c_Periodicidad": { + "enum": [ + "01", + "02", + "03", + "04", + "05" + ], + "type": "string" + }, + "c_Meses": { + "enum": [ + "01", + "02", + "03", + "04", + "05", + "06", + "07", + "08", + "09", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18" + ], + "type": "string" + }, + "c_TipoRelacion": { + "enum": [ + "01", + "02", + "03", + "04", + "05", + "06", + "07", + "08", + "09" + ], + "type": "string" + }, + "c_RegimenFiscal": { + "enum": [ + "601", + "603", + "605", + "606", + "607", + "608", + "609", + "610", + "611", + "612", + "614", + "615", + "616", + "620", + "621", + "622", + "623", + "624", + "625", + "626", + "628", + "629", + "630" + ], + "type": "string" + }, + "c_Pais": { + "enum": [ + "AFG", + "ALA", + "ALB", + "DEU", + "AND", + "AGO", + "AIA", + "ATA", + "ATG", + "SAU", + "DZA", + "ARG", + "ARM", + "ABW", + "AUS", + "AUT", + "AZE", + "BHS", + "BGD", + "BRB", + "BHR", + "BEL", + "BLZ", + "BEN", + "BMU", + "BLR", + "MMR", + "BOL", + "BIH", + "BWA", + "BRA", + "BRN", + "BGR", + "BFA", + "BDI", + "BTN", + "CPV", + "KHM", + "CMR", + "CAN", + "QAT", + "BES", + "TCD", + "CHL", + "CHN", + "CYP", + "COL", + "COM", + "PRK", + "KOR", + "CIV", + "CRI", + "HRV", + "CUB", + "CUW", + "DNK", + "DMA", + "ECU", + "EGY", + "SLV", + "ARE", + "ERI", + "SVK", + "SVN", + "ESP", + "USA", + "EST", + "ETH", + "PHL", + "FIN", + "FJI", + "FRA", + "GAB", + "GMB", + "GEO", + "GHA", + "GIB", + "GRD", + "GRC", + "GRL", + "GLP", + "GUM", + "GTM", + "GUF", + "GGY", + "GIN", + "GNB", + "GNQ", + "GUY", + "HTI", + "HND", + "HKG", + "HUN", + "IND", + "IDN", + "IRQ", + "IRN", + "IRL", + "BVT", + "IMN", + "CXR", + "NFK", + "ISL", + "CYM", + "CCK", + "COK", + "FRO", + "SGS", + "HMD", + "FLK", + "MNP", + "MHL", + "PCN", + "SLB", + "TCA", + "UMI", + "VGB", + "VIR", + "ISR", + "ITA", + "JAM", + "JPN", + "JEY", + "JOR", + "KAZ", + "KEN", + "KGZ", + "KIR", + "KWT", + "LAO", + "LSO", + "LVA", + "LBN", + "LBR", + "LBY", + "LIE", + "LTU", + "LUX", + "MAC", + "MDG", + "MYS", + "MWI", + "MDV", + "MLI", + "MLT", + "MAR", + "MTQ", + "MUS", + "MRT", + "MYT", + "MEX", + "FSM", + "MDA", + "MCO", + "MNG", + "MNE", + "MSR", + "MOZ", + "NAM", + "NRU", + "NPL", + "NIC", + "NER", + "NGA", + "NIU", + "NOR", + "NCL", + "NZL", + "OMN", + "NLD", + "PAK", + "PLW", + "PSE", + "PAN", + "PNG", + "PRY", + "PER", + "PYF", + "POL", + "PRT", + "PRI", + "GBR", + "CAF", + "CZE", + "MKD", + "COG", + "COD", + "DOM", + "REU", + "RWA", + "ROU", + "RUS", + "ESH", + "WSM", + "ASM", + "BLM", + "KNA", + "SMR", + "MAF", + "SPM", + "VCT", + "SHN", + "LCA", + "STP", + "SEN", + "SRB", + "SYC", + "SLE", + "SGP", + "SXM", + "SYR", + "SOM", + "LKA", + "SWZ", + "ZAF", + "SDN", + "SSD", + "SWE", + "CHE", + "SUR", + "SJM", + "THA", + "TWN", + "TZA", + "TJK", + "IOT", + "ATF", + "TLS", + "TGO", + "TKL", + "TON", + "TTO", + "TUN", + "TKM", + "TUR", + "TUV", + "UKR", + "UGA", + "URY", + "UZB", + "VUT", + "VAT", + "VEN", + "VNM", + "WLF", + "YEM", + "DJI", + "ZMB", + "ZWE", + "ZZZ" + ], + "type": "string" + }, + "c_UsoCFDI": { + "enum": [ + "G01", + "G02", + "G03", + "I01", + "I02", + "I03", + "I04", + "I05", + "I06", + "I07", + "I08", + "D01", + "D02", + "D03", + "D04", + "D05", + "D06", + "D07", + "D08", + "D09", + "D10", + "P01", + "S01", + "CP01", + "CN01" + ], + "type": "string" + }, + "c_ClaveProdServ": { + "type": "string" + }, + "c_ClaveUnidad": { + "type": "string" + }, + "c_ObjetoImp": { + "enum": [ + "01", + "02", + "03", + "04" + ], + "type": "string" + }, + "c_Impuesto": { + "enum": [ + "001", + "002", + "003" + ], + "type": "string" + }, + "c_TipoFactor": { + "enum": [ + "Tasa", + "Cuota", + "Exento" + ], + "type": "string" + }, + "c_Estado": { + "enum": [ + "AGU", + "BCN", + "BCS", + "CAM", + "CHP", + "CHH", + "COA", + "COL", + "DIF", + "CMX", + "DUR", + "GUA", + "GRO", + "HID", + "JAL", + "MEX", + "MIC", + "MOR", + "NAY", + "NLE", + "OAX", + "PUE", + "QUE", + "ROO", + "SLP", + "SIN", + "SON", + "TAB", + "TAM", + "TLA", + "VER", + "YUC", + "ZAC", + "AL", + "AK", + "AZ", + "AR", + "CA", + "NC", + "SC", + "CO", + "CT", + "ND", + "SD", + "DE", + "FL", + "GA", + "HI", + "ID", + "IL", + "IN", + "IA", + "KS", + "KY", + "LA", + "ME", + "MD", + "MA", + "MI", + "MN", + "MS", + "MO", + "MT", + "NE", + "NV", + "NJ", + "NY", + "NH", + "NM", + "OH", + "OK", + "OR", + "PA", + "RI", + "TN", + "TX", + "UT", + "VT", + "VA", + "WV", + "WA", + "WI", + "WY", + "ON", + "QC", + "NS", + "NB", + "MB", + "BC", + "PE", + "SK", + "AB", + "NL", + "NT", + "YT", + "UN" + ], + "type": "string" + }, + "c_Colonia": { + "type": "string" + }, + "c_Localidad": { + "enum": [ + "01", + "02", + "03", + "04", + "05", + "06", + "07", + "08", + "09", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24", + "25", + "26", + "27", + "28", + "29", + "30", + "31", + "32", + "33", + "34", + "35", + "36", + "37", + "38", + "39", + "40", + "41", + "42", + "43", + "44", + "45", + "46", + "47", + "48", + "49", + "50", + "51", + "52", + "53", + "54", + "55", + "56", + "57", + "58", + "59", + "60", + "61", + "62", + "66", + "67", + "68", + "69" + ], + "type": "string" + }, + "c_Municipio": { + "enum": [ + "001", + "002", + "003", + "004", + "005", + "006", + "007", + "008", + "009", + "010", + "011", + "012", + "013", + "014", + "015", + "016", + "017", + "018", + "019", + "020", + "021", + "022", + "023", + "024", + "025", + "026", + "027", + "028", + "029", + "030", + "031", + "032", + "033", + "034", + "035", + "036", + "037", + "038", + "039", + "040", + "041", + "042", + "043", + "044", + "045", + "046", + "047", + "048", + "049", + "050", + "051", + "052", + "053", + "054", + "055", + "056", + "057", + "058", + "059", + "060", + "061", + "062", + "063", + "064", + "065", + "066", + "067", + "068", + "069", + "070", + "071", + "072", + "073", + "074", + "075", + "076", + "077", + "078", + "079", + "080", + "081", + "082", + "083", + "084", + "085", + "086", + "087", + "088", + "089", + "090", + "091", + "092", + "093", + "094", + "095", + "096", + "097", + "098", + "099", + "100", + "101", + "102", + "103", + "104", + "105", + "106", + "107", + "108", + "109", + "110", + "111", + "112", + "113", + "114", + "115", + "116", + "117", + "118", + "119", + "120", + "121", + "122", + "123", + "124", + "125", + "126", + "127", + "128", + "129", + "130", + "131", + "132", + "133", + "134", + "135", + "136", + "137", + "138", + "139", + "140", + "141", + "142", + "143", + "144", + "145", + "146", + "147", + "148", + "149", + "150", + "151", + "152", + "153", + "154", + "155", + "156", + "157", + "158", + "159", + "160", + "161", + "162", + "163", + "164", + "165", + "166", + "167", + "168", + "169", + "170", + "171", + "172", + "173", + "174", + "175", + "176", + "177", + "178", + "179", + "180", + "181", + "182", + "183", + "184", + "185", + "186", + "187", + "188", + "189", + "190", + "191", + "192", + "193", + "194", + "195", + "196", + "197", + "198", + "199", + "200", + "201", + "202", + "203", + "204", + "205", + "206", + "207", + "208", + "209", + "210", + "211", + "212", + "213", + "214", + "215", + "216", + "217", + "218", + "219", + "220", + "221", + "222", + "223", + "224", + "225", + "226", + "227", + "228", + "229", + "230", + "231", + "232", + "233", + "234", + "235", + "236", + "237", + "238", + "239", + "240", + "241", + "242", + "243", + "244", + "245", + "246", + "247", + "248", + "249", + "250", + "251", + "252", + "253", + "254", + "255", + "256", + "257", + "258", + "259", + "260", + "261", + "262", + "263", + "264", + "265", + "266", + "267", + "268", + "269", + "270", + "271", + "272", + "273", + "274", + "275", + "276", + "277", + "278", + "279", + "280", + "281", + "282", + "283", + "284", + "285", + "286", + "287", + "288", + "289", + "290", + "291", + "292", + "293", + "294", + "295", + "296", + "297", + "298", + "299", + "300", + "301", + "302", + "303", + "304", + "305", + "306", + "307", + "308", + "309", + "310", + "311", + "312", + "313", + "314", + "315", + "316", + "317", + "318", + "319", + "320", + "321", + "322", + "323", + "324", + "325", + "326", + "327", + "328", + "329", + "330", + "331", + "332", + "333", + "334", + "335", + "336", + "337", + "338", + "339", + "340", + "341", + "342", + "343", + "344", + "345", + "346", + "347", + "348", + "349", + "350", + "351", + "352", + "353", + "354", + "355", + "356", + "357", + "358", + "359", + "360", + "361", + "362", + "363", + "364", + "365", + "366", + "367", + "368", + "369", + "370", + "371", + "372", + "373", + "374", + "375", + "376", + "377", + "378", + "379", + "380", + "381", + "382", + "383", + "384", + "385", + "386", + "387", + "388", + "389", + "390", + "391", + "392", + "393", + "394", + "395", + "396", + "397", + "398", + "399", + "400", + "401", + "402", + "403", + "404", + "405", + "406", + "407", + "408", + "409", + "410", + "411", + "412", + "413", + "414", + "415", + "416", + "417", + "418", + "419", + "420", + "421", + "422", + "423", + "424", + "425", + "426", + "427", + "428", + "429", + "430", + "431", + "432", + "433", + "434", + "435", + "436", + "437", + "438", + "439", + "440", + "441", + "442", + "443", + "444", + "445", + "446", + "447", + "448", + "449", + "450", + "451", + "452", + "453", + "454", + "455", + "456", + "457", + "458", + "459", + "460", + "461", + "462", + "463", + "464", + "465", + "466", + "467", + "468", + "469", + "470", + "471", + "472", + "473", + "474", + "475", + "476", + "477", + "478", + "479", + "480", + "481", + "482", + "483", + "484", + "485", + "486", + "487", + "488", + "489", + "490", + "491", + "492", + "493", + "494", + "495", + "496", + "497", + "498", + "499", + "500", + "501", + "502", + "503", + "504", + "505", + "506", + "507", + "508", + "509", + "510", + "511", + "512", + "513", + "514", + "515", + "516", + "517", + "518", + "519", + "520", + "521", + "522", + "523", + "524", + "525", + "526", + "527", + "528", + "529", + "530", + "531", + "532", + "533", + "534", + "535", + "536", + "537", + "538", + "539", + "540", + "541", + "542", + "543", + "544", + "545", + "546", + "547", + "548", + "549", + "550", + "551", + "552", + "553", + "554", + "555", + "556", + "557", + "558", + "559", + "560", + "561", + "562", + "563", + "564", + "565", + "566", + "567", + "568", + "569", + "570" + ], + "type": "string" + } + } +} \ No newline at end of file diff --git a/packages/cfdi/schema/src/files/schema/catalogos/tipodatos.json b/packages/cfdi/schema/src/files/schema/catalogos/tipodatos.json new file mode 100644 index 0000000..f1adef1 --- /dev/null +++ b/packages/cfdi/schema/src/files/schema/catalogos/tipodatos.json @@ -0,0 +1,135 @@ +{ + "$id": "tipoDatos.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "This JSON Schema file was generated from tipoDatos on Tue Dec 26 2023 19:00:38 GMT-0500 (Eastern Standard Time). For more information please see http://www.xsd2jsonschema.org", + "description": "Schema tag attributes: xmlns:tdCFDI='http://www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI' xmlns:xs='http://www.w3.org/2001/XMLSchema' targetNamespace='http://www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI' elementFormDefault='unqualified' attributeFormDefault='unqualified'", + "properties": { + "t_CURP": { "$ref": "#/definitions/t_CURP" }, + "t_Importe": { "$ref": "#/definitions/t_Importe" }, + "t_Fecha": { "$ref": "#/definitions/t_Fecha" }, + "t_ImporteMXN": { "$ref": "#/definitions/t_ImporteMXN" }, + "t_CuentaBancaria": { "$ref": "#/definitions/t_CuentaBancaria" }, + "t_RFC": { "$ref": "#/definitions/t_RFC" }, + "t_RFC_PM": { "$ref": "#/definitions/t_RFC_PM" }, + "t_RFC_PF": { "$ref": "#/definitions/t_RFC_PF" }, + "t_FechaHora": { "$ref": "#/definitions/t_FechaHora" }, + "t_FechaH": { "$ref": "#/definitions/t_FechaH" }, + "t_Descrip100": { "$ref": "#/definitions/t_Descrip100" }, + "t_NumeroDomicilio": { "$ref": "#/definitions/t_NumeroDomicilio" }, + "t_Referencia": { "$ref": "#/definitions/t_Referencia" }, + "t_Descrip120": { "$ref": "#/definitions/t_Descrip120" }, + "t_TipoCambio": { "$ref": "#/definitions/t_TipoCambio" } + }, + "type": "object", + "anyOf": [ + { "required": ["t_CURP"] }, + { "required": ["t_Importe"] }, + { "required": ["t_Fecha"] }, + { "required": ["t_ImporteMXN"] }, + { "required": ["t_CuentaBancaria"] }, + { "required": ["t_RFC"] }, + { "required": ["t_RFC_PM"] }, + { "required": ["t_RFC_PF"] }, + { "required": ["t_FechaHora"] }, + { "required": ["t_FechaH"] }, + { "required": ["t_Descrip100"] }, + { "required": ["t_NumeroDomicilio"] }, + { "required": ["t_Referencia"] }, + { "required": ["t_Descrip120"] }, + { "required": ["t_TipoCambio"] } + ], + "definitions": { + "t_CURP": { + "description": "Tipo definido para expresar la Clave Única de Registro de Población (CURP)", + "maxLength": 18, + "minLength": 18, + "pattern": "[A-Z][AEIOUX][A-Z]{2}[0-9]{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])[MH]([ABCMTZ]S|[BCJMOT]C|[CNPST]L|[GNQ]T|[GQS]R|C[MH]|[MY]N|[DH]G|NE|VZ|DF|SP)[BCDFGHJ-NP-TV-Z]{3}[0-9A-Z][0-9]", + "type": "string" + }, + "t_Importe": { + "description": "Tipo definido para expresar importes numéricos con fracción hasta seis decimales. No se permiten valores negativos.", + "minimum": 0, + "pattern": "[0-9]{1,18}(.[0-9]{1,6})?", + "type": "number" + }, + "t_Fecha": { + "description": "Tipo definido para la expresión de la fecha. Se expresa en la forma AAAA-MM-DD.", + "pattern": "((19|20)[0-9][0-9])-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])", + "type": "string" + }, + "t_ImporteMXN": { + "description": "Tipo definido para expresar importes monetarios en moneda nacional MXN con fracción hasta dos decimales. No se permiten valores negativos.", + "minimum": 0, + "pattern": "[0-9]{1,18}(.[0-9]{1,2})?", + "type": "number" + }, + "t_CuentaBancaria": { + "description": "Tipo definido para expresar la cuenta bancarizada.", + "pattern": "[0-9]{10,18}", + "type": "integer" + }, + "t_RFC": { + "description": "Tipo definido para expresar claves del Registro Federal de Contribuyentes", + "maxLength": 13, + "minLength": 12, + "pattern": "[A-Z&Ñ]{3,4}[0-9]{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])[A-Z0-9]{2}[0-9A]", + "type": "string" + }, + "t_RFC_PM": { + "description": "Tipo definido para la expresión de un Registro Federal de Contribuyentes de persona moral.", + "minLength": 12, + "pattern": "[A-Z&Ñ]{3}[0-9]{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])[A-Z0-9]{2}[0-9A]", + "type": "string" + }, + "t_RFC_PF": { + "description": "Tipo definido para la expresión de un Registro Federal de Contribuyentes de persona física.", + "minLength": 13, + "pattern": "[A-Z&Ñ]{4}[0-9]{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])[A-Z0-9]{2}[0-9A]", + "type": "string" + }, + "t_FechaHora": { + "description": "Tipo definido para la expresión de la fecha y hora. Se expresa en la forma AAAA-MM-DDThh:mm:ss", + "pattern": "((19|20)[0-9][0-9])-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T(([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9])", + "type": "string" + }, + "t_FechaH": { + "description": "Tipo definido para la expresión de la fecha y hora. Se expresa en la forma AAAA-MM-DDThh:mm:ss", + "pattern": "(20[1-9][0-9])-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T(([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9])", + "type": "string" + }, + "t_Descrip100": { + "description": "Tipo definido para expresar la calle en que está ubicado el domicilio del emisor del comprobante o del destinatario de la mercancía.", + "maxLength": 100, + "minLength": 1, + "pattern": "[^|]{1,100}", + "type": "string" + }, + "t_NumeroDomicilio": { + "description": "Tipo definido para expresar el número interior o el número exterior en donde se ubica el domicilio del emisor del comprobante o del destinatario de la mercancía.", + "maxLength": 55, + "minLength": 1, + "pattern": "[^|]{1,55}", + "type": "string" + }, + "t_Referencia": { + "description": "Tipo definido para expresar la referencia geográfica adicional que permita una fácil o precisa ubicación del domicilio del emisor del comprobante o del destinatario de la mercancía, por ejemplo las coordenadas GPS.", + "maxLength": 250, + "minLength": 1, + "pattern": "[^|]{1,250}", + "type": "string" + }, + "t_Descrip120": { + "description": "Tipo definido para expresar la colonia, localidad o municipio en que está ubicado el domicilio del emisor del comprobante o del destinatario de la mercancía.", + "maxLength": 120, + "minLength": 1, + "pattern": "[^|]{1,120}", + "type": "string" + }, + "t_TipoCambio": { + "description": "Tipo definido para expresar el tipo de cambio. No se permiten valores negativos.", + "minimum": 0, + "pattern": "[0-9]{1,18}(.[0-9]{1,6})?", + "type": "number" + } + } +} diff --git a/packages/cfdi/schema/src/files/schema/cfdi.json b/packages/cfdi/schema/src/files/schema/cfdi.json new file mode 100644 index 0000000..ba62c29 --- /dev/null +++ b/packages/cfdi/schema/src/files/schema/cfdi.json @@ -0,0 +1,129 @@ +{ + "catalogos": [ + { + "name": "tipodatos", + "type": "catalogos", + "key": "CATALOGOS_TIPODATOS", + "path": "catalogos" + }, + { + "name": "catalogos", + "type": "catalogos", + "key": "CATALOGOS_CATALOGOS", + "path": "catalogos" + } + ], + "comprobante": [ + { + "name": "comprobante", + "type": "comprobante", + "key": "COMPROBANTE", + "path": "comprobante" + }, + { + "name": "informacionglobal", + "type": "comprobante", + "key": "COMPROBANTE_INFORMACIONGLOBAL", + "path": "informacionglobal" + }, + { + "name": "cfdirelacionado", + "type": "comprobante", + "key": "COMPROBANTE_CFDIRELACIONADOS_CFDIRELACIONADO", + "path": "cfdirelacionados" + }, + { + "name": "cfdirelacionados", + "type": "comprobante", + "key": "COMPROBANTE_CFDIRELACIONADOS", + "path": "cfdirelacionados" + }, + { + "name": "emisor", + "type": "comprobante", + "key": "COMPROBANTE_EMISOR", + "path": "emisor" + }, + { + "name": "receptor", + "type": "comprobante", + "key": "COMPROBANTE_RECEPTOR", + "path": "receptor" + }, + { + "name": "traslado", + "type": "comprobante", + "key": "COMPROBANTE_CONCEPTOS_CONCEPTO_IMPUESTOS_TRASLADOS_TRASLADO", + "path": "conceptos" + }, + { + "name": "retencion", + "type": "comprobante", + "key": "COMPROBANTE_CONCEPTOS_CONCEPTO_IMPUESTOS_RETENCIONES_RETENCION", + "path": "conceptos" + }, + { + "name": "acuentaterceros", + "type": "comprobante", + "key": "COMPROBANTE_CONCEPTOS_CONCEPTO_ACUENTATERCEROS", + "path": "conceptos" + }, + { + "name": "informacionaduanera", + "type": "comprobante", + "key": "COMPROBANTE_CONCEPTOS_CONCEPTO_INFORMACIONADUANERA", + "path": "conceptos" + }, + { + "name": "cuentapredial", + "type": "comprobante", + "key": "COMPROBANTE_CONCEPTOS_CONCEPTO_CUENTAPREDIAL", + "path": "conceptos" + }, + { + "name": "informacionaduanera", + "type": "comprobante", + "key": "COMPROBANTE_CONCEPTOS_CONCEPTO_PARTE_INFORMACIONADUANERA", + "path": "conceptos" + }, + { + "name": "parte", + "type": "comprobante", + "key": "COMPROBANTE_CONCEPTOS_CONCEPTO_PARTE", + "path": "conceptos" + }, + { + "name": "concepto", + "type": "comprobante", + "key": "COMPROBANTE_CONCEPTOS_CONCEPTO", + "path": "conceptos" + }, + { + "name": "retencion", + "type": "comprobante", + "key": "COMPROBANTE_IMPUESTOS_RETENCIONES_RETENCION", + "path": "impuestos" + }, + { + "name": "traslado", + "type": "comprobante", + "key": "COMPROBANTE_IMPUESTOS_TRASLADOS_TRASLADO", + "path": "impuestos" + }, + { + "name": "impuestos", + "type": "comprobante", + "key": "COMPROBANTE_IMPUESTOS", + "path": "impuestos" + } + ], + "complementos": [ + { + "name": "iedu", + "type": "complementos", + "key": "IEDU", + "path": "complementos" + } + ], + "unknow": [] +} \ No newline at end of file diff --git a/packages/cfdi/schema/src/files/schema/cfdirelacionados/cfdirelacionado.json b/packages/cfdi/schema/src/files/schema/cfdirelacionados/cfdirelacionado.json new file mode 100644 index 0000000..a53c174 --- /dev/null +++ b/packages/cfdi/schema/src/files/schema/cfdirelacionados/cfdirelacionado.json @@ -0,0 +1,18 @@ +{ + "$id": "comprobante_CfdiRelacionados_CfdiRelacionado.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "This JSON Schema file was generated from comprobante_CfdiRelacionados_CfdiRelacionado on Tue Dec 26 2023 18:31:04 GMT-0500 (Eastern Standard Time). For more information please see http://www.xsd2jsonschema.org", + "description": "Schema tag attributes: xmlns:cfdi='http://www.sat.gob.mx/cfd/4' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:catCFDI='http://www.sat.gob.mx/sitio_internet/cfd/catalogos' xmlns:tdCFDI='http://www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI' targetNamespace='http://www.sat.gob.mx/cfd/4' elementFormDefault='qualified' attributeFormDefault='unqualified'", + "required": ["UUID"], + "properties": { + "UUID": { + "description": "Atributo requerido para registrar el folio fiscal (UUID) de un CFDI relacionado con el presente comprobante, por ejemplo: Si el CFDI relacionado es un comprobante de traslado que sirve para registrar el movimiento de la mercancía. Si este comprobante se usa como nota de crédito o nota de débito del comprobante relacionado. Si este comprobante es una devolución sobre el comprobante relacionado. Si éste sustituye a una factura cancelada.", + "maxLength": 36, + "minLength": 36, + "pattern": "[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[a-f0-9A-F]{4}-[a-f0-9A-F]{4}-[a-f0-9A-F]{12}", + "type": "string" + } + }, + "type": "object", + "definitions": {} +} diff --git a/packages/cfdi/schema/src/files/schema/cfdirelacionados/cfdirelacionados.json b/packages/cfdi/schema/src/files/schema/cfdirelacionados/cfdirelacionados.json new file mode 100644 index 0000000..c393237 --- /dev/null +++ b/packages/cfdi/schema/src/files/schema/cfdirelacionados/cfdirelacionados.json @@ -0,0 +1,14 @@ +{ + "$id": "comprobante_CfdiRelacionados.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "This JSON Schema file was generated from comprobante_CfdiRelacionados on Tue Dec 26 2023 18:31:04 GMT-0500 (Eastern Standard Time). For more information please see http://www.xsd2jsonschema.org", + "description": "Atributo requerido para indicar la clave de la relación que existe entre éste que se está generando y el o los CFDI previos.", + "required": ["TipoRelacion"], + "properties": { + "TipoRelacion": { + "$ref": "catalogos.json#/definitions/c_TipoRelacion" + } + }, + "type": "object", + "definitions": {} +} diff --git a/packages/cfdi/schema/src/files/schema/complementos/iedu.json b/packages/cfdi/schema/src/files/schema/complementos/iedu.json new file mode 100644 index 0000000..7b65ccc --- /dev/null +++ b/packages/cfdi/schema/src/files/schema/complementos/iedu.json @@ -0,0 +1,53 @@ +{ + "$id": "iedu.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "This JSON Schema file was generated from iedu on Tue Dec 26 2023 18:59:29 GMT-0500 (Eastern Standard Time). For more information please see http://www.xsd2jsonschema.org", + "description": "Schema tag attributes: xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:iedu='http://www.sat.gob.mx/iedu' targetNamespace='http://www.sat.gob.mx/iedu' elementFormDefault='qualified' attributeFormDefault='unqualified'", + "required": [ + "version", + "nombreAlumno", + "CURP", + "nivelEducativo", + "autRVOE" + ], + "properties": { + "version": { + "description": "Atributo requerido con valor prefijado a 1.0 que indica la versión del estándar bajo el que se encuentra expresado el complemento concepto al comprobante.", + "type": "string" + }, + "nombreAlumno": { + "description": "Atributo requerido para indicar el nombre del Alumno", + "type": "string" + }, + "CURP": { + "maxLength": 18, + "minLength": 18, + "pattern": "[A-Z][A,E,I,O,U,X][A-Z]{2}[0-9]{2}[0-1][0-9][0-3][0-9][M,H][A-Z]{2}[B,C,D,F,G,H,J,K,L,M,N,Ñ,P,Q,R,S,T,V,W,X,Y,Z]{3}[0-9,A-Z][0-9]", + "type": "string" + }, + "nivelEducativo": { + "description": "Atributo requerido para indicar el nivel educativo que cursa el alumno", + "enum": [ + "Preescolar", + "Primaria", + "Secundaria", + "Profesional técnico", + "Bachillerato o su equivalente" + ], + "type": "string" + }, + "autRVOE": { + "description": "Atributo requerido para especificar la clave del centro de trabajo o el reconocimiento de validez oficial de estudios en los términos de la Ley General de Educación que tenga la institución educativa privada donde se realiza el pago.", + "minLength": 1, + "type": "string" + }, + "rfcPago": { + "maxLength": 13, + "minLength": 12, + "pattern": "[A-Z,Ñ,&]{3,4}[0-9]{2}[0-1][0-9][0-3][0-9][A-Z,0-9]?[A-Z,0-9]?[0-9,A-Z]?", + "type": "string" + } + }, + "type": "object", + "definitions": {} +} \ No newline at end of file diff --git a/packages/cfdi/schema/src/files/schema/comprobante/comprobante.json b/packages/cfdi/schema/src/files/schema/comprobante/comprobante.json new file mode 100644 index 0000000..6383eb7 --- /dev/null +++ b/packages/cfdi/schema/src/files/schema/comprobante/comprobante.json @@ -0,0 +1,105 @@ +{ + "$id": "comprobante.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "This JSON Schema file was generated from comprobante on Tue Dec 26 2023 18:31:04 GMT-0500 (Eastern Standard Time). For more information please see http://www.xsd2jsonschema.org", + "description": "Atributo requerido para incorporar el código postal del lugar de expedición del comprobante (domicilio de la matriz o de la sucursal).", + "required": [ + "Version", + "Fecha", + "Sello", + "NoCertificado", + "Certificado", + "SubTotal", + "Moneda", + "Total", + "TipoDeComprobante", + "Exportacion", + "LugarExpedicion" + ], + "properties": { + "Version": { + "description": "Atributo requerido con valor prefijado a 4.0 que indica la versión del estándar bajo el que se encuentra expresado el comprobante.", + "type": "string" + }, + "Serie": { + "description": "Atributo opcional para precisar la serie para control interno del contribuyente. Este atributo acepta una cadena de caracteres.", + "maxLength": 25, + "minLength": 1, + "pattern": "[^|]{1,25}", + "type": "string" + }, + "Folio": { + "description": "Atributo opcional para control interno del contribuyente que expresa el folio del comprobante, acepta una cadena de caracteres.", + "maxLength": 40, + "minLength": 1, + "pattern": "[^|]{1,40}", + "type": "string" + }, + "Fecha": { + "$ref": "tipoDatos.json#/definitions/t_FechaH" + }, + "Sello": { + "description": "Atributo requerido para contener el sello digital del comprobante fiscal, al que hacen referencia las reglas de resolución miscelánea vigente. El sello debe ser expresado como una cadena de texto en formato Base 64.", + "type": "string" + }, + "FormaPago": { + "$ref": "catalogos.json#/definitions/c_FormaPago" + }, + "NoCertificado": { + "description": "Atributo requerido para expresar el número de serie del certificado de sello digital que ampara al comprobante, de acuerdo con el acuse correspondiente a 20 posiciones otorgado por el sistema del SAT.", + "maxLength": 20, + "minLength": 20, + "pattern": "[0-9]{20}", + "type": "string" + }, + "Certificado": { + "description": "Atributo requerido que sirve para incorporar el certificado de sello digital que ampara al comprobante, como texto en formato base 64.", + "type": "string" + }, + "CondicionesDePago": { + "description": "Atributo condicional para expresar las condiciones comerciales aplicables para el pago del comprobante fiscal digital por Internet. Este atributo puede ser condicionado mediante atributos o complementos.", + "maxLength": 1000, + "minLength": 1, + "pattern": "[^|]{1,1000}", + "type": "string" + }, + "SubTotal": { + "$ref": "tipoDatos.json#/definitions/t_Importe" + }, + "Descuento": { + "$ref": "tipoDatos.json#/definitions/t_Importe" + }, + "Moneda": { + "$ref": "catalogos.json#/definitions/c_Moneda" + }, + "TipoCambio": { + "description": "Atributo condicional para representar el tipo de cambio FIX conforme con la moneda usada. Es requerido cuando la clave de moneda es distinta de MXN y de XXX. El valor debe reflejar el número de pesos mexicanos que equivalen a una unidad de la divisa señalada en el atributo moneda. Si el valor está fuera del porcentaje aplicable a la moneda tomado del catálogo c_Moneda, el emisor debe obtener del PAC que vaya a timbrar el CFDI, de manera no automática, una clave de confirmación para ratificar que el valor es correcto e integrar dicha clave en el atributo Confirmacion.", + "minimum": 0.000001, + "type": "number" + }, + "Total": { + "$ref": "tipoDatos.json#/definitions/t_Importe" + }, + "TipoDeComprobante": { + "$ref": "catalogos.json#/definitions/c_TipoDeComprobante" + }, + "Exportacion": { + "$ref": "catalogos.json#/definitions/c_Exportacion" + }, + "MetodoPago": { + "$ref": "catalogos.json#/definitions/c_MetodoPago" + }, + "LugarExpedicion": { + "$ref": "catalogos.json#/definitions/c_CodigoPostal" + }, + "Confirmacion": { + "description": "Atributo condicional para registrar la clave de confirmación que entregue el PAC para expedir el comprobante con importes grandes, con un tipo de cambio fuera del rango establecido o con ambos casos. Es requerido cuando se registra un tipo de cambio o un total fuera del rango establecido.", + "maxLength": 5, + "minLength": 5, + "pattern": "[0-9a-zA-Z]{5}", + "type": "string" + } + }, + "type": "object", + "definitions": {} +} \ No newline at end of file diff --git a/packages/cfdi/schema/src/files/schema/conceptos/acuentaterceros.json b/packages/cfdi/schema/src/files/schema/conceptos/acuentaterceros.json new file mode 100644 index 0000000..49c7851 --- /dev/null +++ b/packages/cfdi/schema/src/files/schema/conceptos/acuentaterceros.json @@ -0,0 +1 @@ +{"$id":"comprobante_Conceptos_Concepto_ACuentaTerceros.json","$schema":"http://json-schema.org/draft-07/schema#","title":"This JSON Schema file was generated from comprobante_Conceptos_Concepto_ACuentaTerceros on Tue Dec 26 2023 18:31:04 GMT-0500 (Eastern Standard Time). For more information please see http://www.xsd2jsonschema.org","description":"Atributo requerido para incorporar la clave del régimen del contribuyente Tercero, a cuenta del que se realiza la operación.","required":["RfcACuentaTerceros","NombreACuentaTerceros","RegimenFiscalACuentaTerceros","DomicilioFiscalACuentaTerceros"],"properties":{"RfcACuentaTerceros":{"$ref":"tipoDatos.json#/definitions/t_RFC"},"NombreACuentaTerceros":{"description":"Atributo requerido para registrar el nombre, denominación o razón social del contribuyente Tercero correspondiente con el Rfc, a cuenta del que se realiza la operación.","maxLength":300,"minLength":1,"pattern":"[^|]{1,300}","type":"string"},"RegimenFiscalACuentaTerceros":{"$ref":"catalogos.json#/definitions/c_RegimenFiscal"},"DomicilioFiscalACuentaTerceros":{"description":"Atributo requerido para incorporar el código postal del domicilio fiscal del Tercero, a cuenta del que se realiza la operación.","maxLength":5,"minLength":5,"pattern":"[0-9]{5}","type":"string"}},"type":"object","definitions":{}} \ No newline at end of file diff --git a/packages/cfdi/schema/src/files/schema/conceptos/concepto.json b/packages/cfdi/schema/src/files/schema/conceptos/concepto.json new file mode 100644 index 0000000..bfd40ab --- /dev/null +++ b/packages/cfdi/schema/src/files/schema/conceptos/concepto.json @@ -0,0 +1,63 @@ +{ + "$id": "comprobante_Conceptos_Concepto.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "This JSON Schema file was generated from comprobante_Conceptos_Concepto on Tue Dec 26 2023 18:31:04 GMT-0500 (Eastern Standard Time). For more information please see http://www.xsd2jsonschema.org", + "description": "Atributo requerido para expresar si la operación comercial es objeto o no de impuesto.", + "required": [ + "ClaveProdServ", + "Cantidad", + "ClaveUnidad", + "Descripcion", + "ValorUnitario", + "Importe", + "ObjetoImp" + ], + "properties": { + "ClaveProdServ": { + "$ref": "catalogos.json#/definitions/c_ClaveProdServ" + }, + "NoIdentificacion": { + "description": "Atributo opcional para expresar el número de parte, identificador del producto o del servicio, la clave de producto o servicio, SKU o equivalente, propia de la operación del emisor, amparado por el presente concepto. Opcionalmente se puede utilizar claves del estándar GTIN.", + "maxLength": 100, + "minLength": 1, + "pattern": "[^|]{1,100}", + "type": "string" + }, + "Cantidad": { + "description": "Atributo requerido para precisar la cantidad de bienes o servicios del tipo particular definido por el presente concepto.", + "minimum": 0.000001, + "type": "number" + }, + "ClaveUnidad": { + "$ref": "catalogos.json#/definitions/c_ClaveUnidad" + }, + "Unidad": { + "description": "Atributo opcional para precisar la unidad de medida propia de la operación del emisor, aplicable para la cantidad expresada en el concepto. La unidad debe corresponder con la descripción del concepto.", + "maxLength": 20, + "minLength": 1, + "pattern": "[^|]{1,20}", + "type": "string" + }, + "Descripcion": { + "description": "Atributo requerido para precisar la descripción del bien o servicio cubierto por el presente concepto.", + "maxLength": 1000, + "minLength": 1, + "pattern": "[^|]{1,1000}", + "type": "string" + }, + "ValorUnitario": { + "$ref": "tipoDatos.json#/definitions/t_Importe" + }, + "Importe": { + "$ref": "tipoDatos.json#/definitions/t_Importe" + }, + "Descuento": { + "$ref": "tipoDatos.json#/definitions/t_Importe" + }, + "ObjetoImp": { + "$ref": "catalogos.json#/definitions/c_ObjetoImp" + } + }, + "type": "object", + "definitions": {} +} \ No newline at end of file diff --git a/packages/cfdi/schema/src/files/schema/conceptos/cuentapredial.json b/packages/cfdi/schema/src/files/schema/conceptos/cuentapredial.json new file mode 100644 index 0000000..d204b49 --- /dev/null +++ b/packages/cfdi/schema/src/files/schema/conceptos/cuentapredial.json @@ -0,0 +1 @@ +{"$id":"comprobante_Conceptos_Concepto_CuentaPredial.json","$schema":"http://json-schema.org/draft-07/schema#","title":"This JSON Schema file was generated from comprobante_Conceptos_Concepto_CuentaPredial on Tue Dec 26 2023 18:31:04 GMT-0500 (Eastern Standard Time). For more information please see http://www.xsd2jsonschema.org","description":"Schema tag attributes: xmlns:cfdi='http://www.sat.gob.mx/cfd/4' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:catCFDI='http://www.sat.gob.mx/sitio_internet/cfd/catalogos' xmlns:tdCFDI='http://www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI' targetNamespace='http://www.sat.gob.mx/cfd/4' elementFormDefault='qualified' attributeFormDefault='unqualified'","required":["Numero"],"properties":{"Numero":{"description":"Atributo requerido para precisar el número de la cuenta predial del inmueble cubierto por el presente concepto, o bien para incorporar los datos de identificación del certificado de participación inmobiliaria no amortizable, tratándose de arrendamiento.","maxLength":150,"minLength":1,"pattern":"[0-9a-zA-Z]{1,150}","type":"string"}},"type":"object","definitions":{}} \ No newline at end of file diff --git a/packages/cfdi/schema/src/files/schema/conceptos/informacionaduanera.json b/packages/cfdi/schema/src/files/schema/conceptos/informacionaduanera.json new file mode 100644 index 0000000..7688ff3 --- /dev/null +++ b/packages/cfdi/schema/src/files/schema/conceptos/informacionaduanera.json @@ -0,0 +1 @@ +{"$id":"comprobante_Conceptos_Concepto_InformacionAduanera.json","$schema":"http://json-schema.org/draft-07/schema#","title":"This JSON Schema file was generated from comprobante_Conceptos_Concepto_InformacionAduanera on Tue Dec 26 2023 18:31:04 GMT-0500 (Eastern Standard Time). For more information please see http://www.xsd2jsonschema.org","description":"Schema tag attributes: xmlns:cfdi='http://www.sat.gob.mx/cfd/4' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:catCFDI='http://www.sat.gob.mx/sitio_internet/cfd/catalogos' xmlns:tdCFDI='http://www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI' targetNamespace='http://www.sat.gob.mx/cfd/4' elementFormDefault='qualified' attributeFormDefault='unqualified'","required":["NumeroPedimento"],"properties":{"NumeroPedimento":{"description":"Atributo requerido para expresar el número del pedimento que ampara la importación del bien que se expresa en el siguiente formato: últimos 2 dígitos del año de validación seguidos por dos espacios, 2 dígitos de la aduana de despacho seguidos por dos espacios, 4 dígitos del número de la patente seguidos por dos espacios, 1 dígito que corresponde al último dígito del año en curso, salvo que se trate de un pedimento consolidado iniciado en el año inmediato anterior o del pedimento original de una rectificación, seguido de 6 dígitos de la numeración progresiva por aduana.","maxLength":21,"minLength":21,"pattern":"[0-9]{2} [0-9]{2} [0-9]{4} [0-9]{7}","type":"string"}},"type":"object","definitions":{}} \ No newline at end of file diff --git a/packages/cfdi/schema/src/files/schema/conceptos/parte.json b/packages/cfdi/schema/src/files/schema/conceptos/parte.json new file mode 100644 index 0000000..7f1f9a6 --- /dev/null +++ b/packages/cfdi/schema/src/files/schema/conceptos/parte.json @@ -0,0 +1 @@ +{"$id":"comprobante_Conceptos_Concepto_Parte.json","$schema":"http://json-schema.org/draft-07/schema#","title":"This JSON Schema file was generated from comprobante_Conceptos_Concepto_Parte on Tue Dec 26 2023 18:31:04 GMT-0500 (Eastern Standard Time). For more information please see http://www.xsd2jsonschema.org","description":"Atributo opcional para precisar el importe total de los bienes o servicios de la presente parte. Debe ser equivalente al resultado de multiplicar la cantidad por el valor unitario expresado en la parte. No se permiten valores negativos.","required":["ClaveProdServ","Cantidad","Descripcion"],"properties":{"ClaveProdServ":{"$ref":"catalogos.json#/definitions/c_ClaveProdServ"},"NoIdentificacion":{"description":"Atributo opcional para expresar el número de serie, número de parte del bien o identificador del producto o del servicio amparado por la presente parte. Opcionalmente se puede utilizar claves del estándar GTIN.","maxLength":100,"minLength":1,"pattern":"[^|]{1,100}","type":"string"},"Cantidad":{"description":"Atributo requerido para precisar la cantidad de bienes o servicios del tipo particular definido por la presente parte.","minimum":0.000001,"type":"number"},"Unidad":{"description":"Atributo opcional para precisar la unidad de medida propia de la operación del emisor, aplicable para la cantidad expresada en la parte. La unidad debe corresponder con la descripción de la parte.","maxLength":20,"minLength":1,"pattern":"[^|]{1,20}","type":"string"},"Descripcion":{"description":"Atributo requerido para precisar la descripción del bien o servicio cubierto por la presente parte.","maxLength":1000,"minLength":1,"pattern":"[^|]{1,1000}","type":"string"},"ValorUnitario":{"$ref":"tipoDatos.json#/definitions/t_Importe"},"Importe":{"$ref":"tipoDatos.json#/definitions/t_Importe"}},"type":"object","definitions":{}} \ No newline at end of file diff --git a/packages/cfdi/schema/src/files/schema/conceptos/retencion.json b/packages/cfdi/schema/src/files/schema/conceptos/retencion.json new file mode 100644 index 0000000..dd6cea9 --- /dev/null +++ b/packages/cfdi/schema/src/files/schema/conceptos/retencion.json @@ -0,0 +1,36 @@ +{ + "$id": "comprobante_Conceptos_Concepto_Impuestos_Retenciones_Retencion.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "This JSON Schema file was generated from comprobante_Conceptos_Concepto_Impuestos_Retenciones_Retencion on Tue Dec 26 2023 18:31:04 GMT-0500 (Eastern Standard Time). For more information please see http://www.xsd2jsonschema.org", + "description": "Atributo requerido para señalar el importe del impuesto retenido que aplica al concepto. No se permiten valores negativos.", + "required": [ + "Base", + "Impuesto", + "TipoFactor", + "TasaOCuota", + "Importe" + ], + "properties": { + "Base": { + "description": "Atributo requerido para señalar la base para el cálculo de la retención, la determinación de la base se realiza de acuerdo con las disposiciones fiscales vigentes. No se permiten valores negativos.", + "minimum": 0.000001, + "type": "number" + }, + "Impuesto": { + "$ref": "catalogos.json#/definitions/c_Impuesto" + }, + "TipoFactor": { + "$ref": "catalogos.json#/definitions/c_TipoFactor" + }, + "TasaOCuota": { + "description": "Atributo requerido para señalar la tasa o cuota del impuesto que se retiene para el presente concepto.", + "minimum": 0, + "type": "number" + }, + "Importe": { + "$ref": "tipoDatos.json#/definitions/t_Importe" + } + }, + "type": "object", + "definitions": {} +} \ No newline at end of file diff --git a/packages/cfdi/schema/src/files/schema/conceptos/traslado.json b/packages/cfdi/schema/src/files/schema/conceptos/traslado.json new file mode 100644 index 0000000..5cea45d --- /dev/null +++ b/packages/cfdi/schema/src/files/schema/conceptos/traslado.json @@ -0,0 +1,34 @@ +{ + "$id": "comprobante_Conceptos_Concepto_Impuestos_Traslados_Traslado.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "This JSON Schema file was generated from comprobante_Conceptos_Concepto_Impuestos_Traslados_Traslado on Tue Dec 26 2023 18:31:04 GMT-0500 (Eastern Standard Time). For more information please see http://www.xsd2jsonschema.org", + "description": "Atributo condicional para señalar el importe del impuesto trasladado que aplica al concepto. No se permiten valores negativos. Es requerido cuando TipoFactor sea Tasa o Cuota.", + "required": [ + "Base", + "Impuesto", + "TipoFactor" + ], + "properties": { + "Base": { + "description": "Atributo requerido para señalar la base para el cálculo del impuesto, la determinación de la base se realiza de acuerdo con las disposiciones fiscales vigentes. No se permiten valores negativos.", + "minimum": 0.000001, + "type": "number" + }, + "Impuesto": { + "$ref": "catalogos.json#/definitions/c_Impuesto" + }, + "TipoFactor": { + "$ref": "catalogos.json#/definitions/c_TipoFactor" + }, + "TasaOCuota": { + "description": "Atributo condicional para señalar el valor de la tasa o cuota del impuesto que se traslada para el presente concepto. Es requerido cuando el atributo TipoFactor tenga una clave que corresponda a Tasa o Cuota.", + "minimum": 0, + "type": "number" + }, + "Importe": { + "$ref": "tipoDatos.json#/definitions/t_Importe" + } + }, + "type": "object", + "definitions": {} +} \ No newline at end of file diff --git a/packages/cfdi/schema/src/files/schema/emisor/emisor.json b/packages/cfdi/schema/src/files/schema/emisor/emisor.json new file mode 100644 index 0000000..d4693db --- /dev/null +++ b/packages/cfdi/schema/src/files/schema/emisor/emisor.json @@ -0,0 +1,35 @@ +{ + "$id": "comprobante_Emisor.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "This JSON Schema file was generated from comprobante_Emisor on Tue Dec 26 2023 18:56:11 GMT-0500 (Eastern Standard Time). For more information please see http://www.xsd2jsonschema.org", + "description": "Atributo requerido para incorporar la clave del régimen del contribuyente emisor al que aplicará el efecto fiscal de este comprobante.", + "required": [ + "Rfc", + "Nombre", + "RegimenFiscal" + ], + "properties": { + "Rfc": { + "$ref": "tipoDatos.json#/definitions/t_RFC" + }, + "Nombre": { + "description": "Atributo requerido para registrar el nombre, denominación o razón social del contribuyente inscrito en el RFC, del emisor del comprobante.", + "maxLength": 300, + "minLength": 1, + "pattern": "[^|]{1,300}", + "type": "string" + }, + "RegimenFiscal": { + "$ref": "catalogos.json#/definitions/c_RegimenFiscal" + }, + "FacAtrAdquirente": { + "description": "Atributo condicional para expresar el número de operación proporcionado por el SAT cuando se trate de un comprobante a través de un PCECFDI o un PCGCFDISP.", + "maxLength": 10, + "minLength": 10, + "pattern": "[0-9]{10}", + "type": "string" + } + }, + "type": "object", + "definitions": {} +} \ No newline at end of file diff --git a/packages/cfdi/schema/src/files/schema/impuestos/impuestos.json b/packages/cfdi/schema/src/files/schema/impuestos/impuestos.json new file mode 100644 index 0000000..edba2b3 --- /dev/null +++ b/packages/cfdi/schema/src/files/schema/impuestos/impuestos.json @@ -0,0 +1,16 @@ +{ + "$id": "comprobante_Impuestos.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "This JSON Schema file was generated from comprobante_Impuestos on Tue Dec 26 2023 18:31:04 GMT-0500 (Eastern Standard Time). For more information please see http://www.xsd2jsonschema.org", + "description": "Atributo condicional para expresar el total de los impuestos trasladados que se desprenden de los conceptos expresados en el comprobante fiscal digital por Internet. No se permiten valores negativos. Es requerido cuando en los conceptos se registren impuestos trasladados.", + "properties": { + "TotalImpuestosRetenidos": { + "$ref": "tipoDatos.json#/definitions/t_Importe" + }, + "TotalImpuestosTrasladados": { + "$ref": "tipoDatos.json#/definitions/t_Importe" + } + }, + "type": "object", + "definitions": {} +} diff --git a/packages/cfdi/schema/src/files/schema/impuestos/retencion.json b/packages/cfdi/schema/src/files/schema/impuestos/retencion.json new file mode 100644 index 0000000..8254b47 --- /dev/null +++ b/packages/cfdi/schema/src/files/schema/impuestos/retencion.json @@ -0,0 +1,20 @@ +{ + "$id": "comprobante_Impuestos_Retenciones_Retencion.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "This JSON Schema file was generated from comprobante_Impuestos_Retenciones_Retencion on Tue Dec 26 2023 18:31:04 GMT-0500 (Eastern Standard Time). For more information please see http://www.xsd2jsonschema.org", + "description": "Atributo requerido para señalar el monto del impuesto retenido. No se permiten valores negativos.", + "required": [ + "Impuesto", + "Importe" + ], + "properties": { + "Impuesto": { + "$ref": "catalogos.json#/definitions/c_Impuesto" + }, + "Importe": { + "$ref": "tipoDatos.json#/definitions/t_Importe" + } + }, + "type": "object", + "definitions": {} +} \ No newline at end of file diff --git a/packages/cfdi/schema/src/files/schema/impuestos/traslado.json b/packages/cfdi/schema/src/files/schema/impuestos/traslado.json new file mode 100644 index 0000000..177db62 --- /dev/null +++ b/packages/cfdi/schema/src/files/schema/impuestos/traslado.json @@ -0,0 +1,28 @@ +{ + "$id": "comprobante_Impuestos_Traslados_Traslado.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "This JSON Schema file was generated from comprobante_Impuestos_Traslados_Traslado on Tue Dec 26 2023 18:31:04 GMT-0500 (Eastern Standard Time). For more information please see http://www.xsd2jsonschema.org", + "description": "Atributo condicional para señalar la suma del importe del impuesto trasladado, agrupado por impuesto, TipoFactor y TasaOCuota. No se permiten valores negativos.", + "required": ["Base", "Impuesto", "TipoFactor"], + "properties": { + "Base": { + "$ref": "tipoDatos.json#/definitions/t_Importe" + }, + "Impuesto": { + "$ref": "catalogos.json#/definitions/c_Impuesto" + }, + "TipoFactor": { + "$ref": "catalogos.json#/definitions/c_TipoFactor" + }, + "TasaOCuota": { + "description": "Atributo condicional para señalar el valor de la tasa o cuota del impuesto que se traslada por los conceptos amparados en el comprobante.", + "minimum": 0, + "type": "number" + }, + "Importe": { + "$ref": "tipoDatos.json#/definitions/t_Importe" + } + }, + "type": "object", + "definitions": {} +} diff --git a/packages/cfdi/schema/src/files/schema/informacionglobal/informacionglobal.json b/packages/cfdi/schema/src/files/schema/informacionglobal/informacionglobal.json new file mode 100644 index 0000000..cc76977 --- /dev/null +++ b/packages/cfdi/schema/src/files/schema/informacionglobal/informacionglobal.json @@ -0,0 +1 @@ +{"$id":"comprobante_InformacionGlobal.json","$schema":"http://json-schema.org/draft-07/schema#","title":"This JSON Schema file was generated from comprobante_InformacionGlobal on Tue Dec 26 2023 18:31:04 GMT-0500 (Eastern Standard Time). For more information please see http://www.xsd2jsonschema.org","description":"Atributo requerido para expresar el mes o los meses al que corresponde la información del comprobante global.","required":["Periodicidad","Meses","Año"],"properties":{"Periodicidad":{"$ref":"catalogos.json#/definitions/c_Periodicidad"},"Meses":{"$ref":"catalogos.json#/definitions/c_Meses"},"Año":{"description":"Atributo requerido para expresar el año al que corresponde la información del comprobante global.","maximum":32767,"minimum":2021,"type":"integer"}},"type":"object","definitions":{}} \ No newline at end of file diff --git a/packages/cfdi/schema/src/files/schema/receptor/receptor.json b/packages/cfdi/schema/src/files/schema/receptor/receptor.json new file mode 100644 index 0000000..121cc5f --- /dev/null +++ b/packages/cfdi/schema/src/files/schema/receptor/receptor.json @@ -0,0 +1,43 @@ +{ + "$id": "comprobante_Receptor.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "This JSON Schema file was generated from comprobante_Receptor on Tue Dec 26 2023 18:31:04 GMT-0500 (Eastern Standard Time). For more information please see http://www.xsd2jsonschema.org", + "description": "Atributo requerido para expresar la clave del uso que dará a esta factura el receptor del CFDI.", + "required": ["Rfc", "Nombre", "DomicilioFiscalReceptor", "RegimenFiscalReceptor", "UsoCFDI"], + "properties": { + "Rfc": { + "$ref": "tipoDatos.json#/definitions/t_RFC" + }, + "Nombre": { + "description": "Atributo requerido para registrar el nombre(s), primer apellido, segundo apellido, según corresponda, denominación o razón social del contribuyente, inscrito en el RFC, del receptor del comprobante.", + "maxLength": 300, + "minLength": 1, + "pattern": "[^|]{1,300}", + "type": "string" + }, + "DomicilioFiscalReceptor": { + "description": "Atributo requerido para registrar el código postal del domicilio fiscal del receptor del comprobante.", + "maxLength": 5, + "minLength": 5, + "pattern": "[0-9]{5}", + "type": "string" + }, + "ResidenciaFiscal": { + "$ref": "catalogos.json#/definitions/c_Pais" + }, + "NumRegIdTrib": { + "description": "Atributo condicional para expresar el número de registro de identidad fiscal del receptor cuando sea residente en el extranjero. Es requerido cuando se incluya el complemento de comercio exterior.", + "maxLength": 40, + "minLength": 1, + "type": "string" + }, + "RegimenFiscalReceptor": { + "$ref": "catalogos.json#/definitions/c_RegimenFiscal" + }, + "UsoCFDI": { + "$ref": "catalogos.json#/definitions/c_UsoCFDI" + } + }, + "type": "object", + "definitions": {} +} diff --git a/packages/cfdi/schema/src/files/tdCFDI.xsd b/packages/cfdi/schema/src/files/tdCFDI.xsd new file mode 100644 index 0000000..86dd233 --- /dev/null +++ b/packages/cfdi/schema/src/files/tdCFDI.xsd @@ -0,0 +1,157 @@ + + + + + Tipo definido para expresar la Clave Única de Registro de Población (CURP) + + + + + + + + + + Tipo definido para expresar importes numéricos con fracción hasta seis decimales. No se permiten valores negativos. + + + + + + + + + + + Tipo definido para la expresión de la fecha. Se expresa en la forma AAAA-MM-DD. + + + + + + + + + Tipo definido para expresar importes monetarios en moneda nacional MXN con fracción hasta dos decimales. No se permiten valores negativos. + + + + + + + + + + + Tipo definido para expresar la cuenta bancarizada. + + + + + + + + + Tipo definido para expresar claves del Registro Federal de Contribuyentes + + + + + + + + + + + Tipo definido para la expresión de un Registro Federal de Contribuyentes de persona moral. + + + + + + + + + + Tipo definido para la expresión de un Registro Federal de Contribuyentes de persona física. + + + + + + + + + + Tipo definido para la expresión de la fecha y hora. Se expresa en la forma AAAA-MM-DDThh:mm:ss + + + + + + + + + Tipo definido para la expresión de la fecha y hora. Se expresa en la forma AAAA-MM-DDThh:mm:ss + + + + + + + + + Tipo definido para expresar la calle en que está ubicado el domicilio del emisor del comprobante o del destinatario de la mercancía. + + + + + + + + + + + Tipo definido para expresar el número interior o el número exterior en donde se ubica el domicilio del emisor del comprobante o del destinatario de la mercancía. + + + + + + + + + + + Tipo definido para expresar la referencia geográfica adicional que permita una fácil o precisa ubicación del domicilio del emisor del comprobante o del destinatario de la mercancía, por ejemplo las coordenadas GPS. + + + + + + + + + + + Tipo definido para expresar la colonia, localidad o municipio en que está ubicado el domicilio del emisor del comprobante o del destinatario de la mercancía. + + + + + + + + + + + Tipo definido para expresar el tipo de cambio. No se permiten valores negativos. + + + + + + + + + diff --git a/packages/cfdi/schema/src/index.ts b/packages/cfdi/schema/src/index.ts new file mode 100644 index 0000000..fade8ee --- /dev/null +++ b/packages/cfdi/schema/src/index.ts @@ -0,0 +1,4 @@ +export { CfdiSchema } from './schema.xsd'; +export { CfdiSchema as default } from './schema.xsd'; +export { CfdiProcess } from './CfdiProcess'; + diff --git a/packages/cfdi/schema/src/schema.xsd.ts b/packages/cfdi/schema/src/schema.xsd.ts new file mode 100644 index 0000000..0a97d8b --- /dev/null +++ b/packages/cfdi/schema/src/schema.xsd.ts @@ -0,0 +1,163 @@ +import { ElementCompact, js2xml, json2xml, xml2js } from 'xml-js'; +import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'; + +import { Catalogs } from './CatalogProcess'; +import { CfdiProcess } from './CfdiProcess'; +import { STRUCTURE } from './common/const/structure'; +// @ts-ignore +import { Xsd2JsonSchema } from 'xsd2jsonschema'; +import { Complementos } from './complementos/complementos.process'; + +export class CfdiSchema { + private static instance: CfdiSchema; + private options = { + xsd: { + cfdi: '', + catalogos: '', + tipoDatos: '', + complementos: [], + }, + }; + private schemaName: any = { + catalogos: [], + comprobante: [], + complementos: [], + unknow: [], + }; + private xs2js: Xsd2JsonSchema; + private schemasJSON: Record = {}; + private schemas: { + name: string; + type: string; + schema: Record; + path: string; + key: string; + }[] = []; + private cfdiProcess: CfdiProcess; + private catalogProcess: Catalogs; + private complementos: Complementos; + + constructor() { + this.xs2js = new Xsd2JsonSchema(); + this.catalogProcess = Catalogs.of(); + this.cfdiProcess = CfdiProcess.of(); + this.cfdiProcess = CfdiProcess.of(); + this.complementos = Complementos.of(); + } + setConfig(options: any) { + this.options.xsd = options.xsd; + this.cfdiProcess.setConfig({ path: options.xsd.cfdi }); + this.catalogProcess.setConfig(options.xsd.catalogos); + this.complementos.setConfig({ path: options.xsd.complementos }); + } + + public static of(): CfdiSchema { + if (!CfdiSchema.instance) { + CfdiSchema.instance = new CfdiSchema(); + } + return CfdiSchema.instance; + } + + async processAll() { + this.schemaName = { + catalogos: [], + comprobante: [], + complementos: [], + unknow: [], + }; + this.schemas = []; + const catalog = await this.catalogProcess.process(); + const tiposDatos = await this.tipoDatos(); + const cfdi = await this.cfdiProcess.process(); + const complementos = await this.complementos.process(); + const extras = { + ...tiposDatos, + ...catalog, + // ...cfdi, + }; + cfdi + .filter((c: any) => c.name !== 'unknow') + .forEach((c: any) => { + const res = this.generateSchema( + { + ...extras, + [c.key]: c.xsd, + }, + c + ); + const filter = res.filter((r) => { + const index = this.schemas.findIndex((s) => s.key === r.key); + return index === -1 && !!r.schema.properties; + }); + + this.schemas.push(...filter); + }); + + complementos.forEach((c: any) => { + const res = this.generateSchema( + { + // ...extras, + [c.key]: c.xsd, + }, + c + ); + this.schemas.push(...res); + }); + return { + schemas: this.schemas, + }; + } + + generateSchema(schemasJSON: any, c: any) { + const xs2js = new Xsd2JsonSchema(); + + const convertedSchemas = xs2js.processAllSchemas({ + schemas: schemasJSON, + }); + + return Object.keys(schemasJSON).map((key) => { + const d = STRUCTURE[c.name] ? 'comprobante' : 'catalogos'; + if (c.key !== key) { + console.log(key); + } + return { + name: c.key === key ? c.name : key, + key: c.key === key ? c.key : `catalogos_${key}`, + path: c.key === key ? c.folder || 'catalogos' : 'catalogos', + type: c.key === key ? c.type || 'comprobante' : 'catalogos', + schema: convertedSchemas[key].getJsonSchema(), + }; + }); + } + + async save(path: string) { + const cfdi = `${path}cfdi.json`; + + this.schemas.forEach((schema) => { + const name = schema.name.toLowerCase(); + const fileName = `${name}.json`; + const direction = `${path}${ + schema.path.toLocaleLowerCase() || 'catalogos' + }`; + const file = `${direction}/${fileName}`; + + this.schemaName[schema.type].push({ + name, + type: schema.type, + key: schema.key.toLocaleUpperCase(), + path: schema.path.toLocaleLowerCase() || 'catalogos', + }); + !existsSync(direction) && mkdirSync(direction); + if (!existsSync(file)) { + writeFileSync(file, JSON.stringify(schema.schema)); + } + }); + + writeFileSync(cfdi, JSON.stringify(this.schemaName)); + } + + tipoDatos() { + const tipoDatosXsd = readFileSync(this.options.xsd.tipoDatos, 'utf-8'); + return { tipoDatos: tipoDatosXsd }; + } +} diff --git a/packages/cfdi/schema/src/utils/manager.ts b/packages/cfdi/schema/src/utils/manager.ts new file mode 100644 index 0000000..b07bc61 --- /dev/null +++ b/packages/cfdi/schema/src/utils/manager.ts @@ -0,0 +1,3 @@ +export function existsFile(filePath: string): boolean { + // return existsSync(`${this.route}${filePath}`); +} diff --git a/packages/cfdi/schema/src/utils/xsdElements.ts b/packages/cfdi/schema/src/utils/xsdElements.ts new file mode 100644 index 0000000..3ed42e9 --- /dev/null +++ b/packages/cfdi/schema/src/utils/xsdElements.ts @@ -0,0 +1,8 @@ +export const INFORMACION_GLOBAL = 'InformacionGlobal'; +export const CFDI_RELACIONADOS = 'CfdiRelacionados'; +export const EMISOR = 'Emisor'; +export const RECEPTOR = 'Receptor'; +export const CONCEPTOS = 'Conceptos'; +export const IMPUESTOS = 'Impuestos'; +export const COMPLEMENTO = 'Complemento'; +export const ADDENDA = 'Addenda'; diff --git a/packages/cfdi/schema/test/blah.test.ts b/packages/cfdi/schema/test/blah.test.ts new file mode 100644 index 0000000..6ac5919 --- /dev/null +++ b/packages/cfdi/schema/test/blah.test.ts @@ -0,0 +1,7 @@ +import { describe, expect, it, test } from 'vitest'; + +describe('blah', () => { + it('works', () => { + expect(2).toEqual(2); + }); +}); diff --git a/packages/cfdi/schema/tsconfig.json b/packages/cfdi/schema/tsconfig.json new file mode 100644 index 0000000..53e2475 --- /dev/null +++ b/packages/cfdi/schema/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "./node_modules/@recreando/typescript-settings/profiles/default/tsconfig-base.json", + "compilerOptions": { + "lib": ["dom", "esnext"], + "types": [ "node" ], + "importHelpers": true, + // output .d.ts declaration files for consumers + "declaration": true, + // output .js.map sourcemap files for consumers + "sourceMap": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + } +} diff --git a/packages/cfdi/schema/vitest.config.mts b/packages/cfdi/schema/vitest.config.mts new file mode 100644 index 0000000..f2a4ec6 --- /dev/null +++ b/packages/cfdi/schema/vitest.config.mts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vitest/config'; +import tsconfigPaths from 'vite-tsconfig-paths'; // only if you are using custom tsconfig paths + +export default defineConfig({ + test: {}, + plugins: [tsconfigPaths()], // only if you are using custom tsconfig paths +}); diff --git a/packages/cfdi/xml2json/src/backup.ts b/packages/cfdi/xml2json/src/backup.ts deleted file mode 100644 index 18605bc..0000000 --- a/packages/cfdi/xml2json/src/backup.ts +++ /dev/null @@ -1,157 +0,0 @@ -const cleanJson = (obj: any): any => { - if (Array.isArray(obj)) { - return obj.map(cleanJson); - } else if (typeof obj === 'object' && obj !== null) { - const newObj: Record = {}; - for (const key in obj) { - const cleanKey = ( - key.includes(':') ? key.split(':').pop() : key - ) as string; - const value = cleanJson(obj[key]); - - if (key === '_attributes') { - Object.assign(newObj, value); - } else if (typeof value === 'object' && value !== null) { - const keys = Object.keys(value); - if ( - keys.length === 1 && - typeof value[keys[0]] === 'object' && - value[keys[0]] !== null - ) { - newObj[cleanKey] = Array.isArray(value[keys[0]]) - ? value[keys[0]] - : [value[keys[0]]]; - } else { - newObj[cleanKey] = value; - } - } else { - newObj[cleanKey] = value; - } - } - - return newObj; - } - - return obj; - }; - - interface Element { - name: string; - attributes: Record; - elements: Element[]; - } - - const cleanJson2 = (elements: Element[]): Record[] => { - const resolutions: Record[] = []; - - elements.forEach((element) => { - const name = element.name as string; - const attributes = element.attributes; - const child_elements = element.elements as Element[]; - - // Creamos un objeto para almacenar los datos del elemento - const elementData: Record = {}; - - // Agregamos los atributos del elemento al objeto - Object.keys(attributes).forEach((key) => { - elementData[key] = attributes[key]; - }); - - // Si tiene elementos hijos, los procesamos de forma recursiva - if (child_elements && child_elements.length > 0) { - const childData: Record[] = []; - child_elements.forEach((child_element) => { - const child_name = child_element.name as string; - const child_attributes = child_element.attributes; - - const child_elementData: Record = {}; - - // Agregamos los atributos del hijo - Object.keys(child_attributes).forEach((key) => { - child_elementData[key] = child_attributes[key]; - }); - - // Recursión para manejar subelementos anidados - const grandchild_elements = child_element.elements as Element[]; - if (grandchild_elements && grandchild_elements.length > 0) { - child_elementData[child_name] = cleanJson2(grandchild_elements); - } - - childData.push(child_elementData); - }); - - // Se agregan los hijos al objeto principal - elementData[name] = childData; - } - - // Añadimos el objeto al array de resultados - resolutions.push(elementData); - }); - - return resolutions; - }; - const extractElement = (node: Element, options = {}): any => { - const { parentName = '', isPlural } = options as { - parentName?: string; - isPlural?: boolean; - }; - const isPluralLocal = parentName.endsWith('s') && parentName.slice(0, -1) === node.name; - const data = {}; - - const subelements = node.elements; - let subelementos2 = [] - if (subelements && subelements.length > 0){ - subelementos2 = extractElements(subelements, { parentName: node.name, isPlural: isPluralLocal }); - } - - if (isPluralLocal) { - - Object.assign(data, node.attributes); - - } else { - Object.assign(data, { - [`${node.name}`]: node.attributes ? node.attributes : subelementos2, - }); - } - console.log("data", data); - return data; - }; - - const extractElements = (elements: Element[], options = {}): any => { - const { parentName = '', isPlural = false } = options as { - parentName?: string; - isPlural?: boolean; - }; - const extracted = elements.map((el, i) => { - const result_child = extractElement(el, { parentName, isPlural}); - return result_child - }); - - return extracted; - }; - const transformToCompact = (node: Element, options: any) => { - const { isPlural = false } = options; - if (!node || typeof node !== 'object') return node; - - const result = {}; - - if (node.attributes) { - Object.assign(result, node.attributes); - } - - // Convierte elementos - if (node.elements && node.elements.length > 0) { - const subelementos = extractElements(node.elements, { - parentName: node.name, - isPlural, - }); - console.log("subelementos", subelementos); - subelementos.forEach((el) => { - Object.assign(result, el); - }); - } - - return { - [node.name]: result - }; - }; \ No newline at end of file diff --git a/packages/cfdi/xml2json/src/backup2.ts b/packages/cfdi/xml2json/src/backup2.ts deleted file mode 100644 index 3c116b1..0000000 --- a/packages/cfdi/xml2json/src/backup2.ts +++ /dev/null @@ -1,101 +0,0 @@ -const toCompactElements = ( - elements: Element[], - { isPlural, parent }: any - ) => { - let result: any = []; - console.log('elements', elements); - - elements.forEach((element) => { - const name = element.name as string; - const attributes = Boolean(element.attributes); - const res = parent.replace(name, ''); - console.log('res', res); - const isLocalPlural = ['s', 'es'].includes(res); - if (attributes && !isPlural) { - if (isLocalPlural) { - result.push(element.attributes) - } else { - result[name] = element.attributes; - } - } - - const d = toCompactElements(element.elements ?? [], { - isPlural: isLocalPlural, - parent: name, - }); - - console.log(` - ============ - parent: ${parent} - name: ${name} - isPlural: ${isPlural} - isLocalPlural: ${isLocalPlural} - d: ${JSON.stringify(d)} - =========== - `); - console.log('result', result); - - if (!isLocalPlural) { - /* result[name] = { - ...result[name], - ...d, - }; */ - } - }); - - return result; - }; - - const toCompact = (node: Element, options: any) => { - const { parent = '', isPlural } = options || {}; - const nodeName = node.name as string; - console.log('node', node); - - let result: any = {}; - - if (node.attributes) { - Object.assign(result, node.attributes); - } - - if (node.elements && node.elements.length > 0) { - node.elements.forEach((element) => { - const name = element.name as string; - const attributes = Boolean(element.attributes); - const res = parent.replace(name, ''); - console.log('res', res); - const isLocalPlural = ['s', 'es'].includes(res); - if (attributes && !isPlural) { - if (isLocalPlural) { - result = element.attributes; - } else { - result[name] = element.attributes; - } - } - - const d = toCompactElements(element.elements ?? [], { - isPlural: isLocalPlural, - parent: name, - }); - - console.log(` - ============ - parent: ${parent} - name: ${name} - isPlural: ${isPlural} - isLocalPlural: ${isLocalPlural} - d: ${JSON.stringify(d)} - =========== - `); - console.log('result', result); - - if (!isLocalPlural) { - result[name] = { - ...result[name], - ...d, - }; - } - }); - } - - return result; - }; \ No newline at end of file diff --git a/packages/cfdi/xml2json/src/cfdi/catalogo.ts b/packages/cfdi/xml2json/src/cfdi/catalogo.ts new file mode 100644 index 0000000..0dacf83 --- /dev/null +++ b/packages/cfdi/xml2json/src/cfdi/catalogo.ts @@ -0,0 +1,12 @@ +export class Catalogo { + private data: Record = {} + constructor(value: T) {} + + get label(): string { + return '' + } + + get value(): string { + return '' + } +} \ No newline at end of file diff --git a/packages/cfdi/xml2json/src/cfdi/cfdi.factory.ts b/packages/cfdi/xml2json/src/cfdi/cfdi.factory.ts new file mode 100644 index 0000000..613d89b --- /dev/null +++ b/packages/cfdi/xml2json/src/cfdi/cfdi.factory.ts @@ -0,0 +1,15 @@ +import { Concepto } from "./concepto"; +import { XmlConceptoAttributes } from "@cfdi/types"; + +export class CFDIFactory { + data!: XmlConceptoAttributes; + constructor(data: XmlConceptoAttributes){ + this.data = data + } + + build(): Concepto { + const concepto = new Concepto(this.data) + return concepto + } + +} \ No newline at end of file diff --git a/packages/cfdi/xml2json/src/cfdi/concepto.factory.ts b/packages/cfdi/xml2json/src/cfdi/concepto.factory.ts new file mode 100644 index 0000000..895110b --- /dev/null +++ b/packages/cfdi/xml2json/src/cfdi/concepto.factory.ts @@ -0,0 +1,15 @@ +import { Concepto } from "./concepto"; +import { ObjetoImp, ObjetoImpEnum, XmlConceptoAttributes } from "@cfdi/types"; + +export class ConceptFactory { + data!: XmlConceptoAttributes; + constructor(data: XmlConceptoAttributes){ + this.data = data + } + + build(): Concepto { + const concepto = new Concepto(this.data) + return concepto + } + +} \ No newline at end of file diff --git a/packages/cfdi/xml2json/src/cfdi/concepto.ts b/packages/cfdi/xml2json/src/cfdi/concepto.ts new file mode 100644 index 0000000..d53dc8c --- /dev/null +++ b/packages/cfdi/xml2json/src/cfdi/concepto.ts @@ -0,0 +1,36 @@ +import { ObjetoImp, ObjetoImpEnum, XmlConceptoAttributes, XmlImpuestosTrasladados } from "@cfdi/types"; +import { Impuestos } from "./impuestos"; +import { Catalogo } from "./catalogo"; + +export class Concepto { + claveProdServ: string; + noIdentificacion?: string; + cantidad: number | string; + claveUnidad: string; + unidad?: string; + descripcion: string; + valorUnitario: number | string; + importe: number | string; + descuento?: number | string; + objetoImp: Catalogo + impuestos?: Impuestos; + + constructor(data: XmlConceptoAttributes){ + this.claveProdServ = data.ClaveProdServ + this.noIdentificacion = data.NoIdentificacion + this.cantidad = data.Cantidad + this.claveUnidad = data.ClaveUnidad + this.unidad = data.Unidad + this.descripcion = data.Descripcion + this.valorUnitario = data.ValorUnitario + this.importe = data.Importe + this.descuento = data.Descuento + this.objetoImp = new Catalogo(data.ObjetoImp) + } + + + setImpuestos(impuestos: XmlImpuestosTrasladados) { + this.impuestos = new Impuestos(impuestos) + } + +} \ No newline at end of file diff --git a/packages/cfdi/xml2json/src/cfdi/impuestos.factory.ts b/packages/cfdi/xml2json/src/cfdi/impuestos.factory.ts new file mode 100644 index 0000000..15d0ebe --- /dev/null +++ b/packages/cfdi/xml2json/src/cfdi/impuestos.factory.ts @@ -0,0 +1,15 @@ +import { ObjetoImp, ObjetoImpEnum, XmlConceptoAttributes, XmlImpuestosTrasladados } from "@cfdi/types"; +import { Impuestos } from "./impuestos"; + +export class TaxesFactory { + data!: XmlImpuestosTrasladados; + constructor(data: XmlImpuestosTrasladados){ + this.data = data + } + + build() { + const impuestos = new Impuestos(this.data) + return impuestos + } + +} \ No newline at end of file diff --git a/packages/cfdi/xml2json/src/cfdi/impuestos.ts b/packages/cfdi/xml2json/src/cfdi/impuestos.ts new file mode 100644 index 0000000..667799b --- /dev/null +++ b/packages/cfdi/xml2json/src/cfdi/impuestos.ts @@ -0,0 +1,8 @@ +export class Impuestos { + constructor(data: any) { + Object.assign(this, data); + } + data() { + console.log(this, "impuestos data") + } +} \ No newline at end of file diff --git a/packages/cfdi/xml2json/src/cfdi/index.ts b/packages/cfdi/xml2json/src/cfdi/index.ts new file mode 100644 index 0000000..32bbecc --- /dev/null +++ b/packages/cfdi/xml2json/src/cfdi/index.ts @@ -0,0 +1,41 @@ +import { Concepto } from './concepto'; +import { XmlToJson } from '../xmlToJson'; +import { + XmlConceptoAttributes, + XmlEmisorAttribute, + XmlReceptorAttribute, +} from '@cfdi/types'; +import { ConceptFactory } from './concepto.factory'; +export class CFDI { + json: Record = {}; + constructor(xml: string) { + this.json = XmlToJson(xml); + } + + get comprobante() { + return this.json.Comprobante; + } + + get emisor(): XmlEmisorAttribute { + return this.json.Comprobante; + } + + get receptor(): XmlReceptorAttribute { + return this.json.Comprobante?.Receptor; + } + + get conceptos(): Concepto[] { + const conceptos = this.json.Comprobante?.Conceptos || []; + return conceptos.map((concepto: XmlConceptoAttributes) => { + return new ConceptFactory(concepto).build(); + }); + } + + get impuestos() { + return this.json.Comprobante?.Impuestos; + } + + get complemento() { + return this.json.Comprobante?.Complemento; + } +} diff --git a/packages/cfdi/xml2json/src/xmlToJson.ts b/packages/cfdi/xml2json/src/xmlToJson.ts index 9f921c1..4e47248 100644 --- a/packages/cfdi/xml2json/src/xmlToJson.ts +++ b/packages/cfdi/xml2json/src/xmlToJson.ts @@ -14,8 +14,9 @@ export function XmlToJson( ignoreComment: false, compact: false, ignoreDeclaration: false, - elementNameFn: (name: string) => - original ? name : name.replace(/^.*:/, ''), + elementNameFn: (name: string) => { + return original ? name : name.replace(/^.*:/, '') + } }; const json = xml2js(stringXml, options); diff --git a/packages/cfdi/xml2json/test/cfdi-class.test.ts b/packages/cfdi/xml2json/test/cfdi-class.test.ts new file mode 100644 index 0000000..b9b37d9 --- /dev/null +++ b/packages/cfdi/xml2json/test/cfdi-class.test.ts @@ -0,0 +1,31 @@ +import { describe, expect, it, test } from 'vitest'; +import { XmlToJson } from '../src/xmlToJson'; +import { CFDI } from '../src/cfdi'; +import path from 'path'; +import { Concepto } from '../src/cfdi/Concepto'; + +const files_path = path.resolve(__dirname, '..', '..', '..', 'files', 'xml'); +const nameCFDI = '5E2D6AFF-2DD7-43D1-83D3-14C1ACA396D9.xml'; +const xml = path.resolve(files_path, nameCFDI); +const cfdi = new CFDI(xml); +describe('CFDI Class ', () => { + it('toObject', () => { + expect(cfdi).toBeDefined(); + expect(cfdi.receptor).toEqual({ + Nombre: 'AMIR MISAEL MARIN', + Rfc: 'XAXX010101000', + UsoCFDI: 'G03', + }); + }); + + it('conceptos', () => { + + const xml = path.resolve(files_path,'conceptos.xml') + const cfdi = new CFDI(xml); + + cfdi.conceptos.forEach((c) => { + console.log(c.Descripcion); + c.impuestos.data() + }) + }); +}); diff --git a/packages/server/src/app/cfdi/pdf/route.ts b/packages/server/src/app/cfdi/pdf/route.ts index 7f8ff57..72296e0 100644 --- a/packages/server/src/app/cfdi/pdf/route.ts +++ b/packages/server/src/app/cfdi/pdf/route.ts @@ -1,16 +1,15 @@ import {PDF117} from '@cfdi/designs/dist/index.cjs' - +import PDF111 from '@cfdi/designs/src/B333' export async function GET(request: Request) { /* const a = new PDF117( '/Users/amir/Documents/proyectos/amir/node/cfdi/packages/files/xml/5E2D6AFF-2DD7-43D1-83D3-14C1ACA396D9.xml', ); */ - const pdf = new PDF117() + const pdf = new PDF111() pdf.design() //console.log(pdf.design()) // pdf.design() const pdfBuffer = await pdf.getPDF().getBuffer() - console.log(pdfBuffer) //return Response.json({ message: 'Hello World' }) return new Response(pdfBuffer, { From 93d886e500676af40da0b74fb9e0b05d81afbbd8 Mon Sep 17 00:00:00 2001 From: MisaelMa Date: Fri, 27 Jun 2025 17:06:56 -0500 Subject: [PATCH 5/9] feat(core): free packages --- packages/cfdi/designs/.gitignore | 2 +- packages/cfdi/designs/dist/index.cjs.js | 1 - packages/cfdi/designs/dist/index.es.js | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) delete mode 100644 packages/cfdi/designs/dist/index.cjs.js delete mode 100644 packages/cfdi/designs/dist/index.es.js diff --git a/packages/cfdi/designs/.gitignore b/packages/cfdi/designs/.gitignore index 6f51bfd..9f874b7 100644 --- a/packages/cfdi/designs/.gitignore +++ b/packages/cfdi/designs/.gitignore @@ -33,7 +33,7 @@ build/Release # Dependency directories node_modules/ jspm_packages/ -packages/cfdi/schema/ +dist/ # Optional npm cache directory .npm diff --git a/packages/cfdi/designs/dist/index.cjs.js b/packages/cfdi/designs/dist/index.cjs.js deleted file mode 100644 index 31fc47e..0000000 --- a/packages/cfdi/designs/dist/index.cjs.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("pdfmake/build/pdfmake"),e=require("pdfmake/build/vfs_fonts"),n=require("@cfdi/utils");class o{columnConfig={width:"auto",text:[]};mode="text";constructor(t){const{children:e=[],width:n="auto",mode:o="text"}=t||{};this.mode=o,this.columnConfig[this.mode]=[],this.columnConfig.width=n,this.addContent(e)}addContent(t){if(Array.isArray(t)){const e=this.columnConfig[this.mode];this.columnConfig[this.mode]=[...e,...t]}else this.columnConfig[this.mode].push(t);return this}setContent(t){return this.addContent(t),this}setStack(t){return this.addContent(t),this}setWidth(t){return this.columnConfig.width=t,this}setStyle(t){return this.columnConfig.style=t,this}toJSON(){return this.columnConfig}}t.addVirtualFileSystem(e);class s{definition={content:[]};setContent(t){return this.definition.content=Array.isArray(t)?t:[t],this}addContent(t){return this.definition.content.push(t),this}setStyles(t){return this.definition.styles=t,this}setDefaultStyle(t){return this.definition.defaultStyle=t,this}toJSON(){return this.definition}getDocument(){return t.createPdf(this.definition)}async save(t,e){const n=t+`${e.replace(".pdf","")}.pdf`;try{return await this.getBuffer(),function(){throw new Error("Function not implemented.")}(),{save:!0,path:n}}catch(t){return{save:!1,error:t}}}async getBlob(t){return new Promise((async e=>{(await this.getDocument()).getBlob((t=>{e(t)}),t)}))}async getBase64(t){return new Promise((async e=>{(await this.getDocument()).getBase64((t=>{e(t)}),t)}))}async getBuffer(t){return new Promise((async e=>{(await this.getDocument()).getBuffer((t=>{e(t)}),t)}))}async getDataUrl(t){return new Promise((async e=>{(await this.getDocument()).getDataUrl((t=>{e(t)}),t)}))}async getStream(t){return(await this.getDocument()).getStream(t)}}class i{columns=[];columnGap=10;addColumn(t){return this.columns.push(t.toJSON()),this}setGap(t){return this.columnGap=t,this}toJSON(){return{columns:this.columns,columnGap:this.columnGap}}}class r{style={};constructor(t={}){this.style=t}setFont(t){return this.style.font=t,this}setFontSize(t){return this.style.fontSize=t,this}setLineHeight(t){return this.style.lineHeight=t,this}setBold(t=!0){return this.style.bold=t,this}setItalic(t=!0){return this.style.italics=t,this}setAlignment(t){return this.style.alignment=t,this}setColor(t){return this.style.color=t,this}setBackground(t){return this.style.background=t,this}setMargin(t){return this.style.margin=t,this}setOpacity(t){return this.style.opacity=t,this}setCharacterSpacing(t){return this.style.characterSpacing=t,this}toJSON(){return this.style}}class d{content;constructor(t){this.content={image:t}}setWidth(t){return this.content.width=t,this}setHeight(t){return this.content.height=t,this}setFit(t,e){return this.content.fit=[t,e],this}setAlignment(t){return this.content.alignment=t,this}setMargin(t){return this.content.margin=t,this}setOpacity(t){return this.content.opacity=t,this}setStyle(t){return this.content.style=t,this}toJSON(){return this.content}}class l{content;constructor(t,e){this.content={text:t},e&&(this.content.style=e.toJSON())}setBold(t){return this.content.bold=t,this}setMargin(t){return this.content.margin=t,this}setStyle(t){return this.content.style=t.toJSON(),this}addText(t,e){if(!Array.isArray(this.content.text)){let t=this.content.text,e=this.content.style??{};delete this.content.style,this.content.text=[{text:t,style:e}]}const n={text:t,...e??{}};return this.content.text.push(n),this}toJSON(){return this.content}}class a{content;constructor(){this.content={table:{body:[]}}}setHeader(t,e){const n=t.map((t=>{if("string"==typeof t)return{text:t,...e??{}};{const n=e?e.toJSON():{};return{...t,style:{...n,...t.style??{}}}}}));return this.content.table.body.unshift(n),this}addRow(t,e){const n=t.map((t=>{if("string"==typeof t)return{text:t,...e??{}};{const n=e?e.toJSON():{};return{...t,style:{...n,...t.style??{}}}}}));return this.content.table.body.push(n),this}setLayout(t){return this.content.layout=t,this}setStyle(t){return this.content={...this.content,style:t.toJSON()},this}setMargin(t){return this.content.margin=t,this}setWidths(t){return this.content.table.widths=t,this}toJSON(){return this.content}}class c{cell={};constructor(t,e){this.cell="string"==typeof t?{text:t,...e??{}}:{text:t.toJSON(),...e??{}}}setColSpan(t){return this.cell.colSpan=t,this}setStyle(t){return this.cell={...this.cell,...t.toJSON()},this}setBorder(t){return this.cell.border=t,this}setAlignment(t){return this.cell.alignment=t,this}toJSON(){return this.cell}}exports.PDF117=class{pdf=new s;design(){const t=(new i).setGap(10).addColumn(new o({mode:"stack",children:new d(n.logo).setHeight(100).setWidth(100).setAlignment("left").toJSON()})).addColumn(new o({children:"",width:40})).addColumn(new o({width:200}).setContent({text:"HERRERIA & ELECTRICOS S DE CV\n",style:{bold:!0,color:"#a76d09"}}).setContent({text:[{text:"R.F.C: ",style:{bold:!0,color:"#a76d09"}},{text:"H&E951128469\n"}]}).setContent({text:[{text:"REGIMEN: ",style:{bold:!0,color:"#a76d09"}},{text:"601 - GENERAL DE LEY PERSONAS MORALES\n"}]}).setContent({text:[{text:"LUGAR DE EXPEDICION: ",style:{bold:!0,color:"#a76d09"}},{text:"CONSTITUYENTES y 115 AV MZA.25 LT.2 Y 3, EJIDO NORTE, 77714 PLAYA DEL CARMEN, Q.R.\n"}]}).setStyle(new r({fontSize:9,color:"#a76d09"}))).addColumn(new o({width:200,mode:"stack"}).setContent([{alignment:"center",margin:[100,0,0,0],text:"FACTURA",style:{fontSize:9,bold:!0,color:"#FF5733"}},{margin:[80,0,0,10],alignment:"center",width:10,table:{body:[[{text:"FOLIO",style:{bold:!0,fontSize:9,alignment:"center",color:"#a76d09",margin:[0,0,0,0]}}],[{text:"A - MYLF-26"}]]},layout:{paddingLeft:(t,e)=>20,paddingRight:(t,e)=>20,paddingTop:(t,e)=>0,paddingBottom:(t,e)=>0,fillColor:(t,e,n)=>0===t?"#eeeeee":null}},{alignment:"center",margin:[80,0,0,0],table:{heights:10,body:[[{text:"FECHA",style:{bold:!0,fontSize:9,alignment:"center",margin:[0,0,0,0]}}],[{text:"2022-02-26T06:06:26"}]]},layout:{paddingTop:(t,e)=>0,paddingBottom:(t,e)=>0,fillColor:(t,e,n)=>0===t?"#eeeeee":null}}])),e=new r({bold:!0,color:"purple"}),s=new r({bold:!0,color:"#a76d09"}),h=new l("Datos del Cliente\n").setBold(!0).setMargin([0,20,0,10]).setStyle(new r({fontSize:10,color:"#0941a7"})).addText("Razon Social: ",s).addText("PUBLIC EN GENERAL\n",e).addText("R.F.C.: ",s).addText("XAXX010101000\n",e).addText("Uso CFDI: ",s).addText("P01\n",e),S=new a;S.setStyle(new r({fontSize:9})),S.setWidths([45,10,50,160,40,50,53,40]),S.setMargin([0,7,0,7]),S.setHeader([new c("CANTIDAD").setColSpan(2).toJSON(),new c("").toJSON(),new l("CLAVE SAT",new r({fillColor:"#C0C0C0"})).toJSON(),new c("CONCEPTO/DESCRIPCIÓN").toJSON(),new l("UNIDAD").toJSON(),new l("P.UNITARIO").toJSON(),new l("DESCUENTO").toJSON(),new l("IMPORTE").toJSON()],new r({fillColor:"black",color:"#a76d09",fontSize:9})),S.addRow([new c("1",new r({fillColor:"red"})).toJSON(),new c("2").toJSON(),new l("10001000",new r({fillColor:"purple"})).toJSON(),new l("HERRERIA & ELECTRICOS S DE CV").toJSON(),new l("UNIDAD").toJSON(),new l("100.00").toJSON(),new l("0.00").toJSON(),new l("100.00").toJSON()]),S.addRow([new c("1",new r({fillColor:"red"})).toJSON(),new c("2").toJSON(),new l("10001000",new r({fillColor:"purple"})).toJSON(),new l("HERRERIA & ELECTRICOS S DE CV").toJSON(),new l("UNIDAD").toJSON(),new l("100.00").toJSON(),new l("0.00").toJSON(),new l("100.00").toJSON()]);const u=new r({fontSize:9,bold:!0}),w=new l("CANTIDAD CON LETRA:\n",u).addText("OCHOCIENTOS TREINTA Y NUEVE PESOS 99/100 M.N.",new r({fontSize:9})),g=new l("SUBTOTAL: ",u).addText("$17240009.13\n",new r({fontSize:9})).addText("DESCUENTO: ",u).addText("$0.00\n",new r({fontSize:9})).addText("IMPUESTOS: ",u).addText("$275.87\n",new r({fontSize:9})).addText("TOTAL: ",u).addText("$2000.00",new r({fontSize:9}));S.addRow([new c(w).setColSpan(6).toJSON(),new c("2",new r({fillColor:"red"})).toJSON(),new l("10001000",new r({fillColor:"purple"})).toJSON(),new l("HERRERIA & ELECTRICOS S DE CV").toJSON(),new l("UNIDAD").toJSON(),new l("100.00").toJSON(),new c(g).setColSpan(2).toJSON(),new l("100.00").toJSON()]);const C=new r({bold:!0,color:"#a76d09"}),O=(new i).addColumn(new o({width:"50%",mode:"stack"}).setContent(new l("Forma de pago: ",C).addText("Efectivo").toJSON()).setContent(new l("Método de pago: ",C).addText("PUE - Pago en una sola exhibición").toJSON()).setContent(new l("No. de cuenta: ",C).addText("123456789").toJSON())).addColumn(new o({width:"50%",mode:"stack"}).setContent(new l("Moneda:",C).addText("MXN").toJSON()).setContent(new l("Tipo de comprobante: ",C).addText("I - Ingreso").toJSON())),N=new a;N.setWidths([250,250]),N.setStyle(new r({fontSize:9})),N.addRow([new c("No. CSD del Emisor").setBorder([!1,!1,!1,!1]).setStyle(new r({bold:!0,color:"orange"})).setAlignment("center").toJSON(),new c("Fecha y hora de certificacion").setBorder([!1,!1,!1,!1]).setStyle(new r({bold:!0,color:"green"})).setAlignment("center").toJSON()],new r({color:"#a76d09",fontSize:9})),N.addRow([new c("30001000000400002463").setBorder([!1,!0,!1,!1]).setAlignment("center").toJSON(),new c("2022-02-26T18:05:05").setBorder([!1,!0,!1,!1]).setAlignment("center").toJSON()],new r({color:"#a76d09",fontSize:9})),N.addRow([new c("Folio Fiscal").setBorder([!1,!1,!1,!1]).setAlignment("center").toJSON(),new c("No. CSD del SAT").setBorder([!1,!1,!1,!1]).setAlignment("center").toJSON()],new r({color:"#a76d09",fontSize:9})),N.addRow([new c("DC2ED983-D108-402E-A2FD-C08EDDA23C47").setBorder([!1,!0,!1,!1]).setAlignment("center").toJSON(),new c("30001000000400002495").setBorder([!1,!0,!1,!1]).setAlignment("center").toJSON()],new r({color:"#a76d09",fontSize:9}));const m=new r({bold:!0,fontSize:7,margin:[50,50,100,50]}),f=new r({fontSize:7}),E=(new i).addColumn(new o({width:"20%",mode:"stack"}).setContent({qr:"https://verificacfdi.facturaelectronica.sat.gob.mx/default.aspx?id=dc2ed983-d108-402e-a2fd-c08edda23c47&re=H&E951128469&rr=XAXX010101000&tt=000000000000002000.000000&fe=h8ZyAw==",fit:100,foreground:"#0941a7",alignment:"left"})).addColumn(new o({width:"80%",mode:"stack"}).setContent(new l("SELLO DIGITAL DEL EMISOR\n",m).addText("YHV2O4OPL7jZIQiuKTgygUb75wrYXRNkgQjKWXPUr19MRfE60v+ug5xHe/bb8hW3DK8Iw9MGiqh/+z5dM2ACWlFk77SqJpEMnBVRkgwmWA/84ltCtSmtQP8roBJHy3JarVPVXwNWgo2qVAaK9Hch5XJZbASlMnPp0JESkze6deZTB22XJRdKkXa1kKZcSx/v/X/+5m99RMUNjtOKerU4jpG0cigO0M/q3j0evKjR6f1uTtW77nYEHZc/++PaExEgO7CaK4Hvk5QNHLD3gngd8UZEG5gTCcZm45B7EyiKJOSOKlF7CEXc7UgY1mYQhbeFQht2+AB9fHYIF1Zzh8ZyAw==\n",f).addText("SELLO DEL SAT\n",m).addText("IUgJIUBUfH6d\n +AmgqQMM370OpyNnlFwLguCoSHJ5qPmPdVjymZjvji1gQiEJSroQXtrZIOQzlADTjsBDespCLE9CQSIaGLJFrUsaH7tJXibft+cBwcLDbZ/\n TTsuff8AV87f06GcVDSXSm6EZKp/dbOVh3lA6/c3QqVCESfKDY+5XLwmG4CkQWlRGEcx7tCVOCLVICNUloz6tGkaHjNOFocKk/\n DFrrvN0fBy8U1vqXK438WIbTqbRNvgGF2Wzkv8GJuiDPjMJEiiHv5Vi0Al26nAZaFFhgu5k1dcfQwxjRgMc7hmEidJ2ngb+96VFhuqlM\n +8lHkfoeFoprXjt+Zu4g==\n",f).addText("CADENA ORIGINAL DEL COMPLEMENTO DE CERTIFICACION DIGITAL DEL SAT\n",m).addText("||1.1|dc2ed983-d108-402e-a2fd-c08edda23c47|2022-02-26T18:05:05|SPR190613I52|\n YHV2O4OPL7jZIQiuKTgygUb75wrYXRNkgQjKWXPUr19MRfE60v+ug5xHe/bb8hW3DK8Iw9MGiqh/\n +z5dM2ACWlFk77SqJpEMnBVRkgwmWA/84ltCtSmtQP8roBJHy3JarVPVXwNWgo2qVAaK9Hch5XJZbASlMnPp0JESkze6deZTB22XJR\n dKkXa1kKZcSx/v/X/+5m99RMUNjtOKerU4jpG0cigO0M/q3j0evKjR6f1uTtW77nYEHZc/+\n +PaExEgO7CaK4Hvk5QNHLD3gngd8UZEG5gTCcZm45B7EyiKJOSOKlF7CEXc7UgY1mYQhbeFQht2+AB9fHYIF1Zzh8ZyAw==|\n 30001000000400002495||",f).toJSON()));this.pdf.addContent(t.toJSON()).addContent(h.toJSON()).addContent(S.toJSON()).addContent(O.toJSON()).addContent(N.toJSON()).addContent(E.toJSON()).setStyles({header:{fontSize:18,bold:!0}}).setDefaultStyle({fontSize:12})}getPDF(){return this.pdf}}; diff --git a/packages/cfdi/designs/dist/index.es.js b/packages/cfdi/designs/dist/index.es.js deleted file mode 100644 index 7599999..0000000 --- a/packages/cfdi/designs/dist/index.es.js +++ /dev/null @@ -1 +0,0 @@ -import t from"pdfmake/build/pdfmake";import e from"pdfmake/build/vfs_fonts";import{logo as n}from"@cfdi/utils";class o{columnConfig={width:"auto",text:[]};mode="text";constructor(t){const{children:e=[],width:n="auto",mode:o="text"}=t||{};this.mode=o,this.columnConfig[this.mode]=[],this.columnConfig.width=n,this.addContent(e)}addContent(t){if(Array.isArray(t)){const e=this.columnConfig[this.mode];this.columnConfig[this.mode]=[...e,...t]}else this.columnConfig[this.mode].push(t);return this}setContent(t){return this.addContent(t),this}setStack(t){return this.addContent(t),this}setWidth(t){return this.columnConfig.width=t,this}setStyle(t){return this.columnConfig.style=t,this}toJSON(){return this.columnConfig}}t.addVirtualFileSystem(e);class s{definition={content:[]};setContent(t){return this.definition.content=Array.isArray(t)?t:[t],this}addContent(t){return this.definition.content.push(t),this}setStyles(t){return this.definition.styles=t,this}setDefaultStyle(t){return this.definition.defaultStyle=t,this}toJSON(){return this.definition}getDocument(){return t.createPdf(this.definition)}async save(t,e){const n=t+`${e.replace(".pdf","")}.pdf`;try{return await this.getBuffer(),function(){throw new Error("Function not implemented.")}(),{save:!0,path:n}}catch(t){return{save:!1,error:t}}}async getBlob(t){return new Promise((async e=>{(await this.getDocument()).getBlob((t=>{e(t)}),t)}))}async getBase64(t){return new Promise((async e=>{(await this.getDocument()).getBase64((t=>{e(t)}),t)}))}async getBuffer(t){return new Promise((async e=>{(await this.getDocument()).getBuffer((t=>{e(t)}),t)}))}async getDataUrl(t){return new Promise((async e=>{(await this.getDocument()).getDataUrl((t=>{e(t)}),t)}))}async getStream(t){return(await this.getDocument()).getStream(t)}}class i{columns=[];columnGap=10;addColumn(t){return this.columns.push(t.toJSON()),this}setGap(t){return this.columnGap=t,this}toJSON(){return{columns:this.columns,columnGap:this.columnGap}}}class r{style={};constructor(t={}){this.style=t}setFont(t){return this.style.font=t,this}setFontSize(t){return this.style.fontSize=t,this}setLineHeight(t){return this.style.lineHeight=t,this}setBold(t=!0){return this.style.bold=t,this}setItalic(t=!0){return this.style.italics=t,this}setAlignment(t){return this.style.alignment=t,this}setColor(t){return this.style.color=t,this}setBackground(t){return this.style.background=t,this}setMargin(t){return this.style.margin=t,this}setOpacity(t){return this.style.opacity=t,this}setCharacterSpacing(t){return this.style.characterSpacing=t,this}toJSON(){return this.style}}class d{content;constructor(t){this.content={image:t}}setWidth(t){return this.content.width=t,this}setHeight(t){return this.content.height=t,this}setFit(t,e){return this.content.fit=[t,e],this}setAlignment(t){return this.content.alignment=t,this}setMargin(t){return this.content.margin=t,this}setOpacity(t){return this.content.opacity=t,this}setStyle(t){return this.content.style=t,this}toJSON(){return this.content}}class l{content;constructor(t,e){this.content={text:t},e&&(this.content.style=e.toJSON())}setBold(t){return this.content.bold=t,this}setMargin(t){return this.content.margin=t,this}setStyle(t){return this.content.style=t.toJSON(),this}addText(t,e){if(!Array.isArray(this.content.text)){let t=this.content.text,e=this.content.style??{};delete this.content.style,this.content.text=[{text:t,style:e}]}const n={text:t,...e??{}};return this.content.text.push(n),this}toJSON(){return this.content}}class a{content;constructor(){this.content={table:{body:[]}}}setHeader(t,e){const n=t.map((t=>{if("string"==typeof t)return{text:t,...e??{}};{const n=e?e.toJSON():{};return{...t,style:{...n,...t.style??{}}}}}));return this.content.table.body.unshift(n),this}addRow(t,e){const n=t.map((t=>{if("string"==typeof t)return{text:t,...e??{}};{const n=e?e.toJSON():{};return{...t,style:{...n,...t.style??{}}}}}));return this.content.table.body.push(n),this}setLayout(t){return this.content.layout=t,this}setStyle(t){return this.content={...this.content,style:t.toJSON()},this}setMargin(t){return this.content.margin=t,this}setWidths(t){return this.content.table.widths=t,this}toJSON(){return this.content}}class c{cell={};constructor(t,e){this.cell="string"==typeof t?{text:t,...e??{}}:{text:t.toJSON(),...e??{}}}setColSpan(t){return this.cell.colSpan=t,this}setStyle(t){return this.cell={...this.cell,...t.toJSON()},this}setBorder(t){return this.cell.border=t,this}setAlignment(t){return this.cell.alignment=t,this}toJSON(){return this.cell}}class h{pdf=new s;design(){const t=(new i).setGap(10).addColumn(new o({mode:"stack",children:new d(n).setHeight(100).setWidth(100).setAlignment("left").toJSON()})).addColumn(new o({children:"",width:40})).addColumn(new o({width:200}).setContent({text:"HERRERIA & ELECTRICOS S DE CV\n",style:{bold:!0,color:"#a76d09"}}).setContent({text:[{text:"R.F.C: ",style:{bold:!0,color:"#a76d09"}},{text:"H&E951128469\n"}]}).setContent({text:[{text:"REGIMEN: ",style:{bold:!0,color:"#a76d09"}},{text:"601 - GENERAL DE LEY PERSONAS MORALES\n"}]}).setContent({text:[{text:"LUGAR DE EXPEDICION: ",style:{bold:!0,color:"#a76d09"}},{text:"CONSTITUYENTES y 115 AV MZA.25 LT.2 Y 3, EJIDO NORTE, 77714 PLAYA DEL CARMEN, Q.R.\n"}]}).setStyle(new r({fontSize:9,color:"#a76d09"}))).addColumn(new o({width:200,mode:"stack"}).setContent([{alignment:"center",margin:[100,0,0,0],text:"FACTURA",style:{fontSize:9,bold:!0,color:"#FF5733"}},{margin:[80,0,0,10],alignment:"center",width:10,table:{body:[[{text:"FOLIO",style:{bold:!0,fontSize:9,alignment:"center",color:"#a76d09",margin:[0,0,0,0]}}],[{text:"A - MYLF-26"}]]},layout:{paddingLeft:(t,e)=>20,paddingRight:(t,e)=>20,paddingTop:(t,e)=>0,paddingBottom:(t,e)=>0,fillColor:(t,e,n)=>0===t?"#eeeeee":null}},{alignment:"center",margin:[80,0,0,0],table:{heights:10,body:[[{text:"FECHA",style:{bold:!0,fontSize:9,alignment:"center",margin:[0,0,0,0]}}],[{text:"2022-02-26T06:06:26"}]]},layout:{paddingTop:(t,e)=>0,paddingBottom:(t,e)=>0,fillColor:(t,e,n)=>0===t?"#eeeeee":null}}])),e=new r({bold:!0,color:"purple"}),s=new r({bold:!0,color:"#a76d09"}),h=new l("Datos del Cliente\n").setBold(!0).setMargin([0,20,0,10]).setStyle(new r({fontSize:10,color:"#0941a7"})).addText("Razon Social: ",s).addText("PUBLIC EN GENERAL\n",e).addText("R.F.C.: ",s).addText("XAXX010101000\n",e).addText("Uso CFDI: ",s).addText("P01\n",e),S=new a;S.setStyle(new r({fontSize:9})),S.setWidths([45,10,50,160,40,50,53,40]),S.setMargin([0,7,0,7]),S.setHeader([new c("CANTIDAD").setColSpan(2).toJSON(),new c("").toJSON(),new l("CLAVE SAT",new r({fillColor:"#C0C0C0"})).toJSON(),new c("CONCEPTO/DESCRIPCIÓN").toJSON(),new l("UNIDAD").toJSON(),new l("P.UNITARIO").toJSON(),new l("DESCUENTO").toJSON(),new l("IMPORTE").toJSON()],new r({fillColor:"black",color:"#a76d09",fontSize:9})),S.addRow([new c("1",new r({fillColor:"red"})).toJSON(),new c("2").toJSON(),new l("10001000",new r({fillColor:"purple"})).toJSON(),new l("HERRERIA & ELECTRICOS S DE CV").toJSON(),new l("UNIDAD").toJSON(),new l("100.00").toJSON(),new l("0.00").toJSON(),new l("100.00").toJSON()]),S.addRow([new c("1",new r({fillColor:"red"})).toJSON(),new c("2").toJSON(),new l("10001000",new r({fillColor:"purple"})).toJSON(),new l("HERRERIA & ELECTRICOS S DE CV").toJSON(),new l("UNIDAD").toJSON(),new l("100.00").toJSON(),new l("0.00").toJSON(),new l("100.00").toJSON()]);const u=new r({fontSize:9,bold:!0}),w=new l("CANTIDAD CON LETRA:\n",u).addText("OCHOCIENTOS TREINTA Y NUEVE PESOS 99/100 M.N.",new r({fontSize:9})),g=new l("SUBTOTAL: ",u).addText("$17240009.13\n",new r({fontSize:9})).addText("DESCUENTO: ",u).addText("$0.00\n",new r({fontSize:9})).addText("IMPUESTOS: ",u).addText("$275.87\n",new r({fontSize:9})).addText("TOTAL: ",u).addText("$2000.00",new r({fontSize:9}));S.addRow([new c(w).setColSpan(6).toJSON(),new c("2",new r({fillColor:"red"})).toJSON(),new l("10001000",new r({fillColor:"purple"})).toJSON(),new l("HERRERIA & ELECTRICOS S DE CV").toJSON(),new l("UNIDAD").toJSON(),new l("100.00").toJSON(),new c(g).setColSpan(2).toJSON(),new l("100.00").toJSON()]);const C=new r({bold:!0,color:"#a76d09"}),O=(new i).addColumn(new o({width:"50%",mode:"stack"}).setContent(new l("Forma de pago: ",C).addText("Efectivo").toJSON()).setContent(new l("Método de pago: ",C).addText("PUE - Pago en una sola exhibición").toJSON()).setContent(new l("No. de cuenta: ",C).addText("123456789").toJSON())).addColumn(new o({width:"50%",mode:"stack"}).setContent(new l("Moneda:",C).addText("MXN").toJSON()).setContent(new l("Tipo de comprobante: ",C).addText("I - Ingreso").toJSON())),m=new a;m.setWidths([250,250]),m.setStyle(new r({fontSize:9})),m.addRow([new c("No. CSD del Emisor").setBorder([!1,!1,!1,!1]).setStyle(new r({bold:!0,color:"orange"})).setAlignment("center").toJSON(),new c("Fecha y hora de certificacion").setBorder([!1,!1,!1,!1]).setStyle(new r({bold:!0,color:"green"})).setAlignment("center").toJSON()],new r({color:"#a76d09",fontSize:9})),m.addRow([new c("30001000000400002463").setBorder([!1,!0,!1,!1]).setAlignment("center").toJSON(),new c("2022-02-26T18:05:05").setBorder([!1,!0,!1,!1]).setAlignment("center").toJSON()],new r({color:"#a76d09",fontSize:9})),m.addRow([new c("Folio Fiscal").setBorder([!1,!1,!1,!1]).setAlignment("center").toJSON(),new c("No. CSD del SAT").setBorder([!1,!1,!1,!1]).setAlignment("center").toJSON()],new r({color:"#a76d09",fontSize:9})),m.addRow([new c("DC2ED983-D108-402E-A2FD-C08EDDA23C47").setBorder([!1,!0,!1,!1]).setAlignment("center").toJSON(),new c("30001000000400002495").setBorder([!1,!0,!1,!1]).setAlignment("center").toJSON()],new r({color:"#a76d09",fontSize:9}));const N=new r({bold:!0,fontSize:7,margin:[50,50,100,50]}),f=new r({fontSize:7}),E=(new i).addColumn(new o({width:"20%",mode:"stack"}).setContent({qr:"https://verificacfdi.facturaelectronica.sat.gob.mx/default.aspx?id=dc2ed983-d108-402e-a2fd-c08edda23c47&re=H&E951128469&rr=XAXX010101000&tt=000000000000002000.000000&fe=h8ZyAw==",fit:100,foreground:"#0941a7",alignment:"left"})).addColumn(new o({width:"80%",mode:"stack"}).setContent(new l("SELLO DIGITAL DEL EMISOR\n",N).addText("YHV2O4OPL7jZIQiuKTgygUb75wrYXRNkgQjKWXPUr19MRfE60v+ug5xHe/bb8hW3DK8Iw9MGiqh/+z5dM2ACWlFk77SqJpEMnBVRkgwmWA/84ltCtSmtQP8roBJHy3JarVPVXwNWgo2qVAaK9Hch5XJZbASlMnPp0JESkze6deZTB22XJRdKkXa1kKZcSx/v/X/+5m99RMUNjtOKerU4jpG0cigO0M/q3j0evKjR6f1uTtW77nYEHZc/++PaExEgO7CaK4Hvk5QNHLD3gngd8UZEG5gTCcZm45B7EyiKJOSOKlF7CEXc7UgY1mYQhbeFQht2+AB9fHYIF1Zzh8ZyAw==\n",f).addText("SELLO DEL SAT\n",N).addText("IUgJIUBUfH6d\n +AmgqQMM370OpyNnlFwLguCoSHJ5qPmPdVjymZjvji1gQiEJSroQXtrZIOQzlADTjsBDespCLE9CQSIaGLJFrUsaH7tJXibft+cBwcLDbZ/\n TTsuff8AV87f06GcVDSXSm6EZKp/dbOVh3lA6/c3QqVCESfKDY+5XLwmG4CkQWlRGEcx7tCVOCLVICNUloz6tGkaHjNOFocKk/\n DFrrvN0fBy8U1vqXK438WIbTqbRNvgGF2Wzkv8GJuiDPjMJEiiHv5Vi0Al26nAZaFFhgu5k1dcfQwxjRgMc7hmEidJ2ngb+96VFhuqlM\n +8lHkfoeFoprXjt+Zu4g==\n",f).addText("CADENA ORIGINAL DEL COMPLEMENTO DE CERTIFICACION DIGITAL DEL SAT\n",N).addText("||1.1|dc2ed983-d108-402e-a2fd-c08edda23c47|2022-02-26T18:05:05|SPR190613I52|\n YHV2O4OPL7jZIQiuKTgygUb75wrYXRNkgQjKWXPUr19MRfE60v+ug5xHe/bb8hW3DK8Iw9MGiqh/\n +z5dM2ACWlFk77SqJpEMnBVRkgwmWA/84ltCtSmtQP8roBJHy3JarVPVXwNWgo2qVAaK9Hch5XJZbASlMnPp0JESkze6deZTB22XJR\n dKkXa1kKZcSx/v/X/+5m99RMUNjtOKerU4jpG0cigO0M/q3j0evKjR6f1uTtW77nYEHZc/+\n +PaExEgO7CaK4Hvk5QNHLD3gngd8UZEG5gTCcZm45B7EyiKJOSOKlF7CEXc7UgY1mYQhbeFQht2+AB9fHYIF1Zzh8ZyAw==|\n 30001000000400002495||",f).toJSON()));this.pdf.addContent(t.toJSON()).addContent(h.toJSON()).addContent(S.toJSON()).addContent(O.toJSON()).addContent(m.toJSON()).addContent(E.toJSON()).setStyles({header:{fontSize:18,bold:!0}}).setDefaultStyle({fontSize:12})}getPDF(){return this.pdf}}export{h as PDF117}; From 448b48921e6e784b5b028126c0ee622ed33d6ac9 Mon Sep 17 00:00:00 2001 From: MisaelMa Date: Sun, 29 Jun 2025 19:10:59 -0500 Subject: [PATCH 6/9] feat(core): free packages --- .../rush/browser-approved-packages.json | 2 +- common/config/rush/pnpm-lock.yaml | 9 +- packages/cfdi/schema/README.md | 298 +++++++++- packages/cfdi/schema/UPGRADE_NOTES.md | 122 +++++ packages/cfdi/schema/src/CatalogProcess.ts | 43 -- packages/cfdi/schema/src/CfdiProcess.ts | 174 ------ packages/cfdi/schema/src/catalogos.xsd.ts | 40 ++ packages/cfdi/schema/src/cfdi.xsd.ts | 124 +++++ .../cfdi/schema/src/common/base-processor.ts | 66 +++ packages/cfdi/schema/src/common/constants.ts | 48 ++ packages/cfdi/schema/src/common/interfaces.ts | 64 +++ .../schema/src/common/processor-factory.ts | 68 +++ packages/cfdi/schema/src/common/xml-utils.ts | 98 ++++ packages/cfdi/schema/src/index.ts | 43 +- packages/cfdi/schema/src/loader.xsd.ts | 179 ++++++ packages/cfdi/schema/src/schema.xsd.ts | 16 +- packages/cfdi/schema/test/blah.test.ts | 7 - packages/cfdi/schema/test/cfdi.xsd.test.ts | 513 ++++++++++++++++++ .../cfdi/xml2json/test/cfdi-class.test.ts | 5 +- packages/server/package.json | 3 +- packages/server/src/app/cfdi/schema/route.ts | 8 + packages/server/tsconfig.json | 4 +- .../profiles/default/tsconfig-base.json | 3 + 23 files changed, 1682 insertions(+), 255 deletions(-) create mode 100644 packages/cfdi/schema/UPGRADE_NOTES.md delete mode 100644 packages/cfdi/schema/src/CatalogProcess.ts delete mode 100644 packages/cfdi/schema/src/CfdiProcess.ts create mode 100644 packages/cfdi/schema/src/catalogos.xsd.ts create mode 100644 packages/cfdi/schema/src/cfdi.xsd.ts create mode 100644 packages/cfdi/schema/src/common/base-processor.ts create mode 100644 packages/cfdi/schema/src/common/constants.ts create mode 100644 packages/cfdi/schema/src/common/interfaces.ts create mode 100644 packages/cfdi/schema/src/common/processor-factory.ts create mode 100644 packages/cfdi/schema/src/common/xml-utils.ts create mode 100644 packages/cfdi/schema/src/loader.xsd.ts delete mode 100644 packages/cfdi/schema/test/blah.test.ts create mode 100644 packages/cfdi/schema/test/cfdi.xsd.test.ts create mode 100644 packages/server/src/app/cfdi/schema/route.ts diff --git a/common/config/rush/browser-approved-packages.json b/common/config/rush/browser-approved-packages.json index 15ba121..800ea2c 100644 --- a/common/config/rush/browser-approved-packages.json +++ b/common/config/rush/browser-approved-packages.json @@ -68,7 +68,7 @@ }, { "name": "@cfdi/schema", - "allowedCategories": [ "libraries" ] + "allowedCategories": [ "libraries", "private" ] }, { "name": "@cfdi/types", diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index c9fd4f7..ce53123 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -1607,18 +1607,15 @@ importers: '@cfdi/pdf': specifier: workspace:* version: link:../cfdi/pdf + '@cfdi/schema': + specifier: workspace:* + version: link:../cfdi/schema '@cfdi/utils': specifier: workspace:* version: link:../cfdi/utils - '@types/pdfmake': - specifier: ^0.2.11 - version: 0.2.11 next: specifier: 15.2.3 version: 15.2.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - pdfmake: - specifier: ~0.2.18 - version: 0.2.18 react: specifier: ^19.0.0 version: 19.0.0 diff --git a/packages/cfdi/schema/README.md b/packages/cfdi/schema/README.md index b3a2438..2a9ad36 100644 --- a/packages/cfdi/schema/README.md +++ b/packages/cfdi/schema/README.md @@ -1,15 +1,295 @@ -utils -change this line in node_modules -xsd2jsonschema/src/converterDraft04.js - -534 this.addProperty(targetSchema, propertyName, oneOfSchema, minOccursAttr); +# @cfdi/schema - Clean Code Refactored Version -534 this.addProperty(targetSchema, propertyName, customType, minOccursAttr); +Sistema refactorizado para procesamiento de archivos XSD con arquitectura limpia, reutilización de código y eliminación de duplicaciones. +## 🎯 Características Principales +- ✅ **Carga Universal**: Soporte para URLs y archivos locales +- ✅ **Clean Code**: Eliminación de duplicaciones y centralización de lógica +- ✅ **Arquitectura Modular**: Clases base reutilizables y utilidades comunes +- ✅ **Factory Pattern**: Creación simplificada de procesadores +- ✅ **Constantes Centralizadas**: Sin valores hardcodeados +- ✅ **Interfaces Estandarizadas**: APIs consistentes +- ✅ **Compatibilidad hacia atrás**: Migración gradual sin romper código existente +## 📦 Instalación -497 // this.workingJsonSchema = this.namespaceManager.getType(nameAttr, jsonSchema, jsonSchema, xsd); -498 // jsonSchema.setSubSchema(nameAttr,jsonSchema); +```bash +npm install @cfdi/schema +``` -700 /xsd2jsonschema/src/jsonschema/jsonSchemaFile.js +## 🚀 Uso Rápido + +### Método 1: Factory Pattern (Recomendado) + +```typescript +import { processXSD, createCfdiProcessor } from '@cfdi/schema'; + +// Procesamiento directo desde URL +const cfdiResult = await processXSD( + 'cfdi', + 'https://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd' +); + +// Procesamiento directo desde archivo local +const catalogResult = await processXSD('catalog', './path/to/catalog.xsd'); + +// Con configuración personalizada +const processor = createCfdiProcessor({ + source: 'https://example.com/schema.xsd', + timeout: 20000, + encoding: 'utf-8', +}); +const result = await processor.process(); +``` + +### Método 2: Uso Tradicional (Compatible) + +```typescript +import { CfdiProcess, CatalogProcess } from '@cfdi/schema'; + +// CFDI desde URL +const cfdiProcessor = CfdiProcess.of(); +cfdiProcessor.setConfig({ + source: 'https://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd', +}); +const cfdiResult = await cfdiProcessor.process(); + +// Catálogo desde archivo local +const catalogProcessor = CatalogProcess.of(); +catalogProcessor.setConfig({ source: './catalog.xsd' }); +const catalogResult = await catalogProcessor.process(); +``` + +### Método 3: XSDLoader Directo + +```typescript +import { XSDLoader } from '@cfdi/schema'; + +const loader = XSDLoader.getInstance(); + +// Cargar múltiples archivos +const results = await loader.loadMultipleXSD([ + { source: 'https://example.com/schema1.xsd' }, + { source: './local-schema.xsd', timeout: 5000 }, +]); +``` + +## 🏗️ Arquitectura + +### Estructura Modular + +``` +src/ +├── common/ # Código común y reutilizable +│ ├── constants.ts # Constantes centralizadas +│ ├── interfaces.ts # Interfaces estandarizadas +│ ├── xml-utils.ts # Utilidades XML reutilizables +│ ├── base-processor.ts # Clase base abstracta +│ └── processor-factory.ts # Factory pattern +├── cfdi.xsd.ts # Procesador CFDI refactorizado +├── catalogos.xsd.ts # Procesador catálogos refactorizado +├── loader.xsd.ts # Cargador XSD universal +└── index.ts # Exportaciones principales +``` + +### Principios Aplicados + +1. **DRY (Don't Repeat Yourself)**: Eliminación de código duplicado +2. **Single Responsibility**: Cada clase tiene una responsabilidad específica +3. **Open/Closed**: Extensible sin modificar código existente +4. **Dependency Inversion**: Dependencias inyectadas, no hardcodeadas +5. **Factory Pattern**: Creación centralizada de objetos + +## 🔧 APIs Principales + +### ProcessorFactory + +```typescript +import { ProcessorFactory } from '@cfdi/schema'; + +// Crear procesador CFDI +const cfdiProcessor = ProcessorFactory.createCfdiProcessor({ + source: 'https://example.com/cfdi.xsd', +}); + +// Crear procesador de catálogos +const catalogProcessor = ProcessorFactory.createCatalogProcessor({ + source: './catalog.xsd', +}); + +// Procesamiento directo +const result = await ProcessorFactory.processXSD( + 'cfdi', + 'https://example.com/schema.xsd' +); +``` + +### XMLUtils (Utilidades Reutilizables) + +```typescript +import { XMLUtils } from '@cfdi/schema'; + +// Convertir a XSD con formato estándar +const xsdString = XMLUtils.toXsd(elementCompact); + +// Crear esquema base con namespaces +const schemaBase = XMLUtils.createSchemaBase({ + targetNamespace: 'custom-namespace', +}); + +// Limpiar anotaciones +XMLUtils.removeAnnotations(element); + +// Verificar elementos de solo atributos +const isOnlyAttr = XMLUtils.isOnlyAttribute(element); +``` + +### Constantes Centralizadas + +```typescript +import { XSD_CONSTANTS } from '@cfdi/schema'; + +// Usar configuraciones predefinidas +const timeout = XSD_CONSTANTS.DEFAULT_TIMEOUT; +const encoding = XSD_CONSTANTS.DEFAULT_ENCODING; +const namespaces = XSD_CONSTANTS.NAMESPACES; +const outputOptions = XSD_CONSTANTS.OUTPUT_OPTIONS; +``` + +## 🔄 Migración desde Versión Anterior + +### Código Anterior + +```typescript +// ❌ Versión anterior con duplicaciones +const cfdiProcessor = CfdiProcess.of(); +cfdiProcessor.setConfig({ path: './schema.xsd' }); +const result = await cfdiProcessor.process(); +``` + +### Código Refactorizado + +```typescript +// ✅ Versión refactorizada (compatible) +const cfdiProcessor = CfdiProcess.of(); +cfdiProcessor.setConfig({ source: './schema.xsd' }); // 'path' también funciona +const result = await cfdiProcessor.process(); + +// ✅ O mejor aún, usar factory +const result = await processXSD('cfdi', './schema.xsd'); +``` + +## 🎨 Personalización Avanzada + +### Extender BaseXSDProcessor + +```typescript +import { BaseXSDProcessor, ProcessorConfig } from '@cfdi/schema'; + +class CustomProcessor extends BaseXSDProcessor { + private static instance: CustomProcessor; + + static of(): CustomProcessor { + if (!CustomProcessor.instance) { + CustomProcessor.instance = new CustomProcessor(); + } + return CustomProcessor.instance; + } + + async process(): Promise { + this.validateConfig(); + const xsd = await this.readXsd(); + // Lógica personalizada + return this.customProcessing(xsd); + } + + private customProcessing(xsd: any): any { + // Implementación específica + } +} +``` + +### Configuración de XMLUtils + +```typescript +import { XMLUtils, XSD_CONSTANTS } from '@cfdi/schema'; + +// Crear esquema con configuración personalizada +const customSchema = XMLUtils.createSchemaBase({ + namespaces: { + 'xmlns:custom': 'http://custom.namespace.com', + }, + targetNamespace: 'http://custom.namespace.com', + imports: [ + { + namespace: 'http://custom.namespace.com', + schemaLocation: 'http://custom.namespace.com/schema.xsd', + }, + ], +}); +``` + +## 🛠️ Configuración Avanzada + +### Opciones de LoaderOptions + +```typescript +interface LoaderOptions { + source: string; // URL o ruta local + encoding?: BufferEncoding; // Codificación (default: 'utf-8') + timeout?: number; // Timeout para URLs (default: 15000ms) +} +``` + +### Opciones de ProcessorConfig + +```typescript +interface ProcessorConfig { + source?: string; // URL o ruta (recomendado) + path?: string; // Compatibilidad hacia atrás + encoding?: BufferEncoding; + timeout?: number; +} +``` + +## 📊 Ventajas del Refactoring + +| Aspecto | Antes | Después | +| ----------------- | ------------------------------------- | ---------------------------------- | +| **Duplicación** | Métodos repetidos en múltiples clases | Lógica centralizada en clases base | +| **Configuración** | Hardcoded en cada clase | Constantes centralizadas | +| **Creación** | Singleton manual por clase | Factory pattern unificado | +| **Reutilización** | Código copiado | Utilidades compartidas | +| **Mantenimiento** | Cambios en múltiples lugares | Single point of change | +| **Testing** | Tests duplicados | Tests centralizados | + +## 🔍 Debugging y Logging + +El sistema incluye logging automático para facilitar el debugging: + +```typescript +// Logs automáticos incluidos: +// - "Descargando XSD desde URL: [url]" +// - "Cargando XSD desde archivo local: [path]" +// - "XSD cargado exitosamente desde: [source]" +``` + +## 📋 Ejemplos Completos + +Ver `/examples/` para ejemplos detallados de uso y migración. + +## 🤝 Contribución + +Al contribuir, asegúrate de seguir los principios de clean code implementados: + +1. No duplicar lógica existente +2. Usar constantes centralizadas +3. Extender clases base cuando sea apropiado +4. Mantener compatibilidad hacia atrás +5. Añadir tests para nueva funcionalidad + +## 📝 Changelog + +- **v2.0.0**: Refactoring completo con clean code +- **v1.x.x**: Versión legacy (compatibilidad mantenida) diff --git a/packages/cfdi/schema/UPGRADE_NOTES.md b/packages/cfdi/schema/UPGRADE_NOTES.md new file mode 100644 index 0000000..f644de1 --- /dev/null +++ b/packages/cfdi/schema/UPGRADE_NOTES.md @@ -0,0 +1,122 @@ +# Notas de Actualización - XSDLoader + +## Resumen de Cambios + +Se ha implementado una nueva clase `XSDLoader` que unifica la carga de archivos XSD tanto desde rutas locales como desde URLs. Esta implementación mejora la flexibilidad y mantiene compatibilidad hacia atrás. + +## Nuevas Funcionalidades + +### 1. Clase XSDLoader + +- **Carga desde URLs**: Descarga automática de archivos XSD con timeout configurable +- **Carga desde rutas locales**: Lectura de archivos del sistema de archivos +- **Validación automática**: Verifica extensión .xsd y contenido válido +- **Manejo de errores**: Mensajes de error descriptivos +- **Singleton Pattern**: Instancia única reutilizable + +### 2. Actualizaciones en CfdiProcess + +- Migrado para usar `XSDLoader` en lugar de `readFileSync` directo +- Nuevo método `setConfig()` acepta `source` además de `path` +- Método `readXsd()` ahora es asíncrono + +### 3. Actualizaciones en CatalogProcess + +- Renombrada de `Catalogs` a `CatalogProcess` para consistencia +- Implementación similar a `CfdiProcess` usando `XSDLoader` +- Ya no extiende de la clase `Process` + +## Uso + +### Básico + +```typescript +import { CfdiProcess, CatalogProcess, XSDLoader } from '@cfdi/schema'; + +// Cargar desde URL +const cfdiProcessor = CfdiProcess.of(); +cfdiProcessor.setConfig({ + source: 'https://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd', +}); +const result = await cfdiProcessor.process(); + +// Cargar desde archivo local +const catalogProcessor = CatalogProcess.of(); +catalogProcessor.setConfig({ + source: './path/to/catalog.xsd', +}); +const catalogResult = await catalogProcessor.process(); +``` + +### Uso directo de XSDLoader + +```typescript +const xsdLoader = XSDLoader.getInstance(); + +// Cargar un solo archivo +const xsdData = await xsdLoader.loadXSD({ + source: 'https://example.com/schema.xsd', + timeout: 15000, +}); + +// Cargar múltiples archivos +const multipleXsd = await xsdLoader.loadMultipleXSD([ + { source: 'https://example.com/schema1.xsd' }, + { source: './local-schema.xsd' }, +]); +``` + +## Compatibilidad hacia atrás + +El código existente seguirá funcionando sin cambios: + +```typescript +// ✅ Esto sigue funcionando +const processor = CfdiProcess.of(); +processor.setConfig({ path: './mi-archivo.xsd' }); +``` + +## Validaciones incluidas + +- ✅ Verificación de extensión `.xsd` +- ✅ Validación de contenido XML válido +- ✅ Verificación de esquema XSD (presencia de `xs:schema`) +- ✅ Manejo de timeouts en descargas +- ✅ Verificación de existencia de archivos locales + +## Manejo de Errores + +La clase proporciona mensajes de error descriptivos: + +- `"El archivo debe tener extensión .xsd"` +- `"El archivo no existe: /path/to/file"` +- `"Timeout al descargar el archivo desde URL"` +- `"El archivo no es un esquema XSD válido"` + +## Archivos modificados + +- ✅ `src/XSDLoader.ts` - Nueva clase principal +- ✅ `src/CfdiProcess.ts` - Actualizado para usar XSDLoader +- ✅ `src/CatalogProcess.ts` - Actualizado y renombrado +- ✅ `src/index.ts` - Exportaciones actualizadas +- ✅ `src/examples/usage-example.ts` - Ejemplos de uso + +## Dependencias + +No se requieren nuevas dependencias. Utiliza las librerías existentes: + +- `xml-js` para parsing XML +- `fs` para archivos locales +- `fetch` (nativo) para URLs + +## Migración recomendada + +Para aprovechar al máximo las nuevas funcionalidades, considera migrar gradualmente: + +1. Reemplaza `path` por `source` en las configuraciones +2. Actualiza `Catalogs` por `CatalogProcess` si lo usas directamente +3. Añade manejo de errores async/await donde sea necesario + +## Ejemplos completos + +Ver `src/examples/usage-example.ts` para ejemplos detallados de uso y migración. diff --git a/packages/cfdi/schema/src/CatalogProcess.ts b/packages/cfdi/schema/src/CatalogProcess.ts deleted file mode 100644 index a4b0faa..0000000 --- a/packages/cfdi/schema/src/CatalogProcess.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { ElementCompact, js2xml, xml2js } from 'xml-js'; - -import { readFileSync } from 'fs'; -import { Process } from './complementos/process'; - -export class Catalogs extends Process { - catalogPath: string = ''; - private static instance: Catalogs; - - public static of(): Catalogs { - if (!Catalogs.instance) { - Catalogs.instance = new Catalogs(); - } - return Catalogs.instance; - } - - async process() { - const xsd = await this.read(); - return { catalogos: xsd }; - } - - xsd(target: ElementCompact) { - const catalogos = target['xs:schema']['xs:simpleType'] as any[]; - this.removePropertiesCatalog(catalogos, [ - 'c_CodigoPostal', - 'c_ClaveProdServ', - 'c_ClaveUnidad', - 'c_Colonia', - ]); - return target; - } - - removePropertiesCatalog(catalogos: any[], properties: string[]) { - properties.forEach((property) => { - const index = catalogos.findIndex( - (ct) => ct._attributes.name === property - ); - if (index !== -1) { - catalogos[index]['xs:restriction']['xs:enumeration'] = []; - } - }); - } -} diff --git a/packages/cfdi/schema/src/CfdiProcess.ts b/packages/cfdi/schema/src/CfdiProcess.ts deleted file mode 100644 index c3462e8..0000000 --- a/packages/cfdi/schema/src/CfdiProcess.ts +++ /dev/null @@ -1,174 +0,0 @@ -import { ElementCompact, js2xml, xml2js } from 'xml-js'; - -import { readFileSync } from 'fs'; - -export class CfdiProcess { - private static instance: CfdiProcess; - cfdiPath: string = ''; - public static of(): CfdiProcess { - if (!CfdiProcess.instance) { - CfdiProcess.instance = new CfdiProcess(); - } - return CfdiProcess.instance; - } - - setConfig(options: any) { - const { path } = options; - path && (this.cfdiPath = path); - // path && (this.catalogPath = path); - } - - async process() { - const targetXsd = this.readXsd(); - const xsd: any = []; - this.schemaWrap(targetXsd, xsd, null, 'comprobante', 'comprobante'); - - const comprobante = this.comprobante(targetXsd); - xsd.unshift({ - name: 'comprobante', - path: 'comprobante', - key: 'comprobante', - folder: 'comprobante', - xsd: comprobante, - }); - - return xsd.map((x: any) => ({ ...x, xsd: this.toXsd(x.xsd) })); - } - - schemaWrap( - xsd: Record, - base: any[] = [], - folder = null, - path = '', - key = '' - ) { - const schema = xsd['xs:schema']['xs:element']['xs:complexType'][ - 'xs:sequence' - ]['xs:element'] as Array; - const items = Array.isArray(schema) ? schema : [schema]; - - items.forEach((e) => { - const name = e?._attributes?.name || 'unknow'; - const newXsd = this.generateXsd( - e, - 'json', - folder || name, - path, - `${key}_${name}` - ); - const isOnlyAttribute = - !!newXsd.xsd['xs:schema']?.['xs:element']?.['xs:complexType']?.[ - 'xs:sequence' - ]; - - if (!isOnlyAttribute) { - base.push(newXsd); - } else { - const newXsdElement = { ...newXsd }; - - this.schemaWrap( - newXsdElement.xsd, - base, - folder || name, - `${path}_${name}` || name, - `${path}_${name}` - ); - delete newXsd.xsd['xs:schema']?.['xs:element']['xs:complexType'][ - 'xs:sequence' - ]; - - base.push(newXsd); - } - }); - } - - comprobante(xsd: Record) { - const comprobante = { ...xsd }; - delete comprobante['xs:schema']['xs:element']['xs:complexType'][ - 'xs:sequence' - ]; - return comprobante; - } - - readXsd() { - const xsd = readFileSync(this.cfdiPath, 'utf-8'); - var options = { compact: true, ignoreComment: true, alwaysChildren: true }; - return xml2js(xsd, options) as ElementCompact; - } - - generateSchemas(schemas: any[]) { - const schemasB: any = {}; - schemas.forEach((schema) => { - schemasB[schema.name] = schema.xsd; - }); - return schemasB; - } - - isOnlyAttribute(element: any) { - return ( - !!element?.['xs:complexType']['xs:attribute'] && - !element['xs:complexType']['xs:sequence'] - ); - } - - generateXsd( - element: any, - type: 'xsd' | 'json' = 'xsd', - folder: string, - path = '', - key = '' - ): any { - delete element?.['xs:annotation']; - - const name = element?._attributes?.name || 'unknow'; - - const newElement = { - 'xs:schema': { - _attributes: { - 'xmlns:cfdi': 'http://www.sat.gob.mx/cfd/4', - 'xmlns:xs': 'http://www.w3.org/2001/XMLSchema', - 'xmlns:catCFDI': 'http://www.sat.gob.mx/sitio_internet/cfd/catalogos', - 'xmlns:tdCFDI': - 'http://www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI', - targetNamespace: 'http://www.sat.gob.mx/cfd/4', - elementFormDefault: 'qualified', - attributeFormDefault: 'unqualified', - }, - 'xs:import': [ - { - _attributes: { - namespace: 'http://www.sat.gob.mx/sitio_internet/cfd/catalogos', - schemaLocation: - 'http://www.sat.gob.mx/sitio_internet/cfd/catalogos/catCFDI.xsd', - }, - }, - { - _attributes: { - namespace: - 'http://www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI', - schemaLocation: - 'http://www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI/tdCFDI.xsd', - }, - }, - ], - 'xs:element': element, - }, - }; - - return { - name, - folder, - path: path ? path : name, - key, - xsd: type === 'xsd' ? this.toXsd(newElement) : newElement, - }; - } - - toXsd(newElement: any) { - return js2xml(newElement, { - compact: true, - ignoreComment: true, - spaces: 4, - }); - } -} diff --git a/packages/cfdi/schema/src/catalogos.xsd.ts b/packages/cfdi/schema/src/catalogos.xsd.ts new file mode 100644 index 0000000..356591c --- /dev/null +++ b/packages/cfdi/schema/src/catalogos.xsd.ts @@ -0,0 +1,40 @@ +import { ElementCompact } from 'xml-js'; +import { BaseXSDProcessor } from './common/base-processor'; +import { XMLUtils } from './common/xml-utils'; +import { XSD_CONSTANTS } from './common/constants'; + +export class CatalogProcess extends BaseXSDProcessor { + private static instance: CatalogProcess; + + public static of(): CatalogProcess { + if (!CatalogProcess.instance) { + CatalogProcess.instance = new CatalogProcess(); + } + return CatalogProcess.instance; + } + + async process() { + this.validateConfig(); + const xsd = await this.readXsd(); + const processedXsd = this.processXsdData(xsd); + const result = XMLUtils.toXsd(processedXsd); + return { catalogos: result }; + } + + private processXsdData(target: ElementCompact): ElementCompact { + const catalogos = target['xs:schema']['xs:simpleType'] as any[]; + this.removePropertiesCatalog(catalogos, XSD_CONSTANTS.CATALOG_REMOVE_PROPERTIES); + return target; + } + + private removePropertiesCatalog(catalogos: any[], properties: readonly string[]): void { + properties.forEach((property) => { + const index = catalogos.findIndex( + (catalog) => catalog._attributes?.name === property + ); + if (index !== -1) { + catalogos[index]['xs:restriction']['xs:enumeration'] = []; + } + }); + } +} diff --git a/packages/cfdi/schema/src/cfdi.xsd.ts b/packages/cfdi/schema/src/cfdi.xsd.ts new file mode 100644 index 0000000..0c9e58c --- /dev/null +++ b/packages/cfdi/schema/src/cfdi.xsd.ts @@ -0,0 +1,124 @@ +import { ElementCompact } from 'xml-js'; +import { BaseXSDProcessor } from './common/base-processor'; +import { XMLUtils } from './common/xml-utils'; +import { XSD_CONSTANTS } from './common/constants'; + +export class CfdiXsd extends BaseXSDProcessor { + private static instance: CfdiXsd; + + public static of(): CfdiXsd { + if (!CfdiXsd.instance) { + CfdiXsd.instance = new CfdiXsd(); + } + return CfdiXsd.instance; + } + + async process() { + this.validateConfig(); + const targetXsd = await this.readXsd(); + const xsd: ElementCompact[] = []; + this.schemaWrap(targetXsd, xsd, null, 'comprobante', 'comprobante'); + + const comprobante = this.createComprobanteElement(targetXsd); + xsd.unshift({ + name: 'comprobante', + path: 'comprobante', + key: 'comprobante', + folder: 'comprobante', + xsd: comprobante, + }); + + return XMLUtils.transformSchemasToXsd(xsd); + } + + private schemaWrap( + xsd: ElementCompact, + base: ElementCompact[] = [], + folder: string | null = null, + path = '', + key = '' + ): void { + const schema = xsd['xs:schema']['xs:element']['xs:complexType'][ + 'xs:sequence' + ]['xs:element'] as Array; + const items = Array.isArray(schema) ? schema : [schema]; + + items.forEach((element) => { + const name = XMLUtils.getElementName(element); + const newXsd = this.generateXsd( + element, + 'json', + folder || name, + path, + `${key}_${name}` + ); + + const isOnlyAttribute = !!newXsd.xsd['xs:schema']?.['xs:element']?.['xs:complexType']?.['xs:sequence']; + + if (!isOnlyAttribute) { + base.push(newXsd); + } else { + const newXsdElement = { ...newXsd }; + + this.schemaWrap( + newXsdElement.xsd, + base, + folder || name, + `${path}_${name}` || name, + `${path}_${name}` + ); + + delete newXsd.xsd['xs:schema']?.['xs:element']['xs:complexType']['xs:sequence']; + base.push(newXsd); + } + }); + } + + private createComprobanteElement(xsd: ElementCompact): ElementCompact { + const comprobante = { ...xsd }; + delete comprobante['xs:schema']['xs:element']['xs:complexType']['xs:sequence']; + return comprobante; + } + + /** + * Genera esquemas indexados por nombre (utilidad legacy) + */ + generateSchemas(schemas: any[]): Record { + return XMLUtils.generateSchemasMap(schemas); + } + + /** + * Verifica si elemento tiene solo atributos (utilidad legacy) + */ + isOnlyAttribute(element: any): boolean { + return XMLUtils.isOnlyAttribute(element); + } + + private generateXsd( + element: any, + type: 'xsd' | 'json' = 'xsd', + folder: string, + path = '', + key = '' + ): any { + XMLUtils.removeAnnotations(element); + + const name = XMLUtils.getElementName(element); + const schemaBase = XMLUtils.createSchemaBase(); + + const newElement = { + 'xs:schema': { + ...schemaBase, + 'xs:element': element, + }, + }; + + return { + name, + folder, + path: path || name, + key, + xsd: type === 'xsd' ? XMLUtils.toXsd(newElement) : newElement, + }; + } +} diff --git a/packages/cfdi/schema/src/common/base-processor.ts b/packages/cfdi/schema/src/common/base-processor.ts new file mode 100644 index 0000000..58d96ab --- /dev/null +++ b/packages/cfdi/schema/src/common/base-processor.ts @@ -0,0 +1,66 @@ +import { ElementCompact } from 'xml-js'; +import { XSDLoader, LoaderOptions } from '../loader.xsd'; +import { XSD_CONSTANTS } from './constants'; +import { ProcessorConfig, IXSDProcessor } from './interfaces'; + +/** + * Clase base abstracta que centraliza la lógica común de procesadores XSD + * Elimina duplicación entre CfdiProcess y CatalogProcess + */ +export abstract class BaseXSDProcessor implements IXSDProcessor { + protected xsdLoader: XSDLoader; + protected source: string = ''; + + constructor() { + this.xsdLoader = XSDLoader.getInstance(); + } + + /** + * Configuración estandarizada con compatibilidad hacia atrás + */ + setConfig(options: ProcessorConfig): void { + // Mantener compatibilidad hacia atrás con 'path' + const source = options.source || options.path; + if (source) { + this.source = source; + } + } + + /** + * Lectura estandarizada de XSD con validación + */ + async readXsd(): Promise { + if (!this.source) { + throw new Error('No se ha configurado una fuente XSD. Use setConfig() primero.'); + } + + const loaderOptions: LoaderOptions = { + source: this.source, + encoding: XSD_CONSTANTS.DEFAULT_ENCODING, + timeout: XSD_CONSTANTS.DEFAULT_TIMEOUT, + }; + + return await this.xsdLoader.loadXSD(loaderOptions); + } + + /** + * Validación de configuración + */ + protected validateConfig(): void { + if (!this.source) { + throw new Error('Configuración inválida: se requiere source o path'); + } + } + + /** + * Método abstracto que cada procesador debe implementar + */ + abstract process(): Promise; + + /** + * Método opcional para limpieza de recursos + */ + dispose(): void { + // Implementación base - los procesadores pueden sobrescribir + } +} \ No newline at end of file diff --git a/packages/cfdi/schema/src/common/constants.ts b/packages/cfdi/schema/src/common/constants.ts new file mode 100644 index 0000000..90039fd --- /dev/null +++ b/packages/cfdi/schema/src/common/constants.ts @@ -0,0 +1,48 @@ +/** + * Constantes centralizadas para el procesamiento de XSD + */ + +export const XSD_CONSTANTS = { + // Configuración de timeout y encoding por defecto + DEFAULT_TIMEOUT: 15000, + DEFAULT_ENCODING: 'utf-8' as BufferEncoding, + + // Espacios de nombres XML comunes + NAMESPACES: { + CFDI: 'http://www.sat.gob.mx/cfd/4', + XS: 'http://www.w3.org/2001/XMLSchema', + CAT_CFDI: 'http://www.sat.gob.mx/sitio_internet/cfd/catalogos', + TD_CFDI: 'http://www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI', + }, + + // Ubicaciones de esquemas externos + SCHEMA_LOCATIONS: { + CAT_CFDI: 'http://www.sat.gob.mx/sitio_internet/cfd/catalogos/catCFDI.xsd', + TD_CFDI: 'http://www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI/tdCFDI.xsd', + }, + + // Opciones de procesamiento XML estándar + XML_OPTIONS: { + compact: true, + ignoreComment: true, + alwaysChildren: true, + }, + + // Configuración de salida XML + OUTPUT_OPTIONS: { + compact: true, + ignoreComment: true, + spaces: 4, + }, + + // Propiedades de catálogo a eliminar por defecto + CATALOG_REMOVE_PROPERTIES: [ + 'c_CodigoPostal', + 'c_ClaveProdServ', + 'c_ClaveUnidad', + 'c_Colonia', + ], +} as const; + +export type XSDNamespaces = typeof XSD_CONSTANTS.NAMESPACES; +export type SchemaLocations = typeof XSD_CONSTANTS.SCHEMA_LOCATIONS; \ No newline at end of file diff --git a/packages/cfdi/schema/src/common/interfaces.ts b/packages/cfdi/schema/src/common/interfaces.ts new file mode 100644 index 0000000..a25c1c7 --- /dev/null +++ b/packages/cfdi/schema/src/common/interfaces.ts @@ -0,0 +1,64 @@ +import { ElementCompact } from 'xml-js'; +import { LoaderOptions } from '../loader.xsd'; + +/** + * Configuración base para procesadores XSD + */ +export interface ProcessorConfig { + source?: string; + path?: string; // Mantener compatibilidad hacia atrás + encoding?: BufferEncoding; + timeout?: number; +} + +/** + * Opciones de procesamiento extendidas + */ +export interface ProcessingOptions extends LoaderOptions { + validateSchema?: boolean; + removeAnnotations?: boolean; +} + +/** + * Resultado estándar de procesamiento + */ +export interface ProcessingResult { + name: string; + path?: string; + key?: string; + folder?: string; + xsd: string | ElementCompact; +} + +/** + * Configuración de generación XSD + */ +export interface XSDGenerationConfig { + type: 'xsd' | 'json'; + folder?: string; + path?: string; + key?: string; +} + +/** + * Interface base para procesadores + */ +export interface IXSDProcessor { + setConfig(options: ProcessorConfig): void; + process(): Promise; + readXsd(): Promise; +} + +/** + * Opciones para creación de elementos XML + */ +export interface XMLElementOptions { + namespaces?: Record; + imports?: Array<{ + namespace: string; + schemaLocation: string; + }>; + targetNamespace?: string; + elementFormDefault?: string; + attributeFormDefault?: string; +} \ No newline at end of file diff --git a/packages/cfdi/schema/src/common/processor-factory.ts b/packages/cfdi/schema/src/common/processor-factory.ts new file mode 100644 index 0000000..a002267 --- /dev/null +++ b/packages/cfdi/schema/src/common/processor-factory.ts @@ -0,0 +1,68 @@ +import { CfdiXsd } from '../cfdi.xsd'; +import { CatalogProcess } from '../catalogos.xsd'; +import { ProcessorConfig } from './interfaces'; + +/** + * Factory para crear procesadores XSD de manera centralizada + * Simplifica el uso y centraliza la lógica de creación + */ +export class ProcessorFactory { + /** + * Crea un procesador CFDI configurado + */ + static createCfdiProcessor(config?: ProcessorConfig): CfdiXsd { + const processor = CfdiXsd.of(); + if (config) { + processor.setConfig(config); + } + return processor; + } + + /** + * Crea un procesador de catálogos configurado + */ + static createCatalogProcessor(config?: ProcessorConfig): CatalogProcess { + const processor = CatalogProcess.of(); + if (config) { + processor.setConfig(config); + } + return processor; + } + + /** + * Crea un procesador basado en el tipo especificado + */ + static createProcessor( + type: 'cfdi' | 'catalog', + config?: ProcessorConfig + ): CfdiXsd | CatalogProcess { + switch (type) { + case 'cfdi': + return this.createCfdiProcessor(config); + case 'catalog': + return this.createCatalogProcessor(config); + default: + throw new Error(`Tipo de procesador no soportado: ${type}`); + } + } + + /** + * Procesa un XSD desde una fuente específica + */ + static async processXSD( + type: 'cfdi' | 'catalog', + source: string, + options?: Omit + ): Promise { + const config: ProcessorConfig = { source, ...options }; + const processor = this.createProcessor(type, config); + return await processor.process(); + } +} + +/** + * Funciones de conveniencia para uso directo + */ +export const createCfdiProcessor = ProcessorFactory.createCfdiProcessor; +export const createCatalogProcessor = ProcessorFactory.createCatalogProcessor; +export const processXSD = ProcessorFactory.processXSD; \ No newline at end of file diff --git a/packages/cfdi/schema/src/common/xml-utils.ts b/packages/cfdi/schema/src/common/xml-utils.ts new file mode 100644 index 0000000..206e95c --- /dev/null +++ b/packages/cfdi/schema/src/common/xml-utils.ts @@ -0,0 +1,98 @@ +import { ElementCompact, js2xml } from 'xml-js'; +import { XSD_CONSTANTS } from './constants'; +import { XMLElementOptions } from './interfaces'; + +/** + * Utilidades XML centralizadas para evitar duplicación + */ +export class XMLUtils { + /** + * Convierte elemento a XSD con configuración estándar + */ + static toXsd(element: ElementCompact): string { + return js2xml(element, XSD_CONSTANTS.OUTPUT_OPTIONS); + } + + /** + * Genera estructura base de esquema XSD con namespaces estándar + */ + static createSchemaBase(options: XMLElementOptions = {}): any { + const defaultNamespaces = { + 'xmlns:cfdi': XSD_CONSTANTS.NAMESPACES.CFDI, + 'xmlns:xs': XSD_CONSTANTS.NAMESPACES.XS, + 'xmlns:catCFDI': XSD_CONSTANTS.NAMESPACES.CAT_CFDI, + 'xmlns:tdCFDI': XSD_CONSTANTS.NAMESPACES.TD_CFDI, + }; + + const defaultImports = [ + { + _attributes: { + namespace: XSD_CONSTANTS.NAMESPACES.CAT_CFDI, + schemaLocation: XSD_CONSTANTS.SCHEMA_LOCATIONS.CAT_CFDI, + }, + }, + { + _attributes: { + namespace: XSD_CONSTANTS.NAMESPACES.TD_CFDI, + schemaLocation: XSD_CONSTANTS.SCHEMA_LOCATIONS.TD_CFDI, + }, + }, + ]; + + return { + _attributes: { + ...defaultNamespaces, + ...options.namespaces, + targetNamespace: options.targetNamespace || XSD_CONSTANTS.NAMESPACES.CFDI, + elementFormDefault: options.elementFormDefault || 'qualified', + attributeFormDefault: options.attributeFormDefault || 'unqualified', + }, + 'xs:import': options.imports || defaultImports, + }; + } + + /** + * Limpia anotaciones de un elemento + */ + static removeAnnotations(element: any): void { + delete element?.['xs:annotation']; + } + + /** + * Obtiene el nombre de un elemento con fallback + */ + static getElementName(element: any, fallback: string = 'unknown'): string { + return element?._attributes?.name || fallback; + } + + /** + * Verifica si un elemento tiene solo atributos (sin secuencia) + */ + static isOnlyAttribute(element: any): boolean { + return ( + !!element?.['xs:complexType']['xs:attribute'] && + !element['xs:complexType']['xs:sequence'] + ); + } + + /** + * Convierte array de esquemas a objeto indexado por nombre + */ + static generateSchemasMap(schemas: any[]): Record { + const schemasMap: Record = {}; + schemas.forEach((schema) => { + schemasMap[schema.name] = schema.xsd; + }); + return schemasMap; + } + + /** + * Aplica transformación estándar de salida a lista de esquemas + */ + static transformSchemasToXsd(schemas: any[]): any[] { + return schemas.map((x: any) => ({ + ...x, + xsd: XMLUtils.toXsd(x.xsd) + })); + } +} \ No newline at end of file diff --git a/packages/cfdi/schema/src/index.ts b/packages/cfdi/schema/src/index.ts index fade8ee..0994324 100644 --- a/packages/cfdi/schema/src/index.ts +++ b/packages/cfdi/schema/src/index.ts @@ -1,4 +1,45 @@ +// Exportar clases principales export { CfdiSchema } from './schema.xsd'; export { CfdiSchema as default } from './schema.xsd'; -export { CfdiProcess } from './CfdiProcess'; +export { CfdiXsd } from './cfdi.xsd'; +export { CatalogProcess } from './catalogos.xsd'; + +// Exportar XSDLoader +export { + XSDLoader, + xsdLoader, + type LoaderOptions +} from './loader.xsd'; + +// Exportar clases base y utilidades +export { BaseXSDProcessor } from './common/base-processor'; +export { XMLUtils } from './common/xml-utils'; +export { XSD_CONSTANTS } from './common/constants'; + +// Exportar interfaces y tipos +export type { + ProcessorConfig, + ProcessingOptions, + ProcessingResult, + XSDGenerationConfig, + IXSDProcessor, + XMLElementOptions +} from './common/interfaces'; + +// Exportar tipos de constantes +export type { + XSDNamespaces, + SchemaLocations +} from './common/constants'; + +// Exportar factory y funciones de conveniencia +export { + ProcessorFactory, + createCfdiProcessor, + createCatalogProcessor, + processXSD +} from './common/processor-factory'; + + + diff --git a/packages/cfdi/schema/src/loader.xsd.ts b/packages/cfdi/schema/src/loader.xsd.ts new file mode 100644 index 0000000..c9ccc55 --- /dev/null +++ b/packages/cfdi/schema/src/loader.xsd.ts @@ -0,0 +1,179 @@ +import { readFileSync, existsSync } from 'fs'; +import { join, isAbsolute, extname } from 'path'; +import { ElementCompact, xml2js } from 'xml-js'; + +export interface LoaderOptions { + source: string; // Ruta local o URL + encoding?: BufferEncoding; + timeout?: number; +} + +export class XSDLoader { + private static instance: XSDLoader; + + public static getInstance(): XSDLoader { + if (!XSDLoader.instance) { + XSDLoader.instance = new XSDLoader(); + } + return XSDLoader.instance; + } + + /** + * Determina si una fuente es una URL o una ruta local + */ + private isUrl(source: string): boolean { + try { + const url = new URL(source); + return url.protocol === 'http:' || url.protocol === 'https:'; + } catch { + return false; + } + } + + /** + * Valida si el archivo tiene extensión .xsd + */ + private isXsdFile(source: string): boolean { + if (this.isUrl(source)) { + // Para URLs, verificar que termine en .xsd + return source.toLowerCase().endsWith('.xsd'); + } else { + // Para rutas locales, verificar la extensión + return extname(source).toLowerCase() === '.xsd'; + } + } + + /** + * Carga el contenido del archivo desde una URL + */ + private async loadFromUrl(url: string, timeout: number = 10000): Promise { + try { + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), timeout); + + const response = await fetch(url, { + signal: controller.signal, + headers: { + 'User-Agent': 'XSDLoader/1.0', + }, + }); + + clearTimeout(timeoutId); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status} - ${response.statusText}`); + } + + const content = await response.text(); + + if (!content.trim()) { + throw new Error('El archivo descargado está vacío'); + } + + return content; + } catch (error) { + if (error instanceof Error) { + if (error.name === 'AbortError') { + throw new Error(`Timeout al descargar el archivo desde ${url}`); + } + throw new Error(`Error descargando XSD desde ${url}: ${error.message}`); + } + throw error; + } + } + + /** + * Carga el contenido del archivo desde una ruta local + */ + private loadFromPath(filePath: string, encoding: BufferEncoding = 'utf-8'): string { + try { + // Verificar si el archivo existe + if (!existsSync(filePath)) { + throw new Error(`El archivo no existe: ${filePath}`); + } + + const content = readFileSync(filePath, encoding); + + if (!content.trim()) { + throw new Error('El archivo está vacío'); + } + + return content; + } catch (error) { + if (error instanceof Error) { + throw new Error(`Error leyendo archivo ${filePath}: ${error.message}`); + } + throw error; + } + } + + /** + * Carga y parsea un archivo XSD desde una URL o ruta local + */ + async loadXSD(options: LoaderOptions): Promise { + const { source, encoding = 'utf-8', timeout = 10000 } = options; + + // Validar que el archivo tenga extensión .xsd + if (!this.isXsdFile(source)) { + throw new Error(`El archivo debe tener extensión .xsd: ${source}`); + } + + let content: string; + + try { + if (this.isUrl(source)) { + //console.log(`Descargando XSD desde URL: ${source}`); + content = await this.loadFromUrl(source, timeout); + } else { + //console.log(`Cargando XSD desde archivo local: ${source}`); + content = this.loadFromPath(source, encoding); + } + + // Parsear el XML + const options = { + compact: true, + ignoreComment: true, + alwaysChildren: true, + }; + + const parsedXsd = xml2js(content, options) as ElementCompact; + + // Validar que sea un esquema XSD válido + if (!parsedXsd['xs:schema']) { + throw new Error('El archivo no es un esquema XSD válido (no contiene xs:schema)'); + } + + //console.log(`XSD cargado exitosamente desde: ${source}`); + return parsedXsd; + + } catch (error) { + if (error instanceof Error) { + throw new Error(`Error procesando XSD desde ${source}: ${error.message}`); + } + throw error; + } + } + + /** + * Carga múltiples archivos XSD + */ + async loadMultipleXSD(sources: LoaderOptions[]): Promise { + const promises = sources.map(options => this.loadXSD(options)); + + try { + return await Promise.all(promises); + } catch (error) { + throw new Error(`Error cargando múltiples archivos XSD: ${error}`); + } + } + + /** + * Utilidad para crear opciones de carga rápida + */ + static createOptions(source: string, encoding?: BufferEncoding, timeout?: number): LoaderOptions { + return { source, encoding, timeout }; + } +} + +// Instancia singleton para uso directo +export const xsdLoader = XSDLoader.getInstance(); \ No newline at end of file diff --git a/packages/cfdi/schema/src/schema.xsd.ts b/packages/cfdi/schema/src/schema.xsd.ts index 0a97d8b..c2c0248 100644 --- a/packages/cfdi/schema/src/schema.xsd.ts +++ b/packages/cfdi/schema/src/schema.xsd.ts @@ -1,8 +1,8 @@ import { ElementCompact, js2xml, json2xml, xml2js } from 'xml-js'; import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'; -import { Catalogs } from './CatalogProcess'; -import { CfdiProcess } from './CfdiProcess'; +import { CatalogProcess } from './catalogos.xsd'; +import { CfdiXsd } from './cfdi.xsd'; import { STRUCTURE } from './common/const/structure'; // @ts-ignore import { Xsd2JsonSchema } from 'xsd2jsonschema'; @@ -33,15 +33,14 @@ export class CfdiSchema { path: string; key: string; }[] = []; - private cfdiProcess: CfdiProcess; - private catalogProcess: Catalogs; + private cfdiProcess: CfdiXsd; + private catalogProcess: CatalogProcess; private complementos: Complementos; constructor() { this.xs2js = new Xsd2JsonSchema(); - this.catalogProcess = Catalogs.of(); - this.cfdiProcess = CfdiProcess.of(); - this.cfdiProcess = CfdiProcess.of(); + this.catalogProcess = CatalogProcess.of(); + this.cfdiProcess = CfdiXsd.of(); this.complementos = Complementos.of(); } setConfig(options: any) { @@ -75,6 +74,7 @@ export class CfdiSchema { ...catalog, // ...cfdi, }; + cfdi .filter((c: any) => c.name !== 'unknow') .forEach((c: any) => { @@ -108,7 +108,7 @@ export class CfdiSchema { }; } - generateSchema(schemasJSON: any, c: any) { + generateSchema(schemasJSON: Record, c: any) { const xs2js = new Xsd2JsonSchema(); const convertedSchemas = xs2js.processAllSchemas({ diff --git a/packages/cfdi/schema/test/blah.test.ts b/packages/cfdi/schema/test/blah.test.ts deleted file mode 100644 index 6ac5919..0000000 --- a/packages/cfdi/schema/test/blah.test.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { describe, expect, it, test } from 'vitest'; - -describe('blah', () => { - it('works', () => { - expect(2).toEqual(2); - }); -}); diff --git a/packages/cfdi/schema/test/cfdi.xsd.test.ts b/packages/cfdi/schema/test/cfdi.xsd.test.ts new file mode 100644 index 0000000..bde6162 --- /dev/null +++ b/packages/cfdi/schema/test/cfdi.xsd.test.ts @@ -0,0 +1,513 @@ +import { describe, it, expect, beforeEach } from 'vitest'; +import { CfdiXsd } from '../src/cfdi.xsd'; +import path from 'path'; + +describe('CfdiXsd - Integration Tests', () => { + let cfdiXsd: CfdiXsd; + + // Ruta al archivo XSD real + const realXsdPath = path.join(__dirname, '../src/files/cfdv40.xsd'); + + beforeEach(() => { + cfdiXsd = CfdiXsd.of(); + }); + + describe('Singleton Pattern', () => { + it('should return the same instance when called multiple times', () => { + const instance1 = CfdiXsd.of(); + const instance2 = CfdiXsd.of(); + + expect(instance1).toBe(instance2); + expect(instance1).toBeInstanceOf(CfdiXsd); + }); + + it('should maintain state across instances', () => { + const instance1 = CfdiXsd.of(); + instance1.setConfig({ source: realXsdPath }); + + const instance2 = CfdiXsd.of(); + + expect(instance1).toBe(instance2); + // Ambas instancias deben tener la misma configuración + expect((instance2 as any).source).toBe(realXsdPath); + }); + }); + + describe('Configuration', () => { + it('should set configuration with source parameter', () => { + cfdiXsd.setConfig({ source: realXsdPath }); + + expect((cfdiXsd as any).source).toBe(realXsdPath); + }); + + it('should maintain backward compatibility with path parameter', () => { + cfdiXsd.setConfig({ path: realXsdPath }); + + expect((cfdiXsd as any).source).toBe(realXsdPath); + }); + + it('should prioritize source over path when both are provided', () => { + const testSource = realXsdPath; + const testPath = './other-path.xsd'; + + cfdiXsd.setConfig({ source: testSource, path: testPath }); + + expect((cfdiXsd as any).source).toBe(testSource); + }); + }); + + describe('Real XSD Processing', () => { + beforeEach(() => { + cfdiXsd.setConfig({ source: realXsdPath }); + }); + + it('should process real CFDI XSD successfully', async () => { + const result = await cfdiXsd.process(); + + expect(result).toBeDefined(); + expect(Array.isArray(result)).toBe(true); + expect(result.length).toBeGreaterThan(0); + + // Verificar que todos los elementos tienen la estructura esperada + result.forEach((element: any) => { + expect(element).toHaveProperty('name'); + expect(element).toHaveProperty('xsd'); + expect(typeof element.xsd).toBe('string'); + expect(element.xsd).toContain(' { + const result = await cfdiXsd.process(); + + expect(result).toBeDefined(); + expect(Array.isArray(result)).toBe(true); + expect(result.length).toBeGreaterThan(0); + + // El primer elemento debe ser comprobante + const firstElement = result[0]; + expect(firstElement).toEqual( + expect.objectContaining({ + name: 'comprobante', + path: 'comprobante', + key: 'comprobante', + folder: 'comprobante' + }) + ); + }); + + it('should process real CFDI elements correctly', async () => { + const result = await cfdiXsd.process(); + + // Buscar elementos específicos del CFDI real + const elementNames = result.map((element: any) => element.name); + + // Verificar que se procesan los elementos principales del CFDI + expect(elementNames).toContain('comprobante'); + + // Buscar elementos que deberían estar presentes en cfdv40.xsd + const hasExpectedElements = elementNames.some((name: string) => + ['InformacionGlobal', 'CfdiRelacionados', 'Emisor', 'Receptor', 'Conceptos'] + .some(expectedName => name.toLowerCase().includes(expectedName.toLowerCase())) + ); + + expect(hasExpectedElements).toBe(true); + }); + + it('should throw error when no source is configured', async () => { + const freshInstance = new (CfdiXsd as any)(); + + await expect(freshInstance.process()).rejects.toThrow( + 'Configuración inválida: se requiere source o path' + ); + }); + + it('should handle invalid file path', async () => { + cfdiXsd.setConfig({ source: './non-existent-file.xsd' }); + + await expect(cfdiXsd.process()).rejects.toThrow(); + }); + + it.only('should contain the correct elements', async () => { + const result = await cfdiXsd.process(); + const withoutXsd = result.map(({xsd, ...item}) => item); + const elementNames = result.map((element) => element.name); + console.log(withoutXsd); + + expect(result).toBeDefined(); + expect(result.length).toBeGreaterThan(0); + expect(elementNames).toContain('comprobante'); + expect(elementNames).toContain('InformacionGlobal'); + expect(elementNames).toContain('CfdiRelacionados'); + expect(elementNames).toContain('Emisor'); + expect(elementNames).toContain('Receptor'); + expect(elementNames).toContain('Conceptos'); + + expect(withoutXsd).toBeDefined(); + expect(withoutXsd).toEqual([ + { + name: 'comprobante', + path: 'comprobante', + key: 'comprobante', + folder: 'comprobante' + }, + { + name: 'InformacionGlobal', + folder: 'InformacionGlobal', + path: 'comprobante', + key: 'comprobante_InformacionGlobal' + }, + { + name: 'CfdiRelacionado', + folder: 'CfdiRelacionados', + path: 'comprobante_CfdiRelacionados', + key: 'comprobante_CfdiRelacionados_CfdiRelacionado' + }, + { + name: 'CfdiRelacionados', + folder: 'CfdiRelacionados', + path: 'comprobante', + key: 'comprobante_CfdiRelacionados' + }, + { + name: 'Emisor', + folder: 'Emisor', + path: 'comprobante', + key: 'comprobante_Emisor' + }, + { + name: 'Receptor', + folder: 'Receptor', + path: 'comprobante', + key: 'comprobante_Receptor' + }, + { + name: 'Traslado', + folder: 'Conceptos', + path: 'comprobante_Conceptos_Concepto_Impuestos_Traslados', + key: 'comprobante_Conceptos_Concepto_Impuestos_Traslados_Traslado' + }, + { + name: 'Traslados', + folder: 'Conceptos', + path: 'comprobante_Conceptos_Concepto_Impuestos', + key: 'comprobante_Conceptos_Concepto_Impuestos_Traslados' + }, + { + name: 'Retencion', + folder: 'Conceptos', + path: 'comprobante_Conceptos_Concepto_Impuestos_Retenciones', + key: 'comprobante_Conceptos_Concepto_Impuestos_Retenciones_Retencion' + }, + { + name: 'Retenciones', + folder: 'Conceptos', + path: 'comprobante_Conceptos_Concepto_Impuestos', + key: 'comprobante_Conceptos_Concepto_Impuestos_Retenciones' + }, + { + name: 'Impuestos', + folder: 'Conceptos', + path: 'comprobante_Conceptos_Concepto', + key: 'comprobante_Conceptos_Concepto_Impuestos' + }, + { + name: 'ACuentaTerceros', + folder: 'Conceptos', + path: 'comprobante_Conceptos_Concepto', + key: 'comprobante_Conceptos_Concepto_ACuentaTerceros' + }, + { + name: 'InformacionAduanera', + folder: 'Conceptos', + path: 'comprobante_Conceptos_Concepto', + key: 'comprobante_Conceptos_Concepto_InformacionAduanera' + }, + { + name: 'CuentaPredial', + folder: 'Conceptos', + path: 'comprobante_Conceptos_Concepto', + key: 'comprobante_Conceptos_Concepto_CuentaPredial' + }, + { + name: 'unknown', + folder: 'Conceptos', + path: 'comprobante_Conceptos_Concepto_ComplementoConcepto', + key: 'comprobante_Conceptos_Concepto_ComplementoConcepto_unknown' + }, + { + name: 'ComplementoConcepto', + folder: 'Conceptos', + path: 'comprobante_Conceptos_Concepto', + key: 'comprobante_Conceptos_Concepto_ComplementoConcepto' + }, + { + name: 'InformacionAduanera', + folder: 'Conceptos', + path: 'comprobante_Conceptos_Concepto_Parte', + key: 'comprobante_Conceptos_Concepto_Parte_InformacionAduanera' + }, + { + name: 'Parte', + folder: 'Conceptos', + path: 'comprobante_Conceptos_Concepto', + key: 'comprobante_Conceptos_Concepto_Parte' + }, + { + name: 'Concepto', + folder: 'Conceptos', + path: 'comprobante_Conceptos', + key: 'comprobante_Conceptos_Concepto' + }, + { + name: 'Conceptos', + folder: 'Conceptos', + path: 'comprobante', + key: 'comprobante_Conceptos' + }, + { + name: 'Retencion', + folder: 'Impuestos', + path: 'comprobante_Impuestos_Retenciones', + key: 'comprobante_Impuestos_Retenciones_Retencion' + }, + { + name: 'Retenciones', + folder: 'Impuestos', + path: 'comprobante_Impuestos', + key: 'comprobante_Impuestos_Retenciones' + }, + { + name: 'Traslado', + folder: 'Impuestos', + path: 'comprobante_Impuestos_Traslados', + key: 'comprobante_Impuestos_Traslados_Traslado' + }, + { + name: 'Traslados', + folder: 'Impuestos', + path: 'comprobante_Impuestos', + key: 'comprobante_Impuestos_Traslados' + }, + { + name: 'Impuestos', + folder: 'Impuestos', + path: 'comprobante', + key: 'comprobante_Impuestos' + }, + { + name: 'unknown', + folder: 'Complemento', + path: 'comprobante_Complemento', + key: 'comprobante_Complemento_unknown' + }, + { + name: 'Complemento', + folder: 'Complemento', + path: 'comprobante', + key: 'comprobante_Complemento' + }, + { + name: 'unknown', + folder: 'Addenda', + path: 'comprobante_Addenda', + key: 'comprobante_Addenda_unknown' + }, + { + name: 'Addenda', + folder: 'Addenda', + path: 'comprobante', + key: 'comprobante_Addenda' + } + ]) + }); + }); + + describe('Real Schema Analysis', () => { + beforeEach(() => { + cfdiXsd.setConfig({ source: realXsdPath }); + }); + + it('should extract all sequence elements from real XSD', async () => { + const result = await cfdiXsd.process(); + + expect(result).toBeDefined(); + expect(result.length).toBeGreaterThan(1); // Al menos comprobante + otros elementos + + // Verificar que cada elemento tiene la estructura correcta + result.forEach((element: any) => { + expect(element.name).toBeTruthy(); + expect(element.xsd).toBeTruthy(); + expect(typeof element.xsd).toBe('string'); + }); + }); + + it('should generate valid XSD for each extracted element', async () => { + const result = await cfdiXsd.process(); + + result.forEach((element: any) => { + // Cada XSD debe contener la estructura básica + expect(element.xsd).toContain(''); + }); + }); + + it('should preserve namespaces in generated XSD', async () => { + const result = await cfdiXsd.process(); + + const firstElement = result[0]; + const xsdContent = firstElement.xsd; + + // Verificar que se mantienen los namespaces importantes + expect(xsdContent).toContain('xmlns:cfdi="http://www.sat.gob.mx/cfd/4"'); + expect(xsdContent).toContain('xmlns:xs="http://www.w3.org/2001/XMLSchema"'); + }); + }); + + describe('Utility Methods with Real Data', () => { + beforeEach(() => { + cfdiXsd.setConfig({ source: realXsdPath }); + }); + + it('should generate schemas map from real processed data', async () => { + const processedSchemas = await cfdiXsd.process(); + + const schemasMap = cfdiXsd.generateSchemas(processedSchemas); + + expect(schemasMap).toBeDefined(); + expect(typeof schemasMap).toBe('object'); + expect(schemasMap['comprobante']).toBeDefined(); + + // Verificar que el mapa tiene las claves correctas + Object.keys(schemasMap).forEach(key => { + expect(typeof schemasMap[key]).toBe('string'); + expect(schemasMap[key]).toContain(' { + // Test con elemento que solo tiene atributos + const attributeOnlyElement = { + 'xs:complexType': { + 'xs:attribute': { name: 'test' } + } + }; + + const isOnlyAttr = cfdiXsd.isOnlyAttribute(attributeOnlyElement); + expect(typeof isOnlyAttr).toBe('boolean'); + + // Test con elemento que tiene secuencias + const sequenceElement = { + 'xs:complexType': { + 'xs:sequence': { + 'xs:element': { name: 'child' } + }, + 'xs:attribute': { name: 'attr' } + } + }; + + const hasSequence = cfdiXsd.isOnlyAttribute(sequenceElement); + expect(typeof hasSequence).toBe('boolean'); + }); + }); + + describe('Integration with Base Processor', () => { + it('should inherit readXsd method from BaseXSDProcessor', async () => { + cfdiXsd.setConfig({ source: realXsdPath }); + + const xsdData = await cfdiXsd.readXsd(); + + expect(xsdData).toBeDefined(); + expect(xsdData['xs:schema']).toBeDefined(); + expect(xsdData['xs:schema']['xs:element']).toBeDefined(); + }); + + it('should inherit validateConfig method from BaseXSDProcessor', async () => { + // Test sin configuración + const freshInstance = new (CfdiXsd as any)(); + + await expect(freshInstance.process()).rejects.toThrow(); + }); + + it('should load real XSD and validate schema structure', async () => { + cfdiXsd.setConfig({ source: realXsdPath }); + + const xsdData = await cfdiXsd.readXsd(); + + // Verificar estructura del esquema real + expect(xsdData['xs:schema']).toBeDefined(); + expect(xsdData['xs:schema']['_attributes']).toBeDefined(); + expect(xsdData['xs:schema']['_attributes']['targetNamespace']).toBe('http://www.sat.gob.mx/cfd/4'); + + // Verificar que existe el elemento Comprobante + expect(xsdData['xs:schema']['xs:element']).toBeDefined(); + expect(xsdData['xs:schema']['xs:element']['_attributes']['name']).toBe('Comprobante'); + }); + }); + + describe('Performance and Validation', () => { + it('should process real XSD within reasonable time', async () => { + cfdiXsd.setConfig({ source: realXsdPath }); + + const startTime = Date.now(); + const result = await cfdiXsd.process(); + const endTime = Date.now(); + + expect(result).toBeDefined(); + expect(endTime - startTime).toBeLessThan(5000); // Menos de 5 segundos + }); + + it('should generate consistent output on multiple runs', async () => { + cfdiXsd.setConfig({ source: realXsdPath }); + + const result1 = await cfdiXsd.process(); + const result2 = await cfdiXsd.process(); + + expect(result1.length).toBe(result2.length); + + // Verificar que los nombres son consistentes + const names1 = result1.map((r: any) => r.name).sort(); + const names2 = result2.map((r: any) => r.name).sort(); + expect(names1).toEqual(names2); + }); + }); + + describe('Error Handling with Real Files', () => { + it('should handle non-existent files gracefully', async () => { + cfdiXsd.setConfig({ source: './non-existent-file.xsd' }); + + await expect(cfdiXsd.process()).rejects.toThrow(); + }); + + it('should handle invalid file types', async () => { + // Usar un archivo que no es XSD + const invalidPath = path.join(__dirname, '../package.json'); + cfdiXsd.setConfig({ source: invalidPath }); + + await expect(cfdiXsd.process()).rejects.toThrow(); + }); + + it('should handle files without .xsd extension', async () => { + cfdiXsd.setConfig({ source: './some-file.txt' }); + + await expect(cfdiXsd.process()).rejects.toThrow('El archivo debe tener extensión .xsd'); + }); + }); + + describe('Memory Management', () => { + it('should not create memory leaks with multiple instances', () => { + const instances: CfdiXsd[] = []; + + for (let i = 0; i < 100; i++) { + instances.push(CfdiXsd.of()); + } + + // Todos deben ser la misma instancia + const firstInstance = instances[0]; + instances.forEach(instance => { + expect(instance).toBe(firstInstance); + }); + }); + }); +}); diff --git a/packages/cfdi/xml2json/test/cfdi-class.test.ts b/packages/cfdi/xml2json/test/cfdi-class.test.ts index b9b37d9..2448f5e 100644 --- a/packages/cfdi/xml2json/test/cfdi-class.test.ts +++ b/packages/cfdi/xml2json/test/cfdi-class.test.ts @@ -23,9 +23,6 @@ describe('CFDI Class ', () => { const xml = path.resolve(files_path,'conceptos.xml') const cfdi = new CFDI(xml); - cfdi.conceptos.forEach((c) => { - console.log(c.Descripcion); - c.impuestos.data() - }) + }); }); diff --git a/packages/server/package.json b/packages/server/package.json index 65f2bc0..e53ed2f 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -16,7 +16,8 @@ "@cfdi/pdf": "workspace:*", "@cfdi/catalogos": "workspace:*", "@cfdi/utils": "workspace:*", - "@cfdi/2json": "workspace:*" + "@cfdi/2json": "workspace:*", + "@cfdi/schema": "workspace:*" }, "devDependencies": { "typescript": "^5", diff --git a/packages/server/src/app/cfdi/schema/route.ts b/packages/server/src/app/cfdi/schema/route.ts new file mode 100644 index 0000000..bd2d93f --- /dev/null +++ b/packages/server/src/app/cfdi/schema/route.ts @@ -0,0 +1,8 @@ + +import {PDF117} from '@cfdi/designs/dist/index.cjs' +import { xsdService } from '@cfdi/schema' +export async function GET(request: Request) { + + const result = await xsdService.processXSD() + return Response.json({ message: 'Hello World',result}) +} \ No newline at end of file diff --git a/packages/server/tsconfig.json b/packages/server/tsconfig.json index a1b8679..13d0ff1 100644 --- a/packages/server/tsconfig.json +++ b/packages/server/tsconfig.json @@ -22,7 +22,9 @@ "@/*": ["./src/*"], "@cfdi/utils": ["./node_modules/@cfdi/utils/src"], "@cfdi/utils/*": ["./node_modules/@cfdi/utils/src/*"], - "@cfdi/2json/*": ["./node_modules/@cfdi/2json/src/*"] + "@cfdi/2json/*": ["./node_modules/@cfdi/2json/src/*"], + "@cfdi/schema": ["./node_modules/@cfdi/schema/src"], + "@cfdi/schema/*": ["./node_modules/@cfdi/schema/src/*"] } }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], diff --git a/rigs/typescript/profiles/default/tsconfig-base.json b/rigs/typescript/profiles/default/tsconfig-base.json index 95a44e3..9443656 100644 --- a/rigs/typescript/profiles/default/tsconfig-base.json +++ b/rigs/typescript/profiles/default/tsconfig-base.json @@ -54,6 +54,9 @@ "@cfdi/schema": [ "./node_modules/@cfdi/schema/src" ], + "@cfdi/schema/*": [ + "./node_modules/@cfdi/schema/src/*" + ], "@cfdi/xsd": [ "./node_modules/@cfdi/xsd/src" ], From b2928dcc1edd2f4e94370bc9beb3b0d84080cc8c Mon Sep 17 00:00:00 2001 From: MisaelMa Date: Sun, 29 Jun 2025 19:57:53 -0500 Subject: [PATCH 7/9] feat(core): free packages --- packages/cfdi/designs/package.json | 6 +++--- packages/cfdi/pdf/package.json | 4 ++-- rigs/vite/package.json | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/cfdi/designs/package.json b/packages/cfdi/designs/package.json index a99b3ac..d3706e8 100644 --- a/packages/cfdi/designs/package.json +++ b/packages/cfdi/designs/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@types/pdfmake": "^0.2.11", - "pdfmake": "^0.2.18", + "pdfmake": "^0.2.20", "vite-plugin-dts": "^4.5.3", "@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-url":"^8.0.2", @@ -19,7 +19,7 @@ "@cfdi/utils": "workspace:*" }, "devDependencies": { - "typescript": "^5.0.0", - "vite": "^6.2.2" + "typescript": "^5.6.3", + "vite": "^7.0.0" } } diff --git a/packages/cfdi/pdf/package.json b/packages/cfdi/pdf/package.json index b9d3546..e60e918 100644 --- a/packages/cfdi/pdf/package.json +++ b/packages/cfdi/pdf/package.json @@ -55,7 +55,7 @@ "immutable": "^4.0.0-rc.12", "moment": "^2.29.4", "moment-timezone": "^0.5.27", - "pdfmake": "^0.1.65", + "pdfmake": "^0.2.20", "qrcode": "^1.4.4", "save-file": "^2.3.1", "xml-js": "^1.6.11" @@ -73,7 +73,7 @@ "@types/deep-freeze": "^0.1.2", "@types/jest": "^27.5.0", "@types/node": "^18.11.3", - "@types/pdfmake": "^0.1.13", + "@types/pdfmake": "^0.2.11", "@types/testing-library__jest-dom": "^5.9.1", "chalk": "^4.0.0", "chokidar": "^3.5.2", diff --git a/rigs/vite/package.json b/rigs/vite/package.json index 7b06fe5..dd3478d 100644 --- a/rigs/vite/package.json +++ b/rigs/vite/package.json @@ -15,7 +15,7 @@ "test:ui": "vitest --ui" }, "dependencies": { - "vite": "^4.0.0" + "vite": "^7.0.0" }, "devDependencies": { "typescript": "^5.6.3", From f0fe787e872d05f6f6ee831846fd8f42ea870772 Mon Sep 17 00:00:00 2001 From: MisaelMa Date: Wed, 30 Jul 2025 14:16:01 -0500 Subject: [PATCH 8/9] feat(schema): added comprobantes test --- packages/cfdi/schema/src/cfdi.xsd.ts | 20 +- packages/cfdi/schema/src/schema.xsd.ts | 18 +- packages/cfdi/schema/src/tipo-datos.xsd.ts | 36 +++ ...di.xsd.test.ts => cfdi.config.xsd.test.ts} | 1 - .../test/comprobante/comprobante.xsd.test.ts | 249 ++++++++++++++++++ 5 files changed, 318 insertions(+), 6 deletions(-) create mode 100644 packages/cfdi/schema/src/tipo-datos.xsd.ts rename packages/cfdi/schema/test/{cfdi.xsd.test.ts => cfdi.config.xsd.test.ts} (99%) create mode 100644 packages/cfdi/schema/test/comprobante/comprobante.xsd.test.ts diff --git a/packages/cfdi/schema/src/cfdi.xsd.ts b/packages/cfdi/schema/src/cfdi.xsd.ts index 0c9e58c..cff6159 100644 --- a/packages/cfdi/schema/src/cfdi.xsd.ts +++ b/packages/cfdi/schema/src/cfdi.xsd.ts @@ -3,6 +3,11 @@ import { BaseXSDProcessor } from './common/base-processor'; import { XMLUtils } from './common/xml-utils'; import { XSD_CONSTANTS } from './common/constants'; +export interface XsdElement { + xsd: ElementCompact; + name: string; +} + export class CfdiXsd extends BaseXSDProcessor { private static instance: CfdiXsd; @@ -15,7 +20,13 @@ export class CfdiXsd extends BaseXSDProcessor { async process() { this.validateConfig(); + const xsd = await this.getXsd(); + return XMLUtils.transformSchemasToXsd(xsd); + } + + public async getXsd(): Promise { const targetXsd = await this.readXsd(); + const xsd: ElementCompact[] = []; this.schemaWrap(targetXsd, xsd, null, 'comprobante', 'comprobante'); @@ -28,7 +39,13 @@ export class CfdiXsd extends BaseXSDProcessor { xsd: comprobante, }); - return XMLUtils.transformSchemasToXsd(xsd); + return xsd as XsdElement[]; + } + + public async getXsdByElement(element: string): Promise { + const xsd = await this.getXsd(); + const elementXsd = xsd.find((x) => x.name === element); + return elementXsd || undefined; } private schemaWrap( @@ -77,6 +94,7 @@ export class CfdiXsd extends BaseXSDProcessor { private createComprobanteElement(xsd: ElementCompact): ElementCompact { const comprobante = { ...xsd }; delete comprobante['xs:schema']['xs:element']['xs:complexType']['xs:sequence']; + //console.log(JSON.stringify(comprobante, null, 2)); return comprobante; } diff --git a/packages/cfdi/schema/src/schema.xsd.ts b/packages/cfdi/schema/src/schema.xsd.ts index c2c0248..59a59f8 100644 --- a/packages/cfdi/schema/src/schema.xsd.ts +++ b/packages/cfdi/schema/src/schema.xsd.ts @@ -5,7 +5,7 @@ import { CatalogProcess } from './catalogos.xsd'; import { CfdiXsd } from './cfdi.xsd'; import { STRUCTURE } from './common/const/structure'; // @ts-ignore -import { Xsd2JsonSchema } from 'xsd2jsonschema'; +import { Xsd2JsonSchema, ConverterDraft07 } from 'xsd2jsonschema'; import { Complementos } from './complementos/complementos.process'; export class CfdiSchema { @@ -108,13 +108,23 @@ export class CfdiSchema { }; } - generateSchema(schemasJSON: Record, c: any) { - const xs2js = new Xsd2JsonSchema(); + xsd2Json(schemasJSON: Record) { + const xs2js = new Xsd2JsonSchema({ + // jsonSchemaVersion: 'draft-07', + //converter: new ConverterDraft07() + //generateTitle: false + }); const convertedSchemas = xs2js.processAllSchemas({ - schemas: schemasJSON, + schemas: schemasJSON }); + return convertedSchemas; + } + + generateSchema(schemasJSON: Record, c: any) { + const convertedSchemas = this.xsd2Json(schemasJSON); + return Object.keys(schemasJSON).map((key) => { const d = STRUCTURE[c.name] ? 'comprobante' : 'catalogos'; if (c.key !== key) { diff --git a/packages/cfdi/schema/src/tipo-datos.xsd.ts b/packages/cfdi/schema/src/tipo-datos.xsd.ts new file mode 100644 index 0000000..7a86421 --- /dev/null +++ b/packages/cfdi/schema/src/tipo-datos.xsd.ts @@ -0,0 +1,36 @@ +import { readFileSync } from "fs"; + +export class TipoDatosXsd { + private static instance: TipoDatosXsd; + private options = { + source: '' + }; + private constructor() { + } + + public static of(): TipoDatosXsd { + if (!TipoDatosXsd.instance) { + TipoDatosXsd.instance = new TipoDatosXsd(); + } + return TipoDatosXsd.instance; + } + + setConfig({ source }: { source: string }) { + this.options.source = source; + } + + public async process() { + const tipoDatosXsd = await this.getXsd(); + return { tipoDatos: tipoDatosXsd }; + } + + public async getXsd() { + const xsd = await this.readXsd(); + return xsd; + } + + private async readXsd() { + const tipoDatosXsd = readFileSync(this.options.source, 'utf-8'); + return tipoDatosXsd; + } +} diff --git a/packages/cfdi/schema/test/cfdi.xsd.test.ts b/packages/cfdi/schema/test/cfdi.config.xsd.test.ts similarity index 99% rename from packages/cfdi/schema/test/cfdi.xsd.test.ts rename to packages/cfdi/schema/test/cfdi.config.xsd.test.ts index bde6162..7c436f7 100644 --- a/packages/cfdi/schema/test/cfdi.xsd.test.ts +++ b/packages/cfdi/schema/test/cfdi.config.xsd.test.ts @@ -132,7 +132,6 @@ describe('CfdiXsd - Integration Tests', () => { const result = await cfdiXsd.process(); const withoutXsd = result.map(({xsd, ...item}) => item); const elementNames = result.map((element) => element.name); - console.log(withoutXsd); expect(result).toBeDefined(); expect(result.length).toBeGreaterThan(0); diff --git a/packages/cfdi/schema/test/comprobante/comprobante.xsd.test.ts b/packages/cfdi/schema/test/comprobante/comprobante.xsd.test.ts new file mode 100644 index 0000000..387f0c7 --- /dev/null +++ b/packages/cfdi/schema/test/comprobante/comprobante.xsd.test.ts @@ -0,0 +1,249 @@ +import { describe, it, expect, beforeEach } from 'vitest'; +import { CfdiXsd, XsdElement } from '../../src/cfdi.xsd'; +import path from 'path'; +import { XMLUtils } from '../../src/common/xml-utils'; +import { CatalogProcess } from '../../src/catalogos.xsd'; +import { TipoDatosXsd } from '../../src/tipo-datos.xsd'; +import { CfdiSchema } from '../../src/schema.xsd'; + +describe('CfdiXsd - Integration Tests', () => { + let cfdiXsd: CfdiXsd; + let catalogProcess: CatalogProcess; + let tipoDatosXsd: TipoDatosXsd; + let cfdiSchema: CfdiSchema; + // Ruta al archivo XSD real + const realXsdPath = path.join(__dirname, '../../src/files/cfdv40.xsd'); + const tipoDatosXsdPath = path.join(__dirname, '../../src/files/tdCFDI.xsd'); + const catalogosXsdPath = path.join(__dirname, '../../src/files/catCFDI.xsd'); + + beforeEach(() => { + cfdiXsd = CfdiXsd.of(); + catalogProcess = CatalogProcess.of(); + tipoDatosXsd = TipoDatosXsd.of(); + cfdiSchema = CfdiSchema.of(); + }); + + describe('XSD', () => { + it('should get the XSD comprobante', async () => { + cfdiXsd.setConfig({ source: realXsdPath }); + catalogProcess.setConfig({ source: catalogosXsdPath }); + tipoDatosXsd.setConfig({ source: tipoDatosXsdPath }); + + const catalogos = await catalogProcess.process(); + const tipoDatos = await tipoDatosXsd.process(); + + const result = (await cfdiXsd.getXsdByElement( + 'comprobante' + )) as XsdElement; + + const xsd = result?.xsd + + console.log(JSON.stringify(xsd, null, 2)); + // Validar estructura del objeto XSD + expect(xsd).toBeDefined(); + + // Verificar estructura básica del schema + expect(xsd['xs:schema']).toBeDefined(); + expect(xsd['xs:schema']['_attributes']).toBeDefined(); + + // Verificar namespaces y atributos del schema + const schemaAttrs = xsd['xs:schema']['_attributes']; + expect(schemaAttrs['xmlns:cfdi']).toBe('http://www.sat.gob.mx/cfd/4'); + expect(schemaAttrs['xmlns:xs']).toBe('http://www.w3.org/2001/XMLSchema'); + expect(schemaAttrs['xmlns:catCFDI']).toBe('http://www.sat.gob.mx/sitio_internet/cfd/catalogos'); + expect(schemaAttrs['xmlns:tdCFDI']).toBe('http://www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI'); + expect(schemaAttrs['targetNamespace']).toBe('http://www.sat.gob.mx/cfd/4'); + expect(schemaAttrs['elementFormDefault']).toBe('qualified'); + expect(schemaAttrs['attributeFormDefault']).toBe('unqualified'); + + // Verificar imports + expect(xsd['xs:schema']['xs:import']).toBeDefined(); + expect(Array.isArray(xsd['xs:schema']['xs:import'])).toBe(true); + expect(xsd['xs:schema']['xs:import']).toHaveLength(2); + + // Verificar elemento Comprobante + expect(xsd['xs:schema']['xs:element']).toBeDefined(); + expect(xsd['xs:schema']['xs:element']['_attributes']['name']).toBe('Comprobante'); + + // Verificar annotation del elemento + expect(xsd['xs:schema']['xs:element']['xs:annotation']).toBeDefined(); + + // Verificar complexType + expect(xsd['xs:schema']['xs:element']['xs:complexType']).toBeDefined(); + + // Verificar atributos del complexType + const attributes = xsd['xs:schema']['xs:element']['xs:complexType']['xs:attribute']; + expect(Array.isArray(attributes)).toBe(true); + expect(attributes.length).toBeGreaterThan(10); // Debe tener varios atributos + + // Verificar algunos atributos específicos + const attributeNames = attributes.map((attr: any) => attr._attributes.name); + expect(attributeNames).toContain('Version'); + expect(attributeNames).toContain('Fecha'); + expect(attributeNames).toContain('Sello'); + expect(attributeNames).toContain('SubTotal'); + expect(attributeNames).toContain('Total'); + expect(attributeNames).toContain('TipoDeComprobante'); + expect(attributeNames).toContain('Exportacion'); + expect(attributeNames).toContain('LugarExpedicion'); + + // Verificar estructura de un atributo específico (Version) + const versionAttr = attributes.find((attr: any) => attr._attributes.name === 'Version'); + expect(versionAttr).toBeDefined(); + expect(versionAttr._attributes.use).toBe('required'); + expect(versionAttr._attributes.fixed).toBe('4.0'); + expect(versionAttr['xs:annotation']).toBeDefined(); + expect(versionAttr['xs:simpleType']).toBeDefined(); + + console.log('✅ XSD object validation passed!'); + console.log('Found attributes:', attributeNames); + + }); + }); + + describe('JsonSchema', () => { + it('should get the JsonSchema comprobante', async () => { + cfdiXsd.setConfig({ source: realXsdPath }); + catalogProcess.setConfig({ source: catalogosXsdPath }); + tipoDatosXsd.setConfig({ source: tipoDatosXsdPath }); + + const catalogos = await catalogProcess.process(); + const tipoDatos = await tipoDatosXsd.process(); + + const result = (await cfdiXsd.getXsdByElement( + 'comprobante' + )) as XsdElement; + + const res = await cfdiSchema.xsd2Json({ + ...catalogos, + ...tipoDatos, + comprobante: XMLUtils.toXsd(result?.xsd), + }); + + const jsonSchema = res['comprobante'].getJsonSchema(); + + expect(jsonSchema.type).toBe('object'); + + expect(jsonSchema.$id).toBe('comprobante.json'); + expect(jsonSchema.$schema).toBe( + 'http://json-schema.org/draft-07/schema#' + ); + expect(jsonSchema.title).toMatch( + /^This JSON Schema file was generated from comprobante on .*\. For more information please see http:\/\/www\.xsd2jsonschema\.org$/ + ); + expect(jsonSchema.description).toBe( + 'Atributo requerido para incorporar el código postal del lugar de expedición del comprobante (domicilio de la matriz o de la sucursal).' + ); + + // Verificar required array + expect(jsonSchema.required).toEqual([ + 'Version', + 'Fecha', + 'Sello', + 'NoCertificado', + 'Certificado', + 'SubTotal', + 'Moneda', + 'Total', + 'TipoDeComprobante', + 'Exportacion', + 'LugarExpedicion', + ]); + + expect(jsonSchema.properties).toEqual({ + Version: { + description: + 'Atributo requerido con valor prefijado a 4.0 que indica la versión del estándar bajo el que se encuentra expresado el comprobante.', + type: 'string', + }, + Serie: { + description: + 'Atributo opcional para precisar la serie para control interno del contribuyente. Este atributo acepta una cadena de caracteres.', + maxLength: 25, + minLength: 1, + pattern: '[^|]{1,25}', + type: 'string', + }, + Folio: { + description: + 'Atributo opcional para control interno del contribuyente que expresa el folio del comprobante, acepta una cadena de caracteres.', + maxLength: 40, + minLength: 1, + pattern: '[^|]{1,40}', + type: 'string', + }, + Fecha: { + $ref: 'tipoDatos.json#/definitions/t_FechaH', + }, + Sello: { + description: + 'Atributo requerido para contener el sello digital del comprobante fiscal, al que hacen referencia las reglas de resolución miscelánea vigente. El sello debe ser expresado como una cadena de texto en formato Base 64.', + type: 'string', + }, + FormaPago: { + $ref: 'catalogos.json#/definitions/c_FormaPago', + }, + NoCertificado: { + description: + 'Atributo requerido para expresar el número de serie del certificado de sello digital que ampara al comprobante, de acuerdo con el acuse correspondiente a 20 posiciones otorgado por el sistema del SAT.', + maxLength: 20, + minLength: 20, + pattern: '[0-9]{20}', + type: 'string', + }, + Certificado: { + description: + 'Atributo requerido que sirve para incorporar el certificado de sello digital que ampara al comprobante, como texto en formato base 64.', + type: 'string', + }, + CondicionesDePago: { + description: + 'Atributo condicional para expresar las condiciones comerciales aplicables para el pago del comprobante fiscal digital por Internet. Este atributo puede ser condicionado mediante atributos o complementos.', + maxLength: 1000, + minLength: 1, + pattern: '[^|]{1,1000}', + type: 'string', + }, + SubTotal: { + $ref: 'tipoDatos.json#/definitions/t_Importe', + }, + Descuento: { + $ref: 'tipoDatos.json#/definitions/t_Importe', + }, + Moneda: { + $ref: 'catalogos.json#/definitions/c_Moneda', + }, + TipoCambio: { + description: + 'Atributo condicional para representar el tipo de cambio FIX conforme con la moneda usada. Es requerido cuando la clave de moneda es distinta de MXN y de XXX. El valor debe reflejar el número de pesos mexicanos que equivalen a una unidad de la divisa señalada en el atributo moneda. Si el valor está fuera del porcentaje aplicable a la moneda tomado del catálogo c_Moneda, el emisor debe obtener del PAC que vaya a timbrar el CFDI, de manera no automática, una clave de confirmación para ratificar que el valor es correcto e integrar dicha clave en el atributo Confirmacion.', + minimum: 0.000001, + type: 'number', + }, + Total: { + $ref: 'tipoDatos.json#/definitions/t_Importe', + }, + TipoDeComprobante: { + $ref: 'catalogos.json#/definitions/c_TipoDeComprobante', + }, + Exportacion: { + $ref: 'catalogos.json#/definitions/c_Exportacion', + }, + MetodoPago: { + $ref: 'catalogos.json#/definitions/c_MetodoPago', + }, + LugarExpedicion: { + $ref: 'catalogos.json#/definitions/c_CodigoPostal', + }, + Confirmacion: { + description: + 'Atributo condicional para registrar la clave de confirmación que entregue el PAC para expedir el comprobante con importes grandes, con un tipo de cambio fuera del rango establecido o con ambos casos. Es requerido cuando se registra un tipo de cambio o un total fuera del rango establecido.', + maxLength: 5, + minLength: 5, + pattern: '[0-9a-zA-Z]{5}', + type: 'string', + }, + }); + //console.log(JSON.stringify(res['comprobante'].getJsonSchema(), null, 2)); + }); + }); +}); From 536b5b53bdad63e8c2d829aab0432fad9eb98cff Mon Sep 17 00:00:00 2001 From: MisaelMa Date: Mon, 4 Aug 2025 12:09:46 -0500 Subject: [PATCH 9/9] feat(schema): implemement schema --- packages/cfdi/schema/src/cfdi.xsd.ts | 5 +- .../informacionglobal/informacionglobal.json | 20 +- .../comprobante/cfdi-relacionados.xsd.test.ts | 227 +++++++++ .../test/comprobante/emisor.xsd.test.ts | 116 +++++ .../test/comprobante/impuestos.xsd.test.ts | 431 ++++++++++++++++++ .../comprobante/informacion_g.xsd.test.ts | 180 ++++++++ .../test/comprobante/receptor.xsd.test.ts | 179 ++++++++ packages/cfdi/schema/test/shared.ts | 10 + 8 files changed, 1165 insertions(+), 3 deletions(-) create mode 100644 packages/cfdi/schema/test/comprobante/cfdi-relacionados.xsd.test.ts create mode 100644 packages/cfdi/schema/test/comprobante/emisor.xsd.test.ts create mode 100644 packages/cfdi/schema/test/comprobante/impuestos.xsd.test.ts create mode 100644 packages/cfdi/schema/test/comprobante/informacion_g.xsd.test.ts create mode 100644 packages/cfdi/schema/test/comprobante/receptor.xsd.test.ts create mode 100644 packages/cfdi/schema/test/shared.ts diff --git a/packages/cfdi/schema/src/cfdi.xsd.ts b/packages/cfdi/schema/src/cfdi.xsd.ts index cff6159..667a05a 100644 --- a/packages/cfdi/schema/src/cfdi.xsd.ts +++ b/packages/cfdi/schema/src/cfdi.xsd.ts @@ -42,9 +42,10 @@ export class CfdiXsd extends BaseXSDProcessor { return xsd as XsdElement[]; } - public async getXsdByElement(element: string): Promise { + public async getXsdByElement(element: string, key: string = 'name'): Promise { const xsd = await this.getXsd(); - const elementXsd = xsd.find((x) => x.name === element); + //console.log(xsd); + const elementXsd = xsd.find((x: Record) => x[key] === element); return elementXsd || undefined; } diff --git a/packages/cfdi/schema/src/files/schema/informacionglobal/informacionglobal.json b/packages/cfdi/schema/src/files/schema/informacionglobal/informacionglobal.json index cc76977..ab82db1 100644 --- a/packages/cfdi/schema/src/files/schema/informacionglobal/informacionglobal.json +++ b/packages/cfdi/schema/src/files/schema/informacionglobal/informacionglobal.json @@ -1 +1,19 @@ -{"$id":"comprobante_InformacionGlobal.json","$schema":"http://json-schema.org/draft-07/schema#","title":"This JSON Schema file was generated from comprobante_InformacionGlobal on Tue Dec 26 2023 18:31:04 GMT-0500 (Eastern Standard Time). For more information please see http://www.xsd2jsonschema.org","description":"Atributo requerido para expresar el mes o los meses al que corresponde la información del comprobante global.","required":["Periodicidad","Meses","Año"],"properties":{"Periodicidad":{"$ref":"catalogos.json#/definitions/c_Periodicidad"},"Meses":{"$ref":"catalogos.json#/definitions/c_Meses"},"Año":{"description":"Atributo requerido para expresar el año al que corresponde la información del comprobante global.","maximum":32767,"minimum":2021,"type":"integer"}},"type":"object","definitions":{}} \ No newline at end of file +{ + "$id": "comprobante_InformacionGlobal.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "This JSON Schema file was generated from comprobante_InformacionGlobal on Tue Dec 26 2023 18:31:04 GMT-0500 (Eastern Standard Time). For more information please see http://www.xsd2jsonschema.org", + "description": "Atributo requerido para expresar el mes o los meses al que corresponde la información del comprobante global.", + "required": ["Periodicidad", "Meses", "Año"], + "properties": { + "Periodicidad": { "$ref": "catalogos.json#/definitions/c_Periodicidad" }, + "Meses": { "$ref": "catalogos.json#/definitions/c_Meses" }, + "Año": { + "description": "Atributo requerido para expresar el año al que corresponde la información del comprobante global.", + "maximum": 32767, + "minimum": 2021, + "type": "integer" + } + }, + "type": "object", + "definitions": {} +} diff --git a/packages/cfdi/schema/test/comprobante/cfdi-relacionados.xsd.test.ts b/packages/cfdi/schema/test/comprobante/cfdi-relacionados.xsd.test.ts new file mode 100644 index 0000000..c912c2e --- /dev/null +++ b/packages/cfdi/schema/test/comprobante/cfdi-relacionados.xsd.test.ts @@ -0,0 +1,227 @@ +import { describe, it, expect, beforeEach } from 'vitest'; +import { CfdiXsd, XsdElement } from '../../src/cfdi.xsd'; +import path from 'path'; +import { XMLUtils } from '../../src/common/xml-utils'; +import { CatalogProcess } from '../../src/catalogos.xsd'; +import { TipoDatosXsd } from '../../src/tipo-datos.xsd'; +import { CfdiSchema } from '../../src/schema.xsd'; +import { + CATALOGOS_NAMESPACE, + CATALOGOS_SCHEMA_LOCATION, + TIPO_DATOS_NAMESPACE, + TIPO_DATOS_SCHEMA_LOCATION, +} from '../shared'; + +describe('CfdiXsd - CfdiRelacionados Integration Tests', () => { + let cfdiXsd: CfdiXsd; + let catalogProcess: CatalogProcess; + let tipoDatosXsd: TipoDatosXsd; + let cfdiSchema: CfdiSchema; + // Ruta al archivo XSD real + const realXsdPath = path.join(__dirname, '../../src/files/cfdv40.xsd'); + const tipoDatosXsdPath = path.join(__dirname, '../../src/files/tdCFDI.xsd'); + const catalogosXsdPath = path.join(__dirname, '../../src/files/catCFDI.xsd'); + + beforeEach(() => { + cfdiXsd = CfdiXsd.of(); + catalogProcess = CatalogProcess.of(); + tipoDatosXsd = TipoDatosXsd.of(); + cfdiSchema = CfdiSchema.of(); + cfdiXsd.setConfig({ source: realXsdPath }); + catalogProcess.setConfig({ source: catalogosXsdPath }); + tipoDatosXsd.setConfig({ source: tipoDatosXsdPath }); + }); + + describe('XSD CfdiRelacionados', () => { + it('should get the XSD CfdiRelacionados', async () => { + const catalogos = await catalogProcess.process(); + const tipoDatos = await tipoDatosXsd.process(); + + const result = (await cfdiXsd.getXsdByElement( + 'CfdiRelacionados' + )) as XsdElement; + + const xsd = result?.xsd; + + // Validar estructura del objeto XSD + expect(xsd).toBeDefined(); + + // Verificar estructura básica del schema + expect(xsd['xs:schema']).toBeDefined(); + expect(xsd['xs:schema']['_attributes']).toBeDefined(); + + // Verificar namespaces y atributos del schema + const schemaAttrs = xsd['xs:schema']['_attributes']; + expect(schemaAttrs['xmlns:cfdi']).toBe('http://www.sat.gob.mx/cfd/4'); + expect(schemaAttrs['xmlns:xs']).toBe('http://www.w3.org/2001/XMLSchema'); + expect(schemaAttrs['xmlns:catCFDI']).toBe( + 'http://www.sat.gob.mx/sitio_internet/cfd/catalogos' + ); + expect(schemaAttrs['xmlns:tdCFDI']).toBe( + 'http://www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI' + ); + expect(schemaAttrs['targetNamespace']).toBe( + 'http://www.sat.gob.mx/cfd/4' + ); + expect(schemaAttrs['elementFormDefault']).toBe('qualified'); + expect(schemaAttrs['attributeFormDefault']).toBe('unqualified'); + + // Verificar imports + expect(xsd['xs:schema']['xs:import']).toBeDefined(); + expect(Array.isArray(xsd['xs:schema']['xs:import'])).toBe(true); + expect(xsd['xs:schema']['xs:import']).toHaveLength(2); + expect(xsd['xs:schema']['xs:import']).toContainEqual({ + _attributes: { + namespace: CATALOGOS_NAMESPACE, + schemaLocation: CATALOGOS_SCHEMA_LOCATION, + }, + }); + expect(xsd['xs:schema']['xs:import']).toContainEqual({ + _attributes: { + namespace: TIPO_DATOS_NAMESPACE, + schemaLocation: TIPO_DATOS_SCHEMA_LOCATION, + }, + }); + + // Verificar elemento CfdiRelacionados + expect(xsd['xs:schema']['xs:element']).toBeDefined(); + expect(xsd['xs:schema']['xs:element']['_attributes']).toEqual({ + maxOccurs: 'unbounded', + minOccurs: '0', + name: 'CfdiRelacionados', + }); + + // Verificar complexType + expect(xsd['xs:schema']['xs:element']['xs:complexType']).toBeDefined(); + + }); + it('should get the JsonSchema CfdiRelacionados', async () => { + const catalogos = await catalogProcess.process(); + const tipoDatos = await tipoDatosXsd.process(); + + const result = (await cfdiXsd.getXsdByElement( + 'CfdiRelacionados' + )) as XsdElement; + + const res = await cfdiSchema.xsd2Json({ + ...catalogos, + ...tipoDatos, + CfdiRelacionados: XMLUtils.toXsd(result?.xsd), + }); + + const jsonSchema = res['CfdiRelacionados'].getJsonSchema(); + + expect(jsonSchema).toBeDefined(); + expect(jsonSchema.type).toBe('object'); + + // Verificar propiedades que no cambian + expect(jsonSchema.$id).toBe('CfdiRelacionados.json'); + expect(jsonSchema.$schema).toBe( + 'http://json-schema.org/draft-07/schema#' + ); + + // Usar regex para el title que contiene timestamp + expect(jsonSchema.title).toMatch( + /^This JSON Schema file was generated from CfdiRelacionados on .*\. For more information please see http:\/\/www\.xsd2jsonschema\.org$/ + ); + + // Verificar required array para CfdiRelacionados + expect(jsonSchema.required).toContain('TipoRelacion'); + + // Verificar que properties existe y tiene las propiedades esperadas + expect(jsonSchema.properties).toBeDefined(); + expect(jsonSchema.properties).toEqual({ + "TipoRelacion": { + "$ref": "catalogos.json#/definitions/c_TipoRelacion" + } + }); + + + }); + }); + + describe('XSD CfdiRelacionado', () => { + it('should get the XSD CfdiRelacionado', async () => { + const catalogos = await catalogProcess.process(); + const tipoDatos = await tipoDatosXsd.process(); + + const result = (await cfdiXsd.getXsdByElement( + 'CfdiRelacionado' + )) as XsdElement; + + const xsd = result?.xsd; + + // Validar estructura del objeto XSD + expect(xsd).toBeDefined(); + + // Verificar estructura básica del schema + expect(xsd['xs:schema']).toBeDefined(); + expect(xsd['xs:schema']['_attributes']).toBeDefined(); + + // Verificar elemento CfdiRelacionado + expect(xsd['xs:schema']['xs:element']).toBeDefined(); + expect(xsd['xs:schema']['xs:element']['_attributes']).toEqual({ + maxOccurs: 'unbounded', + name: 'CfdiRelacionado', + }); + + // Verificar complexType y sus atributos + expect(xsd['xs:schema']['xs:element']['xs:complexType']).toBeDefined(); + + // Verificar atributos del complexType + const attributes = + xsd['xs:schema']['xs:element']['xs:complexType']['xs:attribute']; + + // CfdiRelacionado debe tener el atributo UUID + + }); + + it('should get the JsonSchema CfdiRelacionado', async () => { + const catalogos = await catalogProcess.process(); + const tipoDatos = await tipoDatosXsd.process(); + + const result = (await cfdiXsd.getXsdByElement( + 'CfdiRelacionado' + )) as XsdElement; + + const res = await cfdiSchema.xsd2Json({ + ...catalogos, + ...tipoDatos, + CfdiRelacionado: XMLUtils.toXsd(result?.xsd), + }); + + const jsonSchema = res['CfdiRelacionado'].getJsonSchema(); + + expect(jsonSchema).toBeDefined(); + expect(jsonSchema.type).toBe('object'); + + // Verificar propiedades que no cambian + expect(jsonSchema.$id).toBe('CfdiRelacionado.json'); + expect(jsonSchema.$schema).toBe( + 'http://json-schema.org/draft-07/schema#' + ); + + // Usar regex para el title que contiene timestamp + expect(jsonSchema.title).toMatch( + /^This JSON Schema file was generated from CfdiRelacionado on .*\. For more information please see http:\/\/www\.xsd2jsonschema\.org$/ + ); + + // Verificar required array para CfdiRelacionado + expect(jsonSchema.required).toContain('UUID'); + + // Verificar que properties existe y tiene las propiedades esperadas + expect(jsonSchema.properties).toBeDefined(); + expect(jsonSchema.properties).toEqual({ + "UUID": { + "description": "Atributo requerido para registrar el folio fiscal (UUID) de un CFDI relacionado con el presente comprobante, por ejemplo: Si el CFDI relacionado es un comprobante de traslado que sirve para registrar el movimiento de la mercancía. Si este comprobante se usa como nota de crédito o nota de débito del comprobante relacionado. Si este comprobante es una devolución sobre el comprobante relacionado. Si éste sustituye a una factura cancelada.", + "maxLength": 36, + "minLength": 36, + "pattern": "[a-f0-9A-F]{8}-[a-f0-9A-F]{4}-[a-f0-9A-F]{4}-[a-f0-9A-F]{4}-[a-f0-9A-F]{12}", + "type": "string" + } + }); + + + }); + }); +}); diff --git a/packages/cfdi/schema/test/comprobante/emisor.xsd.test.ts b/packages/cfdi/schema/test/comprobante/emisor.xsd.test.ts new file mode 100644 index 0000000..1276e27 --- /dev/null +++ b/packages/cfdi/schema/test/comprobante/emisor.xsd.test.ts @@ -0,0 +1,116 @@ +import { describe, it, expect, beforeEach } from 'vitest'; +import { CfdiXsd, XsdElement } from '../../src/cfdi.xsd'; +import path from 'path'; +import { XMLUtils } from '../../src/common/xml-utils'; +import { CatalogProcess } from '../../src/catalogos.xsd'; +import { TipoDatosXsd } from '../../src/tipo-datos.xsd'; +import { CfdiSchema } from '../../src/schema.xsd'; +import { + CATALOGOS_NAMESPACE, + CATALOGOS_SCHEMA_LOCATION, + TIPO_DATOS_NAMESPACE, + TIPO_DATOS_SCHEMA_LOCATION, +} from '../shared'; + +describe('CfdiXsd - Integration Tests', () => { + let cfdiXsd: CfdiXsd; + let catalogProcess: CatalogProcess; + let tipoDatosXsd: TipoDatosXsd; + let cfdiSchema: CfdiSchema; + // Ruta al archivo XSD real + const realXsdPath = path.join(__dirname, '../../src/files/cfdv40.xsd'); + const tipoDatosXsdPath = path.join(__dirname, '../../src/files/tdCFDI.xsd'); + const catalogosXsdPath = path.join(__dirname, '../../src/files/catCFDI.xsd'); + + beforeEach(() => { + cfdiXsd = CfdiXsd.of(); + catalogProcess = CatalogProcess.of(); + tipoDatosXsd = TipoDatosXsd.of(); + cfdiSchema = CfdiSchema.of(); + cfdiXsd.setConfig({ source: realXsdPath }); + catalogProcess.setConfig({ source: catalogosXsdPath }); + tipoDatosXsd.setConfig({ source: tipoDatosXsdPath }); + }); + + describe('XSD', () => { + it('should get the XSD comprobante', async () => { + const catalogos = await catalogProcess.process(); + const tipoDatos = await tipoDatosXsd.process(); + + const result = (await cfdiXsd.getXsdByElement('Emisor')) as XsdElement; + + const xsd = result?.xsd; + + expect(xsd).toBeDefined(); + expect(xsd['xs:schema']['xs:import']).toBeDefined(); + expect(Array.isArray(xsd['xs:schema']['xs:import'])).toBe(true); + expect(xsd['xs:schema']['xs:import']).toHaveLength(2); + expect(xsd['xs:schema']['xs:import']).toContainEqual({ + _attributes: { + namespace: CATALOGOS_NAMESPACE, + schemaLocation: CATALOGOS_SCHEMA_LOCATION, + }, + }); + expect(xsd['xs:schema']['xs:import']).toContainEqual({ + _attributes: { + namespace: TIPO_DATOS_NAMESPACE, + schemaLocation: TIPO_DATOS_SCHEMA_LOCATION, + }, + }); + expect(xsd['xs:schema']['xs:element']['_attributes']).toEqual({ + name: 'Emisor', + }); + + expect( + xsd['xs:schema']['xs:element']['xs:complexType']['xs:attribute'] + ).toHaveLength(4); + + }); + }); + + describe('JsonSchema', () => { + it('should get the JsonSchema comprobante', async () => { + const catalogos = await catalogProcess.process(); + const tipoDatos = await tipoDatosXsd.process(); + + const result = (await cfdiXsd.getXsdByElement('Emisor')) as XsdElement; + + const res = await cfdiSchema.xsd2Json({ + ...catalogos, + ...tipoDatos, + Emisor: XMLUtils.toXsd(result?.xsd), + }); + + const jsonSchema = res['Emisor'].getJsonSchema(); + + expect(jsonSchema).toBeDefined(); + expect(jsonSchema.type).toBe('object'); + + expect(jsonSchema.required).toEqual(['Rfc', 'Nombre', 'RegimenFiscal']); + expect(jsonSchema.properties).toEqual({ + Rfc: { + $ref: 'tipoDatos.json#/definitions/t_RFC', + }, + Nombre: { + description: + 'Atributo requerido para registrar el nombre, denominación o razón social del contribuyente inscrito en el RFC, del emisor del comprobante.', + maxLength: 300, + minLength: 1, + pattern: '[^|]{1,300}', + type: 'string', + }, + RegimenFiscal: { + $ref: 'catalogos.json#/definitions/c_RegimenFiscal', + }, + FacAtrAdquirente: { + description: + 'Atributo condicional para expresar el número de operación proporcionado por el SAT cuando se trate de un comprobante a través de un PCECFDI o un PCGCFDISP.', + maxLength: 10, + minLength: 10, + pattern: '[0-9]{10}', + type: 'string', + }, + }); + }); + }); +}); diff --git a/packages/cfdi/schema/test/comprobante/impuestos.xsd.test.ts b/packages/cfdi/schema/test/comprobante/impuestos.xsd.test.ts new file mode 100644 index 0000000..45000c1 --- /dev/null +++ b/packages/cfdi/schema/test/comprobante/impuestos.xsd.test.ts @@ -0,0 +1,431 @@ +import { describe, it, expect, beforeEach } from 'vitest'; +import { CfdiXsd, XsdElement } from '../../src/cfdi.xsd'; +import path from 'path'; +import { XMLUtils } from '../../src/common/xml-utils'; +import { CatalogProcess } from '../../src/catalogos.xsd'; +import { TipoDatosXsd } from '../../src/tipo-datos.xsd'; +import { CfdiSchema } from '../../src/schema.xsd'; +import { + CATALOGOS_NAMESPACE, + CATALOGOS_SCHEMA_LOCATION, + TIPO_DATOS_NAMESPACE, + TIPO_DATOS_SCHEMA_LOCATION, +} from '../shared'; + +describe('CfdiXsd - Impuestos Integration Tests', () => { + let cfdiXsd: CfdiXsd; + let catalogProcess: CatalogProcess; + let tipoDatosXsd: TipoDatosXsd; + let cfdiSchema: CfdiSchema; + // Ruta al archivo XSD real + const realXsdPath = path.join(__dirname, '../../src/files/cfdv40.xsd'); + const tipoDatosXsdPath = path.join(__dirname, '../../src/files/tdCFDI.xsd'); + const catalogosXsdPath = path.join(__dirname, '../../src/files/catCFDI.xsd'); + + beforeEach(() => { + cfdiXsd = CfdiXsd.of(); + catalogProcess = CatalogProcess.of(); + tipoDatosXsd = TipoDatosXsd.of(); + cfdiSchema = CfdiSchema.of(); + cfdiXsd.setConfig({ source: realXsdPath }); + catalogProcess.setConfig({ source: catalogosXsdPath }); + tipoDatosXsd.setConfig({ source: tipoDatosXsdPath }); + }); + + describe('XSD Impuestos', () => { + it('should get the XSD Impuestos', async () => { + const catalogos = await catalogProcess.process(); + const tipoDatos = await tipoDatosXsd.process(); + + const result = (await cfdiXsd.getXsdByElement( + 'comprobante_Impuestos', + 'key' + )) as XsdElement; + + const xsd = result?.xsd; + // Validar estructura del objeto XSD + expect(xsd).toBeDefined(); + + // Verificar estructura básica del schema + expect(xsd['xs:schema']).toBeDefined(); + expect(xsd['xs:schema']['_attributes']).toBeDefined(); + + // Verificar namespaces y atributos del schema + const schemaAttrs = xsd['xs:schema']['_attributes']; + expect(schemaAttrs['xmlns:cfdi']).toBe('http://www.sat.gob.mx/cfd/4'); + expect(schemaAttrs['xmlns:xs']).toBe('http://www.w3.org/2001/XMLSchema'); + expect(schemaAttrs['xmlns:catCFDI']).toBe( + 'http://www.sat.gob.mx/sitio_internet/cfd/catalogos' + ); + expect(schemaAttrs['xmlns:tdCFDI']).toBe( + 'http://www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI' + ); + expect(schemaAttrs['targetNamespace']).toBe( + 'http://www.sat.gob.mx/cfd/4' + ); + expect(schemaAttrs['elementFormDefault']).toBe('qualified'); + expect(schemaAttrs['attributeFormDefault']).toBe('unqualified'); + + // Verificar imports + expect(xsd['xs:schema']['xs:import']).toBeDefined(); + expect(Array.isArray(xsd['xs:schema']['xs:import'])).toBe(true); + expect(xsd['xs:schema']['xs:import']).toHaveLength(2); + expect(xsd['xs:schema']['xs:import']).toContainEqual({ + _attributes: { + namespace: CATALOGOS_NAMESPACE, + schemaLocation: CATALOGOS_SCHEMA_LOCATION, + }, + }); + expect(xsd['xs:schema']['xs:import']).toContainEqual({ + _attributes: { + namespace: TIPO_DATOS_NAMESPACE, + schemaLocation: TIPO_DATOS_SCHEMA_LOCATION, + }, + }); + + // Verificar elemento Impuestos + expect(xsd['xs:schema']['xs:element']).toBeDefined(); + expect(xsd['xs:schema']['xs:element']['_attributes']).toEqual( + expect.objectContaining({ + name: 'Impuestos', + }) + ); + + // Verificar complexType + expect(xsd['xs:schema']['xs:element']['xs:complexType']).toBeDefined(); + }); + + it('should get the JsonSchema Impuestos', async () => { + const catalogos = await catalogProcess.process(); + const tipoDatos = await tipoDatosXsd.process(); + + const result = (await cfdiXsd.getXsdByElement( + 'comprobante_Impuestos', + 'key' + )) as XsdElement; + + const res = await cfdiSchema.xsd2Json({ + ...catalogos, + ...tipoDatos, + Impuestos: XMLUtils.toXsd(result?.xsd), + }); + + const jsonSchema = res['Impuestos'].getJsonSchema(); + expect(jsonSchema).toBeDefined(); + expect(jsonSchema.type).toBe('object'); + + // Verificar propiedades que no cambian + expect(jsonSchema.$id).toBe('Impuestos.json'); + expect(jsonSchema.$schema).toBe( + 'http://json-schema.org/draft-07/schema#' + ); + + // Usar regex para el title que contiene timestamp + expect(jsonSchema.title).toMatch( + /^This JSON Schema file was generated from Impuestos on .*\. For more information please see http:\/\/www\.xsd2jsonschema\.org$/ + ); + + // Verificar que properties existe + expect(jsonSchema.properties).toBeDefined(); + + // Impuestos puede tener TotalImpuestosRetenidos y TotalImpuestosTrasladados + if (jsonSchema.properties.TotalImpuestosRetenidos) { + expect(jsonSchema.properties.TotalImpuestosRetenidos.$ref).toContain( + 'tipoDatos.json#/definitions/t_Importe' + ); + } + if (jsonSchema.properties.TotalImpuestosTrasladados) { + expect(jsonSchema.properties.TotalImpuestosTrasladados.$ref).toContain( + 'tipoDatos.json#/definitions/t_Importe' + ); + } + }); + }); + + describe('XSD Retenciones', () => { + it('should get the XSD Retenciones', async () => { + const catalogos = await catalogProcess.process(); + const tipoDatos = await tipoDatosXsd.process(); + + const result = (await cfdiXsd.getXsdByElement( + 'comprobante_Impuestos_Retenciones', + 'key' + )) as XsdElement; + + const xsd = result?.xsd; + + // Validar estructura del objeto XSD + expect(xsd).toBeDefined(); + + // Verificar elemento Retenciones + expect(xsd['xs:schema']['xs:element']).toBeDefined(); + expect(xsd['xs:schema']['xs:element']['_attributes']).toEqual( + expect.objectContaining({ + name: 'Retenciones', + }) + ); + + // Verificar complexType + expect(xsd['xs:schema']['xs:element']['xs:complexType']).toBeDefined(); + }); + + it('should get the JsonSchema Retenciones', async () => { + const catalogos = await catalogProcess.process(); + const tipoDatos = await tipoDatosXsd.process(); + + const result = (await cfdiXsd.getXsdByElement( + 'comprobante_Impuestos_Retenciones', + 'key' + )) as XsdElement; + + const res = await cfdiSchema.xsd2Json({ + ...catalogos, + ...tipoDatos, + Retenciones: XMLUtils.toXsd(result?.xsd), + }); + + const jsonSchema = res['Retenciones'].getJsonSchema(); + + expect(jsonSchema).toBeDefined(); + expect(jsonSchema.type).toBe('object'); + + // Verificar propiedades que no cambian + expect(jsonSchema.$id).toBe('Retenciones.json'); + expect(jsonSchema.$schema).toBe( + 'http://json-schema.org/draft-07/schema#' + ); + }); + }); + + describe('XSD Retencion', () => { + it('should get the XSD Retencion', async () => { + const catalogos = await catalogProcess.process(); + const tipoDatos = await tipoDatosXsd.process(); + + const result = (await cfdiXsd.getXsdByElement( + 'comprobante_Impuestos_Retenciones_Retencion', + 'key' + )) as XsdElement; + + const xsd = result?.xsd; + + // Validar estructura del objeto XSD + expect(xsd).toBeDefined(); + + // Verificar elemento Retencion + expect(xsd['xs:schema']['xs:element']).toBeDefined(); + expect(xsd['xs:schema']['xs:element']['_attributes']).toEqual( + expect.objectContaining({ + name: 'Retencion', + }) + ); + + // Verificar complexType y sus atributos + expect(xsd['xs:schema']['xs:element']['xs:complexType']).toBeDefined(); + + // Verificar atributos del complexType + const attributes = + xsd['xs:schema']['xs:element']['xs:complexType']['xs:attribute']; + expect(Array.isArray(attributes)).toBe(true); + + // Retencion debe tener atributos específicos + const attributeNames = attributes.map( + (attr: any) => attr._attributes.name + ); + expect(attributeNames).toContain('Impuesto'); + expect(attributeNames).toContain('Importe'); + }); + + it('should get the JsonSchema Retencion', async () => { + const catalogos = await catalogProcess.process(); + const tipoDatos = await tipoDatosXsd.process(); + + const result = (await cfdiXsd.getXsdByElement( + 'comprobante_Impuestos_Retenciones_Retencion', + 'key' + )) as XsdElement; + + const res = await cfdiSchema.xsd2Json({ + ...catalogos, + ...tipoDatos, + Retencion: XMLUtils.toXsd(result?.xsd), + }); + + const jsonSchema = res['Retencion'].getJsonSchema(); + + expect(jsonSchema).toBeDefined(); + expect(jsonSchema.type).toBe('object'); + + // Verificar required array para Retencion + expect(jsonSchema.required).toContain('Impuesto'); + expect(jsonSchema.required).toContain('Importe'); + + // Verificar que properties existe y tiene las propiedades esperadas + expect(jsonSchema.properties).toBeDefined(); + expect(jsonSchema.properties.Impuesto).toBeDefined(); + expect(jsonSchema.properties.Importe).toBeDefined(); + + // Verificar referencias específicas + expect(jsonSchema.properties.Impuesto.$ref).toContain( + 'catalogos.json#/definitions/c_Impuesto' + ); + expect(jsonSchema.properties.Importe.$ref).toContain( + 'tipoDatos.json#/definitions/t_Importe' + ); + }); + }); + + describe('XSD Traslados', () => { + it('should get the XSD Traslados', async () => { + const catalogos = await catalogProcess.process(); + const tipoDatos = await tipoDatosXsd.process(); + + const result = (await cfdiXsd.getXsdByElement( + 'comprobante_Impuestos_Traslados', + 'key' + )) as XsdElement; + + const xsd = result?.xsd; + + // Validar estructura del objeto XSD + expect(xsd).toBeDefined(); + + // Verificar elemento Traslados + expect(xsd['xs:schema']['xs:element']).toBeDefined(); + expect(xsd['xs:schema']['xs:element']['_attributes']).toEqual( + expect.objectContaining({ + name: 'Traslados', + }) + ); + + // Verificar complexType + expect(xsd['xs:schema']['xs:element']['xs:complexType']).toBeDefined(); + }); + + it('should get the JsonSchema Traslados', async () => { + const catalogos = await catalogProcess.process(); + const tipoDatos = await tipoDatosXsd.process(); + + const result = (await cfdiXsd.getXsdByElement( + 'comprobante_Impuestos_Traslados', + 'key' + )) as XsdElement; + + const res = await cfdiSchema.xsd2Json({ + ...catalogos, + ...tipoDatos, + Traslados: XMLUtils.toXsd(result?.xsd), + }); + + const jsonSchema = res['Traslados'].getJsonSchema(); + + expect(jsonSchema).toBeDefined(); + expect(jsonSchema.type).toBe('object'); + + // Verificar propiedades que no cambian + expect(jsonSchema.$id).toBe('Traslados.json'); + expect(jsonSchema.$schema).toBe( + 'http://json-schema.org/draft-07/schema#' + ); + }); + }); + + describe('XSD Traslado', () => { + it('should get the XSD Traslado', async () => { + const catalogos = await catalogProcess.process(); + const tipoDatos = await tipoDatosXsd.process(); + + const result = (await cfdiXsd.getXsdByElement( + 'comprobante_Impuestos_Traslados_Traslado', + 'key' + )) as XsdElement; + + const xsd = result?.xsd; + + // Validar estructura del objeto XSD + expect(xsd).toBeDefined(); + + // Verificar elemento Traslado + expect(xsd['xs:schema']['xs:element']).toBeDefined(); + expect(xsd['xs:schema']['xs:element']['_attributes']).toEqual( + expect.objectContaining({ + name: 'Traslado', + }) + ); + + // Verificar complexType y sus atributos + expect(xsd['xs:schema']['xs:element']['xs:complexType']).toBeDefined(); + + // Verificar atributos del complexType + const attributes = + xsd['xs:schema']['xs:element']['xs:complexType']['xs:attribute']; + expect(Array.isArray(attributes)).toBe(true); + + // Traslado debe tener atributos específicos + const attributeNames = attributes.map( + (attr: any) => attr._attributes.name + ); + expect(attributeNames).toContain('Base'); + expect(attributeNames).toContain('Impuesto'); + expect(attributeNames).toContain('TipoFactor'); + }); + + it('should get the JsonSchema Traslado', async () => { + const catalogos = await catalogProcess.process(); + const tipoDatos = await tipoDatosXsd.process(); + + const result = (await cfdiXsd.getXsdByElement( + 'comprobante_Impuestos_Traslados_Traslado', + 'key' + )) as XsdElement; + + const res = await cfdiSchema.xsd2Json({ + ...catalogos, + ...tipoDatos, + Traslado: XMLUtils.toXsd(result?.xsd), + }); + + const jsonSchema = res['Traslado'].getJsonSchema(); + + expect(jsonSchema).toBeDefined(); + expect(jsonSchema.type).toBe('object'); + + // Verificar required array para Traslado + expect(jsonSchema.required).toContain('Base'); + expect(jsonSchema.required).toContain('Impuesto'); + expect(jsonSchema.required).toContain('TipoFactor'); + + // Verificar que properties existe y tiene las propiedades esperadas + expect(jsonSchema.properties).toBeDefined(); + expect(jsonSchema.properties.Base).toBeDefined(); + expect(jsonSchema.properties.Impuesto).toBeDefined(); + expect(jsonSchema.properties.TipoFactor).toBeDefined(); + + // Verificar referencias específicas + expect(jsonSchema.properties.Base.$ref).toContain( + 'tipoDatos.json#/definitions/t_Importe' + ); + expect(jsonSchema.properties.Impuesto.$ref).toContain( + 'catalogos.json#/definitions/c_Impuesto' + ); + expect(jsonSchema.properties.TipoFactor.$ref).toContain( + 'catalogos.json#/definitions/c_TipoFactor' + ); + + // Verificar propiedades opcionales si existen + if (jsonSchema.properties.TasaOCuota) { + expect(jsonSchema.properties.TasaOCuota).toEqual({ + description: + 'Atributo condicional para señalar el valor de la tasa o cuota del impuesto que se traslada por los conceptos amparados en el comprobante.', + minimum: 0, + type: 'number', + }); + } + if (jsonSchema.properties.Importe) { + expect(jsonSchema.properties.Importe).toEqual({ + $ref: 'tipoDatos.json#/definitions/t_Importe', + }); + } + }); + }); +}); diff --git a/packages/cfdi/schema/test/comprobante/informacion_g.xsd.test.ts b/packages/cfdi/schema/test/comprobante/informacion_g.xsd.test.ts new file mode 100644 index 0000000..f8c498a --- /dev/null +++ b/packages/cfdi/schema/test/comprobante/informacion_g.xsd.test.ts @@ -0,0 +1,180 @@ +import { describe, it, expect, beforeEach } from 'vitest'; +import { CfdiXsd, XsdElement } from '../../src/cfdi.xsd'; +import path from 'path'; +import { XMLUtils } from '../../src/common/xml-utils'; +import { CatalogProcess } from '../../src/catalogos.xsd'; +import { TipoDatosXsd } from '../../src/tipo-datos.xsd'; +import { CfdiSchema } from '../../src/schema.xsd'; +const CATALOGOS_NAMESPACE = + 'http://www.sat.gob.mx/sitio_internet/cfd/catalogos'; +const TIPO_DATOS_NAMESPACE = + 'http://www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI'; +const CATALOGOS_SCHEMA_LOCATION = + 'http://www.sat.gob.mx/sitio_internet/cfd/catalogos/catCFDI.xsd'; +const TIPO_DATOS_SCHEMA_LOCATION = + 'http://www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI/tdCFDI.xsd'; + +describe('CfdiXsd - Integration Tests', () => { + let cfdiXsd: CfdiXsd; + let catalogProcess: CatalogProcess; + let tipoDatosXsd: TipoDatosXsd; + let cfdiSchema: CfdiSchema; + // Ruta al archivo XSD real + const realXsdPath = path.join(__dirname, '../../src/files/cfdv40.xsd'); + const tipoDatosXsdPath = path.join(__dirname, '../../src/files/tdCFDI.xsd'); + const catalogosXsdPath = path.join(__dirname, '../../src/files/catCFDI.xsd'); + + beforeEach(() => { + cfdiXsd = CfdiXsd.of(); + catalogProcess = CatalogProcess.of(); + tipoDatosXsd = TipoDatosXsd.of(); + cfdiSchema = CfdiSchema.of(); + cfdiXsd.setConfig({ source: realXsdPath }); + catalogProcess.setConfig({ source: catalogosXsdPath }); + tipoDatosXsd.setConfig({ source: tipoDatosXsdPath }); + }); + + describe('XSD', () => { + it('should get the XSD comprobante', async () => { + const catalogos = await catalogProcess.process(); + const tipoDatos = await tipoDatosXsd.process(); + + const result = (await cfdiXsd.getXsdByElement( + 'InformacionGlobal' + )) as XsdElement; + + const xsd = result?.xsd; + + console.log(JSON.stringify(xsd, null, 2)); + expect(xsd).toBeDefined(); + expect(xsd['xs:schema']['xs:import']).toBeDefined(); + expect(Array.isArray(xsd['xs:schema']['xs:import'])).toBe(true); + expect(xsd['xs:schema']['xs:import']).toHaveLength(2); + expect(xsd['xs:schema']['xs:import']).toContainEqual({ + _attributes: { + namespace: CATALOGOS_NAMESPACE, + schemaLocation: CATALOGOS_SCHEMA_LOCATION, + }, + }); + expect(xsd['xs:schema']['xs:import']).toContainEqual({ + _attributes: { + namespace: TIPO_DATOS_NAMESPACE, + schemaLocation: TIPO_DATOS_SCHEMA_LOCATION, + }, + }); + expect(xsd['xs:schema']['xs:element']['_attributes']).toEqual({ + name: 'InformacionGlobal', + minOccurs: '0', + }); + + expect(xsd['xs:schema']['xs:element']['xs:complexType']['xs:attribute']).toHaveLength(3); + expect(xsd['xs:schema']['xs:element']['xs:complexType']['xs:attribute']).toContainEqual({ + "_attributes": { + "name": "Periodicidad", + "type": "catCFDI:c_Periodicidad", + "use": "required" + }, + "xs:annotation": { + "xs:documentation": { + "_text": "Atributo requerido para expresar el período al que corresponde la información del comprobante global." + } + } + }); + expect(xsd['xs:schema']['xs:element']['xs:complexType']['xs:attribute']).toContainEqual( { + "_attributes": { + "name": "Meses", + "type": "catCFDI:c_Meses", + "use": "required" + }, + "xs:annotation": { + "xs:documentation": { + "_text": "Atributo requerido para expresar el mes o los meses al que corresponde la información del comprobante global." + } + } + },); + expect(xsd['xs:schema']['xs:element']['xs:complexType']['xs:attribute']).toContainEqual({ + "_attributes": { + "name": "Año", + "use": "required" + }, + "xs:annotation": { + "xs:documentation": { + "_text": "Atributo requerido para expresar el año al que corresponde la información del comprobante global." + } + }, + "xs:simpleType": { + "xs:restriction": { + "_attributes": { + "base": "xs:short" + }, + "xs:minInclusive": { + "_attributes": { + "value": "2021" + } + }, + "xs:whiteSpace": { + "_attributes": { + "value": "collapse" + } + } + } + } + }); + }); + }); + + describe('JsonSchema', () => { + it('should get the JsonSchema comprobante', async () => { + cfdiXsd.setConfig({ source: realXsdPath }); + catalogProcess.setConfig({ source: catalogosXsdPath }); + tipoDatosXsd.setConfig({ source: tipoDatosXsdPath }); + + const catalogos = await catalogProcess.process(); + const tipoDatos = await tipoDatosXsd.process(); + + const result = (await cfdiXsd.getXsdByElement( + 'InformacionGlobal' + )) as XsdElement; + + const res = await cfdiSchema.xsd2Json({ + ...catalogos, + ...tipoDatos, + 'InformacionGlobal': XMLUtils.toXsd(result?.xsd), + }); + + const jsonSchema = res['InformacionGlobal'].getJsonSchema(); + + console.log(JSON.stringify(jsonSchema, null, 2)); + expect(jsonSchema).toBeDefined(); + expect(jsonSchema.type).toBe('object'); + + expect(jsonSchema.title).toMatch( + /This JSON Schema file was generated from InformacionGlobal on .*\. For more information please see http:\/\/www\.xsd2jsonschema\.org$/ + ); + expect(jsonSchema.description).toBe( + 'Atributo requerido para expresar el mes o los meses al que corresponde la información del comprobante global.' + ); + expect(jsonSchema.required).toEqual([ + 'Periodicidad', + 'Meses', + 'Año' + ]); + expect(jsonSchema.properties).toEqual({ + 'Periodicidad': { + '$ref': 'catalogos.json#/definitions/c_Periodicidad' + }, + 'Meses': { + '$ref': 'catalogos.json#/definitions/c_Meses' + }, + 'Año': { + 'description': 'Atributo requerido para expresar el año al que corresponde la información del comprobante global.', + 'maximum': 32767, + 'minimum': 2021, + 'type': 'integer' + } + }); + }); + }); +}); + + \ No newline at end of file diff --git a/packages/cfdi/schema/test/comprobante/receptor.xsd.test.ts b/packages/cfdi/schema/test/comprobante/receptor.xsd.test.ts new file mode 100644 index 0000000..0c655e2 --- /dev/null +++ b/packages/cfdi/schema/test/comprobante/receptor.xsd.test.ts @@ -0,0 +1,179 @@ +import { describe, it, expect, beforeEach } from 'vitest'; +import { CfdiXsd, XsdElement } from '../../src/cfdi.xsd'; +import path from 'path'; +import { XMLUtils } from '../../src/common/xml-utils'; +import { CatalogProcess } from '../../src/catalogos.xsd'; +import { TipoDatosXsd } from '../../src/tipo-datos.xsd'; +import { CfdiSchema } from '../../src/schema.xsd'; +import { + CATALOGOS_NAMESPACE, + CATALOGOS_SCHEMA_LOCATION, + TIPO_DATOS_NAMESPACE, + TIPO_DATOS_SCHEMA_LOCATION, +} from '../shared'; + +describe('CfdiXsd - Receptor Integration Tests', () => { + let cfdiXsd: CfdiXsd; + let catalogProcess: CatalogProcess; + let tipoDatosXsd: TipoDatosXsd; + let cfdiSchema: CfdiSchema; + // Ruta al archivo XSD real + const realXsdPath = path.join(__dirname, '../../src/files/cfdv40.xsd'); + const tipoDatosXsdPath = path.join(__dirname, '../../src/files/tdCFDI.xsd'); + const catalogosXsdPath = path.join(__dirname, '../../src/files/catCFDI.xsd'); + + beforeEach(() => { + cfdiXsd = CfdiXsd.of(); + catalogProcess = CatalogProcess.of(); + tipoDatosXsd = TipoDatosXsd.of(); + cfdiSchema = CfdiSchema.of(); + cfdiXsd.setConfig({ source: realXsdPath }); + catalogProcess.setConfig({ source: catalogosXsdPath }); + tipoDatosXsd.setConfig({ source: tipoDatosXsdPath }); + }); + + describe('XSD', () => { + it('should get the XSD Receptor', async () => { + const catalogos = await catalogProcess.process(); + const tipoDatos = await tipoDatosXsd.process(); + + const result = (await cfdiXsd.getXsdByElement('Receptor')) as XsdElement; + + const xsd = result?.xsd; + console.log(JSON.stringify(xsd, null, 2)); + + // Validar estructura del objeto XSD + expect(xsd).toBeDefined(); + + // Verificar estructura básica del schema + expect(xsd['xs:schema']).toBeDefined(); + expect(xsd['xs:schema']['_attributes']).toBeDefined(); + + // Verificar namespaces y atributos del schema + const schemaAttrs = xsd['xs:schema']['_attributes']; + expect(schemaAttrs['xmlns:cfdi']).toBe('http://www.sat.gob.mx/cfd/4'); + expect(schemaAttrs['xmlns:xs']).toBe('http://www.w3.org/2001/XMLSchema'); + expect(schemaAttrs['xmlns:catCFDI']).toBe('http://www.sat.gob.mx/sitio_internet/cfd/catalogos'); + expect(schemaAttrs['xmlns:tdCFDI']).toBe('http://www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI'); + expect(schemaAttrs['targetNamespace']).toBe('http://www.sat.gob.mx/cfd/4'); + expect(schemaAttrs['elementFormDefault']).toBe('qualified'); + expect(schemaAttrs['attributeFormDefault']).toBe('unqualified'); + + // Verificar imports + expect(xsd['xs:schema']['xs:import']).toBeDefined(); + expect(Array.isArray(xsd['xs:schema']['xs:import'])).toBe(true); + expect(xsd['xs:schema']['xs:import']).toHaveLength(2); + expect(xsd['xs:schema']['xs:import']).toContainEqual({ + _attributes: { + namespace: CATALOGOS_NAMESPACE, + schemaLocation: CATALOGOS_SCHEMA_LOCATION, + }, + }); + expect(xsd['xs:schema']['xs:import']).toContainEqual({ + _attributes: { + namespace: TIPO_DATOS_NAMESPACE, + schemaLocation: TIPO_DATOS_SCHEMA_LOCATION, + }, + }); + + // Verificar elemento Receptor + expect(xsd['xs:schema']['xs:element']).toBeDefined(); + expect(xsd['xs:schema']['xs:element']['_attributes']).toEqual({ + name: 'Receptor', + }); + + // Verificar complexType y sus atributos + expect(xsd['xs:schema']['xs:element']['xs:complexType']).toBeDefined(); + + // Verificar atributos del complexType + const attributes = xsd['xs:schema']['xs:element']['xs:complexType']['xs:attribute']; + expect(Array.isArray(attributes)).toBe(true); + expect(attributes.length).toBeGreaterThan(3); // Receptor tiene varios atributos + + // Verificar algunos atributos específicos del Receptor + const attributeNames = attributes.map((attr: any) => attr._attributes.name); + expect(attributeNames).toContain('Rfc'); + expect(attributeNames).toContain('Nombre'); + expect(attributeNames).toContain('DomicilioFiscalReceptor'); + expect(attributeNames).toContain('RegimenFiscalReceptor'); + expect(attributeNames).toContain('UsoCFDI'); + + console.log('✅ XSD Receptor validation passed!'); + console.log('Found attributes:', attributeNames); + }); + }); + + describe('JsonSchema', () => { + it('should get the JsonSchema Receptor', async () => { + const catalogos = await catalogProcess.process(); + const tipoDatos = await tipoDatosXsd.process(); + + const result = (await cfdiXsd.getXsdByElement('Receptor')) as XsdElement; + + const res = await cfdiSchema.xsd2Json({ + ...catalogos, + ...tipoDatos, + Receptor: XMLUtils.toXsd(result?.xsd), + }); + + const jsonSchema = res['Receptor'].getJsonSchema(); + + expect(jsonSchema).toBeDefined(); + expect(jsonSchema.type).toBe('object'); + + // Verificar propiedades que no cambian + expect(jsonSchema.$id).toBe('Receptor.json'); + expect(jsonSchema.$schema).toBe('http://json-schema.org/draft-07/schema#'); + + // Usar regex para el title que contiene timestamp + expect(jsonSchema.title).toMatch(/^This JSON Schema file was generated from Receptor on .*\. For more information please see http:\/\/www\.xsd2jsonschema\.org$/); + + // Verificar required array para Receptor + expect(jsonSchema.required).toContain('Rfc'); + expect(jsonSchema.required).toContain('Nombre'); + expect(jsonSchema.required).toContain('DomicilioFiscalReceptor'); + expect(jsonSchema.required).toContain('RegimenFiscalReceptor'); + expect(jsonSchema.required).toContain('UsoCFDI'); + + // Verificar que properties existe y tiene las propiedades esperadas del Receptor + expect(jsonSchema.properties).toBeDefined(); + expect(jsonSchema.properties).toEqual( { + "Rfc": { + "$ref": "tipoDatos.json#/definitions/t_RFC" + }, + "Nombre": { + "description": "Atributo requerido para registrar el nombre(s), primer apellido, segundo apellido, según corresponda, denominación o razón social del contribuyente, inscrito en el RFC, del receptor del comprobante.", + "maxLength": 300, + "minLength": 1, + "pattern": "[^|]{1,300}", + "type": "string" + }, + "DomicilioFiscalReceptor": { + "description": "Atributo requerido para registrar el código postal del domicilio fiscal del receptor del comprobante.", + "maxLength": 5, + "minLength": 5, + "pattern": "[0-9]{5}", + "type": "string" + }, + "ResidenciaFiscal": { + "$ref": "catalogos.json#/definitions/c_Pais" + }, + "NumRegIdTrib": { + "description": "Atributo condicional para expresar el número de registro de identidad fiscal del receptor cuando sea residente en el extranjero. Es requerido cuando se incluya el complemento de comercio exterior.", + "maxLength": 40, + "minLength": 1, + "type": "string" + }, + "RegimenFiscalReceptor": { + "$ref": "catalogos.json#/definitions/c_RegimenFiscal" + }, + "UsoCFDI": { + "$ref": "catalogos.json#/definitions/c_UsoCFDI" + } + }); + + console.log('✅ JsonSchema Receptor validation passed!'); + console.log(JSON.stringify(jsonSchema, null, 2)); + }); + }); +}); \ No newline at end of file diff --git a/packages/cfdi/schema/test/shared.ts b/packages/cfdi/schema/test/shared.ts new file mode 100644 index 0000000..f3e9b4b --- /dev/null +++ b/packages/cfdi/schema/test/shared.ts @@ -0,0 +1,10 @@ +const CATALOGOS_NAMESPACE = + 'http://www.sat.gob.mx/sitio_internet/cfd/catalogos'; +const TIPO_DATOS_NAMESPACE = + 'http://www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI'; +const CATALOGOS_SCHEMA_LOCATION = + 'http://www.sat.gob.mx/sitio_internet/cfd/catalogos/catCFDI.xsd'; +const TIPO_DATOS_SCHEMA_LOCATION = + 'http://www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI/tdCFDI.xsd'; + +export { CATALOGOS_NAMESPACE, TIPO_DATOS_NAMESPACE, CATALOGOS_SCHEMA_LOCATION, TIPO_DATOS_SCHEMA_LOCATION }; \ No newline at end of file