{"version":3,"sources":["../src/country/index.ts","../src/country/currency.ts","../src/country/currencies/ars.ts","../src/country/types.ts","../src/country/qr-validator.ts","../src/country/currencies/bob.ts","../src/country/currencies/brl.ts","../src/country/currencies/cop.ts","../src/country/currencies/cup.ts","../src/country/currencies/ecu.ts","../src/country/currencies/eur.ts","../src/country/currencies/idr.ts","../src/country/currencies/inr.ts","../src/country/currencies/mex.ts","../src/country/currencies/ngn.ts","../src/country/currencies/pen.ts","../src/country/currencies/php.ts","../src/country/currencies/usd.ts","../src/country/currencies/ven.ts","../src/country/payment-fields.ts","../src/country/countries.ts","../src/country/validators.ts"],"sourcesContent":["// ── Constants ────────────────────────────────────────────────────────────\n\nexport {\n\tCOUNTRY_OPTIONS,\n\tgetCountryOption,\n\tgetTransferWarning,\n\tuploadsPaymentQR,\n\tusesCatalogPaymentForm,\n\tusesPackedPaymentId,\n} from \"./countries\";\nexport { CURRENCY, CURRENCY_CODES } from \"./currency\";\nexport { PAYMENT_ID_FIELDS } from \"./payment-fields\";\n\n// ── Types ───────────────────────────────────────────────────────────────\n\nexport type { PeruvianPaymentIdParts } from \"./currencies/pen\";\nexport type { VenezuelanPaymentIdParts } from \"./currencies/ven\";\nexport type { CurrencyCode } from \"./currency\";\nexport { type CountryOption, PACKED_PAYMENT_ID_SEP, type PaymentIdFieldConfig } from \"./types\";\n\n// ── Validators ──────────────────────────────────────────────────────────\n\nexport {\n\tassignPaymentIdToFieldValues,\n\tassignStoredPaymentIdToFieldValues,\n\tdeserializeCompoundPaymentId,\n\tformatCompoundPaymentIdForDisplay,\n\tformatStoredPaymentIdForDisplay,\n\tgetPayQrPayload,\n\tgetStoredQrPayload,\n\tpackStoredPaymentId,\n\tserializeCompoundPaymentId,\n\tunpackPackedPaymentId,\n\tvalidateArgentinePaymentId,\n\tvalidateBolivianAccount,\n\tvalidateBolivianQr,\n\tvalidateCatalogPaymentDraft,\n\tvalidateColombianPaymentId,\n\tvalidateCubanCardNumber,\n\tvalidateCubanPhoneNumber,\n\tvalidateEcuadorianAccountName,\n\tvalidateEcuadorianAccountNumber,\n\tvalidateEcuadorianCedula,\n\tvalidateIndonesianPhoneNumber,\n\tvalidateMexicanPaymentId,\n\tvalidateNigerianAccountName,\n\tvalidateNigerianAccountNumber,\n\tvalidatePaymentIdFields,\n\tvalidatePeruvianCci,\n\tvalidatePeruvianPaymentId,\n\tvalidatePeruvianPaymentKey,\n\tvalidatePeruvianPhone,\n\tvalidatePeruvianQr,\n\tvalidatePhilippinePhoneNumber,\n\tvalidatePIXId,\n\tvalidateRevolutId,\n\tvalidateStoredPaymentId,\n\tvalidateUPIId,\n\tvalidateVenezuelanPaymentId,\n\tvalidateVenezuelanPhoneNumber,\n\tvalidateVenezuelanQr,\n\tvalidateVenezuelanRif,\n} from \"./validators\";\n","/**\n * All supported currency symbols. Single source of truth for the SDK.\n *\n * Lives alongside the country metadata so that adding a currency is a\n * single-folder operation: drop a new file in `currencies/<code>.ts`, add it\n * to this map, and both `COUNTRY_OPTIONS` and `ZodCurrencySchema` pick it up.\n */\nexport const CURRENCY = {\n\tIDR: \"IDR\",\n\tINR: \"INR\",\n\tBRL: \"BRL\",\n\tARS: \"ARS\",\n\tMEX: \"MEX\",\n\tVEN: \"VEN\",\n\tBOB: \"BOB\",\n\tEUR: \"EUR\",\n\tNGN: \"NGN\",\n\tUSD: \"USD\",\n\tCOP: \"COP\",\n\tCUP: \"CUP\",\n\tECU: \"ECU\",\n\tPEN: \"PEN\",\n\tPHP: \"PHP\",\n} as const;\n\n/** Union of supported currency codes. */\nexport type CurrencyCode = (typeof CURRENCY)[keyof typeof CURRENCY];\n\n/**\n * Tuple form of the currency codes — used by `z.enum(...)` in the shared\n * validation layer. Narrow tuple type required by Zod.\n */\nexport const CURRENCY_CODES = Object.values(CURRENCY) as [CurrencyCode, ...CurrencyCode[]];\n","import { CURRENCY } from \"../currency\";\nimport type { CountryOption, PaymentIdFieldConfig } from \"../types\";\n\nexport const ARS_PLACEHOLDER = \"juan.perez\";\nexport const ARS_VALIDATION_ERROR =\n\t\"Please enter a valid CBU/CVU (22 digits) or Alias (6-20 characters)\";\n\n/** Validates CBU (Clave Bancaria Uniforme) — Argentine banking key, 22 digits with checksums. */\nfunction validateCBU(cbu: string): boolean {\n\tif (cbu.length !== 22) return false;\n\tif (/^(\\d)\\1{21}$/.test(cbu)) return false;\n\n\tconst bankCode = cbu.substring(0, 7);\n\tconst bankCheckDigit = parseInt(cbu[7], 10);\n\tlet sum = 0;\n\tconst weights = [7, 1, 3, 9, 7, 1, 3];\n\tfor (let i = 0; i < 7; i++) {\n\t\tsum += parseInt(bankCode[i], 10) * weights[i];\n\t}\n\tconst calculatedBankCheck = (10 - (sum % 10)) % 10;\n\tif (bankCheckDigit !== calculatedBankCheck) return false;\n\n\tconst accountNumber = cbu.substring(8, 21);\n\tconst accountCheckDigit = parseInt(cbu[21], 10);\n\tsum = 0;\n\tconst accountWeights = [3, 9, 7, 1, 3, 9, 7, 1, 3, 9, 7, 1, 3];\n\tfor (let i = 0; i < 13; i++) {\n\t\tsum += parseInt(accountNumber[i], 10) * accountWeights[i];\n\t}\n\tconst calculatedAccountCheck = (10 - (sum % 10)) % 10;\n\tif (accountCheckDigit !== calculatedAccountCheck) return false;\n\n\treturn true;\n}\n\n/**\n * Validates Argentine payment IDs (CBU, CVU, or Alias).\n * CBU/CVU: 22 digits with checksum. Alias: 6-20 alphanumeric characters.\n */\nexport function validateArgentinePaymentId(paymentId: string): boolean {\n\tif (!paymentId || paymentId.trim().length === 0) return false;\n\n\tconst trimmedPaymentId = paymentId.trim();\n\n\tif (/^\\d{22}$/.test(trimmedPaymentId)) return validateCBU(trimmedPaymentId);\n\tif (/^[a-zA-Z0-9.\\-_]{6,20}$/.test(trimmedPaymentId)) return true;\n\n\treturn false;\n}\n\n/** Payment ID field configuration for ARS (Argentina, ALIAS). */\nexport const ARS_PAYMENT_FIELDS: PaymentIdFieldConfig[] = [\n\t{\n\t\tkey: \"alias\",\n\t\tlabel: \"ALIAS_ID\",\n\t\tplaceholder: ARS_PLACEHOLDER,\n\t\tdisplayLabel: \"Alias\",\n\t\tvalidate: validateArgentinePaymentId,\n\t\tvalidationErrorMessage: ARS_VALIDATION_ERROR,\n\t},\n];\n\n/** Country option for Argentina (ARS). */\nexport const ARS_COUNTRY_OPTION: CountryOption = {\n\tcountry: \"Argentina\",\n\tcurrency: CURRENCY.ARS,\n\tsymbolNative: \"$\",\n\tlocale: \"es-AR\",\n\tpaymentMethod: \"ALIAS\",\n\tpaymentAddressName: \"ALIAS_ID\",\n\ttimezone: \"America/Argentina/Buenos_Aires\",\n\ttimezone_name: \"ART\",\n\tflag: \"🇦🇷\",\n\tflagUrl: \"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1e6-1f1f7.png\",\n\tphoneCode: \"+54\",\n\ttelegramSupportChannel: \"https://t.me/p2pmeargentina\",\n\ttwitterUsername: \"p2pmeargentina\",\n\tsmsCountryCodes: [\"AR\"],\n\tprecision: 2,\n\tisAlpha: false,\n\tdisabled: false,\n\tdisabledPaymentTypes: [],\n};\n","import type { CurrencyCode } from \"../types\";\n\n/** Joins an optional QR payload with typed fields (`qr||phone|cci`). */\nexport const PACKED_PAYMENT_ID_SEP = \"||\";\n\nexport interface PaymentIdFieldConfig {\n\treadonly key: string;\n\treadonly label: string;\n\treadonly placeholder: string;\n\treadonly displayLabel: string | null;\n\treadonly validate: (value: string) => boolean;\n\treadonly validationErrorMessage: string;\n\t/**\n\t * When true, an empty value is allowed. If every field is optional, at least\n\t * one field must still be filled (see `validatePaymentIdFields`).\n\t */\n\treadonly optional?: boolean;\n}\n\nexport interface CountryOption {\n\treadonly country: string;\n\treadonly currency: CurrencyCode;\n\treadonly internationalFormat?: string;\n\treadonly symbolNative: string;\n\treadonly locale: string;\n\treadonly paymentMethod: string;\n\treadonly paymentAddressName: string;\n\treadonly timezone: string;\n\treadonly timezone_name: string;\n\treadonly flag: string;\n\treadonly phoneCode?: string;\n\treadonly flagUrl: string;\n\treadonly telegramSupportChannel: string;\n\treadonly twitterUsername: string;\n\treadonly smsCountryCodes: readonly string[];\n\treadonly precision: number;\n\treadonly isAlpha: boolean;\n\treadonly disabled: boolean;\n\treadonly disabledPaymentTypes: readonly string[];\n\t/**\n\t * Merchant/seller provides payment details by uploading a QR image.\n\t * Distinct from PAY, where the buyer scans a QR. Default: false.\n\t */\n\treadonly uploadPaymentQR?: boolean;\n\t/** Structural check for a standalone QR payload (no `||` pack). */\n\treadonly validateQr?: (payload: string) => boolean;\n\t/**\n\t * PAY display: payload to re-draw a stored QR. May be looser than\n\t * `validateQr` so old orders still render (e.g. Yape/Plin without CRC,\n\t * Pago Móvil without `merchantId`). Scan & Pay uses `validateQr` /\n\t * parsers, not this hook. Apps call `getPayQrPayload(currency, id)` —\n\t * do not branch on currency.\n\t */\n\treadonly getPayQrPayload?: (paymentId: string) => string | null;\n\t/**\n\t * Fill catalog fields from a validated QR (e.g. Yape/Plin phone in EMVCo).\n\t * Only used when the typed fallback did not already set the key.\n\t */\n\treadonly hydrateFieldsFromQr?: (qr: string) => Partial<Record<string, string>>;\n\t/**\n\t * i18n key for a warning shown before the payer sends fiat (e.g. a bank\n\t * outage). Apps call `getTransferWarning(currency)` — do not branch on\n\t * currency. Omit when there is no warning.\n\t */\n\treadonly transferWarning?: string;\n}\n","/**\n * QR payload checks for **SELL collection** (seller/merchant uploads a QR).\n *\n * Why this file exists: user-app and merchant-app share the same “is this\n * blob a payment QR we can store?” rules. Keeping them here means the apps\n * call `CountryOption.validateQr` instead of copying peru/ven parsers.\n *\n * This is not `@p2pdotme/sdk/qr-parsers`. Parsers are Scan & Pay: they\n * pull amount/address out of a live scan. Peru Scan & Pay (`parsePeru`)\n * reuses `validatePeruvianQr` so a bad CRC cannot become the stored ID.\n *\n * Image → string stays in the apps (`qr-scanner` needs a File / canvas).\n * This module only sees the decoded payload string.\n */\nimport { PACKED_PAYMENT_ID_SEP } from \"./types\";\n\nfunction crc16ccitt(s: string): string {\n\tlet crc = 0xffff;\n\tfor (let i = 0; i < s.length; i++) {\n\t\tcrc ^= s.charCodeAt(i) << 8;\n\t\tfor (let j = 0; j < 8; j++) {\n\t\t\tcrc = crc & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1;\n\t\t\tcrc &= 0xffff;\n\t\t}\n\t}\n\treturn crc.toString(16).toUpperCase().padStart(4, \"0\");\n}\n\n/**\n * Structural EMVCo upload check: parseable TLV, country tag 58, currency tag 53,\n * and a matching CRC-16/CCITT-FALSE (tag 63). CRC is required on upload so we\n * never persist a truncated screenshot. `getPayQrPayload` may still re-draw a\n * stored blob whose CRC later fails.\n */\nfunction validateEmvcoQr(payload: string, country: string, currency: string): boolean {\n\tif (!payload || payload.trim().length === 0) return false;\n\tconst data = payload.trim();\n\n\tconst tags: Record<string, string> = {};\n\tlet pos = 0;\n\twhile (pos + 4 <= data.length) {\n\t\tconst tag = data.substring(pos, pos + 2);\n\t\tconst lengthStr = data.substring(pos + 2, pos + 4);\n\t\tif (!/^[0-9]{2}$/.test(tag) || !/^[0-9]{2}$/.test(lengthStr)) break;\n\t\tconst length = Number.parseInt(lengthStr, 10);\n\t\tif (pos + 4 + length > data.length) break;\n\t\ttags[tag] = data.substring(pos + 4, pos + 4 + length);\n\t\tpos += 4 + length;\n\t}\n\n\tif (tags[\"58\"] !== country) return false;\n\tif (tags[\"53\"] !== currency) return false;\n\n\tconst crcTag = tags[\"63\"];\n\tif (!crcTag) return false;\n\n\tconst marker = data.lastIndexOf(\"6304\");\n\tif (marker === -1) return false;\n\n\tconst expected = crc16ccitt(data.substring(0, marker + 4));\n\treturn expected.toUpperCase() === crcTag.toUpperCase();\n}\n\n/**\n * Yape/Plin EMVCo: country PE, currency 604, CRC-16/CCITT-FALSE.\n * Same rule for SELL upload and Scan & Pay (`parsePeru`).\n * `getPayQrPayload` may still re-draw a stored blob whose CRC later fails.\n */\nexport function validatePeruvianQr(payload: string): boolean {\n\treturn validateEmvcoQr(payload, \"PE\", \"604\");\n}\n\n/**\n * Bolivia QR Simple encrypted envelope (Yape Bs, BancoSol, Banco Fie dynamic QR,\n * etc.): `<base64 ciphertext>|<hex checksum>`. The payload is bank-encrypted so we\n * cannot read account/amount — we only validate the envelope shape and store it\n * verbatim to re-render. The checksum is a hex digest whose length varies by bank\n * (24 hex for Banco Fie, 32 hex for Yape/BancoSol). Reject packed `||` IDs so a\n * stored compound string is never mistaken for a QR.\n */\nfunction isBolivianEncryptedQr(payload: string): boolean {\n\tconst trimmed = payload.trim();\n\tif (trimmed.includes(PACKED_PAYMENT_ID_SEP)) return false;\n\tconst sep = trimmed.lastIndexOf(\"|\");\n\tif (sep < 40) return false;\n\tconst blob = trimmed.slice(0, sep);\n\tconst tag = trimmed.slice(sep + 1);\n\tif (blob.length % 4 !== 0) return false;\n\tif (!/^[A-Za-z0-9+/]+={0,2}$/.test(blob)) return false;\n\treturn /^(?:[0-9A-Fa-f]{24}|[0-9A-Fa-f]{32})$/.test(tag);\n}\n\n/**\n * Bolivia QR Simple. Accepts either the encrypted envelope (Yape Bs, BancoSol\n * dynamic QR — `<base64>|<32-hex>`) or an EMVCo static QR (country BO, currency\n * 068, CRC-16/CCITT-FALSE). CRC / envelope shape is required on upload so we\n * never persist a truncated screenshot.\n */\nexport function validateBolivianQr(payload: string): boolean {\n\tif (!payload || payload.trim().length === 0) return false;\n\treturn isBolivianEncryptedQr(payload) || validateEmvcoQr(payload, \"BO\", \"068\");\n}\n\n/**\n * Suiche 7B / Pago Móvil collection QR: `base64?merchantId=NNNN&…`.\n * The base64 is bank AES — we cannot decode phone/RIF from it, only the\n * envelope. Reject packed `||` IDs so a stored compound string is never\n * treated as a QR. Same rule for SELL upload and Scan & Pay (`parsePagoMovil`).\n * `getPayQrPayload` may still re-draw a stored blob without `merchantId`.\n */\nexport function validateVenezuelanQr(payload: string): boolean {\n\tif (!payload || typeof payload !== \"string\") return false;\n\tconst trimmed = payload.trim();\n\tif (trimmed.includes(PACKED_PAYMENT_ID_SEP)) return false;\n\tconst qIdx = trimmed.indexOf(\"?\");\n\tif (qIdx < 40) return false;\n\tconst blob = trimmed.substring(0, qIdx);\n\tif (!/^[A-Za-z0-9+/=]+$/.test(blob)) return false;\n\treturn /(?:^|[?&])merchantId=\\d{3,4}(?:&|$)/.test(trimmed.substring(qIdx));\n}\n\n/** Left side of `qr||fields`, or the whole string when not packed. */\nexport function payQrCandidate(paymentId: string): string {\n\tconst trimmed = paymentId.trim();\n\tconst sep = trimmed.indexOf(PACKED_PAYMENT_ID_SEP);\n\treturn (sep >= 0 ? trimmed.slice(0, sep) : trimmed).trim();\n}\n\n/**\n * PAY display: Yape/Plin EMVCo (PE / 604) even when CRC fails.\n * SELL upload still uses `validatePeruvianQr`.\n */\nexport function isPeruvianPayQr(payload: string): boolean {\n\tif (!payload.startsWith(\"0002\")) return false;\n\treturn payload.includes(\"5802PE\") && payload.includes(\"5303604\");\n}\n\n/**\n * PAY display: Pago Móvil envelope `base64?…` without requiring merchantId.\n * SELL upload still uses `validateVenezuelanQr`.\n */\nexport function isVenezuelanPayQr(payload: string): boolean {\n\tif (!payload || payload.includes(PACKED_PAYMENT_ID_SEP)) return false;\n\tconst qIdx = payload.indexOf(\"?\");\n\tif (qIdx === -1) return false;\n\tconst blob = payload.slice(0, qIdx);\n\treturn blob.length > 0 && /^[A-Za-z0-9+/=]+$/.test(blob);\n}\n\n/**\n * PAY display: QR Ph EMVCo (PH / 608). SELL PHP is `phone|bank-name`, not a QR.\n * CRC is not required here — Scan & Pay already gated it on create.\n */\nexport function isPhilippinePayQr(payload: string): boolean {\n\tif (!payload.startsWith(\"0002\")) return false;\n\treturn payload.includes(\"5802PH\") && payload.includes(\"5303608\");\n}\n\n/**\n * PAY display: Bolivia QR Simple. EMVCo (BO / 068) even when CRC fails, or an\n * encrypted envelope `<base64>|<hex>` with a looser checksum than SELL upload\n * (16–64 hex vs 24/32). SELL still uses `validateBolivianQr`.\n */\nexport function isBolivianPayQr(payload: string): boolean {\n\tif (!payload || payload.includes(PACKED_PAYMENT_ID_SEP)) return false;\n\tif (payload.startsWith(\"0002\") && payload.includes(\"5802BO\") && payload.includes(\"5303068\")) {\n\t\treturn true;\n\t}\n\tconst sep = payload.lastIndexOf(\"|\");\n\tif (sep < 40) return false;\n\tconst blob = payload.slice(0, sep);\n\tconst tag = payload.slice(sep + 1);\n\tif (blob.length % 4 !== 0) return false;\n\tif (!/^[A-Za-z0-9+/]+={0,2}$/.test(blob)) return false;\n\treturn /^[0-9A-Fa-f]{16,64}$/.test(tag);\n}\n","import { CURRENCY } from \"../currency\";\nimport { isBolivianPayQr, payQrCandidate, validateBolivianQr } from \"../qr-validator\";\nimport type { CountryOption, PaymentIdFieldConfig } from \"../types\";\n\nexport { validateBolivianQr };\n\nexport const BOB_PLACEHOLDER = \"Bank account number (8–20 digits)\";\nexport const BOB_VALIDATION_ERROR = \"Please enter a valid Bolivian bank account number\";\n\n/**\n * Validates a Bolivian bank account number for QR Simple transfers.\n * Accepts 8–20 digits; spaces and dashes are ignored.\n */\nexport function validateBolivianAccount(account: string): boolean {\n\tif (!account || account.trim().length === 0) return false;\n\tconst cleaned = account.trim().replace(/[\\s-]/g, \"\");\n\treturn /^\\d{8,20}$/.test(cleaned);\n}\n\n/** Payment ID field configuration for BOB (Bolivia, QR Simple). */\nexport const BOB_PAYMENT_FIELDS: PaymentIdFieldConfig[] = [\n\t{\n\t\tkey: \"account\",\n\t\tlabel: \"ACCOUNT_NUMBER\",\n\t\tplaceholder: BOB_PLACEHOLDER,\n\t\tdisplayLabel: \"Cuenta\",\n\t\tvalidate: validateBolivianAccount,\n\t\tvalidationErrorMessage: BOB_VALIDATION_ERROR,\n\t},\n];\n\n/** Country option for Bolivia (BOB). */\nexport const BOB_COUNTRY_OPTION: CountryOption = {\n\tcountry: \"Bolivia\",\n\tcurrency: CURRENCY.BOB,\n\tinternationalFormat: \"BOB\",\n\tsymbolNative: \"Bs.\",\n\tlocale: \"es-BO\",\n\tpaymentMethod: \"QR_SIMPLE\",\n\tpaymentAddressName: \"QR_SIMPLE_DETAILS\",\n\ttimezone: \"America/La_Paz\",\n\ttimezone_name: \"BOT\",\n\tflag: \"🇧🇴\",\n\tflagUrl: \"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1e7-1f1f4.png\",\n\tphoneCode: \"+591\",\n\ttelegramSupportChannel: \"https://t.me/p2pmebolivia\",\n\ttwitterUsername: \"p2pmebolivia\",\n\tsmsCountryCodes: [\"BO\"],\n\tprecision: 2,\n\tisAlpha: true,\n\tdisabled: false,\n\tdisabledPaymentTypes: [],\n\tuploadPaymentQR: true,\n\tvalidateQr: validateBolivianQr,\n\tgetPayQrPayload: (paymentId) => {\n\t\tconst candidate = payQrCandidate(paymentId);\n\t\treturn isBolivianPayQr(candidate) ? candidate : null;\n\t},\n};\n","import { CURRENCY } from \"../currency\";\nimport type { CountryOption, PaymentIdFieldConfig } from \"../types\";\n\nexport const BRL_PLACEHOLDER = \"Chave pix ou pix copia e cola\";\nexport const BRL_VALIDATION_ERROR = \"Please enter a valid PIX ID\";\n\n/** Validates CPF (Brazilian tax ID for individuals). */\nfunction validateCPF(cpf: string): boolean {\n\tif (cpf.length !== 11) return false;\n\tif (/^(\\d)\\1{10}$/.test(cpf)) return false;\n\n\tlet sum = 0;\n\tfor (let i = 0; i < 9; i++) {\n\t\tsum += parseInt(cpf[i], 10) * (10 - i);\n\t}\n\tlet remainder = sum % 11;\n\tconst firstDigit = remainder < 2 ? 0 : 11 - remainder;\n\tif (parseInt(cpf[9], 10) !== firstDigit) return false;\n\n\tsum = 0;\n\tfor (let i = 0; i < 10; i++) {\n\t\tsum += parseInt(cpf[i], 10) * (11 - i);\n\t}\n\tremainder = sum % 11;\n\tconst secondDigit = remainder < 2 ? 0 : 11 - remainder;\n\treturn parseInt(cpf[10], 10) === secondDigit;\n}\n\n/** Validates CNPJ (Brazilian tax ID for companies). */\nfunction validateCNPJ(cnpj: string): boolean {\n\tif (cnpj.length !== 14) return false;\n\tif (/^(\\d)\\1{13}$/.test(cnpj)) return false;\n\n\tlet sum = 0;\n\tconst weights1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];\n\tfor (let i = 0; i < 12; i++) {\n\t\tsum += parseInt(cnpj[i], 10) * weights1[i];\n\t}\n\tlet remainder = sum % 11;\n\tconst firstDigit = remainder < 2 ? 0 : 11 - remainder;\n\tif (parseInt(cnpj[12], 10) !== firstDigit) return false;\n\n\tsum = 0;\n\tconst weights2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];\n\tfor (let i = 0; i < 13; i++) {\n\t\tsum += parseInt(cnpj[i], 10) * weights2[i];\n\t}\n\tremainder = sum % 11;\n\tconst secondDigit = remainder < 2 ? 0 : 11 - remainder;\n\treturn parseInt(cnpj[13], 10) === secondDigit;\n}\n\n/**\n * Validates PIX ID format.\n * PIX can be: CPF (11 digits), CNPJ (14 digits), email, phone (10–11 digits or E.164),\n * random key (UUID), or a PIX \"copia e cola\" EMV QR payload (starts with 000201).\n */\nexport function validatePIXId(pixId: string): boolean {\n\tif (!pixId || pixId.trim().length === 0) return false;\n\n\tconst trimmedPixId = pixId.trim();\n\n\t// PIX \"copia e cola\" — EMV QR code payload\n\tif (/^000201/.test(trimmedPixId)) return true;\n\n\t// 11 digits: valid CPF or Brazilian mobile phone key (DDD 11–99 + digit 9 + 8 digits)\n\tif (/^\\d{11}$/.test(trimmedPixId))\n\t\treturn validateCPF(trimmedPixId) || /^[1-9][1-9]9\\d{8}$/.test(trimmedPixId);\n\tif (/^\\d{14}$/.test(trimmedPixId)) return validateCNPJ(trimmedPixId);\n\tif (/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(trimmedPixId)) return true;\n\t// Phone key: 10–11 digits (with or without country code prefix)\n\tif (/^\\d{10,11}$/.test(trimmedPixId)) return true;\n\tif (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(trimmedPixId))\n\t\treturn true;\n\n\treturn false;\n}\n\n/** Payment ID field configuration for BRL (Brazil, PIX). */\nexport const BRL_PAYMENT_FIELDS: PaymentIdFieldConfig[] = [\n\t{\n\t\tkey: \"pix\",\n\t\tlabel: \"PIX_ID\",\n\t\tplaceholder: BRL_PLACEHOLDER,\n\t\tdisplayLabel: \"PIX ID\",\n\t\tvalidate: validatePIXId,\n\t\tvalidationErrorMessage: BRL_VALIDATION_ERROR,\n\t},\n];\n\n/** Country option for Brazil (BRL). */\nexport const BRL_COUNTRY_OPTION: CountryOption = {\n\tcountry: \"Brazil\",\n\tcurrency: CURRENCY.BRL,\n\tsymbolNative: \"R$\",\n\tlocale: \"pt-BR\",\n\tpaymentMethod: \"PIX\",\n\tpaymentAddressName: \"PIX_ID\",\n\ttimezone: \"America/Sao_Paulo\",\n\ttimezone_name: \"BRT\",\n\tflag: \"🇧🇷\",\n\tflagUrl: \"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1e7-1f1f7.png\",\n\tphoneCode: \"+55\",\n\ttelegramSupportChannel: \"https://t.me/p2pmebrasil\",\n\ttwitterUsername: \"p2pmebrasil\",\n\tsmsCountryCodes: [\"BR\"],\n\tprecision: 2,\n\tisAlpha: false,\n\tdisabled: false,\n\tdisabledPaymentTypes: [],\n};\n","import { CURRENCY } from \"../currency\";\nimport type { CountryOption, PaymentIdFieldConfig } from \"../types\";\n\nexport const COP_PLACEHOLDER = \"3001234567 / juan.perez@nequi.com.co / @alias\";\nexport const COP_VALIDATION_ERROR =\n\t\"Please enter a valid Colombian payment ID (e.g., 3001234567, email, or @alias)\";\n\n/**\n * Validates Colombian payment ID for Nequi, Daviplata, or Bre-B.\n * Accepts a 10-digit phone number starting with 3, a valid email address,\n * or a Bre-B alias starting with @ (e.g. @juanperez).\n */\nexport function validateColombianPaymentId(paymentId: string): boolean {\n\tif (!paymentId || paymentId.trim().length === 0) return false;\n\tconst trimmed = paymentId.trim();\n\tif (/^3\\d{9}$/.test(trimmed)) return true;\n\tif (/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(trimmed)) return true;\n\tif (/^@\\S+$/.test(trimmed)) return true;\n\treturn false;\n}\n\n/** Payment ID field configuration for COP (Colombia, Transferencia). */\nexport const COP_PAYMENT_FIELDS: PaymentIdFieldConfig[] = [\n\t{\n\t\tkey: \"alias\",\n\t\tlabel: \"ALIAS_TRANSFERENCIA\",\n\t\tplaceholder: COP_PLACEHOLDER,\n\t\tdisplayLabel: \"Nequi / Daviplata / Bre-B\",\n\t\tvalidate: validateColombianPaymentId,\n\t\tvalidationErrorMessage: COP_VALIDATION_ERROR,\n\t},\n];\n\n/** Country option for Colombia (COP). */\nexport const COP_COUNTRY_OPTION: CountryOption = {\n\tcountry: \"Colombia\",\n\tcurrency: CURRENCY.COP,\n\tsymbolNative: \"$\",\n\tlocale: \"es-CO\",\n\tpaymentMethod: \"TRANSFERENCIA\",\n\tpaymentAddressName: \"ALIAS_TRANSFERENCIA\",\n\ttimezone: \"America/Bogota\",\n\ttimezone_name: \"COT\",\n\tflag: \"🇨🇴\",\n\tflagUrl: \"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1e8-1f1f4.png\",\n\tphoneCode: \"+57\",\n\ttelegramSupportChannel: \"https://t.me/p2pmecolombiaclientes\",\n\ttwitterUsername: \"p2pmeColombia\",\n\tsmsCountryCodes: [\"CO\"],\n\tprecision: 2,\n\tisAlpha: true,\n\tdisabled: false,\n\tdisabledPaymentTypes: [],\n};\n","import { CURRENCY } from \"../currency\";\nimport type { CountryOption, PaymentIdFieldConfig } from \"../types\";\n\nexport const CUP_PLACEHOLDER_PHONE = \"54004417\";\nexport const CUP_PLACEHOLDER_CARD = \"9227 9598 7238 3620\";\n\nexport const CUP_VALIDATION_ERROR_PHONE =\n\t\"Please enter a valid 8-digit phone number (e.g., 54004417)\";\nexport const CUP_VALIDATION_ERROR_CARD =\n\t\"Please enter a valid 16-digit card number (e.g., 9227 9598 7238 3620)\";\n\n/**\n * Validates Cuban phone number for Transfermóvil.\n * Format: 8 digits, optionally prefixed with the +53 country code.\n */\nexport function validateCubanPhoneNumber(phoneNumber: string): boolean {\n\tif (!phoneNumber || phoneNumber.trim().length === 0) return false;\n\n\tconst cleaned = phoneNumber.trim().replace(/\\D/g, \"\");\n\n\tif (/^\\d{8}$/.test(cleaned)) return true;\n\tif (/^53\\d{8}$/.test(cleaned)) return true;\n\n\treturn false;\n}\n\n/**\n * Validates Cuban bank card number for Transfermóvil.\n * Format: 16 digits, spaces allowed (e.g., \"9227 9598 7238 3620\").\n */\nexport function validateCubanCardNumber(cardNumber: string): boolean {\n\tif (!cardNumber || cardNumber.trim().length === 0) return false;\n\tconst cleaned = cardNumber.trim().replace(/[\\s-]/g, \"\");\n\treturn /^\\d{16}$/.test(cleaned);\n}\n\n/** Payment ID field configuration for CUP (Cuba, Transfermóvil). */\nexport const CUP_PAYMENT_FIELDS: PaymentIdFieldConfig[] = [\n\t{\n\t\tkey: \"phone\",\n\t\tlabel: \"PHONE_NUMBER\",\n\t\tplaceholder: CUP_PLACEHOLDER_PHONE,\n\t\tdisplayLabel: \"Phone\",\n\t\tvalidate: validateCubanPhoneNumber,\n\t\tvalidationErrorMessage: CUP_VALIDATION_ERROR_PHONE,\n\t},\n\t{\n\t\tkey: \"card\",\n\t\tlabel: \"CARD_NUMBER\",\n\t\tplaceholder: CUP_PLACEHOLDER_CARD,\n\t\tdisplayLabel: \"Card\",\n\t\tvalidate: validateCubanCardNumber,\n\t\tvalidationErrorMessage: CUP_VALIDATION_ERROR_CARD,\n\t},\n];\n\n/** Country option for Cuba (CUP). Transfermóvil transfers, including QR payments. */\nexport const CUP_COUNTRY_OPTION: CountryOption = {\n\tcountry: \"Cuba\",\n\tcurrency: CURRENCY.CUP,\n\tsymbolNative: \"$\",\n\tlocale: \"es-CU\",\n\tpaymentMethod: \"TRANSFERMOVIL\",\n\tpaymentAddressName: \"TRANSFERMOVIL_DETAILS\",\n\ttimezone: \"America/Havana\",\n\ttimezone_name: \"CST\",\n\tflag: \"🇨🇺\",\n\tflagUrl: \"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1e8-1f1fa.png\",\n\tphoneCode: \"+53\",\n\ttelegramSupportChannel: \"https://t.me/p2pdotmecuba\",\n\ttwitterUsername: \"P2Pdotmecuba\",\n\tsmsCountryCodes: [\"CU\"],\n\tprecision: 2,\n\tisAlpha: true,\n\tdisabled: false,\n\tdisabledPaymentTypes: [],\n\ttransferWarning: \"CUP_BANDEC_WARNING\",\n};\n","import { CURRENCY } from \"../currency\";\nimport type { CountryOption, PaymentIdFieldConfig } from \"../types\";\n\n// ── Placeholders & error messages ────────────────────────────────────────────\n\nexport const ECU_PLACEHOLDER_BANK = \"Banco Pichincha\";\nexport const ECU_PLACEHOLDER_ACCOUNT_TYPE = \"Savings / Checking\";\nexport const ECU_PLACEHOLDER_ACCOUNT_NUMBER = \"2100123456\";\nexport const ECU_PLACEHOLDER_NAME = \"Juan Pérez\";\nexport const ECU_PLACEHOLDER_CEDULA = \"1710034065\";\n\nexport const ECU_BANK_VALIDATION_ERROR = \"Please enter the bank name\";\nexport const ECU_ACCOUNT_TYPE_VALIDATION_ERROR = \"Please enter the account type\";\nexport const ECU_ACCOUNT_NUMBER_VALIDATION_ERROR =\n\t\"Please enter a valid account number (4-20 digits)\";\nexport const ECU_NAME_VALIDATION_ERROR = \"Please enter the account holder name\";\nexport const ECU_CEDULA_VALIDATION_ERROR = \"Please enter a valid Ecuadorian cédula or RUC\";\n\n// ── Validators ───────────────────────────────────────────────────────────────\n\nfunction isValidCedulaCore(cedula: string): boolean {\n\tif (!/^\\d{10}$/.test(cedula)) return false;\n\tconst province = Number(cedula.slice(0, 2));\n\tif (province < 1 || province > 24) return false;\n\tif (Number(cedula[2]) >= 6) return false;\n\n\tconst coefficients = [2, 1, 2, 1, 2, 1, 2, 1, 2];\n\tlet sum = 0;\n\tfor (let i = 0; i < 9; i++) {\n\t\tlet product = Number(cedula[i]) * coefficients[i];\n\t\tif (product > 9) product -= 9;\n\t\tsum += product;\n\t}\n\tconst checkDigit = sum % 10 === 0 ? 0 : 10 - (sum % 10);\n\treturn checkDigit === Number(cedula[9]);\n}\n\n/**\n * Validates an Ecuadorian cédula (10-digit, módulo-10 checksum) or a 13-digit RUC\n * whose first 10 digits form a valid cédula. Province must be 01–24 and the third\n * digit < 6 (natural person).\n */\nexport function validateEcuadorianCedula(value: string): boolean {\n\tif (!value || value.trim().length === 0) return false;\n\tconst cleaned = value.trim().replace(/\\D/g, \"\");\n\tif (cleaned.length === 13) return isValidCedulaCore(cleaned.slice(0, 10));\n\tif (cleaned.length !== 10) return false;\n\treturn isValidCedulaCore(cleaned);\n}\n\n/** Validates an Ecuadorian bank account number — 4–20 digits after stripping separators. */\nexport function validateEcuadorianAccountNumber(value: string): boolean {\n\tif (!value || value.trim().length === 0) return false;\n\tconst cleaned = value.trim().replace(/\\D/g, \"\");\n\treturn /^\\d{4,20}$/.test(cleaned);\n}\n\n/** Validates an account holder name — non-empty, letters/spaces/apostrophe/period/hyphen only. */\nexport function validateEcuadorianAccountName(value: string): boolean {\n\tif (!value || value.trim().length === 0) return false;\n\treturn /^[A-Za-zÀ-ÿ][A-Za-zÀ-ÿ .'-]{1,}$/.test(value.trim());\n}\n\n// ── Payment fields ───────────────────────────────────────────────────────────\n\n/** Payment ID field configuration for ECU (Ecuador, bank transfer — all free text). */\nexport const ECU_PAYMENT_FIELDS: PaymentIdFieldConfig[] = [\n\t{\n\t\tkey: \"bank-name\",\n\t\tlabel: \"BANK_NAME\",\n\t\tplaceholder: ECU_PLACEHOLDER_BANK,\n\t\tdisplayLabel: \"Bank\",\n\t\tvalidate: (v: string) => v.trim().length > 0,\n\t\tvalidationErrorMessage: ECU_BANK_VALIDATION_ERROR,\n\t},\n\t{\n\t\tkey: \"account-type\",\n\t\tlabel: \"ACCOUNT_TYPE\",\n\t\tplaceholder: ECU_PLACEHOLDER_ACCOUNT_TYPE,\n\t\tdisplayLabel: \"Account Type\",\n\t\tvalidate: (v: string) => v.trim().length > 0,\n\t\tvalidationErrorMessage: ECU_ACCOUNT_TYPE_VALIDATION_ERROR,\n\t},\n\t{\n\t\tkey: \"account-number\",\n\t\tlabel: \"ACCOUNT_NUMBER\",\n\t\tplaceholder: ECU_PLACEHOLDER_ACCOUNT_NUMBER,\n\t\tdisplayLabel: \"Account Number\",\n\t\tvalidate: validateEcuadorianAccountNumber,\n\t\tvalidationErrorMessage: ECU_ACCOUNT_NUMBER_VALIDATION_ERROR,\n\t},\n\t{\n\t\tkey: \"account-name\",\n\t\tlabel: \"NAME\",\n\t\tplaceholder: ECU_PLACEHOLDER_NAME,\n\t\tdisplayLabel: \"Name\",\n\t\tvalidate: validateEcuadorianAccountName,\n\t\tvalidationErrorMessage: ECU_NAME_VALIDATION_ERROR,\n\t},\n\t{\n\t\tkey: \"cedula\",\n\t\tlabel: \"CEDULA\",\n\t\tplaceholder: ECU_PLACEHOLDER_CEDULA,\n\t\tdisplayLabel: \"Cédula\",\n\t\tvalidate: validateEcuadorianCedula,\n\t\tvalidationErrorMessage: ECU_CEDULA_VALIDATION_ERROR,\n\t},\n];\n\n// ── Country option ───────────────────────────────────────────────────────────\n\n/** Country option for Ecuador (ECU — USD-denominated, bank transfer + DeUna QR). */\nexport const ECU_COUNTRY_OPTION: CountryOption = {\n\tcountry: \"Ecuador\",\n\tcurrency: CURRENCY.ECU,\n\tinternationalFormat: \"USD\",\n\tsymbolNative: \"$\",\n\tlocale: \"es-EC\",\n\tpaymentMethod: \"TRANSFERENCIA\",\n\tpaymentAddressName: \"ECU_BANK_DETAILS\",\n\ttimezone: \"America/Guayaquil\",\n\ttimezone_name: \"ECT\",\n\tflag: \"🇪🇨\",\n\tflagUrl: \"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1ea-1f1e8.png\",\n\tphoneCode: \"+593\",\n\ttelegramSupportChannel: \"https://t.me/Ecuador_P2P\",\n\ttwitterUsername: \"P2Pdotme_Ecu\",\n\tsmsCountryCodes: [],\n\tprecision: 2,\n\tisAlpha: true,\n\tdisabled: false,\n\tdisabledPaymentTypes: [],\n};\n","import { CURRENCY } from \"../currency\";\nimport type { CountryOption, PaymentIdFieldConfig } from \"../types\";\n\nexport const EUR_PLACEHOLDER = \"@username or email\";\nexport const EUR_VALIDATION_ERROR = \"Please enter a valid Revolut ID (username, email, or phone)\";\n\n/**\n * Validates Revolut ID (username, email, or phone number).\n */\nexport function validateRevolutId(revolutId: string): boolean {\n\tif (!revolutId || revolutId.trim().length === 0) return false;\n\n\tconst trimmed = revolutId.trim();\n\n\tif (/^@?[a-zA-Z0-9._-]{3,30}$/.test(trimmed)) return true;\n\tif (/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(trimmed)) return true;\n\tif (/^\\+?\\d{7,15}$/.test(trimmed)) return true;\n\n\treturn false;\n}\n\n/** Payment ID field configuration for EUR (Revolut EUR). */\nexport const EUR_PAYMENT_FIELDS: PaymentIdFieldConfig[] = [\n\t{\n\t\tkey: \"revolut\",\n\t\tlabel: \"REVOLUT_ID\",\n\t\tplaceholder: EUR_PLACEHOLDER,\n\t\tdisplayLabel: \"Revolut ID\",\n\t\tvalidate: validateRevolutId,\n\t\tvalidationErrorMessage: EUR_VALIDATION_ERROR,\n\t},\n];\n\n/** Country option for Revolut EUR. */\nexport const EUR_COUNTRY_OPTION: CountryOption = {\n\tcountry: \"Revolut EUR\",\n\tcurrency: CURRENCY.EUR,\n\tsymbolNative: \"€\",\n\tlocale: \"de-DE\",\n\tpaymentMethod: \"REVOLUT\",\n\tpaymentAddressName: \"REVOLUT_ID\",\n\ttimezone: \"Europe/Berlin\",\n\ttimezone_name: \"CET\",\n\tflag: \"\",\n\tflagUrl: \"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f310.png\",\n\tphoneCode: \"\",\n\ttelegramSupportChannel: \"https://t.me/P2Pdotme\",\n\ttwitterUsername: \"P2Pdotme\",\n\tsmsCountryCodes: [],\n\tprecision: 2,\n\tisAlpha: true,\n\tdisabled: true,\n\tdisabledPaymentTypes: [\"PAY\"],\n};\n","import { CURRENCY } from \"../currency\";\nimport type { CountryOption, PaymentIdFieldConfig } from \"../types\";\n\nexport const IDR_PLACEHOLDER = \"8123456789\";\nexport const IDR_VALIDATION_ERROR =\n\t\"Please enter a valid Indonesian phone number (e.g., 8123456789)\";\n\n/**\n * Validates Indonesian phone number.\n * Validates just the number part (9-12 digits).\n */\nexport function validateIndonesianPhoneNumber(phoneNumber: string): boolean {\n\tif (!phoneNumber || phoneNumber.trim().length === 0) return false;\n\tif (/[a-zA-Z]/.test(phoneNumber)) return false;\n\tconst cleaned = phoneNumber.replace(/\\D/g, \"\");\n\treturn /^\\d{9,12}$/.test(cleaned);\n}\n\n/** Payment ID field configuration for IDR (Indonesia, QRIS). */\nexport const IDR_PAYMENT_FIELDS: PaymentIdFieldConfig[] = [\n\t{\n\t\tkey: \"phone\",\n\t\tlabel: \"PHONE_NUMBER\",\n\t\tplaceholder: IDR_PLACEHOLDER,\n\t\tdisplayLabel: \"Phone Number\",\n\t\tvalidate: validateIndonesianPhoneNumber,\n\t\tvalidationErrorMessage: IDR_VALIDATION_ERROR,\n\t},\n];\n\n/** Country option for Indonesia (IDR). */\nexport const IDR_COUNTRY_OPTION: CountryOption = {\n\tcountry: \"Indonesia\",\n\tcurrency: CURRENCY.IDR,\n\tsymbolNative: \"Rp\",\n\tlocale: \"id-ID\",\n\tpaymentMethod: \"QRIS\",\n\tpaymentAddressName: \"PHONE_NUMBER\",\n\ttimezone: \"Asia/Jakarta\",\n\ttimezone_name: \"WIB\",\n\tflag: \"🇮🇩\",\n\tflagUrl: \"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1ee-1f1e9.png\",\n\tphoneCode: \"+62\",\n\ttelegramSupportChannel: \"https://t.me/p2pmeindonesia\",\n\ttwitterUsername: \"p2pdotmeID\",\n\tsmsCountryCodes: [],\n\tprecision: 0,\n\tisAlpha: false,\n\tdisabled: false,\n\tdisabledPaymentTypes: [],\n};\n","import { CURRENCY } from \"../currency\";\nimport type { CountryOption, PaymentIdFieldConfig } from \"../types\";\n\nexport const INR_PLACEHOLDER = \"merchant@upi\";\nexport const INR_VALIDATION_ERROR = \"Please enter a valid UPI ID (e.g., username@bankname)\";\n\n/**\n * Validates UPI ID format.\n * UPI ID format: username@bankname (e.g., john@paytm, user@ybl, 8658404239@kotak811)\n */\nexport function validateUPIId(upiId: string): boolean {\n\tif (!upiId || upiId.trim().length === 0) return false;\n\tconst upiRegex = /^[a-zA-Z0-9.\\-_]{2,256}@[a-zA-Z0-9]{2,64}$/;\n\treturn upiRegex.test(upiId.trim());\n}\n\n/** Payment ID field configuration for INR (India, UPI). */\nexport const INR_PAYMENT_FIELDS: PaymentIdFieldConfig[] = [\n\t{\n\t\tkey: \"upi\",\n\t\tlabel: \"UPI_ID\",\n\t\tplaceholder: INR_PLACEHOLDER,\n\t\tdisplayLabel: \"UPI ID\",\n\t\tvalidate: validateUPIId,\n\t\tvalidationErrorMessage: INR_VALIDATION_ERROR,\n\t},\n];\n\n/** Country option for India (INR). */\nexport const INR_COUNTRY_OPTION: CountryOption = {\n\tcountry: \"India\",\n\tcurrency: CURRENCY.INR,\n\tsymbolNative: \"₹\",\n\tlocale: \"en-IN\",\n\tpaymentMethod: \"UPI\",\n\tpaymentAddressName: \"UPI_ID\",\n\ttimezone: \"Asia/Kolkata\",\n\ttimezone_name: \"IST\",\n\tflag: \"🇮🇳\",\n\tflagUrl: \"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1ee-1f1f3.png\",\n\tphoneCode: \"+91\",\n\ttelegramSupportChannel: \"https://t.me/P2Pdotme\",\n\ttwitterUsername: \"P2Pdotme\",\n\tsmsCountryCodes: [\"IN\"],\n\tprecision: 2,\n\tisAlpha: false,\n\tdisabled: false,\n\tdisabledPaymentTypes: [],\n};\n","import { CURRENCY } from \"../currency\";\nimport type { CountryOption, PaymentIdFieldConfig } from \"../types\";\n\nexport const MEX_PLACEHOLDER = \"012345678901234567\";\nexport const MEX_VALIDATION_ERROR =\n\t\"Please enter a valid CLABE (18 digits), card number, or phone number\";\n\n/**\n * Validates Mexican payment IDs (CLABE, card number, or phone number).\n * CLABE: 18 digits. Card: 16 digits. Phone: 10 digits.\n */\nexport function validateMexicanPaymentId(paymentId: string): boolean {\n\tif (!paymentId || paymentId.trim().length === 0) return false;\n\n\tconst trimmed = paymentId.trim().replace(/\\D/g, \"\");\n\n\tif (/^\\d{18}$/.test(trimmed)) return true;\n\tif (/^\\d{16}$/.test(trimmed)) return true;\n\tif (/^\\d{10}$/.test(trimmed)) return true;\n\n\treturn false;\n}\n\n/** Payment ID field configuration for MEX (Mexico, SPEI). */\nexport const MEX_PAYMENT_FIELDS: PaymentIdFieldConfig[] = [\n\t{\n\t\tkey: \"clabe\",\n\t\tlabel: \"CLABE_ID\",\n\t\tplaceholder: MEX_PLACEHOLDER,\n\t\tdisplayLabel: \"CLABE\",\n\t\tvalidate: validateMexicanPaymentId,\n\t\tvalidationErrorMessage: MEX_VALIDATION_ERROR,\n\t},\n];\n\n/** Country option for Mexico (MEX). */\nexport const MEX_COUNTRY_OPTION: CountryOption = {\n\tcountry: \"Mexico\",\n\tcurrency: CURRENCY.MEX,\n\tinternationalFormat: \"MXN\",\n\tsymbolNative: \"Mx\",\n\tlocale: \"es-MX\",\n\tpaymentMethod: \"SPEI\",\n\tpaymentAddressName: \"CLABE_ID\",\n\ttimezone: \"America/Mexico_City\",\n\ttimezone_name: \"CST\",\n\tflag: \"🇲🇽\",\n\tflagUrl: \"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1f2-1f1fd.png\",\n\tphoneCode: \"+52\",\n\ttelegramSupportChannel: \"https://t.me/p2pdotmex\",\n\ttwitterUsername: \"p2pmemexico\",\n\tsmsCountryCodes: [\"MX\"],\n\tprecision: 2,\n\tisAlpha: true,\n\tdisabled: true,\n\tdisabledPaymentTypes: [\"PAY\"],\n};\n","import { CURRENCY } from \"../currency\";\nimport type { CountryOption, PaymentIdFieldConfig } from \"../types\";\n\nexport const NGN_PLACEHOLDER = \"0123456789\";\nexport const NGN_PLACEHOLDER_BANK = \"Bank Name\";\nexport const NGN_PLACEHOLDER_ACCOUNT_NAME = \"Account Name\";\nexport const NGN_VALIDATION_ERROR = \"Please enter a valid 10-digit account number\";\nexport const NGN_BANK_NAME_VALIDATION_ERROR = \"Please enter a valid bank name\";\nexport const NGN_ACCOUNT_NAME_VALIDATION_ERROR = \"Please enter a valid account name\";\n\n/**\n * Validates Nigerian bank account number (NUBAN format, 10 digits).\n */\nexport function validateNigerianAccountNumber(accountNumber: string): boolean {\n\tif (!accountNumber || accountNumber.trim().length === 0) return false;\n\tconst cleaned = accountNumber.trim().replace(/\\D/g, \"\");\n\treturn /^\\d{10}$/.test(cleaned);\n}\n\n/**\n * Validates a Nigerian bank account holder name (non-empty, letters/spaces/.'- only).\n */\nexport function validateNigerianAccountName(accountName: string): boolean {\n\tif (!accountName || accountName.trim().length === 0) return false;\n\treturn /^[A-Za-z][A-Za-z .'-]{1,}$/.test(accountName.trim());\n}\n\n/** Payment ID field configuration for NGN (Nigeria, NIP). */\nexport const NGN_PAYMENT_FIELDS: PaymentIdFieldConfig[] = [\n\t{\n\t\tkey: \"account\",\n\t\tlabel: \"ACCOUNT_NUMBER\",\n\t\tplaceholder: NGN_PLACEHOLDER,\n\t\tdisplayLabel: \"Account Number\",\n\t\tvalidate: validateNigerianAccountNumber,\n\t\tvalidationErrorMessage: NGN_VALIDATION_ERROR,\n\t},\n\t{\n\t\tkey: \"bank-name\",\n\t\tlabel: \"BANK_NAME\",\n\t\tplaceholder: NGN_PLACEHOLDER_BANK,\n\t\tdisplayLabel: \"Bank Name\",\n\t\tvalidate: (v: string) => v.trim().length > 0,\n\t\tvalidationErrorMessage: NGN_BANK_NAME_VALIDATION_ERROR,\n\t},\n\t{\n\t\tkey: \"account-name\",\n\t\tlabel: \"ACCOUNT_NAME\",\n\t\tplaceholder: NGN_PLACEHOLDER_ACCOUNT_NAME,\n\t\tdisplayLabel: \"Account Name\",\n\t\tvalidate: validateNigerianAccountName,\n\t\tvalidationErrorMessage: NGN_ACCOUNT_NAME_VALIDATION_ERROR,\n\t},\n];\n\n/** Country option for Nigeria (NGN). */\nexport const NGN_COUNTRY_OPTION: CountryOption = {\n\tcountry: \"Nigeria\",\n\tcurrency: CURRENCY.NGN,\n\tsymbolNative: \"₦\",\n\tlocale: \"en-NG\",\n\tpaymentMethod: \"NIP\",\n\tpaymentAddressName: \"ACCOUNT_NUMBER\",\n\ttimezone: \"Africa/Lagos\",\n\ttimezone_name: \"WAT\",\n\tflag: \"🇳🇬\",\n\tflagUrl: \"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1f3-1f1ec.png\",\n\tphoneCode: \"+234\",\n\ttelegramSupportChannel: \"https://t.me/p2pmengn\",\n\ttwitterUsername: \"p2pmeNigeria\",\n\tsmsCountryCodes: [],\n\tprecision: 2,\n\tisAlpha: true,\n\tdisabled: false,\n\tdisabledPaymentTypes: [],\n};\n","import { CURRENCY } from \"../currency\";\nimport { isPeruvianPayQr, payQrCandidate, validatePeruvianQr } from \"../qr-validator\";\nimport { type CountryOption, PACKED_PAYMENT_ID_SEP, type PaymentIdFieldConfig } from \"../types\";\n\nexport { validatePeruvianQr };\n\nexport const PEN_PLACEHOLDER = \"CCI (20 digits) or Yape/Plin phone (9XXXXXXXX)\";\nexport const PEN_PHONE_PLACEHOLDER = \"PERU_PHONE_PLACEHOLDER\";\nexport const PEN_CCI_PLACEHOLDER = \"PERU_CCI_PLACEHOLDER\";\nexport const PEN_VALIDATION_ERROR = \"Please enter a valid 20-digit CCI or Yape/Plin phone number\";\nexport const PEN_PHONE_VALIDATION_ERROR = \"Please enter a valid Yape/Plin phone (9XXXXXXXX)\";\nexport const PEN_CCI_VALIDATION_ERROR = \"Please enter a valid 20-digit CCI\";\n\n/** Validates a 20-digit Peruvian CCI (spaces ignored). */\nexport function validatePeruvianCci(value: string): boolean {\n\tif (!value || value.trim().length === 0) return false;\n\treturn /^\\d{20}$/.test(value.trim().replace(/\\s+/g, \"\"));\n}\n\n/**\n * Validates a Yape/Plin phone: `9` + 8 digits, optional `+51` / `51` prefix.\n */\nexport function validatePeruvianPhone(value: string): boolean {\n\tif (!value || value.trim().length === 0) return false;\n\tconst phone = value\n\t\t.trim()\n\t\t.replace(/\\s+/g, \"\")\n\t\t.replace(/^\\+?51/, \"\");\n\treturn /^9\\d{8}$/.test(phone);\n}\n\n/**\n * Validates a Peruvian payment key for the legacy single-field path.\n * Accepts either a 20-digit CCI or a Yape/Plin phone number.\n */\nexport function validatePeruvianPaymentKey(value: string): boolean {\n\treturn validatePeruvianCci(value) || validatePeruvianPhone(value);\n}\n\n/** Normalizes a CCI or Yape/Plin phone to the stored digit form. */\nexport function normalizePeruvianPaymentKey(value: string): string {\n\tconst trimmed = value.trim();\n\tconst cci = trimmed.replace(/\\s+/g, \"\");\n\tif (/^\\d{20}$/.test(cci)) return cci;\n\tconst phone = trimmed.replace(/\\s+/g, \"\").replace(/^\\+?51/, \"\");\n\tif (/^9\\d{8}$/.test(phone)) return phone;\n\treturn cci;\n}\n\nexport type PeruvianPaymentIdParts = {\n\tqr: string | null;\n\tphone: string | null;\n\tcci: string | null;\n};\n\nfunction looksLikeTlv(value: string): boolean {\n\tif (value.length < 5 || !/^\\d{4}/.test(value)) return false;\n\tconst len = Number.parseInt(value.slice(2, 4), 10);\n\treturn !Number.isNaN(len) && len >= 0 && 4 + len <= value.length;\n}\n\n/**\n * Phone from a TLV value. Skips hex hashes (Yape tag 39) so `998765432`\n * inside a checksum never counts. Allows `+51` / `51` glued to a 9XXXXXXXX.\n */\nfunction phoneFromTlvValue(value: string): string | null {\n\tconst trimmed = value.trim();\n\tif (!trimmed) return null;\n\tif (validatePeruvianPhone(trimmed)) return normalizePeruvianPaymentKey(trimmed);\n\tif (/^[0-9a-f]+$/i.test(trimmed) && /[a-f]/i.test(trimmed)) return null;\n\tconst match = trimmed.match(/(^|[^0-9])(\\+?51)?(9\\d{8})(?![0-9])/);\n\tif (!match) return null;\n\tconst candidate = `${match[2] ?? \"\"}${match[3]}`;\n\treturn validatePeruvianPhone(candidate) ? normalizePeruvianPaymentKey(candidate) : null;\n}\n\n/**\n * Walks EMVCo TLV (merchant-account templates, additional data, and any nested\n * TLV) and returns the first Yape/Plin phone found.\n */\nfunction extractPeruvianPhoneFromQr(payload: string): string | null {\n\tlet pos = 0;\n\twhile (pos + 4 <= payload.length) {\n\t\tconst tag = payload.slice(pos, pos + 2);\n\t\tconst len = Number.parseInt(payload.slice(pos + 2, pos + 4), 10);\n\t\tif (Number.isNaN(len) || len < 0 || pos + 4 + len > payload.length) break;\n\t\tconst value = payload.slice(pos + 4, pos + 4 + len);\n\t\tconst direct = phoneFromTlvValue(value);\n\t\tif (direct) return direct;\n\t\tif ((tag >= \"02\" && tag <= \"51\") || tag === \"62\" || tag === \"64\" || looksLikeTlv(value)) {\n\t\t\tconst nested = extractPeruvianPhoneFromQr(value);\n\t\t\tif (nested) return nested;\n\t\t}\n\t\tpos += 4 + len;\n\t}\n\tconst glued = payload.match(/\\+51\\s*9\\d{8}/);\n\tif (glued && validatePeruvianPhone(glued[0])) {\n\t\treturn normalizePeruvianPaymentKey(glued[0]);\n\t}\n\treturn null;\n}\n\nfunction parsePeruvianFallback(value: string): Pick<PeruvianPaymentIdParts, \"phone\" | \"cci\"> {\n\tconst trimmed = value.trim();\n\tif (!trimmed) return { phone: null, cci: null };\n\tconst tokens = trimmed\n\t\t.split(\"|\")\n\t\t.map((token) => token.trim())\n\t\t.filter(Boolean);\n\tlet phone: string | null = null;\n\tlet cci: string | null = null;\n\tfor (const token of tokens) {\n\t\tif (!phone && validatePeruvianPhone(token)) {\n\t\t\tphone = normalizePeruvianPaymentKey(token);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!cci && validatePeruvianCci(token)) {\n\t\t\tcci = normalizePeruvianPaymentKey(token);\n\t\t}\n\t}\n\treturn { phone, cci };\n}\n\n/**\n * Splits a stored PEN payment ID into QR payload and/or typed fallback.\n * Formats: EMVCo blob, CCI, phone, `phone|cci`, or `blob||fallback`.\n */\nexport function parsePeruvianPaymentId(value: string | null | undefined): PeruvianPaymentIdParts {\n\tif (!value || typeof value !== \"string\") {\n\t\treturn { qr: null, phone: null, cci: null };\n\t}\n\tconst trimmed = value.trim();\n\tconst sep = trimmed.indexOf(PACKED_PAYMENT_ID_SEP);\n\tif (sep >= 0) {\n\t\tconst left = trimmed.slice(0, sep);\n\t\tconst right = trimmed.slice(sep + PACKED_PAYMENT_ID_SEP.length);\n\t\tconst fallback = parsePeruvianFallback(right);\n\t\tconst qr = validatePeruvianQr(left) ? left : null;\n\t\treturn {\n\t\t\tqr,\n\t\t\tphone: fallback.phone ?? (qr ? extractPeruvianPhoneFromQr(qr) : null),\n\t\t\tcci: fallback.cci,\n\t\t};\n\t}\n\tif (validatePeruvianQr(trimmed)) {\n\t\treturn {\n\t\t\tqr: trimmed,\n\t\t\tphone: extractPeruvianPhoneFromQr(trimmed),\n\t\t\tcci: null,\n\t\t};\n\t}\n\tconst fallback = parsePeruvianFallback(trimmed);\n\treturn { qr: null, phone: fallback.phone, cci: fallback.cci };\n}\n\nexport function serializePeruvianPaymentId(\n\tqr: string | null | undefined,\n\tphone: string | null | undefined,\n\tcci: string | null | undefined,\n): string {\n\tconst q = qr?.trim() && validatePeruvianQr(qr.trim()) ? qr.trim() : \"\";\n\tconst p = phone?.trim() && validatePeruvianPhone(phone) ? normalizePeruvianPaymentKey(phone) : \"\";\n\tconst c = cci?.trim() && validatePeruvianCci(cci) ? normalizePeruvianPaymentKey(cci) : \"\";\n\tconst fallback = p && c ? `${p}|${c}` : p || c;\n\tif (q && fallback) return `${q}${PACKED_PAYMENT_ID_SEP}${fallback}`;\n\treturn q || fallback;\n}\n\nfunction isValidPeruvianTypedRest(value: string): boolean {\n\tconst nonempty = value\n\t\t.split(\"|\")\n\t\t.map((token) => token.trim())\n\t\t.filter((token) => token.length > 0);\n\tif (nonempty.length === 0) return false;\n\treturn nonempty.every((token) => validatePeruvianPhone(token) || validatePeruvianCci(token));\n}\n\n/** QR payload and/or CCI and/or Yape/Plin phone. A packed rest must be valid typed fields. */\nexport function validatePeruvianPaymentId(value: string): boolean {\n\tif (!value || typeof value !== \"string\") return false;\n\tconst trimmed = value.trim();\n\tconst sep = trimmed.indexOf(PACKED_PAYMENT_ID_SEP);\n\tif (sep >= 0) {\n\t\tconst left = trimmed.slice(0, sep);\n\t\tconst right = trimmed.slice(sep + PACKED_PAYMENT_ID_SEP.length);\n\t\tconst qrOk = validatePeruvianQr(left);\n\t\tif (right.trim()) return qrOk && isValidPeruvianTypedRest(right);\n\t\treturn qrOk;\n\t}\n\tif (validatePeruvianQr(trimmed)) return true;\n\treturn isValidPeruvianTypedRest(trimmed);\n}\n\n/** Payment ID field configuration for PEN (Peru). At least one of phone / CCI. */\nexport const PEN_PAYMENT_FIELDS: PaymentIdFieldConfig[] = [\n\t{\n\t\tkey: \"phone\",\n\t\tlabel: \"PERU_PHONE_LABEL\",\n\t\tplaceholder: PEN_PHONE_PLACEHOLDER,\n\t\tdisplayLabel: \"Yape / Plin phone\",\n\t\tvalidate: validatePeruvianPhone,\n\t\tvalidationErrorMessage: PEN_PHONE_VALIDATION_ERROR,\n\t\toptional: true,\n\t},\n\t{\n\t\tkey: \"cci\",\n\t\tlabel: \"PERU_CCI_LABEL\",\n\t\tplaceholder: PEN_CCI_PLACEHOLDER,\n\t\tdisplayLabel: \"CCI\",\n\t\tvalidate: validatePeruvianCci,\n\t\tvalidationErrorMessage: PEN_CCI_VALIDATION_ERROR,\n\t\toptional: true,\n\t},\n];\n\n/** Country option for Peru (PEN). */\nexport const PEN_COUNTRY_OPTION: CountryOption = {\n\tcountry: \"Peru\",\n\tcurrency: CURRENCY.PEN,\n\tsymbolNative: \"S/\",\n\tlocale: \"es-PE\",\n\tpaymentMethod: \"YAPE_PLIN_CCI\",\n\tpaymentAddressName: \"YAPE_PLIN_CCI_DETAILS\",\n\ttimezone: \"America/Lima\",\n\ttimezone_name: \"PET\",\n\tflag: \"🇵🇪\",\n\tflagUrl: \"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1f5-1f1ea.png\",\n\tphoneCode: \"+51\",\n\ttelegramSupportChannel: \"https://t.me/p2pmeperu\",\n\ttwitterUsername: \"p2pmePeru\",\n\tsmsCountryCodes: [\"PE\"],\n\tprecision: 2,\n\tisAlpha: true,\n\tdisabled: false,\n\tdisabledPaymentTypes: [],\n\tuploadPaymentQR: true,\n\tvalidateQr: validatePeruvianQr,\n\tgetPayQrPayload: (paymentId) => {\n\t\tconst candidate = payQrCandidate(paymentId);\n\t\treturn isPeruvianPayQr(candidate) ? candidate : null;\n\t},\n\thydrateFieldsFromQr: (qr) => {\n\t\tconst phone = extractPeruvianPhoneFromQr(qr);\n\t\treturn phone ? { phone } : {};\n\t},\n};\n","import { CURRENCY } from \"../currency\";\nimport { isPhilippinePayQr, payQrCandidate } from \"../qr-validator\";\nimport type { CountryOption, PaymentIdFieldConfig } from \"../types\";\n\nexport const PHP_PLACEHOLDER_PHONE = \"9171234567\";\nexport const PHP_PLACEHOLDER_BANK = \"GCash\";\n\nexport const PHP_VALIDATION_ERROR_PHONE =\n\t\"Please enter a valid Philippine mobile number (e.g., 9171234567)\";\nexport const PHP_BANK_NAME_VALIDATION_ERROR = \"Please enter the receiving bank or e-wallet\";\n\n/**\n * Validates a Philippine mobile number for InstaPay (GCash / Maya).\n * Mobile numbers are 10 digits starting with 9, and are commonly written\n * locally as `09XXXXXXXXX` or internationally as `+63 9XXXXXXXXX`.\n */\nexport function validatePhilippinePhoneNumber(phoneNumber: string): boolean {\n\tif (!phoneNumber || phoneNumber.trim().length === 0) return false;\n\tif (/[a-zA-Z]/.test(phoneNumber)) return false;\n\n\tconst cleaned = phoneNumber.trim().replace(/\\D/g, \"\");\n\n\tif (/^9\\d{9}$/.test(cleaned)) return true;\n\tif (/^09\\d{9}$/.test(cleaned)) return true;\n\tif (/^639\\d{9}$/.test(cleaned)) return true;\n\n\treturn false;\n}\n\n/**\n * Payment ID field configuration for PHP (Philippines, InstaPay).\n *\n * InstaPay is an interbank rail, so the receiving institution has to be named\n * alongside the number — it may be an e-wallet (GCash, Maya), a digital bank\n * (GoTyme) or a local bank. For e-wallets the account number is the mobile\n * number the wallet is registered to.\n */\nexport const PHP_PAYMENT_FIELDS: PaymentIdFieldConfig[] = [\n\t{\n\t\tkey: \"phone\",\n\t\tlabel: \"PHONE_NUMBER\",\n\t\tplaceholder: PHP_PLACEHOLDER_PHONE,\n\t\tdisplayLabel: \"Phone Number\",\n\t\tvalidate: validatePhilippinePhoneNumber,\n\t\tvalidationErrorMessage: PHP_VALIDATION_ERROR_PHONE,\n\t},\n\t{\n\t\tkey: \"bank-name\",\n\t\tlabel: \"BANK_NAME\",\n\t\tplaceholder: PHP_PLACEHOLDER_BANK,\n\t\tdisplayLabel: \"Bank Name\",\n\t\tvalidate: (v: string) => v.trim().length > 0,\n\t\tvalidationErrorMessage: PHP_BANK_NAME_VALIDATION_ERROR,\n\t},\n];\n\n/**\n * Country option for the Philippines (PHP).\n *\n * Payment channel is InstaPay — merchants are free to receive through GCash or\n * Maya, both of which settle over InstaPay. Scan & Pay supports the QR Ph\n * standard only (wallet-proprietary GCash-only / Maya-only QRs are ignored),\n * mirroring how QRIS is handled for Indonesia, so PAY stays enabled.\n */\nexport const PHP_COUNTRY_OPTION: CountryOption = {\n\tcountry: \"Philippines\",\n\tcurrency: CURRENCY.PHP,\n\tsymbolNative: \"₱\",\n\tlocale: \"en-PH\",\n\tpaymentMethod: \"INSTAPAY\",\n\tpaymentAddressName: \"PHONE_NUMBER\",\n\ttimezone: \"Asia/Manila\",\n\ttimezone_name: \"PST\",\n\tflag: \"🇵🇭\",\n\tflagUrl: \"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1f5-1f1ed.png\",\n\tphoneCode: \"+63\",\n\ttelegramSupportChannel: \"https://t.me/p2pdotmeph\",\n\ttwitterUsername: \"p2pdotmeph\",\n\tsmsCountryCodes: [\"PH\"],\n\tprecision: 2,\n\tisAlpha: true,\n\tdisabled: false,\n\tdisabledPaymentTypes: [],\n\tgetPayQrPayload: (paymentId) => {\n\t\tconst candidate = payQrCandidate(paymentId);\n\t\treturn isPhilippinePayQr(candidate) ? candidate : null;\n\t},\n};\n","import { CURRENCY } from \"../currency\";\nimport type { CountryOption, PaymentIdFieldConfig } from \"../types\";\nimport { EUR_PLACEHOLDER, EUR_VALIDATION_ERROR, validateRevolutId } from \"./eur\";\n\nexport const USD_PLACEHOLDER = EUR_PLACEHOLDER;\nexport const USD_VALIDATION_ERROR = EUR_VALIDATION_ERROR;\n\n/** Payment ID field configuration for USD (Revolut USD). */\nexport const USD_PAYMENT_FIELDS: PaymentIdFieldConfig[] = [\n\t{\n\t\tkey: \"revolut\",\n\t\tlabel: \"REVOLUT_ID\",\n\t\tplaceholder: USD_PLACEHOLDER,\n\t\tdisplayLabel: \"Revolut ID\",\n\t\tvalidate: validateRevolutId,\n\t\tvalidationErrorMessage: USD_VALIDATION_ERROR,\n\t},\n];\n\n/** Country option for Revolut USD. */\nexport const USD_COUNTRY_OPTION: CountryOption = {\n\tcountry: \"Revolut USD\",\n\tcurrency: CURRENCY.USD,\n\tsymbolNative: \"$\",\n\tlocale: \"en-US\",\n\tpaymentMethod: \"REVOLUT\",\n\tpaymentAddressName: \"REVOLUT_ID\",\n\ttimezone: \"America/New_York\",\n\ttimezone_name: \"EST\",\n\tflag: \"\",\n\tflagUrl: \"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f310.png\",\n\tphoneCode: \"+1\",\n\ttelegramSupportChannel: \"https://t.me/P2Pdotme\",\n\ttwitterUsername: \"P2Pdotme\",\n\tsmsCountryCodes: [\"US\"],\n\tprecision: 2,\n\tisAlpha: true,\n\tdisabled: true,\n\tdisabledPaymentTypes: [\"PAY\"],\n};\n","import { CURRENCY } from \"../currency\";\nimport { isVenezuelanPayQr, payQrCandidate, validateVenezuelanQr } from \"../qr-validator\";\nimport { type CountryOption, PACKED_PAYMENT_ID_SEP, type PaymentIdFieldConfig } from \"../types\";\n\nexport { validateVenezuelanQr };\n\nexport const VEN_PLACEHOLDER = \"04121234567\";\nexport const VEN_PLACEHOLDER_RIF = \"V12345678\";\nexport const VEN_PLACEHOLDER_BANK = \"Banesco\";\n\nexport const VEN_VALIDATION_ERROR = \"Please enter a valid phone number (e.g., 04121234567)\";\nexport const VEN_VALIDATION_ERROR_RIF =\n\t\"Please enter a valid Cédula/RIF (e.g., V12345678, P12345678)\";\nexport const VEN_VALIDATION_ERROR_BANK = \"Please enter a bank name\";\n\n/** Allowed Venezuelan document prefixes for Pago Móvil (SENIAT / banking). */\nexport const VEN_RIF_PREFIXES = [\"V\", \"E\", \"J\", \"G\", \"R\", \"P\"] as const;\n\n/**\n * Validates Venezuelan phone number for Pago Movil.\n * Format: 04XX-XXXXXXX (11 digits starting with 04).\n */\nexport function validateVenezuelanPhoneNumber(phoneNumber: string): boolean {\n\tif (!phoneNumber || phoneNumber.trim().length === 0) return false;\n\n\tconst cleaned = phoneNumber.trim().replace(/\\D/g, \"\");\n\n\tif (/^04\\d{9}$/.test(cleaned)) return true;\n\tif (/^4\\d{9}$/.test(cleaned)) return true;\n\n\treturn false;\n}\n\n/**\n * Validates Venezuelan Cédula/RIF for Pago Móvil.\n * Format: prefix (V|E|J|G|R|P) followed by digits.\n * Includes natural persons (V), foreigners (E), companies (J), government (G),\n * residual (R), and passport-linked accounts (P).\n */\nexport function validateVenezuelanRif(rif: string): boolean {\n\tif (!rif || rif.trim().length === 0) return false;\n\tconst trimmed = rif.trim().toUpperCase();\n\treturn /^[VEJGRP]\\d+$/.test(trimmed);\n}\n\nfunction isValidVenezuelanCompound(value: string): boolean {\n\tconst parts = value.split(\"|\");\n\tif (parts.length !== 3) return false;\n\treturn (\n\t\tvalidateVenezuelanPhoneNumber(parts[0]) &&\n\t\tvalidateVenezuelanRif(parts[1]) &&\n\t\tparts[2].trim().length > 0\n\t);\n}\n\nexport type VenezuelanPaymentIdParts = {\n\tqr: string | null;\n\tcompound: string | null;\n};\n\n/**\n * Splits a stored VEN payment ID into its QR payload and/or typed fallback.\n * Formats: S7B blob, `phone|rif|bank`, or `blob||phone|rif|bank`.\n */\nexport function parseVenezuelanPaymentId(\n\tvalue: string | null | undefined,\n): VenezuelanPaymentIdParts {\n\tif (!value || typeof value !== \"string\") return { qr: null, compound: null };\n\tconst trimmed = value.trim();\n\tconst sep = trimmed.indexOf(PACKED_PAYMENT_ID_SEP);\n\tif (sep >= 0) {\n\t\tconst left = trimmed.slice(0, sep);\n\t\tconst right = trimmed.slice(sep + PACKED_PAYMENT_ID_SEP.length);\n\t\treturn {\n\t\t\tqr: validateVenezuelanQr(left) ? left : null,\n\t\t\tcompound: isValidVenezuelanCompound(right) ? right : null,\n\t\t};\n\t}\n\tif (validateVenezuelanQr(trimmed)) return { qr: trimmed, compound: null };\n\tif (isValidVenezuelanCompound(trimmed)) return { qr: null, compound: trimmed };\n\treturn { qr: null, compound: null };\n}\n\nexport function serializeVenezuelanPaymentId(\n\tqr: string | null | undefined,\n\tcompound: string | null | undefined,\n): string {\n\tconst q = qr?.trim() && validateVenezuelanQr(qr.trim()) ? qr.trim() : \"\";\n\tconst c = compound?.trim() || \"\";\n\tif (q && c) return `${q}${PACKED_PAYMENT_ID_SEP}${c}`;\n\treturn q || c;\n}\n\n/**\n * Accepts a Suiche 7B QR payload, the typed `phone|rif|bank` fallback,\n * or both packed as `qr||phone|rif|bank`. A non-empty packed rest must be a\n * valid compound — QR does not mask an incomplete trio.\n */\nexport function validateVenezuelanPaymentId(value: string): boolean {\n\tif (!value || typeof value !== \"string\") return false;\n\tconst trimmed = value.trim();\n\tconst sep = trimmed.indexOf(PACKED_PAYMENT_ID_SEP);\n\tif (sep >= 0) {\n\t\tconst left = trimmed.slice(0, sep);\n\t\tconst right = trimmed.slice(sep + PACKED_PAYMENT_ID_SEP.length);\n\t\tconst qrOk = validateVenezuelanQr(left);\n\t\tif (right.trim()) return qrOk && isValidVenezuelanCompound(right);\n\t\treturn qrOk;\n\t}\n\tconst { qr, compound } = parseVenezuelanPaymentId(trimmed);\n\treturn qr !== null || compound !== null;\n}\n\n/** Payment ID field configuration for VEN (Venezuela, Pago Móvil). */\nexport const VEN_PAYMENT_FIELDS: PaymentIdFieldConfig[] = [\n\t{\n\t\tkey: \"phone\",\n\t\tlabel: \"PHONE_NUMBER\",\n\t\tplaceholder: VEN_PLACEHOLDER,\n\t\tdisplayLabel: \"Phone\",\n\t\tvalidate: validateVenezuelanPhoneNumber,\n\t\tvalidationErrorMessage: VEN_VALIDATION_ERROR,\n\t},\n\t{\n\t\tkey: \"rif\",\n\t\tlabel: \"RIF_LABEL\",\n\t\tplaceholder: VEN_PLACEHOLDER_RIF,\n\t\tdisplayLabel: \"Cédula/RIF\",\n\t\tvalidate: validateVenezuelanRif,\n\t\tvalidationErrorMessage: VEN_VALIDATION_ERROR_RIF,\n\t},\n\t{\n\t\tkey: \"bank\",\n\t\tlabel: \"BANK_LABEL\",\n\t\tplaceholder: VEN_PLACEHOLDER_BANK,\n\t\tdisplayLabel: \"Banco\",\n\t\tvalidate: (v: string) => v.trim().length > 0,\n\t\tvalidationErrorMessage: VEN_VALIDATION_ERROR_BANK,\n\t},\n];\n\n/** Country option for Venezuela (VEN). */\nexport const VEN_COUNTRY_OPTION: CountryOption = {\n\tcountry: \"Venezuela\",\n\tcurrency: CURRENCY.VEN,\n\tinternationalFormat: \"VES\",\n\tsymbolNative: \"Bs\",\n\tlocale: \"es-VE\",\n\tpaymentMethod: \"PAGO_MOVIL\",\n\tpaymentAddressName: \"PAGO_MOVIL_DETAILS\",\n\ttimezone: \"America/Caracas\",\n\ttimezone_name: \"VET\",\n\tflag: \"🇻🇪\",\n\tflagUrl: \"https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1fb-1f1ea.png\",\n\tphoneCode: \"+58\",\n\ttelegramSupportChannel: \"https://t.me/p2pmevenezuela\",\n\ttwitterUsername: \"p2pmevenezuela\",\n\tsmsCountryCodes: [\"VE\"],\n\tprecision: 2,\n\tisAlpha: false,\n\tdisabled: false,\n\tdisabledPaymentTypes: [],\n\tuploadPaymentQR: true,\n\tvalidateQr: validateVenezuelanQr,\n\tgetPayQrPayload: (paymentId) => {\n\t\tconst candidate = payQrCandidate(paymentId);\n\t\treturn isVenezuelanPayQr(candidate) ? candidate : null;\n\t},\n};\n","import type { CurrencyCode } from \"../types\";\nimport {\n\tARS_PAYMENT_FIELDS,\n\tBOB_PAYMENT_FIELDS,\n\tBRL_PAYMENT_FIELDS,\n\tCOP_PAYMENT_FIELDS,\n\tCUP_PAYMENT_FIELDS,\n\tECU_PAYMENT_FIELDS,\n\tEUR_PAYMENT_FIELDS,\n\tIDR_PAYMENT_FIELDS,\n\tINR_PAYMENT_FIELDS,\n\tMEX_PAYMENT_FIELDS,\n\tNGN_PAYMENT_FIELDS,\n\tPEN_PAYMENT_FIELDS,\n\tPHP_PAYMENT_FIELDS,\n\tUSD_PAYMENT_FIELDS,\n\tVEN_PAYMENT_FIELDS,\n} from \"./currencies\";\nimport type { PaymentIdFieldConfig } from \"./types\";\n\n/** Payment ID field configuration for each supported currency. */\nexport const PAYMENT_ID_FIELDS: Record<CurrencyCode, PaymentIdFieldConfig[]> = {\n\tINR: INR_PAYMENT_FIELDS,\n\tIDR: IDR_PAYMENT_FIELDS,\n\tBRL: BRL_PAYMENT_FIELDS,\n\tARS: ARS_PAYMENT_FIELDS,\n\tMEX: MEX_PAYMENT_FIELDS,\n\tVEN: VEN_PAYMENT_FIELDS,\n\tBOB: BOB_PAYMENT_FIELDS,\n\tNGN: NGN_PAYMENT_FIELDS,\n\tEUR: EUR_PAYMENT_FIELDS,\n\tUSD: USD_PAYMENT_FIELDS,\n\tCOP: COP_PAYMENT_FIELDS,\n\tCUP: CUP_PAYMENT_FIELDS,\n\tECU: ECU_PAYMENT_FIELDS,\n\tPEN: PEN_PAYMENT_FIELDS,\n\tPHP: PHP_PAYMENT_FIELDS,\n};\n","import {\n\tARS_COUNTRY_OPTION,\n\tBOB_COUNTRY_OPTION,\n\tBRL_COUNTRY_OPTION,\n\tCOP_COUNTRY_OPTION,\n\tCUP_COUNTRY_OPTION,\n\tECU_COUNTRY_OPTION,\n\tEUR_COUNTRY_OPTION,\n\tIDR_COUNTRY_OPTION,\n\tINR_COUNTRY_OPTION,\n\tMEX_COUNTRY_OPTION,\n\tNGN_COUNTRY_OPTION,\n\tPEN_COUNTRY_OPTION,\n\tPHP_COUNTRY_OPTION,\n\tUSD_COUNTRY_OPTION,\n\tVEN_COUNTRY_OPTION,\n} from \"./currencies\";\nimport type { CurrencyCode } from \"./currency\";\nimport { PAYMENT_ID_FIELDS } from \"./payment-fields\";\nimport type { CountryOption } from \"./types\";\n\n/** All supported countries with their currency metadata, payment methods, and display config. */\nexport const COUNTRY_OPTIONS: readonly CountryOption[] = [\n\tINR_COUNTRY_OPTION,\n\tIDR_COUNTRY_OPTION,\n\tBRL_COUNTRY_OPTION,\n\tARS_COUNTRY_OPTION,\n\tMEX_COUNTRY_OPTION,\n\tVEN_COUNTRY_OPTION,\n\tBOB_COUNTRY_OPTION,\n\tNGN_COUNTRY_OPTION,\n\tCOP_COUNTRY_OPTION,\n\tCUP_COUNTRY_OPTION,\n\tECU_COUNTRY_OPTION,\n\tPEN_COUNTRY_OPTION,\n\tPHP_COUNTRY_OPTION,\n\tEUR_COUNTRY_OPTION,\n\tUSD_COUNTRY_OPTION,\n];\n\nexport function getCountryOption(\n\tcurrency: CurrencyCode | null | undefined,\n): CountryOption | undefined {\n\tif (!currency) return undefined;\n\treturn COUNTRY_OPTIONS.find((c) => c.currency === currency);\n}\n\n/**\n * Whether the merchant/seller provides payment details by uploading a QR image.\n * Distinct from PAY (`disabledPaymentTypes`), where the buyer scans a QR.\n */\nexport function uploadsPaymentQR(currency: CurrencyCode | null | undefined): boolean {\n\treturn getCountryOption(currency)?.uploadPaymentQR === true;\n}\n\n/**\n * Whether a stored payment ID may include a QR payload (`qr||fields` or\n * standalone QR). Derived from `validateQr` — no extra flag.\n */\nexport function usesPackedPaymentId(currency: CurrencyCode | null | undefined): boolean {\n\treturn getCountryOption(currency)?.validateQr != null;\n}\n\n/**\n * Apps mount the catalog form (PackedPaymentInput): QR upload and typed\n * fields may both show — they are not exclusive.\n */\nexport function usesCatalogPaymentForm(currency: CurrencyCode | null | undefined): boolean {\n\tif (!currency) return false;\n\treturn uploadsPaymentQR(currency) || (PAYMENT_ID_FIELDS[currency]?.length ?? 0) > 1;\n}\n\n/**\n * i18n key for a warning shown before the payer sends fiat, or `null` when the\n * currency has none. Apps translate with `t(key)` — do not branch on currency.\n */\nexport function getTransferWarning(currency: CurrencyCode | null | undefined): string | null {\n\treturn getCountryOption(currency)?.transferWarning ?? null;\n}\n","import { getCountryOption } from \"./countries\";\nimport type { CurrencyCode } from \"./currency\";\nimport { PAYMENT_ID_FIELDS } from \"./payment-fields\";\nimport { PACKED_PAYMENT_ID_SEP, type PaymentIdFieldConfig } from \"./types\";\n\nexport {\n\tvalidateArgentinePaymentId,\n\tvalidateBolivianAccount,\n\tvalidateColombianPaymentId,\n\tvalidateCubanCardNumber,\n\tvalidateCubanPhoneNumber,\n\tvalidateEcuadorianAccountName,\n\tvalidateEcuadorianAccountNumber,\n\tvalidateEcuadorianCedula,\n\tvalidateIndonesianPhoneNumber,\n\tvalidateMexicanPaymentId,\n\tvalidateNigerianAccountName,\n\tvalidateNigerianAccountNumber,\n\tvalidatePeruvianCci,\n\tvalidatePeruvianPaymentId,\n\tvalidatePeruvianPaymentKey,\n\tvalidatePeruvianPhone,\n\tvalidatePhilippinePhoneNumber,\n\tvalidatePIXId,\n\tvalidateRevolutId,\n\tvalidateUPIId,\n\tvalidateVenezuelanPaymentId,\n\tvalidateVenezuelanPhoneNumber,\n\tvalidateVenezuelanRif,\n} from \"./currencies\";\nexport {\n\tisBolivianPayQr,\n\tisPeruvianPayQr,\n\tisPhilippinePayQr,\n\tisVenezuelanPayQr,\n\tpayQrCandidate,\n\tvalidateBolivianQr,\n\tvalidatePeruvianQr,\n\tvalidateVenezuelanQr,\n} from \"./qr-validator\";\nexport { PACKED_PAYMENT_ID_SEP };\n\n/** Serializes multiple fields into a pipe-separated string. */\nexport function serializeCompoundPaymentId(...fields: string[]): string {\n\treturn fields.join(\"|\");\n}\n\n/** Deserializes a pipe-separated payment ID into its component fields. */\nexport function deserializeCompoundPaymentId(paymentId: string): string[] {\n\treturn paymentId.split(\"|\");\n}\n\n/**\n * Formats a compound payment ID for display using optional labels.\n * Empty parts (optional fields left blank) are omitted.\n */\nexport function formatCompoundPaymentIdForDisplay(\n\tpaymentId: string,\n\tlabels: (string | null)[],\n): string {\n\tconst parts = deserializeCompoundPaymentId(paymentId);\n\treturn parts\n\t\t.map((part, i) => {\n\t\t\tif (!part?.trim()) return null;\n\t\t\treturn labels[i] ? `${labels[i]}: ${part}` : part;\n\t\t})\n\t\t.filter((part): part is string => part !== null)\n\t\t.join(\" | \");\n}\n\n/**\n * Validates a stored payment ID against `PAYMENT_ID_FIELDS`.\n * Optional fields may be empty; if every field is optional, at least one must\n * be filled. A legacy single token (no `|`) matches any one field's validator.\n */\nexport function validatePaymentIdFields(\n\tfields: readonly PaymentIdFieldConfig[],\n\tpaymentId: string,\n): boolean {\n\tif (!paymentId || paymentId.trim().length === 0) return false;\n\tif (!fields.length) return false;\n\n\tif (fields.length === 1) {\n\t\treturn fields[0].validate(paymentId);\n\t}\n\n\tconst parts = deserializeCompoundPaymentId(paymentId);\n\n\tif (parts.length === 1) {\n\t\tif (!fields.some((field) => field.optional)) return false;\n\t\treturn fields.some((field) => field.validate(parts[0]));\n\t}\n\n\tconst values = fields.map((_, i) => (parts[i] ?? \"\").trim());\n\tconst eachOk = fields.every((field, i) => {\n\t\tconst value = values[i];\n\t\tif (!value) return field.optional === true;\n\t\treturn field.validate(value);\n\t});\n\tif (!eachOk) return false;\n\n\treturn values.some((value) => value.length > 0);\n}\n\n/**\n * Splits a stored payment ID into per-field values for form hydration.\n * A legacy single token is assigned to the first field whose validator matches.\n */\nexport function assignPaymentIdToFieldValues(\n\tfields: readonly PaymentIdFieldConfig[],\n\tpaymentId: string,\n): Record<string, string> {\n\tconst result: Record<string, string> = {};\n\tfor (const field of fields) result[field.key] = \"\";\n\tif (!paymentId) return result;\n\n\tconst { rest } = unpackPackedPaymentId(paymentId);\n\tif (!rest) return result;\n\n\tconst tokens = deserializeCompoundPaymentId(rest)\n\t\t.map((part) => part.trim())\n\t\t.filter((part) => part.length > 0);\n\n\tconst claimed = new Set<string>();\n\tfor (const token of tokens) {\n\t\tconst field = fields.find((item) => !claimed.has(item.key) && item.validate(token));\n\t\tif (field) {\n\t\t\tresult[field.key] = token;\n\t\t\tclaimed.add(field.key);\n\t\t}\n\t}\n\n\tif (claimed.size === 0 && tokens.length === 1 && fields.length === 1) {\n\t\tresult[fields[0].key] = tokens[0];\n\t\treturn result;\n\t}\n\n\tif (claimed.size < Math.min(tokens.length, fields.length)) {\n\t\tfields.forEach((field, i) => {\n\t\t\tif (!result[field.key]) result[field.key] = tokens[i] ?? \"\";\n\t\t});\n\t}\n\n\treturn result;\n}\n\nexport function unpackPackedPaymentId(paymentId: string): {\n\tqr: string;\n\trest: string;\n} {\n\tconst sep = paymentId.indexOf(PACKED_PAYMENT_ID_SEP);\n\tif (sep < 0) return { qr: \"\", rest: paymentId };\n\treturn {\n\t\tqr: paymentId.slice(0, sep),\n\t\trest: paymentId.slice(sep + PACKED_PAYMENT_ID_SEP.length),\n\t};\n}\n\nfunction isStandaloneQr(\n\tvalidateQr: ((payload: string) => boolean) | undefined,\n\tvalue: string,\n): boolean {\n\treturn !!validateQr?.(value);\n}\n\n/**\n * QR blob from a stored payment ID, or `null` if none / invalid.\n */\nexport function getStoredQrPayload(\n\tcurrency: CurrencyCode | null | undefined,\n\tpaymentId: string | null | undefined,\n): string | null {\n\tif (!currency || !paymentId) return null;\n\tconst option = getCountryOption(currency);\n\tif (!option?.validateQr) return null;\n\tconst trimmed = paymentId.trim();\n\tconst { qr } = unpackPackedPaymentId(trimmed);\n\tif (qr && option.validateQr(qr)) return qr;\n\tif (isStandaloneQr(option.validateQr, trimmed)) return trimmed;\n\treturn null;\n}\n\n/**\n * Payload to feed `QRCodeSVG` for a PAY (or packed SELL) order.\n * Tries strict `getStoredQrPayload` first, then the country's PAY hook.\n */\nexport function getPayQrPayload(\n\tcurrency: CurrencyCode | null | undefined,\n\tpaymentId: string | null | undefined,\n): string | null {\n\tif (!currency || !paymentId) return null;\n\tconst stored = getStoredQrPayload(currency, paymentId);\n\tif (stored) return stored;\n\treturn getCountryOption(currency)?.getPayQrPayload?.(paymentId.trim()) ?? null;\n}\n\nfunction packedTypedRest(\n\tfields: readonly PaymentIdFieldConfig[],\n\tfieldValues: Record<string, string>,\n): string {\n\tconst parts = fields.map((field) => (fieldValues[field.key] ?? \"\").trim());\n\tif (!parts.some((part) => part.length > 0)) return \"\";\n\treturn serializeCompoundPaymentId(...parts);\n}\n\n/**\n * Builds a stored payment ID: optional validated QR packed with catalog fields.\n */\nexport function packStoredPaymentId(\n\tcurrency: CurrencyCode,\n\tqr: string | null | undefined,\n\tfieldValues: Record<string, string>,\n): string {\n\tconst fields = PAYMENT_ID_FIELDS[currency] ?? [];\n\tconst option = getCountryOption(currency);\n\tconst trimmedQr = qr?.trim() ?? \"\";\n\tconst q = trimmedQr && option?.validateQr?.(trimmedQr) ? trimmedQr : \"\";\n\tconst rest = packedTypedRest(fields, fieldValues);\n\tif (q && rest) return `${q}${PACKED_PAYMENT_ID_SEP}${rest}`;\n\treturn q || rest;\n}\n\nfunction fieldsMatchStoredId(fields: readonly PaymentIdFieldConfig[], paymentId: string): boolean {\n\tif (validatePaymentIdFields(fields, paymentId)) return true;\n\tconst assigned = assignPaymentIdToFieldValues(fields, paymentId);\n\tconst values = fields.map((field) => (assigned[field.key] || \"\").trim());\n\tif (!values.some((value) => value.length > 0)) return false;\n\treturn fields.every((field, i) => {\n\t\tconst value = values[i];\n\t\tif (!value) return field.optional === true;\n\t\treturn field.validate(value);\n\t});\n}\n\n/**\n * Catalog payment form draft: optional QR and/or typed fields may coexist.\n * Neither path is required relative to the other. If any typed field has text,\n * non-optional fields must all be present and valid (`optional` on the catalog).\n */\nexport function validateCatalogPaymentDraft(\n\tcurrency: CurrencyCode,\n\tqr: string | null | undefined,\n\tfieldValues: Record<string, string>,\n): boolean {\n\treturn validateStoredPaymentId(currency, packStoredPaymentId(currency, qr, fieldValues));\n}\n\n/**\n * Validates a stored payment ID: optional packed QR, then catalog fields.\n * QR-only is valid when the country exposes `validateQr`.\n */\nexport function validateStoredPaymentId(currency: CurrencyCode, paymentId: string): boolean {\n\tif (!paymentId || paymentId.trim().length === 0) return false;\n\tconst fields = PAYMENT_ID_FIELDS[currency];\n\tif (!fields?.length) return false;\n\tconst option = getCountryOption(currency);\n\tconst trimmed = paymentId.trim();\n\tconst { qr, rest } = unpackPackedPaymentId(trimmed);\n\n\tif (qr) {\n\t\tif (!option?.validateQr?.(qr)) return false;\n\t\tif (!rest.trim()) return true;\n\t\treturn fieldsMatchStoredId(fields, rest);\n\t}\n\tif (isStandaloneQr(option?.validateQr, trimmed)) return true;\n\treturn fieldsMatchStoredId(fields, trimmed);\n}\n\n/**\n * Typed-field values for form hydration. Packed QR prefix is stripped.\n * `hydrateFieldsFromQr` fills keys the typed fallback left empty (PEN phone).\n */\nexport function assignStoredPaymentIdToFieldValues(\n\tcurrency: CurrencyCode,\n\tpaymentId: string,\n): Record<string, string> {\n\tconst fields = PAYMENT_ID_FIELDS[currency] ?? [];\n\tconst option = getCountryOption(currency);\n\tconst trimmed = paymentId.trim();\n\tconst { qr, rest } = unpackPackedPaymentId(trimmed);\n\n\tlet qrPayload = \"\";\n\tlet typed = rest.trim();\n\tif (qr && option?.validateQr?.(qr)) {\n\t\tqrPayload = qr;\n\t} else if (isStandaloneQr(option?.validateQr, trimmed)) {\n\t\tqrPayload = trimmed;\n\t\ttyped = \"\";\n\t} else {\n\t\tconst payQr = option?.getPayQrPayload?.(trimmed);\n\t\tif (payQr) {\n\t\t\tqrPayload = payQr;\n\t\t\ttyped = qr && payQr === qr ? rest.trim() : \"\";\n\t\t}\n\t}\n\n\tconst values = assignPaymentIdToFieldValues(fields, typed);\n\tif (qrPayload && option?.hydrateFieldsFromQr) {\n\t\tconst extra = option.hydrateFieldsFromQr(qrPayload);\n\t\tfor (const [key, value] of Object.entries(extra)) {\n\t\t\tif (value && !values[key]) values[key] = value;\n\t\t}\n\t}\n\treturn values;\n}\n\n/**\n * Human-readable stored ID: labeled typed fields, never the raw QR blob.\n * QR-only returns an empty string so the caller can substitute a label.\n */\nexport function formatStoredPaymentIdForDisplay(currency: CurrencyCode, paymentId: string): string {\n\tconst fields = PAYMENT_ID_FIELDS[currency] ?? [];\n\tconst values = assignStoredPaymentIdToFieldValues(currency, paymentId);\n\tif (fields.length <= 1) return (values[fields[0]?.key ?? \"\"] || \"\").trim();\n\treturn fields\n\t\t.map((field) => {\n\t\t\tconst value = (values[field.key] || \"\").trim();\n\t\t\tif (!value) return null;\n\t\t\treturn field.displayLabel ? `${field.displayLabel}: ${value}` : value;\n\t\t})\n\t\t.filter((part): part is string => part !== null)\n\t\t.join(\" | \");\n}\n"],"mappings":"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","names":[]}