@boostengine/payments 1.0.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +175 -103
- package/dist/index.cjs +182 -24
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +20 -148
- package/dist/index.d.ts +20 -148
- package/dist/index.mjs +182 -24
- package/dist/index.mjs.map +1 -1
- package/dist/react.cjs +173 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.mts +29 -0
- package/dist/react.d.ts +29 -0
- package/dist/react.mjs +167 -0
- package/dist/react.mjs.map +1 -0
- package/dist/types-D3bPaYhQ.d.mts +194 -0
- package/dist/types-D3bPaYhQ.d.ts +194 -0
- package/package.json +29 -3
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters/base.adapter.ts","../src/utils/crypto.ts","../src/utils/errors.ts","../src/adapters/razorpay.adapter.ts","../src/adapters/cashfree.adapter.ts","../src/adapters/phonepe.adapter.ts","../src/adapters/paytm.adapter.ts","../src/adapters/stripe.adapter.ts","../src/adapters/cod.adapter.ts","../src/manager.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import {\n GatewayName,\n UnifiedCreateOrderOptions,\n UnifiedOrderResult,\n UnifiedPaymentVerificationOptions,\n UnifiedPaymentVerificationResult,\n UnifiedRefundOptions,\n UnifiedRefundResult,\n WebhookVerificationOptions,\n WebhookVerificationResult,\n} from '../types';\n\nexport abstract class BasePaymentAdapter {\n public abstract readonly name: GatewayName;\n\n /**\n * Create an order or payment session on the gateway.\n */\n public abstract createOrder(options: UnifiedCreateOrderOptions): Promise<UnifiedOrderResult>;\n\n /**\n * Verify checkout completion signature or status query.\n */\n public abstract verifyPayment(\n options: UnifiedPaymentVerificationOptions\n ): Promise<UnifiedPaymentVerificationResult>;\n\n /**\n * Initiate a refund back to the customer.\n */\n public abstract refund(options: UnifiedRefundOptions): Promise<UnifiedRefundResult>;\n\n /**\n * Verify server-to-server webhook authenticity and parse payload.\n */\n public abstract verifyWebhook(\n options: WebhookVerificationOptions\n ): Promise<WebhookVerificationResult>;\n\n /**\n * Safe helper to extract single string header value from request headers.\n */\n protected getHeader(\n headers: Record<string, string | string[] | undefined>,\n name: string\n ): string | undefined {\n const direct = headers[name] ?? headers[name.toLowerCase()] ?? headers[name.toUpperCase()];\n if (Array.isArray(direct)) return direct[0];\n return direct;\n }\n\n /**\n * Helper to perform HTTP JSON requests with standard error extraction.\n */\n protected async fetchJson<T = any>(\n url: string,\n options: {\n method?: 'GET' | 'POST' | 'PATCH' | 'DELETE';\n headers?: Record<string, string>;\n body?: any;\n } = {}\n ): Promise<T> {\n const { method = 'GET', headers = {}, body } = options;\n const requestHeaders: Record<string, string> = {\n Accept: 'application/json',\n ...headers,\n };\n\n let serializedBody: string | undefined;\n if (body !== undefined) {\n if (typeof body === 'string') {\n serializedBody = body;\n } else if (headers['Content-Type'] === 'application/x-www-form-urlencoded') {\n serializedBody = new URLSearchParams(body).toString();\n } else {\n requestHeaders['Content-Type'] = 'application/json';\n serializedBody = JSON.stringify(body);\n }\n }\n\n const res = await fetch(url, {\n method,\n headers: requestHeaders,\n body: serializedBody,\n });\n\n const text = await res.text();\n let data: any;\n try {\n data = JSON.parse(text);\n } catch {\n data = text;\n }\n\n if (!res.ok) {\n const errMsg =\n data?.message ||\n data?.error?.description ||\n data?.error?.message ||\n data?.description ||\n (typeof data === 'string' ? data : `HTTP ${res.status} ${res.statusText}`);\n throw new Error(`[${this.name.toUpperCase()} API Error] ${errMsg}`);\n }\n\n return data as T;\n }\n}\n","import crypto from 'crypto';\n\n/**\n * Computes HMAC-SHA256 hex digest.\n */\nexport function hmacSha256(data: string | Buffer, secret: string): string {\n return crypto.createHmac('sha256', secret).update(data).digest('hex');\n}\n\n/**\n * Computes standard SHA-256 hex digest.\n */\nexport function sha256(data: string | Buffer): string {\n return crypto.createHash('sha256').update(data).digest('hex');\n}\n\n/**\n * Encodes string into Base64.\n */\nexport function base64Encode(data: string | object): string {\n const str = typeof data === 'string' ? data : JSON.stringify(data);\n return Buffer.from(str, 'utf8').toString('base64');\n}\n\n/**\n * Decodes Base64 into utf-8 string.\n */\nexport function base64Decode(encoded: string): string {\n return Buffer.from(encoded, 'base64').toString('utf8');\n}\n\n/**\n * Constant-time safe string comparison to prevent timing attacks on signatures.\n */\nexport function safeCompare(a: string, b: string): boolean {\n try {\n const bufA = Buffer.from(a, 'utf8');\n const bufB = Buffer.from(b, 'utf8');\n if (bufA.length !== bufB.length) return false;\n return crypto.timingSafeEqual(bufA, bufB);\n } catch {\n return false;\n }\n}\n","import { GatewayName } from '../types';\n\nexport class PaymentError extends Error {\n public readonly gateway?: GatewayName;\n public readonly statusCode?: number;\n public readonly rawError?: any;\n\n constructor(message: string, options?: { gateway?: GatewayName; statusCode?: number; rawError?: any }) {\n super(message);\n this.name = 'PaymentError';\n this.gateway = options?.gateway;\n this.statusCode = options?.statusCode;\n this.rawError = options?.rawError;\n Object.setPrototypeOf(this, PaymentError.prototype);\n }\n}\n\nexport class GatewayNotConfiguredError extends PaymentError {\n constructor(gateway: GatewayName) {\n super(`Payment gateway '${gateway}' is not configured in PaymentManager.`, { gateway, statusCode: 400 });\n this.name = 'GatewayNotConfiguredError';\n Object.setPrototypeOf(this, GatewayNotConfiguredError.prototype);\n }\n}\n\nexport class SignatureVerificationError extends PaymentError {\n constructor(gateway: GatewayName, details?: string) {\n super(`Invalid webhook/payment signature for gateway '${gateway}'. ${details || ''}`.trim(), {\n gateway,\n statusCode: 401,\n });\n this.name = 'SignatureVerificationError';\n Object.setPrototypeOf(this, SignatureVerificationError.prototype);\n }\n}\n","import { BasePaymentAdapter } from './base.adapter';\nimport {\n GatewayName,\n RazorpayConfig,\n UnifiedCreateOrderOptions,\n UnifiedOrderResult,\n UnifiedPaymentVerificationOptions,\n UnifiedPaymentVerificationResult,\n UnifiedRefundOptions,\n UnifiedRefundResult,\n WebhookVerificationOptions,\n WebhookVerificationResult,\n} from '../types';\nimport { hmacSha256, safeCompare } from '../utils/crypto';\nimport { PaymentError } from '../utils/errors';\n\nexport class RazorpayAdapter extends BasePaymentAdapter {\n public readonly name: GatewayName = 'razorpay';\n private readonly baseUrl = 'https://api.razorpay.com/v1';\n\n constructor(private readonly config: RazorpayConfig) {\n super();\n if (!config.keyId || !config.keySecret) {\n throw new PaymentError('Razorpay keyId and keySecret are required.', { gateway: 'razorpay' });\n }\n }\n\n private getAuthHeader(): string {\n const creds = `${this.config.keyId}:${this.config.keySecret}`;\n return `Basic ${Buffer.from(creds).toString('base64')}`;\n }\n\n public async createOrder(options: UnifiedCreateOrderOptions): Promise<UnifiedOrderResult> {\n // Razorpay requires amount in subunits (paise for INR, cents for USD)\n const amountInSubunits = Math.round(options.amount * 100);\n\n const payload = {\n amount: amountInSubunits,\n currency: options.currency.toUpperCase(),\n receipt: options.receipt,\n notes: {\n customer_name: options.customer.name,\n customer_email: options.customer.email,\n customer_phone: options.customer.phone,\n ...options.notes,\n },\n };\n\n const res = await this.fetchJson(`${this.baseUrl}/orders`, {\n method: 'POST',\n headers: {\n Authorization: this.getAuthHeader(),\n },\n body: payload,\n });\n\n return {\n gateway: 'razorpay',\n orderId: options.receipt,\n gatewayOrderId: res.id,\n amount: options.amount,\n currency: options.currency.toUpperCase(),\n status: 'CREATED',\n rawResponse: res,\n };\n }\n\n public async verifyPayment(\n options: UnifiedPaymentVerificationOptions\n ): Promise<UnifiedPaymentVerificationResult> {\n if (!options.paymentId) {\n throw new PaymentError('Razorpay payment verification requires paymentId.', { gateway: 'razorpay' });\n }\n\n let isSignatureValid = false;\n if (options.signature) {\n // Standard frontend signature check: HMAC_SHA256(orderId + \"|\" + paymentId, secret)\n const expectedSignature = hmacSha256(\n `${options.orderId}|${options.paymentId}`,\n this.config.keySecret\n );\n isSignatureValid = safeCompare(expectedSignature, options.signature);\n }\n\n // Query payment status directly from Razorpay to guarantee certainty\n const payment = await this.fetchJson(`${this.baseUrl}/payments/${options.paymentId}`, {\n method: 'GET',\n headers: {\n Authorization: this.getAuthHeader(),\n },\n });\n\n const isCaptured = payment.status === 'captured' || payment.status === 'authorized';\n\n return {\n gateway: 'razorpay',\n isSuccessful: (options.signature ? isSignatureValid : true) && isCaptured,\n paymentId: payment.id,\n orderId: options.orderId,\n amount: payment.amount / 100,\n currency: payment.currency,\n paymentMethod: payment.method,\n rawResponse: payment,\n };\n }\n\n public async refund(options: UnifiedRefundOptions): Promise<UnifiedRefundResult> {\n const payload: Record<string, any> = {\n notes: { reason: options.reason || 'Merchant requested refund' },\n };\n if (options.amount) {\n payload.amount = Math.round(options.amount * 100);\n }\n\n const res = await this.fetchJson(`${this.baseUrl}/payments/${options.paymentId}/refund`, {\n method: 'POST',\n headers: {\n Authorization: this.getAuthHeader(),\n },\n body: payload,\n });\n\n return {\n gateway: 'razorpay',\n refundId: res.id,\n paymentId: options.paymentId,\n amount: res.amount / 100,\n status: res.status === 'processed' ? 'SUCCESS' : 'PENDING',\n rawResponse: res,\n };\n }\n\n public async verifyWebhook(\n options: WebhookVerificationOptions\n ): Promise<WebhookVerificationResult> {\n const secret = options.webhookSecret || this.config.webhookSecret;\n if (!secret) {\n return {\n isValid: false,\n gateway: 'razorpay',\n error: 'Razorpay webhookSecret is not configured.',\n };\n }\n\n const signature = this.getHeader(options.headers, 'x-razorpay-signature');\n\n if (!signature || typeof signature !== 'string') {\n return {\n isValid: false,\n gateway: 'razorpay',\n error: 'Missing X-Razorpay-Signature header.',\n };\n }\n\n const rawString =\n typeof options.rawBody === 'string'\n ? options.rawBody\n : options.rawBody.toString('utf8');\n\n const expectedSignature = hmacSha256(rawString, secret);\n const isValid = safeCompare(expectedSignature, signature);\n\n let parsedData: any;\n try {\n parsedData = JSON.parse(rawString);\n } catch {\n parsedData = null;\n }\n\n return {\n isValid,\n gateway: 'razorpay',\n event: parsedData?.event,\n data: parsedData?.payload,\n };\n }\n}\n","import { BasePaymentAdapter } from './base.adapter';\nimport {\n CashfreeConfig,\n GatewayName,\n UnifiedCreateOrderOptions,\n UnifiedOrderResult,\n UnifiedPaymentVerificationOptions,\n UnifiedPaymentVerificationResult,\n UnifiedRefundOptions,\n UnifiedRefundResult,\n WebhookVerificationOptions,\n WebhookVerificationResult,\n} from '../types';\nimport { hmacSha256, safeCompare } from '../utils/crypto';\nimport { PaymentError } from '../utils/errors';\n\nexport class CashfreeAdapter extends BasePaymentAdapter {\n public readonly name: GatewayName = 'cashfree';\n private readonly baseUrl: string;\n private readonly apiVersion: string;\n\n constructor(private readonly config: CashfreeConfig) {\n super();\n if (!config.appId || !config.secretKey) {\n throw new PaymentError('Cashfree appId and secretKey are required.', { gateway: 'cashfree' });\n }\n this.baseUrl =\n config.env === 'PRODUCTION'\n ? 'https://api.cashfree.com/pg'\n : 'https://sandbox.cashfree.com/pg';\n this.apiVersion = config.apiVersion || '2023-08-01';\n }\n\n private getHeaders(): Record<string, string> {\n return {\n 'x-client-id': this.config.appId,\n 'x-client-secret': this.config.secretKey,\n 'x-api-version': this.apiVersion,\n 'Content-Type': 'application/json',\n };\n }\n\n public async createOrder(options: UnifiedCreateOrderOptions): Promise<UnifiedOrderResult> {\n const payload = {\n order_id: options.receipt,\n order_amount: options.amount,\n order_currency: options.currency.toUpperCase(),\n customer_details: {\n customer_id: options.customer.id || `cust_${Date.now()}`,\n customer_name: options.customer.name,\n customer_email: options.customer.email,\n customer_phone: options.customer.phone,\n },\n order_meta: {\n return_url: options.redirectUrl,\n notify_url: options.callbackUrl,\n },\n order_note: options.notes ? JSON.stringify(options.notes) : 'Order via Boost Payments',\n };\n\n const res = await this.fetchJson(`${this.baseUrl}/orders`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: payload,\n });\n\n return {\n gateway: 'cashfree',\n orderId: options.receipt,\n gatewayOrderId: res.order_id,\n amount: options.amount,\n currency: options.currency.toUpperCase(),\n status: res.order_status === 'ACTIVE' ? 'CREATED' : 'PENDING',\n paymentSessionId: res.payment_session_id,\n rawResponse: res,\n };\n }\n\n public async verifyPayment(\n options: UnifiedPaymentVerificationOptions\n ): Promise<UnifiedPaymentVerificationResult> {\n const order = await this.fetchJson(`${this.baseUrl}/orders/${options.orderId}`, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n const isSuccessful = order.order_status === 'PAID';\n let paymentMethod = 'unknown';\n let paymentId = options.paymentId || order.order_id;\n\n if (isSuccessful) {\n try {\n const payments = await this.fetchJson(`${this.baseUrl}/orders/${options.orderId}/payments`, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n if (Array.isArray(payments) && payments.length > 0) {\n const latest = payments[0];\n paymentId = String(latest.cf_payment_id || paymentId);\n paymentMethod = latest.payment_group || (latest.payment_method ? Object.keys(latest.payment_method)[0] : 'online');\n }\n } catch {\n // Fallback to order details\n }\n }\n\n return {\n gateway: 'cashfree',\n isSuccessful,\n paymentId,\n orderId: order.order_id,\n amount: order.order_amount,\n currency: order.order_currency,\n paymentMethod,\n rawResponse: order,\n };\n }\n\n public async refund(options: UnifiedRefundOptions): Promise<UnifiedRefundResult> {\n if (!options.orderId) {\n throw new PaymentError('Cashfree refund requires orderId.', { gateway: 'cashfree' });\n }\n\n const payload = {\n refund_id: `rfnd_${Date.now()}`,\n refund_amount: options.amount,\n refund_note: options.reason || 'Merchant initiated refund',\n };\n\n const res = await this.fetchJson(`${this.baseUrl}/orders/${options.orderId}/refunds`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: payload,\n });\n\n return {\n gateway: 'cashfree',\n refundId: res.refund_id,\n paymentId: options.paymentId,\n amount: res.refund_amount,\n status: res.refund_status === 'SUCCESS' ? 'SUCCESS' : 'PENDING',\n rawResponse: res,\n };\n }\n\n public async verifyWebhook(\n options: WebhookVerificationOptions\n ): Promise<WebhookVerificationResult> {\n const signature = this.getHeader(options.headers, 'x-webhook-signature');\n const timestamp = this.getHeader(options.headers, 'x-webhook-timestamp');\n\n const rawString =\n typeof options.rawBody === 'string'\n ? options.rawBody\n : options.rawBody.toString('utf8');\n\n let isValid = false;\n if (signature && timestamp) {\n const signedData = `${timestamp}${rawString}`;\n const expectedSignature = Buffer.from(\n hmacSha256(signedData, this.config.secretKey),\n 'hex'\n ).toString('base64');\n isValid = safeCompare(expectedSignature, signature);\n } else if (signature) {\n const expectedSignature = Buffer.from(\n hmacSha256(rawString, this.config.secretKey),\n 'hex'\n ).toString('base64');\n isValid = safeCompare(expectedSignature, signature);\n }\n\n let parsedData: any;\n try {\n parsedData = JSON.parse(rawString);\n } catch {\n parsedData = null;\n }\n\n return {\n isValid,\n gateway: 'cashfree',\n event: parsedData?.type,\n data: parsedData?.data,\n };\n }\n}\n","import { BasePaymentAdapter } from './base.adapter';\nimport {\n GatewayName,\n PhonePeConfig,\n UnifiedCreateOrderOptions,\n UnifiedOrderResult,\n UnifiedPaymentVerificationOptions,\n UnifiedPaymentVerificationResult,\n UnifiedRefundOptions,\n UnifiedRefundResult,\n WebhookVerificationOptions,\n WebhookVerificationResult,\n} from '../types';\nimport { base64Decode, base64Encode, sha256 } from '../utils/crypto';\nimport { PaymentError } from '../utils/errors';\n\nexport class PhonePeAdapter extends BasePaymentAdapter {\n public readonly name: GatewayName = 'phonepe';\n private readonly baseUrl: string;\n private readonly saltIndex: string;\n\n constructor(private readonly config: PhonePeConfig) {\n super();\n if (!config.merchantId || !config.saltKey) {\n throw new PaymentError('PhonePe merchantId and saltKey are required.', { gateway: 'phonepe' });\n }\n this.baseUrl =\n config.env === 'PRODUCTION'\n ? 'https://api.phonepe.com/apis/hermes'\n : 'https://api-preprod.phonepe.com/apis/pg-sandbox';\n this.saltIndex = config.saltIndex || '1';\n }\n\n private calculateXVerify(base64Payload: string, endpoint: string): string {\n const stringToHash = `${base64Payload}${endpoint}${this.config.saltKey}`;\n const hash = sha256(stringToHash);\n return `${hash}###${this.saltIndex}`;\n }\n\n public async createOrder(options: UnifiedCreateOrderOptions): Promise<UnifiedOrderResult> {\n const amountInPaise = Math.round(options.amount * 100);\n\n const payload = {\n merchantId: this.config.merchantId,\n merchantTransactionId: options.receipt,\n merchantUserId: options.customer.id || `MUID_${Date.now()}`,\n amount: amountInPaise,\n redirectUrl: options.redirectUrl || 'https://yourstore.com/order-success',\n redirectMode: 'POST',\n callbackUrl: options.callbackUrl || 'https://api.yourstore.com/webhooks/phonepe',\n mobileNumber: options.customer.phone.replace(/[^0-9]/g, '').slice(-10),\n paymentInstrument: {\n type: 'PAY_PAGE',\n },\n };\n\n const base64Payload = base64Encode(payload);\n const endpoint = '/pg/v1/pay';\n const xVerify = this.calculateXVerify(base64Payload, endpoint);\n\n const res = await this.fetchJson(`${this.baseUrl}${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-VERIFY': xVerify,\n },\n body: {\n request: base64Payload,\n },\n });\n\n const redirectUrl = res?.data?.instrumentResponse?.redirectInfo?.url;\n\n return {\n gateway: 'phonepe',\n orderId: options.receipt,\n gatewayOrderId: options.receipt,\n amount: options.amount,\n currency: options.currency.toUpperCase(),\n status: res.success ? 'CREATED' : 'FAILED',\n redirectUrl,\n rawResponse: res,\n };\n }\n\n public async verifyPayment(\n options: UnifiedPaymentVerificationOptions\n ): Promise<UnifiedPaymentVerificationResult> {\n const endpoint = `/pg/v1/status/${this.config.merchantId}/${options.orderId}`;\n const stringToHash = `${endpoint}${this.config.saltKey}`;\n const xVerify = `${sha256(stringToHash)}###${this.saltIndex}`;\n\n const res = await this.fetchJson(`${this.baseUrl}${endpoint}`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'X-VERIFY': xVerify,\n 'X-MERCHANT-ID': this.config.merchantId,\n },\n });\n\n const isSuccessful = res.code === 'PAYMENT_SUCCESS';\n const amount = res.data?.amount ? res.data.amount / 100 : 0;\n const paymentId = res.data?.transactionId || options.orderId;\n\n return {\n gateway: 'phonepe',\n isSuccessful,\n paymentId,\n orderId: options.orderId,\n amount,\n currency: 'INR',\n paymentMethod: res.data?.paymentInstrument?.type || 'UPI',\n rawResponse: res,\n };\n }\n\n public async refund(options: UnifiedRefundOptions): Promise<UnifiedRefundResult> {\n const refundTxnId = `RF_${Date.now()}`;\n const amountInPaise = options.amount ? Math.round(options.amount * 100) : 0;\n\n const payload = {\n merchantId: this.config.merchantId,\n merchantTransactionId: refundTxnId,\n originalTransactionId: options.orderId || options.paymentId,\n amount: amountInPaise,\n callbackUrl: 'https://api.yourstore.com/webhooks/phonepe',\n };\n\n const base64Payload = base64Encode(payload);\n const endpoint = '/pg/v1/refund';\n const xVerify = this.calculateXVerify(base64Payload, endpoint);\n\n const res = await this.fetchJson(`${this.baseUrl}${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-VERIFY': xVerify,\n },\n body: {\n request: base64Payload,\n },\n });\n\n return {\n gateway: 'phonepe',\n refundId: refundTxnId,\n paymentId: options.paymentId,\n amount: options.amount || 0,\n status: res.success ? 'SUCCESS' : 'FAILED',\n rawResponse: res,\n };\n }\n\n public async verifyWebhook(\n options: WebhookVerificationOptions\n ): Promise<WebhookVerificationResult> {\n const rawString =\n typeof options.rawBody === 'string'\n ? options.rawBody\n : options.rawBody.toString('utf8');\n\n let parsed: any;\n try {\n parsed = JSON.parse(rawString);\n } catch {\n return { isValid: false, gateway: 'phonepe', error: 'Invalid JSON payload' };\n }\n\n if (!parsed.response) {\n return { isValid: false, gateway: 'phonepe', error: 'Missing response field in PhonePe callback' };\n }\n\n const decoded = JSON.parse(base64Decode(parsed.response));\n const isSuccess = decoded.code === 'PAYMENT_SUCCESS';\n\n return {\n isValid: true,\n gateway: 'phonepe',\n event: decoded.code,\n data: decoded.data,\n };\n }\n}\n","import { BasePaymentAdapter } from './base.adapter';\nimport {\n GatewayName,\n PaytmConfig,\n UnifiedCreateOrderOptions,\n UnifiedOrderResult,\n UnifiedPaymentVerificationOptions,\n UnifiedPaymentVerificationResult,\n UnifiedRefundOptions,\n UnifiedRefundResult,\n WebhookVerificationOptions,\n WebhookVerificationResult,\n} from '../types';\nimport { PaymentError } from '../utils/errors';\n\nexport class PaytmAdapter extends BasePaymentAdapter {\n public readonly name: GatewayName = 'paytm';\n private readonly baseUrl: string;\n\n constructor(private readonly config: PaytmConfig) {\n super();\n if (!config.mid || !config.merchantKey) {\n throw new PaymentError('Paytm mid and merchantKey are required.', { gateway: 'paytm' });\n }\n this.baseUrl =\n config.env === 'PRODUCTION'\n ? 'https://securegw.paytm.in'\n : 'https://securegw-stage.paytm.in';\n }\n\n public async createOrder(options: UnifiedCreateOrderOptions): Promise<UnifiedOrderResult> {\n const payload = {\n body: {\n requestType: 'Payment',\n mid: this.config.mid,\n websiteName: this.config.website || 'DEFAULT',\n orderId: options.receipt,\n callbackUrl: options.callbackUrl || 'https://api.yourstore.com/webhooks/paytm',\n txnAmount: {\n value: options.amount.toFixed(2),\n currency: 'INR',\n },\n userInfo: {\n custId: options.customer.id || `CUST_${Date.now()}`,\n mobile: options.customer.phone.replace(/[^0-9]/g, '').slice(-10),\n email: options.customer.email,\n },\n },\n };\n\n const url = `${this.baseUrl}/theia/api/v1/initiateTransaction?mid=${this.config.mid}&orderId=${options.receipt}`;\n const res = await this.fetchJson(url, {\n method: 'POST',\n body: payload,\n });\n\n const txnToken = res?.body?.txnToken;\n\n return {\n gateway: 'paytm',\n orderId: options.receipt,\n gatewayOrderId: options.receipt,\n amount: options.amount,\n currency: 'INR',\n status: txnToken ? 'CREATED' : 'FAILED',\n txnToken,\n rawResponse: res,\n };\n }\n\n public async verifyPayment(\n options: UnifiedPaymentVerificationOptions\n ): Promise<UnifiedPaymentVerificationResult> {\n const url = `${this.baseUrl}/v3/order/status`;\n const payload = {\n body: {\n mid: this.config.mid,\n orderId: options.orderId,\n },\n };\n\n const res = await this.fetchJson(url, {\n method: 'POST',\n body: payload,\n });\n\n const body = res?.body || {};\n const isSuccessful = body.resultInfo?.resultStatus === 'TXN_SUCCESS';\n\n return {\n gateway: 'paytm',\n isSuccessful,\n paymentId: body.txnId || options.orderId,\n orderId: options.orderId,\n amount: parseFloat(body.txnAmount || '0'),\n currency: 'INR',\n paymentMethod: body.paymentMode || 'ONLINE',\n rawResponse: res,\n };\n }\n\n public async refund(options: UnifiedRefundOptions): Promise<UnifiedRefundResult> {\n const refundRefId = `RF_${Date.now()}`;\n const url = `${this.baseUrl}/refund/apply`;\n const payload = {\n body: {\n mid: this.config.mid,\n txnType: 'REFUND',\n orderId: options.orderId,\n txnId: options.paymentId,\n refId: refundRefId,\n refundAmount: (options.amount || 0).toFixed(2),\n },\n };\n\n const res = await this.fetchJson(url, {\n method: 'POST',\n body: payload,\n });\n\n const body = res?.body || {};\n const isSuccess = body.resultInfo?.resultStatus === 'TXN_SUCCESS' || body.resultInfo?.resultStatus === 'PENDING';\n\n return {\n gateway: 'paytm',\n refundId: body.refundId || refundRefId,\n paymentId: options.paymentId,\n amount: options.amount || 0,\n status: isSuccess ? 'SUCCESS' : 'FAILED',\n rawResponse: res,\n };\n }\n\n public async verifyWebhook(\n options: WebhookVerificationOptions\n ): Promise<WebhookVerificationResult> {\n const rawString =\n typeof options.rawBody === 'string'\n ? options.rawBody\n : options.rawBody.toString('utf8');\n\n let parsed: any;\n try {\n parsed = JSON.parse(rawString);\n } catch {\n // Check if urlencoded form post\n const params = new URLSearchParams(rawString);\n parsed = Object.fromEntries(params.entries());\n }\n\n const isSuccess = parsed?.STATUS === 'TXN_SUCCESS' || parsed?.resultInfo?.resultStatus === 'TXN_SUCCESS';\n\n return {\n isValid: true,\n gateway: 'paytm',\n event: isSuccess ? 'TXN_SUCCESS' : 'TXN_FAILURE',\n data: parsed,\n };\n }\n}\n","import { BasePaymentAdapter } from './base.adapter';\nimport {\n GatewayName,\n StripeConfig,\n UnifiedCreateOrderOptions,\n UnifiedOrderResult,\n UnifiedPaymentVerificationOptions,\n UnifiedPaymentVerificationResult,\n UnifiedRefundOptions,\n UnifiedRefundResult,\n WebhookVerificationOptions,\n WebhookVerificationResult,\n} from '../types';\nimport { hmacSha256, safeCompare } from '../utils/crypto';\nimport { PaymentError } from '../utils/errors';\n\nexport class StripeAdapter extends BasePaymentAdapter {\n public readonly name: GatewayName = 'stripe';\n private readonly baseUrl = 'https://api.stripe.com/v1';\n\n constructor(private readonly config: StripeConfig) {\n super();\n if (!config.secretKey) {\n throw new PaymentError('Stripe secretKey is required.', { gateway: 'stripe' });\n }\n }\n\n private getAuthHeader(): Record<string, string> {\n return {\n Authorization: `Bearer ${this.config.secretKey}`,\n 'Content-Type': 'application/x-www-form-urlencoded',\n };\n }\n\n public async createOrder(options: UnifiedCreateOrderOptions): Promise<UnifiedOrderResult> {\n const amountInCents = Math.round(options.amount * 100);\n\n const body: Record<string, string> = {\n 'payment_method_types[0]': 'card',\n mode: 'payment',\n client_reference_id: options.receipt,\n customer_email: options.customer.email,\n 'line_items[0][price_data][currency]': options.currency.toLowerCase(),\n 'line_items[0][price_data][unit_amount]': String(amountInCents),\n 'line_items[0][price_data][product_data][name]': `Order #${options.receipt}`,\n 'line_items[0][quantity]': '1',\n success_url: options.redirectUrl || 'https://yourstore.com/order-success?session_id={CHECKOUT_SESSION_ID}',\n cancel_url: 'https://yourstore.com/cart',\n };\n\n const res = await this.fetchJson(`${this.baseUrl}/checkout/sessions`, {\n method: 'POST',\n headers: this.getAuthHeader(),\n body,\n });\n\n return {\n gateway: 'stripe',\n orderId: options.receipt,\n gatewayOrderId: res.id,\n amount: options.amount,\n currency: options.currency.toUpperCase(),\n status: 'CREATED',\n redirectUrl: res.url,\n rawResponse: res,\n };\n }\n\n public async verifyPayment(\n options: UnifiedPaymentVerificationOptions\n ): Promise<UnifiedPaymentVerificationResult> {\n const session = await this.fetchJson(`${this.baseUrl}/checkout/sessions/${options.orderId}`, {\n method: 'GET',\n headers: this.getAuthHeader(),\n });\n\n const isSuccessful = session.payment_status === 'paid';\n const amount = session.amount_total ? session.amount_total / 100 : 0;\n const paymentId = (session.payment_intent as string) || session.id;\n\n return {\n gateway: 'stripe',\n isSuccessful,\n paymentId,\n orderId: session.client_reference_id || session.id,\n amount,\n currency: (session.currency || 'USD').toUpperCase(),\n paymentMethod: 'card',\n rawResponse: session,\n };\n }\n\n public async refund(options: UnifiedRefundOptions): Promise<UnifiedRefundResult> {\n const body: Record<string, string> = {\n payment_intent: options.paymentId,\n };\n if (options.amount) {\n body.amount = String(Math.round(options.amount * 100));\n }\n if (options.reason) {\n body.reason = 'requested_by_customer';\n }\n\n const res = await this.fetchJson(`${this.baseUrl}/refunds`, {\n method: 'POST',\n headers: this.getAuthHeader(),\n body,\n });\n\n return {\n gateway: 'stripe',\n refundId: res.id,\n paymentId: options.paymentId,\n amount: res.amount / 100,\n status: res.status === 'succeeded' ? 'SUCCESS' : 'PENDING',\n rawResponse: res,\n };\n }\n\n public async verifyWebhook(\n options: WebhookVerificationOptions\n ): Promise<WebhookVerificationResult> {\n const secret = options.webhookSecret || this.config.webhookSecret;\n if (!secret) {\n return { isValid: false, gateway: 'stripe', error: 'Stripe webhookSecret is not configured.' };\n }\n\n const sigHeader = this.getHeader(options.headers, 'stripe-signature');\n\n if (!sigHeader || typeof sigHeader !== 'string') {\n return { isValid: false, gateway: 'stripe', error: 'Missing stripe-signature header.' };\n }\n\n // Parse timestamp & signatures: t=1492774577,v1=5257a869e7ecebeda32affa...\n const parts = sigHeader.split(',');\n let timestamp = '';\n const signatures: string[] = [];\n\n parts.forEach((part) => {\n const [key, val] = part.split('=');\n if (key === 't') timestamp = val;\n if (key === 'v1') signatures.push(val);\n });\n\n const rawString =\n typeof options.rawBody === 'string'\n ? options.rawBody\n : options.rawBody.toString('utf8');\n\n const signedPayload = `${timestamp}.${rawString}`;\n const expectedSignature = hmacSha256(signedPayload, secret);\n const isValid = signatures.some((sig) => safeCompare(expectedSignature, sig));\n\n let parsed: any;\n try {\n parsed = JSON.parse(rawString);\n } catch {\n parsed = null;\n }\n\n return {\n isValid,\n gateway: 'stripe',\n event: parsed?.type,\n data: parsed?.data?.object,\n };\n }\n}\n","import { BasePaymentAdapter } from './base.adapter';\nimport {\n CODConfig,\n GatewayName,\n UnifiedCreateOrderOptions,\n UnifiedOrderResult,\n UnifiedPaymentVerificationOptions,\n UnifiedPaymentVerificationResult,\n UnifiedRefundOptions,\n UnifiedRefundResult,\n WebhookVerificationOptions,\n WebhookVerificationResult,\n} from '../types';\nimport { PaymentError } from '../utils/errors';\n\nexport class CODAdapter extends BasePaymentAdapter {\n public readonly name: GatewayName = 'cod';\n\n constructor(private readonly config: CODConfig = {}) {\n super();\n }\n\n public async createOrder(options: UnifiedCreateOrderOptions): Promise<UnifiedOrderResult> {\n const min = this.config.minOrderValue ?? 0;\n const max = this.config.maxOrderValue ?? 10000;\n\n if (options.amount < min) {\n throw new PaymentError(`Order amount ${options.amount} is below minimum COD threshold of ${min}`, {\n gateway: 'cod',\n statusCode: 400,\n });\n }\n\n if (options.amount > max) {\n throw new PaymentError(`Order amount ${options.amount} exceeds maximum COD limit of ${max}`, {\n gateway: 'cod',\n statusCode: 400,\n });\n }\n\n const codFee = this.config.extraFee || 0;\n const totalAmount = options.amount + codFee;\n\n return {\n gateway: 'cod',\n orderId: options.receipt,\n gatewayOrderId: `COD_${options.receipt}`,\n amount: totalAmount,\n currency: options.currency.toUpperCase(),\n status: 'CREATED',\n rawResponse: {\n paymentMode: 'Cash On Delivery',\n baseAmount: options.amount,\n codFee,\n totalPayable: totalAmount,\n },\n };\n }\n\n public async verifyPayment(\n options: UnifiedPaymentVerificationOptions\n ): Promise<UnifiedPaymentVerificationResult> {\n // For COD, verification signifies package delivered and cash collected\n return {\n gateway: 'cod',\n isSuccessful: true,\n paymentId: `COD_COLLECTED_${options.orderId}`,\n orderId: options.orderId,\n amount: 0,\n currency: 'INR',\n paymentMethod: 'cash_on_delivery',\n rawResponse: { status: 'COLLECTED' },\n };\n }\n\n public async refund(options: UnifiedRefundOptions): Promise<UnifiedRefundResult> {\n return {\n gateway: 'cod',\n refundId: `COD_RF_${Date.now()}`,\n paymentId: options.paymentId,\n amount: options.amount || 0,\n status: 'SUCCESS',\n rawResponse: { note: 'Manual cash/store-credit refund for COD' },\n };\n }\n\n public async verifyWebhook(\n _options: WebhookVerificationOptions\n ): Promise<WebhookVerificationResult> {\n return {\n isValid: true,\n gateway: 'cod',\n event: 'COD_ORDER',\n data: {},\n };\n }\n}\n","import {\n GatewayName,\n PaymentManagerOptions,\n UnifiedCreateOrderOptions,\n UnifiedOrderResult,\n UnifiedPaymentVerificationOptions,\n UnifiedPaymentVerificationResult,\n UnifiedRefundOptions,\n UnifiedRefundResult,\n WebhookVerificationOptions,\n WebhookVerificationResult,\n} from './types';\nimport { BasePaymentAdapter } from './adapters/base.adapter';\nimport { RazorpayAdapter } from './adapters/razorpay.adapter';\nimport { CashfreeAdapter } from './adapters/cashfree.adapter';\nimport { PhonePeAdapter } from './adapters/phonepe.adapter';\nimport { PaytmAdapter } from './adapters/paytm.adapter';\nimport { StripeAdapter } from './adapters/stripe.adapter';\nimport { CODAdapter } from './adapters/cod.adapter';\nimport { GatewayNotConfiguredError, PaymentError } from './utils/errors';\n\nexport class PaymentManager {\n private readonly adapters: Map<GatewayName, BasePaymentAdapter> = new Map();\n private readonly defaultGateway?: GatewayName;\n private readonly smartRouting?: PaymentManagerOptions['smartRouting'];\n\n constructor(options: PaymentManagerOptions) {\n this.defaultGateway = options.defaultGateway;\n this.smartRouting = options.smartRouting;\n\n // Initialize configured gateways\n const { gateways } = options;\n if (gateways.razorpay) {\n this.adapters.set('razorpay', new RazorpayAdapter(gateways.razorpay));\n }\n if (gateways.cashfree) {\n this.adapters.set('cashfree', new CashfreeAdapter(gateways.cashfree));\n }\n if (gateways.phonepe) {\n this.adapters.set('phonepe', new PhonePeAdapter(gateways.phonepe));\n }\n if (gateways.paytm) {\n this.adapters.set('paytm', new PaytmAdapter(gateways.paytm));\n }\n if (gateways.stripe) {\n this.adapters.set('stripe', new StripeAdapter(gateways.stripe));\n }\n if (gateways.cod) {\n this.adapters.set('cod', new CODAdapter(gateways.cod));\n }\n\n if (this.adapters.size === 0) {\n console.warn('⚠️ [PaymentManager] No payment gateways were configured in PaymentManager.');\n }\n }\n\n /**\n * Returns an active adapter instance by gateway name.\n */\n public getAdapter(gateway: GatewayName): BasePaymentAdapter {\n const adapter = this.adapters.get(gateway);\n if (!adapter) {\n throw new GatewayNotConfiguredError(gateway);\n }\n return adapter;\n }\n\n /**\n * Lists all currently registered gateway names.\n */\n public listConfiguredGateways(): GatewayName[] {\n return Array.from(this.adapters.keys());\n }\n\n /**\n * Resolves the optimal gateway based on currency rules, explicit override, or default.\n */\n public resolveGateway(options: { gateway?: GatewayName; currency?: string }): GatewayName {\n if (options.gateway) {\n return options.gateway;\n }\n\n if (options.currency && this.smartRouting?.currencyMap) {\n const mapped = this.smartRouting.currencyMap[options.currency.toUpperCase()];\n if (mapped && this.adapters.has(mapped)) {\n return mapped;\n }\n }\n\n if (this.defaultGateway && this.adapters.has(this.defaultGateway)) {\n return this.defaultGateway;\n }\n\n const firstAvailable = this.adapters.keys().next().value;\n if (firstAvailable) {\n return firstAvailable;\n }\n\n throw new PaymentError('No payment gateways configured to process order.');\n }\n\n /**\n * Create an order using the chosen or automatically resolved gateway.\n */\n public async createOrder(options: UnifiedCreateOrderOptions): Promise<UnifiedOrderResult> {\n const targetGateway = this.resolveGateway({\n gateway: options.gateway,\n currency: options.currency,\n });\n const adapter = this.getAdapter(targetGateway);\n return adapter.createOrder(options);\n }\n\n /**\n * Smart Fallback: Attempts creation on primary gateway. If it throws an error or fails,\n * it automatically routes through fallback gateways in sequence!\n */\n public async createOrderWithFallback(\n options: UnifiedCreateOrderOptions & { fallbackChain?: GatewayName[] }\n ): Promise<UnifiedOrderResult> {\n const chain =\n options.fallbackChain ||\n this.smartRouting?.fallbackChain ||\n (this.listConfiguredGateways());\n\n if (chain.length === 0) {\n throw new PaymentError('Fallback chain is empty. Configure at least one gateway.');\n }\n\n let lastError: any;\n for (const gw of chain) {\n if (!this.adapters.has(gw)) continue;\n try {\n const adapter = this.getAdapter(gw);\n const result = await adapter.createOrder({ ...options, gateway: gw });\n return result;\n } catch (err: any) {\n lastError = err;\n console.warn(`[PaymentManager Fallback] Gateway '${gw}' failed (${err.message}). Trying next gateway in chain...`);\n }\n }\n\n throw new PaymentError(\n `All gateways in fallback chain [${chain.join(', ')}] failed. Last error: ${lastError?.message || 'Unknown'}`,\n { rawError: lastError }\n );\n }\n\n /**\n * Verifies payment completion signature or status query.\n */\n public async verifyPayment(\n options: UnifiedPaymentVerificationOptions\n ): Promise<UnifiedPaymentVerificationResult> {\n const adapter = this.getAdapter(options.gateway);\n return adapter.verifyPayment(options);\n }\n\n /**\n * Initiates a customer refund.\n */\n public async refund(options: UnifiedRefundOptions): Promise<UnifiedRefundResult> {\n const adapter = this.getAdapter(options.gateway);\n return adapter.refund(options);\n }\n\n /**\n * Verifies incoming webhook authenticity and decodes payload.\n */\n public async verifyWebhook(\n options: WebhookVerificationOptions\n ): Promise<WebhookVerificationResult> {\n const adapter = this.getAdapter(options.gateway);\n return adapter.verifyWebhook(options);\n }\n}\n\n/**\n * Factory function to instantiate a PaymentManager.\n */\nexport function createPaymentManager(options: PaymentManagerOptions): PaymentManager {\n return new PaymentManager(options);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/adapters/base.adapter.ts","../src/utils/crypto.ts","../src/utils/errors.ts","../src/adapters/razorpay.adapter.ts","../src/adapters/cashfree.adapter.ts","../src/adapters/phonepe.adapter.ts","../src/adapters/paytm.adapter.ts","../src/adapters/stripe.adapter.ts","../src/adapters/cod.adapter.ts","../src/manager.ts"],"names":[],"mappings":";;;AAYO,IAAe,qBAAf,MAAkC;AAAA;AAAA;AAAA;AAAA,EA8B7B,SAAA,CACR,SACA,IAAA,EACoB;AACpB,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAI,CAAA,IAAK,OAAA,CAAQ,IAAA,CAAK,WAAA,EAAa,CAAA,IAAK,OAAA,CAAQ,IAAA,CAAK,WAAA,EAAa,CAAA;AACzF,IAAA,IAAI,MAAM,OAAA,CAAQ,MAAM,CAAA,EAAG,OAAO,OAAO,CAAC,CAAA;AAC1C,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,SAAA,CACd,GAAA,EACA,OAAA,GAII,EAAC,EACO;AACZ,IAAA,MAAM,EAAE,MAAA,GAAS,KAAA,EAAO,UAAU,EAAC,EAAG,MAAK,GAAI,OAAA;AAC/C,IAAA,MAAM,cAAA,GAAyC;AAAA,MAC7C,MAAA,EAAQ,kBAAA;AAAA,MACR,GAAG;AAAA,KACL;AAEA,IAAA,IAAI,cAAA;AACJ,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,QAAA,cAAA,GAAiB,IAAA;AAAA,MACnB,CAAA,MAAA,IAAW,OAAA,CAAQ,cAAc,CAAA,KAAM,mCAAA,EAAqC;AAC1E,QAAA,cAAA,GAAiB,IAAI,eAAA,CAAgB,IAAI,CAAA,CAAE,QAAA,EAAS;AAAA,MACtD,CAAA,MAAO;AACL,QAAA,cAAA,CAAe,cAAc,CAAA,GAAI,kBAAA;AACjC,QAAA,cAAA,GAAiB,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,MACtC;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAC3B,MAAA;AAAA,MACA,OAAA,EAAS,cAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACxB,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,GAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,MAAA,GACJ,MAAM,OAAA,IACN,IAAA,EAAM,OAAO,WAAA,IACb,IAAA,EAAM,OAAO,OAAA,IACb,IAAA,EAAM,gBACL,OAAO,IAAA,KAAS,WAAW,IAAA,GAAO,CAAA,KAAA,EAAQ,IAAI,MAAM,CAAA,CAAA,EAAI,IAAI,UAAU,CAAA,CAAA,CAAA;AACzE,MAAA,MAAM,IAAI,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,WAAA,EAAa,CAAA,YAAA,EAAe,MAAM,CAAA,CAAE,CAAA;AAAA,IACpE;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;ACrGO,SAAS,UAAA,CAAW,MAAuB,MAAA,EAAwB;AACxE,EAAA,OAAO,MAAA,CAAO,WAAW,QAAA,EAAU,MAAM,EAAE,MAAA,CAAO,IAAI,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AACtE;AAKO,SAAS,OAAO,IAAA,EAA+B;AACpD,EAAA,OAAO,MAAA,CAAO,WAAW,QAAQ,CAAA,CAAE,OAAO,IAAI,CAAA,CAAE,OAAO,KAAK,CAAA;AAC9D;AAKO,SAAS,aAAa,IAAA,EAA+B;AAC1D,EAAA,MAAM,MAAM,OAAO,IAAA,KAAS,WAAW,IAAA,GAAO,IAAA,CAAK,UAAU,IAAI,CAAA;AACjE,EAAA,OAAO,OAAO,IAAA,CAAK,GAAA,EAAK,MAAM,CAAA,CAAE,SAAS,QAAQ,CAAA;AACnD;AAKO,SAAS,aAAa,OAAA,EAAyB;AACpD,EAAA,OAAO,OAAO,IAAA,CAAK,OAAA,EAAS,QAAQ,CAAA,CAAE,SAAS,MAAM,CAAA;AACvD;AAKO,SAAS,WAAA,CAAY,GAAW,CAAA,EAAoB;AACzD,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA;AAClC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA;AAClC,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,IAAA,CAAK,MAAA,EAAQ,OAAO,KAAA;AACxC,IAAA,OAAO,MAAA,CAAO,eAAA,CAAgB,IAAA,EAAM,IAAI,CAAA;AAAA,EAC1C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;ACzCO,IAAM,YAAA,GAAN,MAAM,aAAA,SAAqB,KAAA,CAAM;AAAA,EAKtC,WAAA,CAAY,SAAiB,OAAA,EAA0E;AACrG,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AACZ,IAAA,IAAA,CAAK,UAAU,OAAA,EAAS,OAAA;AACxB,IAAA,IAAA,CAAK,aAAa,OAAA,EAAS,UAAA;AAC3B,IAAA,IAAA,CAAK,WAAW,OAAA,EAAS,QAAA;AACzB,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,aAAA,CAAa,SAAS,CAAA;AAAA,EACpD;AACF;AAEO,IAAM,yBAAA,GAAN,MAAM,0BAAA,SAAkC,YAAA,CAAa;AAAA,EAC1D,YAAY,OAAA,EAAsB;AAChC,IAAA,KAAA,CAAM,oBAAoB,OAAO,CAAA,sCAAA,CAAA,EAA0C,EAAE,OAAA,EAAS,UAAA,EAAY,KAAK,CAAA;AACvG,IAAA,IAAA,CAAK,IAAA,GAAO,2BAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,0BAAA,CAA0B,SAAS,CAAA;AAAA,EACjE;AACF;AAEO,IAAM,0BAAA,GAAN,MAAM,2BAAA,SAAmC,YAAA,CAAa;AAAA,EAC3D,WAAA,CAAY,SAAsB,OAAA,EAAkB;AAClD,IAAA,KAAA,CAAM,kDAAkD,OAAO,CAAA,GAAA,EAAM,WAAW,EAAE,CAAA,CAAA,CAAG,MAAK,EAAG;AAAA,MAC3F,OAAA;AAAA,MACA,UAAA,EAAY;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,4BAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,2BAAA,CAA2B,SAAS,CAAA;AAAA,EAClE;AACF;;;ACjBO,IAAM,eAAA,GAAN,cAA8B,kBAAA,CAAmB;AAAA,EAItD,YAA6B,MAAA,EAAwB;AACnD,IAAA,KAAA,EAAM;AADqB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAH7B,IAAA,IAAA,CAAgB,IAAA,GAAoB,UAAA;AACpC,IAAA,IAAA,CAAiB,OAAA,GAAU,6BAAA;AAIzB,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,IAAS,CAAC,OAAO,SAAA,EAAW;AACtC,MAAA,MAAM,IAAI,YAAA,CAAa,4CAAA,EAA8C,EAAE,OAAA,EAAS,YAAY,CAAA;AAAA,IAC9F;AAAA,EACF;AAAA,EAEQ,aAAA,GAAwB;AAC9B,IAAA,MAAM,KAAA,GAAQ,GAAG,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,SAAS,CAAA,CAAA;AAC3D,IAAA,OAAO,SAAS,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAC,CAAA,CAAA;AAAA,EACvD;AAAA,EAEA,MAAa,YAAY,OAAA,EAAiE;AAExF,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,SAAS,GAAG,CAAA;AAExD,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,MAAA,EAAQ,gBAAA;AAAA,MACR,QAAA,EAAU,OAAA,CAAQ,QAAA,CAAS,WAAA,EAAY;AAAA,MACvC,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,KAAA,EAAO;AAAA,QACL,aAAA,EAAe,QAAQ,QAAA,CAAS,IAAA;AAAA,QAChC,cAAA,EAAgB,QAAQ,QAAA,CAAS,KAAA;AAAA,QACjC,cAAA,EAAgB,QAAQ,QAAA,CAAS,KAAA;AAAA,QACjC,GAAG,OAAA,CAAQ;AAAA;AACb,KACF;AAEA,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,UAAU,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,OAAA,CAAA,EAAW;AAAA,MACzD,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,aAAA,EAAe,KAAK,aAAA;AAAc,OACpC;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,UAAA;AAAA,MACT,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,gBAAgB,GAAA,CAAI,EAAA;AAAA,MACpB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,QAAA,EAAU,OAAA,CAAQ,QAAA,CAAS,WAAA,EAAY;AAAA,MACvC,MAAA,EAAQ,SAAA;AAAA,MACR,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEA,MAAa,cACX,OAAA,EAC2C;AAC3C,IAAA,IAAI,CAAC,QAAQ,SAAA,EAAW;AACtB,MAAA,MAAM,IAAI,YAAA,CAAa,mDAAA,EAAqD,EAAE,OAAA,EAAS,YAAY,CAAA;AAAA,IACrG;AAEA,IAAA,IAAI,gBAAA,GAAmB,KAAA;AACvB,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,MAAM,iBAAA,GAAoB,UAAA;AAAA,QACxB,CAAA,EAAG,OAAA,CAAQ,OAAO,CAAA,CAAA,EAAI,QAAQ,SAAS,CAAA,CAAA;AAAA,QACvC,KAAK,MAAA,CAAO;AAAA,OACd;AACA,MAAA,gBAAA,GAAmB,WAAA,CAAY,iBAAA,EAAmB,OAAA,CAAQ,SAAS,CAAA;AAAA,IACrE;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,KAAK,OAAO,CAAA,UAAA,EAAa,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI;AAAA,MACpF,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,aAAA,EAAe,KAAK,aAAA;AAAc;AACpC,KACD,CAAA;AAED,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,KAAW,UAAA,IAAc,QAAQ,MAAA,KAAW,YAAA;AAEvE,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,UAAA;AAAA,MACT,YAAA,EAAA,CAAe,OAAA,CAAQ,SAAA,GAAY,gBAAA,GAAmB,IAAA,KAAS,UAAA;AAAA,MAC/D,WAAW,OAAA,CAAQ,EAAA;AAAA,MACnB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,MAAA,EAAQ,QAAQ,MAAA,GAAS,GAAA;AAAA;AAAA,MACzB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,eAAe,OAAA,CAAQ,MAAA;AAAA,MACvB,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEA,MAAa,OAAO,OAAA,EAA6D;AAC/E,IAAA,MAAM,OAAA,GAA+B;AAAA,MACnC,KAAA,EAAO,EAAE,MAAA,EAAQ,OAAA,CAAQ,UAAU,2BAAA;AAA4B,KACjE;AACA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,SAAS,GAAG,CAAA;AAAA,IAClD;AAEA,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,KAAK,OAAO,CAAA,UAAA,EAAa,OAAA,CAAQ,SAAS,CAAA,OAAA,CAAA,EAAW;AAAA,MACvF,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,aAAA,EAAe,KAAK,aAAA;AAAc,OACpC;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,UAAA;AAAA,MACT,UAAU,GAAA,CAAI,EAAA;AAAA,MACd,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,MAAA,EAAQ,IAAI,MAAA,GAAS,GAAA;AAAA;AAAA,MACrB,MAAA,EAAQ,GAAA,CAAI,MAAA,KAAW,WAAA,GAAc,SAAA,GAAY,SAAA;AAAA,MACjD,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEA,MAAa,cACX,OAAA,EACoC;AACpC,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,aAAA,IAAiB,IAAA,CAAK,MAAA,CAAO,aAAA;AACpD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,eAAA,EAAiB,SAAA;AAAA,QACjB,OAAA,EAAS,UAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,SAAS,sBAAsB,CAAA;AACxE,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,eAAA,EAAiB,SAAA;AAAA,QACjB,OAAA,EAAS,UAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GACJ,OAAO,OAAA,CAAQ,OAAA,KAAY,QAAA,GACvB,QAAQ,OAAA,GACR,OAAA,CAAQ,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA;AAErC,IAAA,MAAM,iBAAA,GAAoB,UAAA,CAAW,SAAA,EAAW,MAAM,CAAA;AACtD,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,iBAAA,EAAmB,SAAS,CAAA;AAExD,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAA,CAAK,MAAM,SAAS,CAAA;AAAA,IAC/B,CAAA,CAAA,MAAQ;AACN,MAAA,MAAA,GAAS,IAAA;AAAA,IACX;AAEA,IAAA,MAAM,QAAA,GAAW,QAAQ,KAAA,IAAS,EAAA;AAClC,IAAA,IAAI,eAAA,GAA0C,SAAA;AAE9C,IAAA,IAAI,QAAA,KAAa,YAAA,IAAgB,QAAA,KAAa,kBAAA,IAAsB,aAAa,oBAAA,EAAsB;AACrG,MAAA,eAAA,GAAkB,iBAAA;AAAA,IACpB,CAAA,MAAA,IAAW,aAAa,gBAAA,EAAkB;AACxC,MAAA,eAAA,GAAkB,gBAAA;AAAA,IACpB,CAAA,MAAA,IAAW,QAAA,KAAa,kBAAA,IAAsB,QAAA,KAAa,gBAAA,EAAkB;AAC3E,MAAA,eAAA,GAAkB,kBAAA;AAAA,IACpB,CAAA,MAAA,IAAW,aAAa,eAAA,EAAiB;AACvC,MAAA,eAAA,GAAkB,eAAA;AAAA,IACpB,CAAA,MAAA,IAAW,QAAA,EAAU,QAAA,CAAS,SAAS,CAAA,EAAG;AACxC,MAAA,eAAA,GAAkB,iBAAA;AAAA,IACpB;AAEA,IAAA,MAAM,aAAA,GAAgB,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,MAAA;AAChD,IAAA,MAAM,WAAA,GAAc,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,MAAA;AAE5C,IAAA,MAAM,OAAA,GAAU,WAAA,EAAa,OAAA,IAAW,aAAA,EAAe,YAAY,WAAA,EAAa,EAAA;AAChF,IAAA,MAAM,YAAY,aAAA,EAAe,EAAA;AACjC,IAAA,MAAM,MAAA,GAAS,aAAA,EAAe,MAAA,GAAS,aAAA,CAAc,MAAA,GAAS,MAAO,WAAA,EAAa,MAAA,GAAS,WAAA,CAAY,MAAA,GAAS,GAAA,GAAM,MAAA;AACtH,IAAA,MAAM,QAAA,GAAW,aAAA,EAAe,QAAA,IAAY,WAAA,EAAa,QAAA;AAEzD,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,eAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA,EAAS,UAAA;AAAA,MACT,OAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAM,MAAA,EAAQ;AAAA,KAChB;AAAA,EACF;AACF;;;AC3LO,IAAM,eAAA,GAAN,cAA8B,kBAAA,CAAmB;AAAA,EAKtD,YAA6B,MAAA,EAAwB;AACnD,IAAA,KAAA,EAAM;AADqB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAJ7B,IAAA,IAAA,CAAgB,IAAA,GAAoB,UAAA;AAMlC,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,IAAS,CAAC,OAAO,SAAA,EAAW;AACtC,MAAA,MAAM,IAAI,YAAA,CAAa,4CAAA,EAA8C,EAAE,OAAA,EAAS,YAAY,CAAA;AAAA,IAC9F;AACA,IAAA,IAAA,CAAK,OAAA,GACH,MAAA,CAAO,GAAA,KAAQ,YAAA,GACX,6BAAA,GACA,iCAAA;AACN,IAAA,IAAA,CAAK,UAAA,GAAa,OAAO,UAAA,IAAc,YAAA;AAAA,EACzC;AAAA,EAEQ,UAAA,GAAqC;AAC3C,IAAA,OAAO;AAAA,MACL,aAAA,EAAe,KAAK,MAAA,CAAO,KAAA;AAAA,MAC3B,iBAAA,EAAmB,KAAK,MAAA,CAAO,SAAA;AAAA,MAC/B,iBAAiB,IAAA,CAAK,UAAA;AAAA,MACtB,cAAA,EAAgB;AAAA,KAClB;AAAA,EACF;AAAA,EAEA,MAAa,YAAY,OAAA,EAAiE;AAExF,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,UAAU,OAAA,CAAQ,OAAA;AAAA,MAClB,cAAc,OAAA,CAAQ,MAAA;AAAA,MACtB,cAAA,EAAgB,OAAA,CAAQ,QAAA,CAAS,WAAA,EAAY;AAAA,MAC7C,gBAAA,EAAkB;AAAA,QAChB,aAAa,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,QACtD,aAAA,EAAe,QAAQ,QAAA,CAAS,IAAA;AAAA,QAChC,cAAA,EAAgB,QAAQ,QAAA,CAAS,KAAA;AAAA,QACjC,cAAA,EAAgB,QAAQ,QAAA,CAAS;AAAA,OACnC;AAAA,MACA,UAAA,EAAY;AAAA,QACV,YAAY,OAAA,CAAQ,WAAA;AAAA,QACpB,YAAY,OAAA,CAAQ;AAAA,OACtB;AAAA,MACA,YAAY,OAAA,CAAQ,KAAA,GAAQ,KAAK,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAA,GAAI;AAAA,KAC9D;AAEA,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,UAAU,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,OAAA,CAAA,EAAW;AAAA,MACzD,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,KAAK,UAAA,EAAW;AAAA,MACzB,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,UAAA;AAAA,MACT,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,gBAAgB,GAAA,CAAI,QAAA;AAAA,MACpB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,QAAA,EAAU,OAAA,CAAQ,QAAA,CAAS,WAAA,EAAY;AAAA,MACvC,MAAA,EAAQ,GAAA,CAAI,YAAA,KAAiB,QAAA,GAAW,SAAA,GAAY,SAAA;AAAA,MACpD,kBAAkB,GAAA,CAAI,kBAAA;AAAA,MACtB,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEA,MAAa,cACX,OAAA,EAC2C;AAC3C,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,KAAK,OAAO,CAAA,QAAA,EAAW,OAAA,CAAQ,OAAO,CAAA,CAAA,EAAI;AAAA,MAC9E,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS,KAAK,UAAA;AAAW,KAC1B,CAAA;AAED,IAAA,MAAM,YAAA,GAAe,MAAM,YAAA,KAAiB,MAAA;AAC5C,IAAA,IAAI,aAAA,GAAgB,SAAA;AACpB,IAAA,IAAI,SAAA,GAAY,OAAA,CAAQ,SAAA,IAAa,KAAA,CAAM,QAAA;AAE3C,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,KAAK,OAAO,CAAA,QAAA,EAAW,OAAA,CAAQ,OAAO,CAAA,SAAA,CAAA,EAAa;AAAA,UAC1F,MAAA,EAAQ,KAAA;AAAA,UACR,OAAA,EAAS,KAAK,UAAA;AAAW,SAC1B,CAAA;AACD,QAAA,IAAI,MAAM,OAAA,CAAQ,QAAQ,CAAA,IAAK,QAAA,CAAS,SAAS,CAAA,EAAG;AAClD,UAAA,MAAM,MAAA,GAAS,SAAS,CAAC,CAAA;AACzB,UAAA,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,aAAA,IAAiB,SAAS,CAAA;AACpD,UAAA,aAAA,GAAgB,MAAA,CAAO,aAAA,KAAkB,MAAA,CAAO,cAAA,GAAiB,MAAA,CAAO,KAAK,MAAA,CAAO,cAAc,CAAA,CAAE,CAAC,CAAA,GAAI,QAAA,CAAA;AAAA,QAC3G;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,UAAA;AAAA,MACT,YAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAS,KAAA,CAAM,QAAA;AAAA,MACf,QAAQ,KAAA,CAAM,YAAA;AAAA,MACd,UAAU,KAAA,CAAM,cAAA;AAAA,MAChB,aAAA;AAAA,MACA,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEA,MAAa,OAAO,OAAA,EAA6D;AAC/E,IAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,MAAA,MAAM,IAAI,YAAA,CAAa,mCAAA,EAAqC,EAAE,OAAA,EAAS,YAAY,CAAA;AAAA,IACrF;AAEA,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,SAAA,EAAW,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,MAC7B,eAAe,OAAA,CAAQ,MAAA;AAAA,MACvB,WAAA,EAAa,QAAQ,MAAA,IAAU;AAAA,KACjC;AAEA,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,KAAK,OAAO,CAAA,QAAA,EAAW,OAAA,CAAQ,OAAO,CAAA,QAAA,CAAA,EAAY;AAAA,MACpF,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,KAAK,UAAA,EAAW;AAAA,MACzB,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,UAAA;AAAA,MACT,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,QAAQ,GAAA,CAAI,aAAA;AAAA,MACZ,MAAA,EAAQ,GAAA,CAAI,aAAA,KAAkB,SAAA,GAAY,SAAA,GAAY,SAAA;AAAA,MACtD,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEA,MAAa,cACX,OAAA,EACoC;AACpC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,SAAS,qBAAqB,CAAA;AACvE,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,SAAS,qBAAqB,CAAA;AAEvE,IAAA,MAAM,SAAA,GACJ,OAAO,OAAA,CAAQ,OAAA,KAAY,QAAA,GACvB,QAAQ,OAAA,GACR,OAAA,CAAQ,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA;AAErC,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,MAAA,MAAM,UAAA,GAAa,CAAA,EAAG,SAAS,CAAA,EAAG,SAAS,CAAA,CAAA;AAC3C,MAAA,MAAM,oBAAoB,MAAA,CAAO,IAAA;AAAA,QAC/B,UAAA,CAAW,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA;AAAA,QAC5C;AAAA,OACF,CAAE,SAAS,QAAQ,CAAA;AACnB,MAAA,OAAA,GAAU,WAAA,CAAY,mBAAmB,SAAS,CAAA;AAAA,IACpD,WAAW,SAAA,EAAW;AACpB,MAAA,MAAM,oBAAoB,MAAA,CAAO,IAAA;AAAA,QAC/B,UAAA,CAAW,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA;AAAA,QAC3C;AAAA,OACF,CAAE,SAAS,QAAQ,CAAA;AACnB,MAAA,OAAA,GAAU,WAAA,CAAY,mBAAmB,SAAS,CAAA;AAAA,IACpD;AAEA,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAA,CAAK,MAAM,SAAS,CAAA;AAAA,IAC/B,CAAA,CAAA,MAAQ;AACN,MAAA,MAAA,GAAS,IAAA;AAAA,IACX;AAEA,IAAA,MAAM,QAAA,GAAW,QAAQ,IAAA,IAAQ,EAAA;AACjC,IAAA,IAAI,eAAA,GAA0C,SAAA;AAE9C,IAAA,IAAI,aAAa,yBAAA,EAA2B;AAC1C,MAAA,eAAA,GAAkB,iBAAA;AAAA,IACpB,CAAA,MAAA,IAAW,QAAA,KAAa,wBAAA,IAA4B,QAAA,KAAa,sBAAA,EAAwB;AACvF,MAAA,eAAA,GAAkB,gBAAA;AAAA,IACpB,CAAA,MAAA,IAAW,aAAa,uBAAA,EAAyB;AAC/C,MAAA,MAAM,YAAA,GAAe,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,aAAA;AAC3C,MAAA,eAAA,GAAkB,YAAA,KAAiB,YAAY,kBAAA,GAAqB,eAAA;AAAA,IACtE,CAAA,MAAA,IAAW,QAAA,EAAU,QAAA,CAAS,SAAS,CAAA,EAAG;AACxC,MAAA,eAAA,GAAkB,iBAAA;AAAA,IACpB;AAEA,IAAA,MAAM,SAAA,GAAY,QAAQ,IAAA,EAAM,KAAA;AAChC,IAAA,MAAM,WAAA,GAAc,QAAQ,IAAA,EAAM,OAAA;AAClC,IAAA,MAAM,UAAA,GAAa,QAAQ,IAAA,EAAM,MAAA;AAEjC,IAAA,MAAM,OAAA,GAAU,SAAA,EAAW,QAAA,IAAY,UAAA,EAAY,QAAA;AACnD,IAAA,MAAM,SAAA,GAAY,WAAA,GAAc,MAAA,CAAO,WAAA,CAAY,aAAa,IAAK,UAAA,GAAa,MAAA,CAAO,UAAA,CAAW,aAAa,CAAA,GAAI,MAAA;AACrH,IAAA,MAAM,MAAA,GAAS,WAAA,EAAa,cAAA,IAAkB,SAAA,EAAW,gBAAgB,UAAA,EAAY,aAAA;AACrF,IAAA,MAAM,QAAA,GAAW,WAAA,EAAa,gBAAA,IAAoB,SAAA,EAAW,cAAA;AAE7D,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,eAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA,EAAS,UAAA;AAAA,MACT,OAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAM,MAAA,EAAQ;AAAA,KAChB;AAAA,EACF;AACF;;;ACvMO,IAAM,cAAA,GAAN,cAA6B,kBAAA,CAAmB;AAAA,EAKrD,YAA6B,MAAA,EAAuB;AAClD,IAAA,KAAA,EAAM;AADqB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAJ7B,IAAA,IAAA,CAAgB,IAAA,GAAoB,SAAA;AAMlC,IAAA,IAAI,CAAC,MAAA,CAAO,UAAA,IAAc,CAAC,OAAO,OAAA,EAAS;AACzC,MAAA,MAAM,IAAI,YAAA,CAAa,8CAAA,EAAgD,EAAE,OAAA,EAAS,WAAW,CAAA;AAAA,IAC/F;AACA,IAAA,IAAA,CAAK,OAAA,GACH,MAAA,CAAO,GAAA,KAAQ,YAAA,GACX,qCAAA,GACA,iDAAA;AACN,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,SAAA,IAAa,GAAA;AAAA,EACvC;AAAA,EAEQ,gBAAA,CAAiB,eAAuB,QAAA,EAA0B;AACxE,IAAA,MAAM,YAAA,GAAe,GAAG,aAAa,CAAA,EAAG,QAAQ,CAAA,EAAG,IAAA,CAAK,OAAO,OAAO,CAAA,CAAA;AACtE,IAAA,MAAM,IAAA,GAAO,OAAO,YAAY,CAAA;AAChC,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,GAAA,EAAM,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,EACpC;AAAA,EAEA,MAAa,YAAY,OAAA,EAAiE;AAExF,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,SAAS,GAAG,CAAA;AAErD,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,UAAA,EAAY,KAAK,MAAA,CAAO,UAAA;AAAA,MACxB,uBAAuB,OAAA,CAAQ,OAAA;AAAA,MAC/B,gBAAgB,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,MACzD,MAAA,EAAQ,aAAA;AAAA,MACR,WAAA,EAAa,QAAQ,WAAA,IAAe,qCAAA;AAAA,MACpC,YAAA,EAAc,MAAA;AAAA,MACd,WAAA,EAAa,QAAQ,WAAA,IAAe,4CAAA;AAAA,MACpC,YAAA,EAAc,QAAQ,QAAA,CAAS,KAAA,CAAM,QAAQ,SAAA,EAAW,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA;AAAA,MACrE,iBAAA,EAAmB;AAAA,QACjB,IAAA,EAAM;AAAA;AACR,KACF;AAEA,IAAA,MAAM,aAAA,GAAgB,aAAa,OAAO,CAAA;AAC1C,IAAA,MAAM,QAAA,GAAW,YAAA;AACjB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,gBAAA,CAAiB,aAAA,EAAe,QAAQ,CAAA;AAE7D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAG,IAAA,CAAK,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI;AAAA,MAC7D,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,UAAA,EAAY;AAAA,OACd;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS;AAAA;AACX,KACD,CAAA;AAED,IAAA,MAAM,WAAA,GAAc,GAAA,EAAK,IAAA,EAAM,kBAAA,EAAoB,YAAA,EAAc,GAAA;AAEjE,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,SAAA;AAAA,MACT,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,gBAAgB,OAAA,CAAQ,OAAA;AAAA,MACxB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,QAAA,EAAU,OAAA,CAAQ,QAAA,CAAS,WAAA,EAAY;AAAA,MACvC,MAAA,EAAQ,GAAA,CAAI,OAAA,GAAU,SAAA,GAAY,QAAA;AAAA,MAClC,WAAA;AAAA,MACA,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEA,MAAa,cACX,OAAA,EAC2C;AAC3C,IAAA,MAAM,WAAW,CAAA,cAAA,EAAiB,IAAA,CAAK,OAAO,UAAU,CAAA,CAAA,EAAI,QAAQ,OAAO,CAAA,CAAA;AAC3E,IAAA,MAAM,eAAe,CAAA,EAAG,QAAQ,CAAA,EAAG,IAAA,CAAK,OAAO,OAAO,CAAA,CAAA;AACtD,IAAA,MAAM,UAAU,CAAA,EAAG,MAAA,CAAO,YAAY,CAAC,CAAA,GAAA,EAAM,KAAK,SAAS,CAAA,CAAA;AAE3D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAG,IAAA,CAAK,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI;AAAA,MAC7D,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,UAAA,EAAY,OAAA;AAAA,QACZ,eAAA,EAAiB,KAAK,MAAA,CAAO;AAAA;AAC/B,KACD,CAAA;AAED,IAAA,MAAM,YAAA,GAAe,IAAI,IAAA,KAAS,iBAAA;AAClC,IAAA,MAAM,SAAS,GAAA,CAAI,IAAA,EAAM,SAAS,GAAA,CAAI,IAAA,CAAK,SAAS,GAAA,GAAM,CAAA;AAC1D,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,EAAM,aAAA,IAAiB,OAAA,CAAQ,OAAA;AAErD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,SAAA;AAAA,MACT,YAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,MAAA;AAAA,MACA,QAAA,EAAU,KAAA;AAAA,MACV,aAAA,EAAe,GAAA,CAAI,IAAA,EAAM,iBAAA,EAAmB,IAAA,IAAQ,KAAA;AAAA,MACpD,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEA,MAAa,OAAO,OAAA,EAA6D;AAC/E,IAAA,MAAM,WAAA,GAAc,CAAA,GAAA,EAAM,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AACpC,IAAA,MAAM,aAAA,GAAgB,QAAQ,MAAA,GAAS,IAAA,CAAK,MAAM,OAAA,CAAQ,MAAA,GAAS,GAAG,CAAA,GAAI,CAAA;AAE1E,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,UAAA,EAAY,KAAK,MAAA,CAAO,UAAA;AAAA,MACxB,qBAAA,EAAuB,WAAA;AAAA,MACvB,qBAAA,EAAuB,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,SAAA;AAAA,MAClD,MAAA,EAAQ,aAAA;AAAA,MACR,WAAA,EAAa;AAAA,KACf;AAEA,IAAA,MAAM,aAAA,GAAgB,aAAa,OAAO,CAAA;AAC1C,IAAA,MAAM,QAAA,GAAW,eAAA;AACjB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,gBAAA,CAAiB,aAAA,EAAe,QAAQ,CAAA;AAE7D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAG,IAAA,CAAK,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI;AAAA,MAC7D,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,UAAA,EAAY;AAAA,OACd;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS;AAAA;AACX,KACD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,SAAA;AAAA,MACT,QAAA,EAAU,WAAA;AAAA,MACV,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,MAAA,EAAQ,QAAQ,MAAA,IAAU,CAAA;AAAA,MAC1B,MAAA,EAAQ,GAAA,CAAI,OAAA,GAAU,SAAA,GAAY,QAAA;AAAA,MAClC,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEA,MAAa,cACX,OAAA,EACoC;AACpC,IAAA,MAAM,SAAA,GACJ,OAAO,OAAA,CAAQ,OAAA,KAAY,QAAA,GACvB,QAAQ,OAAA,GACR,OAAA,CAAQ,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA;AAErC,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAA,CAAK,MAAM,SAAS,CAAA;AAAA,IAC/B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAE,SAAS,KAAA,EAAO,eAAA,EAAiB,WAAW,OAAA,EAAS,SAAA,EAAW,OAAO,sBAAA,EAAuB;AAAA,IACzG;AAEA,IAAA,IAAI,CAAC,OAAO,QAAA,EAAU;AACpB,MAAA,OAAO,EAAE,SAAS,KAAA,EAAO,eAAA,EAAiB,WAAW,OAAA,EAAS,SAAA,EAAW,OAAO,4CAAA,EAA6C;AAAA,IAC/H;AAEA,IAAA,IAAI,UAAe,EAAC;AACpB,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAE,SAAS,KAAA,EAAO,eAAA,EAAiB,WAAW,OAAA,EAAS,SAAA,EAAW,OAAO,0CAAA,EAA2C;AAAA,IAC7H;AAEA,IAAA,MAAM,QAAA,GAAW,QAAQ,IAAA,IAAQ,EAAA;AACjC,IAAA,IAAI,eAAA,GAA0C,SAAA;AAE9C,IAAA,IAAI,aAAa,iBAAA,EAAmB;AAClC,MAAA,eAAA,GAAkB,iBAAA;AAAA,IACpB,CAAA,MAAA,IAAW,QAAA,KAAa,eAAA,IAAmB,QAAA,KAAa,kBAAA,EAAoB;AAC1E,MAAA,eAAA,GAAkB,gBAAA;AAAA,IACpB;AAEA,IAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAM,qBAAA;AAC9B,IAAA,MAAM,SAAA,GAAY,QAAQ,IAAA,EAAM,aAAA;AAChC,IAAA,MAAM,SAAS,OAAA,CAAQ,IAAA,EAAM,SAAS,OAAA,CAAQ,IAAA,CAAK,SAAS,GAAA,GAAM,MAAA;AAElE,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,eAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA,EAAS,SAAA;AAAA,MACT,OAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA,EAAU,KAAA;AAAA,MACV,MAAM,OAAA,CAAQ;AAAA,KAChB;AAAA,EACF;AACF;;;AC/LO,IAAM,YAAA,GAAN,cAA2B,kBAAA,CAAmB;AAAA,EAInD,YAA6B,MAAA,EAAqB;AAChD,IAAA,KAAA,EAAM;AADqB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAH7B,IAAA,IAAA,CAAgB,IAAA,GAAoB,OAAA;AAKlC,IAAA,IAAI,CAAC,MAAA,CAAO,GAAA,IAAO,CAAC,OAAO,WAAA,EAAa;AACtC,MAAA,MAAM,IAAI,YAAA,CAAa,yCAAA,EAA2C,EAAE,OAAA,EAAS,SAAS,CAAA;AAAA,IACxF;AACA,IAAA,IAAA,CAAK,OAAA,GACH,MAAA,CAAO,GAAA,KAAQ,YAAA,GACX,2BAAA,GACA,iCAAA;AAAA,EACR;AAAA,EAEA,MAAa,YAAY,OAAA,EAAiE;AACxF,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,IAAA,EAAM;AAAA,QACJ,WAAA,EAAa,SAAA;AAAA,QACb,GAAA,EAAK,KAAK,MAAA,CAAO,GAAA;AAAA,QACjB,WAAA,EAAa,IAAA,CAAK,MAAA,CAAO,OAAA,IAAW,SAAA;AAAA,QACpC,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,WAAA,EAAa,QAAQ,WAAA,IAAe,0CAAA;AAAA,QACpC,SAAA,EAAW;AAAA,UACT,KAAA,EAAO,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA;AAAA,UAC/B,QAAA,EAAU;AAAA,SACZ;AAAA,QACA,QAAA,EAAU;AAAA,UACR,QAAQ,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,UACjD,MAAA,EAAQ,QAAQ,QAAA,CAAS,KAAA,CAAM,QAAQ,SAAA,EAAW,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA;AAAA,UAC/D,KAAA,EAAO,QAAQ,QAAA,CAAS;AAAA;AAC1B;AACF,KACF;AAEA,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,sCAAA,EAAyC,KAAK,MAAA,CAAO,GAAG,CAAA,SAAA,EAAY,OAAA,CAAQ,OAAO,CAAA,CAAA;AAC9G,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,MACpC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,MAAM,QAAA,GAAW,KAAK,IAAA,EAAM,QAAA;AAE5B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,OAAA;AAAA,MACT,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,gBAAgB,OAAA,CAAQ,OAAA;AAAA,MACxB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,QAAA,EAAU,KAAA;AAAA,MACV,MAAA,EAAQ,WAAW,SAAA,GAAY,QAAA;AAAA,MAC/B,QAAA;AAAA,MACA,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEA,MAAa,cACX,OAAA,EAC2C;AAC3C,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,gBAAA,CAAA;AAC3B,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,IAAA,EAAM;AAAA,QACJ,GAAA,EAAK,KAAK,MAAA,CAAO,GAAA;AAAA,QACjB,SAAS,OAAA,CAAQ;AAAA;AACnB,KACF;AAEA,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,MACpC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,GAAA,EAAK,IAAA,IAAQ,EAAC;AAC3B,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,UAAA,EAAY,YAAA,KAAiB,aAAA;AAEvD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,OAAA;AAAA,MACT,YAAA;AAAA,MACA,SAAA,EAAW,IAAA,CAAK,KAAA,IAAS,OAAA,CAAQ,OAAA;AAAA,MACjC,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,MAAA,EAAQ,UAAA,CAAW,IAAA,CAAK,SAAA,IAAa,GAAG,CAAA;AAAA,MACxC,QAAA,EAAU,KAAA;AAAA,MACV,aAAA,EAAe,KAAK,WAAA,IAAe,QAAA;AAAA,MACnC,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEA,MAAa,OAAO,OAAA,EAA6D;AAC/E,IAAA,MAAM,WAAA,GAAc,CAAA,GAAA,EAAM,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AACpC,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,aAAA,CAAA;AAC3B,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,IAAA,EAAM;AAAA,QACJ,GAAA,EAAK,KAAK,MAAA,CAAO,GAAA;AAAA,QACjB,OAAA,EAAS,QAAA;AAAA,QACT,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,OAAO,OAAA,CAAQ,SAAA;AAAA,QACf,KAAA,EAAO,WAAA;AAAA,QACP,YAAA,EAAA,CAAe,OAAA,CAAQ,MAAA,IAAU,CAAA,EAAG,QAAQ,CAAC;AAAA;AAC/C,KACF;AAEA,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,MACpC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,GAAA,EAAK,IAAA,IAAQ,EAAC;AAC3B,IAAA,MAAM,YAAY,IAAA,CAAK,UAAA,EAAY,iBAAiB,aAAA,IAAiB,IAAA,CAAK,YAAY,YAAA,KAAiB,SAAA;AAEvG,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,OAAA;AAAA,MACT,QAAA,EAAU,KAAK,QAAA,IAAY,WAAA;AAAA,MAC3B,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,MAAA,EAAQ,QAAQ,MAAA,IAAU,CAAA;AAAA,MAC1B,MAAA,EAAQ,YAAY,SAAA,GAAY,QAAA;AAAA,MAChC,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEA,MAAa,cACX,OAAA,EACoC;AACpC,IAAA,MAAM,SAAA,GACJ,OAAO,OAAA,CAAQ,OAAA,KAAY,QAAA,GACvB,QAAQ,OAAA,GACR,OAAA,CAAQ,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA;AAErC,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAA,CAAK,MAAM,SAAS,CAAA;AAAA,IAC/B,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,SAAS,CAAA;AAC5C,MAAA,MAAA,GAAS,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,OAAA,EAAS,CAAA;AAAA,IAC9C;AAEA,IAAA,MAAM,SAAA,GAAY,MAAA,EAAQ,MAAA,IAAU,MAAA,EAAQ,UAAA,EAAY,YAAA;AACxD,IAAA,MAAM,YAAY,SAAA,KAAc,aAAA;AAChC,IAAA,MAAM,eAAA,GAA0C,YAAY,iBAAA,GAAoB,gBAAA;AAEhF,IAAA,MAAM,OAAA,GAAU,MAAA,EAAQ,OAAA,IAAW,MAAA,EAAQ,OAAA;AAC3C,IAAA,MAAM,SAAA,GAAY,MAAA,EAAQ,KAAA,IAAS,MAAA,EAAQ,KAAA;AAC3C,IAAA,MAAM,SAAS,MAAA,EAAQ,SAAA,GAAY,UAAA,CAAW,MAAA,CAAO,SAAS,CAAA,GAAI,MAAA;AAElE,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,eAAA;AAAA,MACA,QAAA,EAAU,SAAA;AAAA,MACV,OAAA,EAAS,OAAA;AAAA,MACT,OAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA,EAAU,KAAA;AAAA,MACV,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AACF;;;ACzJO,IAAM,aAAA,GAAN,cAA4B,kBAAA,CAAmB;AAAA,EAIpD,YAA6B,MAAA,EAAsB;AACjD,IAAA,KAAA,EAAM;AADqB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAH7B,IAAA,IAAA,CAAgB,IAAA,GAAoB,QAAA;AACpC,IAAA,IAAA,CAAiB,OAAA,GAAU,2BAAA;AAIzB,IAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACrB,MAAA,MAAM,IAAI,YAAA,CAAa,+BAAA,EAAiC,EAAE,OAAA,EAAS,UAAU,CAAA;AAAA,IAC/E;AAAA,EACF;AAAA,EAEQ,aAAA,GAAwC;AAC9C,IAAA,OAAO;AAAA,MACL,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,CAAA;AAAA,MAC9C,cAAA,EAAgB;AAAA,KAClB;AAAA,EACF;AAAA,EAEA,MAAa,YAAY,OAAA,EAAiE;AAExF,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,SAAS,GAAG,CAAA;AAErD,IAAA,MAAM,IAAA,GAA+B;AAAA,MACnC,yBAAA,EAA2B,MAAA;AAAA,MAC3B,IAAA,EAAM,SAAA;AAAA,MACN,qBAAqB,OAAA,CAAQ,OAAA;AAAA,MAC7B,cAAA,EAAgB,QAAQ,QAAA,CAAS,KAAA;AAAA,MACjC,qCAAA,EAAuC,OAAA,CAAQ,QAAA,CAAS,WAAA,EAAY;AAAA,MACpE,wCAAA,EAA0C,OAAO,aAAa,CAAA;AAAA,MAC9D,+CAAA,EAAiD,CAAA,OAAA,EAAU,OAAA,CAAQ,OAAO,CAAA,CAAA;AAAA,MAC1E,yBAAA,EAA2B,GAAA;AAAA,MAC3B,WAAA,EAAa,QAAQ,WAAA,IAAe,sEAAA;AAAA,MACpC,UAAA,EAAY;AAAA,KACd;AAEA,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,UAAU,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,kBAAA,CAAA,EAAsB;AAAA,MACpE,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,KAAK,aAAA,EAAc;AAAA,MAC5B;AAAA,KACD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,QAAA;AAAA,MACT,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,gBAAgB,GAAA,CAAI,EAAA;AAAA,MACpB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,QAAA,EAAU,OAAA,CAAQ,QAAA,CAAS,WAAA,EAAY;AAAA,MACvC,MAAA,EAAQ,SAAA;AAAA,MACR,aAAa,GAAA,CAAI,GAAA;AAAA,MACjB,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEA,MAAa,cACX,OAAA,EAC2C;AAC3C,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,KAAK,OAAO,CAAA,mBAAA,EAAsB,OAAA,CAAQ,OAAO,CAAA,CAAA,EAAI;AAAA,MAC3F,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS,KAAK,aAAA;AAAc,KAC7B,CAAA;AAED,IAAA,MAAM,YAAA,GAAe,QAAQ,cAAA,KAAmB,MAAA;AAChD,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,YAAA,GAAe,OAAA,CAAQ,eAAe,GAAA,GAAM,CAAA;AACnE,IAAA,MAAM,SAAA,GAAa,OAAA,CAAQ,cAAA,IAA6B,OAAA,CAAQ,EAAA;AAEhE,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,QAAA;AAAA,MACT,YAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA,EAAS,OAAA,CAAQ,mBAAA,IAAuB,OAAA,CAAQ,EAAA;AAAA,MAChD,MAAA;AAAA,MACA,QAAA,EAAA,CAAW,OAAA,CAAQ,QAAA,IAAY,KAAA,EAAO,WAAA,EAAY;AAAA,MAClD,aAAA,EAAe,MAAA;AAAA,MACf,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEA,MAAa,OAAO,OAAA,EAA6D;AAC/E,IAAA,MAAM,IAAA,GAA+B;AAAA,MACnC,gBAAgB,OAAA,CAAQ;AAAA,KAC1B;AACA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,IAAA,CAAK,SAAS,MAAA,CAAO,IAAA,CAAK,MAAM,OAAA,CAAQ,MAAA,GAAS,GAAG,CAAC,CAAA;AAAA,IACvD;AACA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,IAAA,CAAK,MAAA,GAAS,uBAAA;AAAA,IAChB;AAEA,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,UAAU,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,QAAA,CAAA,EAAY;AAAA,MAC1D,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,KAAK,aAAA,EAAc;AAAA,MAC5B;AAAA,KACD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,QAAA;AAAA,MACT,UAAU,GAAA,CAAI,EAAA;AAAA,MACd,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,MAAA,EAAQ,IAAI,MAAA,GAAS,GAAA;AAAA;AAAA,MACrB,MAAA,EAAQ,GAAA,CAAI,MAAA,KAAW,WAAA,GAAc,SAAA,GAAY,SAAA;AAAA,MACjD,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEA,MAAa,cACX,OAAA,EACoC;AACpC,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,aAAA,IAAiB,IAAA,CAAK,MAAA,CAAO,aAAA;AACpD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,EAAE,SAAS,KAAA,EAAO,eAAA,EAAiB,WAAW,OAAA,EAAS,QAAA,EAAU,OAAO,yCAAA,EAA0C;AAAA,IAC3H;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,SAAS,kBAAkB,CAAA;AACpE,IAAA,IAAI,CAAC,SAAA,IAAa,OAAO,SAAA,KAAc,QAAA,EAAU;AAC/C,MAAA,OAAO,EAAE,SAAS,KAAA,EAAO,eAAA,EAAiB,WAAW,OAAA,EAAS,QAAA,EAAU,OAAO,kCAAA,EAAmC;AAAA,IACpH;AAEA,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA;AACjC,IAAA,IAAI,SAAA,GAAY,EAAA;AAChB,IAAA,MAAM,aAAuB,EAAC;AAE9B,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,MAAA,MAAM,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACjC,MAAA,IAAI,GAAA,KAAQ,KAAK,SAAA,GAAY,GAAA;AAC7B,MAAA,IAAI,GAAA,KAAQ,IAAA,EAAM,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAAA,IACvC,CAAC,CAAA;AAED,IAAA,MAAM,SAAA,GACJ,OAAO,OAAA,CAAQ,OAAA,KAAY,QAAA,GACvB,QAAQ,OAAA,GACR,OAAA,CAAQ,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA;AAErC,IAAA,MAAM,aAAA,GAAgB,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAC/C,IAAA,MAAM,iBAAA,GAAoB,UAAA,CAAW,aAAA,EAAe,MAAM,CAAA;AAC1D,IAAA,MAAM,OAAA,GAAU,WAAW,IAAA,CAAK,CAAC,QAAQ,WAAA,CAAY,iBAAA,EAAmB,GAAG,CAAC,CAAA;AAE5E,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAA,CAAK,MAAM,SAAS,CAAA;AAAA,IAC/B,CAAA,CAAA,MAAQ;AACN,MAAA,MAAA,GAAS,IAAA;AAAA,IACX;AAEA,IAAA,MAAM,QAAA,GAAW,QAAQ,IAAA,IAAQ,EAAA;AACjC,IAAA,IAAI,eAAA,GAA0C,SAAA;AAE9C,IAAA,IAAI,QAAA,KAAa,4BAAA,IAAgC,QAAA,KAAa,0BAAA,EAA4B;AACxF,MAAA,eAAA,GAAkB,iBAAA;AAAA,IACpB,CAAA,MAAA,IAAW,aAAa,+BAAA,EAAiC;AACvD,MAAA,eAAA,GAAkB,gBAAA;AAAA,IACpB,CAAA,MAAA,IAAW,aAAa,iBAAA,EAAmB;AACzC,MAAA,eAAA,GAAkB,kBAAA;AAAA,IACpB,CAAA,MAAA,IAAW,QAAA,EAAU,QAAA,CAAS,SAAS,CAAA,EAAG;AACxC,MAAA,eAAA,GAAkB,iBAAA;AAAA,IACpB;AAEA,IAAA,MAAM,GAAA,GAAM,QAAQ,IAAA,EAAM,MAAA;AAC1B,IAAA,MAAM,UAAU,GAAA,EAAK,mBAAA,IAAuB,GAAA,EAAK,QAAA,EAAU,YAAY,GAAA,EAAK,EAAA;AAC5E,IAAA,MAAM,SAAA,GAAY,GAAA,EAAK,cAAA,IAAkB,GAAA,EAAK,EAAA;AAC9C,IAAA,MAAM,MAAA,GAAS,GAAA,EAAK,YAAA,GAAe,GAAA,CAAI,YAAA,GAAe,MAAO,GAAA,EAAK,MAAA,GAAS,GAAA,CAAI,MAAA,GAAS,GAAA,GAAM,MAAA;AAC9F,IAAA,MAAM,WAAW,GAAA,EAAK,QAAA,GAAW,GAAA,CAAI,QAAA,CAAS,aAAY,GAAI,MAAA;AAE9D,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,eAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA,EAAS,QAAA;AAAA,MACT,OAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AACF;;;AChLO,IAAM,UAAA,GAAN,cAAyB,kBAAA,CAAmB;AAAA,EAGjD,WAAA,CAA6B,MAAA,GAAoB,EAAC,EAAG;AACnD,IAAA,KAAA,EAAM;AADqB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAF7B,IAAA,IAAA,CAAgB,IAAA,GAAoB,KAAA;AAAA,EAIpC;AAAA,EAEA,MAAa,YAAY,OAAA,EAAiE;AACxF,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,aAAA,IAAiB,CAAA;AACzC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,aAAA,IAAiB,GAAA;AAEzC,IAAA,IAAI,OAAA,CAAQ,SAAS,GAAA,EAAK;AACxB,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,aAAA,EAAgB,QAAQ,MAAM,CAAA,mCAAA,EAAsC,GAAG,CAAA,CAAA,EAAI;AAAA,QAChG,OAAA,EAAS,KAAA;AAAA,QACT,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,GAAA,EAAK;AACxB,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,aAAA,EAAgB,QAAQ,MAAM,CAAA,8BAAA,EAAiC,GAAG,CAAA,CAAA,EAAI;AAAA,QAC3F,OAAA,EAAS,KAAA;AAAA,QACT,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,QAAA,IAAY,CAAA;AACvC,IAAA,MAAM,WAAA,GAAc,QAAQ,MAAA,GAAS,MAAA;AAErC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,cAAA,EAAgB,CAAA,IAAA,EAAO,OAAA,CAAQ,OAAO,CAAA,CAAA;AAAA,MACtC,MAAA,EAAQ,WAAA;AAAA,MACR,QAAA,EAAU,OAAA,CAAQ,QAAA,CAAS,WAAA,EAAY;AAAA,MACvC,MAAA,EAAQ,SAAA;AAAA,MACR,WAAA,EAAa;AAAA,QACX,WAAA,EAAa,kBAAA;AAAA,QACb,YAAY,OAAA,CAAQ,MAAA;AAAA,QACpB,MAAA;AAAA,QACA,YAAA,EAAc;AAAA;AAChB,KACF;AAAA,EACF;AAAA,EAEA,MAAa,cACX,OAAA,EAC2C;AAC3C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,YAAA,EAAc,IAAA;AAAA,MACd,SAAA,EAAW,CAAA,cAAA,EAAiB,OAAA,CAAQ,OAAO,CAAA,CAAA;AAAA,MAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,MAAA,EAAQ,CAAA;AAAA,MACR,QAAA,EAAU,KAAA;AAAA,MACV,aAAA,EAAe,kBAAA;AAAA,MACf,WAAA,EAAa,EAAE,MAAA,EAAQ,WAAA;AAAY,KACrC;AAAA,EACF;AAAA,EAEA,MAAa,OAAO,OAAA,EAA6D;AAC/E,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,QAAA,EAAU,CAAA,OAAA,EAAU,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,MAC9B,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,MAAA,EAAQ,QAAQ,MAAA,IAAU,CAAA;AAAA,MAC1B,MAAA,EAAQ,SAAA;AAAA,MACR,WAAA,EAAa,EAAE,IAAA,EAAM,yCAAA;AAA0C,KACjE;AAAA,EACF;AAAA,EAEA,MAAa,cACX,QAAA,EACoC;AACpC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,eAAA,EAAiB,iBAAA;AAAA,MACjB,QAAA,EAAU,WAAA;AAAA,MACV,OAAA,EAAS,KAAA;AAAA,MACT,MAAM;AAAC,KACT;AAAA,EACF;AACF;;;AC3EO,IAAM,iBAAN,MAAqB;AAAA,EAK1B,YAAY,OAAA,EAAgC;AAJ5C,IAAA,IAAA,CAAiB,QAAA,uBAAqD,GAAA,EAAI;AAKxE,IAAA,IAAA,CAAK,iBAAiB,OAAA,CAAQ,cAAA;AAC9B,IAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,YAAA;AAG5B,IAAA,MAAM,EAAE,UAAS,GAAI,OAAA;AACrB,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,IAAA,CAAK,SAAS,GAAA,CAAI,UAAA,EAAY,IAAI,eAAA,CAAgB,QAAA,CAAS,QAAQ,CAAC,CAAA;AAAA,IACtE;AACA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,IAAA,CAAK,SAAS,GAAA,CAAI,UAAA,EAAY,IAAI,eAAA,CAAgB,QAAA,CAAS,QAAQ,CAAC,CAAA;AAAA,IACtE;AACA,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,IAAA,CAAK,SAAS,GAAA,CAAI,SAAA,EAAW,IAAI,cAAA,CAAe,QAAA,CAAS,OAAO,CAAC,CAAA;AAAA,IACnE;AACA,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,IAAA,CAAK,SAAS,GAAA,CAAI,OAAA,EAAS,IAAI,YAAA,CAAa,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,IAC7D;AACA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,IAAA,CAAK,SAAS,GAAA,CAAI,QAAA,EAAU,IAAI,aAAA,CAAc,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,IAChE;AACA,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,IAAA,CAAK,SAAS,GAAA,CAAI,KAAA,EAAO,IAAI,UAAA,CAAW,QAAA,CAAS,GAAG,CAAC,CAAA;AAAA,IACvD;AAEA,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,IAAA,KAAS,CAAA,EAAG;AAC5B,MAAA,OAAA,CAAQ,KAAK,sFAA4E,CAAA;AAAA,IAC3F;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,WAAW,OAAA,EAA0C;AAC1D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AACzC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,0BAA0B,OAAO,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,sBAAA,GAAwC;AAC7C,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKO,eAAe,OAAA,EAAoE;AACxF,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,OAAO,OAAA,CAAQ,OAAA;AAAA,IACjB;AAEA,IAAA,IAAI,OAAA,CAAQ,QAAA,IAAY,IAAA,CAAK,YAAA,EAAc,WAAA,EAAa;AACtD,MAAA,MAAM,SAAS,IAAA,CAAK,YAAA,CAAa,YAAY,OAAA,CAAQ,QAAA,CAAS,aAAa,CAAA;AAC3E,MAAA,IAAI,MAAA,IAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG;AACvC,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,cAAA,IAAkB,IAAA,CAAK,SAAS,GAAA,CAAI,IAAA,CAAK,cAAc,CAAA,EAAG;AACjE,MAAA,OAAO,IAAA,CAAK,cAAA;AAAA,IACd;AAEA,IAAA,MAAM,iBAAiB,IAAA,CAAK,QAAA,CAAS,IAAA,EAAK,CAAE,MAAK,CAAE,KAAA;AACnD,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,OAAO,cAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAI,aAAa,kDAAkD,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,YAAY,OAAA,EAAiE;AACxF,IAAA,MAAM,aAAA,GAAgB,KAAK,cAAA,CAAe;AAAA,MACxC,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,UAAU,OAAA,CAAQ;AAAA,KACnB,CAAA;AACD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,aAAa,CAAA;AAC7C,IAAA,OAAO,OAAA,CAAQ,YAAY,OAAO,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,wBACX,OAAA,EAC6B;AAC7B,IAAA,MAAM,QACJ,OAAA,CAAQ,aAAA,IACR,KAAK,YAAA,EAAc,aAAA,IAClB,KAAK,sBAAA,EAAuB;AAE/B,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,aAAa,0DAA0D,CAAA;AAAA,IACnF;AAEA,IAAA,IAAI,SAAA;AACJ,IAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,MAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG;AAC5B,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,EAAE,CAAA;AAClC,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,WAAA,CAAY,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,EAAA,EAAI,CAAA;AACpE,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,GAAA,EAAU;AACjB,QAAA,SAAA,GAAY,GAAA;AACZ,QAAA,OAAA,CAAQ,KAAK,CAAA,mCAAA,EAAsC,EAAE,CAAA,UAAA,EAAa,GAAA,CAAI,OAAO,CAAA,kCAAA,CAAoC,CAAA;AAAA,MACnH;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,YAAA;AAAA,MACR,CAAA,gCAAA,EAAmC,MAAM,IAAA,CAAK,IAAI,CAAC,CAAA,sBAAA,EAAyB,SAAA,EAAW,WAAW,SAAS,CAAA,CAAA;AAAA,MAC3G,EAAE,UAAU,SAAA;AAAU,KACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,cACX,OAAA,EAC2C;AAC3C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,OAAO,CAAA;AAC/C,IAAA,OAAO,OAAA,CAAQ,cAAc,OAAO,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,OAAO,OAAA,EAA6D;AAC/E,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,OAAO,CAAA;AAC/C,IAAA,OAAO,OAAA,CAAQ,OAAO,OAAO,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,cACX,OAAA,EACoC;AACpC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,OAAO,CAAA;AAC/C,IAAA,OAAO,OAAA,CAAQ,cAAc,OAAO,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAa,mBAAA,CACX,OAAA,EACA,OAAA,EACoC;AACpC,IAAA,IAAI;AACF,MAAA,IAAI,OAAA,GAAU,EAAA;AACd,MAAA,IAAI,OAAO,OAAA,CAAQ,IAAA,KAAS,UAAA,EAAY;AACtC,QAAA,OAAA,GAAU,MAAM,QAAQ,IAAA,EAAK;AAAA,MAC/B,CAAA,MAAA,IAAW,OAAO,OAAA,CAAQ,IAAA,KAAS,QAAA,EAAU;AAC3C,QAAA,OAAA,GAAU,OAAA,CAAQ,IAAA;AAAA,MACpB,CAAA,MAAA,IAAW,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA,EAAG;AACxC,QAAA,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AAAA,MACxC;AAEA,MAAA,MAAM,UAAkC,EAAC;AACzC,MAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,QAAA,IAAI,OAAO,OAAA,CAAQ,OAAA,CAAQ,OAAA,KAAY,UAAA,EAAY;AACjD,UAAA,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,CAAC,GAAA,EAAa,GAAA,KAAgB;AACpD,YAAA,OAAA,CAAQ,GAAA,CAAI,WAAA,EAAa,CAAA,GAAI,GAAA;AAAA,UAC/B,CAAC,CAAA;AAAA,QACH,CAAA,MAAA,IAAW,OAAO,OAAA,CAAQ,OAAA,CAAQ,YAAY,UAAA,EAAY;AACxD,UAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,KAAK,OAAA,CAAQ,OAAA,CAAQ,SAAQ,EAAG;AAClD,YAAA,OAAA,CAAQ,GAAA,CAAI,WAAA,EAAa,CAAA,GAAI,GAAA;AAAA,UAC/B;AAAA,QACF,CAAA,MAAA,IAAW,OAAO,OAAA,CAAQ,OAAA,KAAY,QAAA,EAAU;AAC9C,UAAA,MAAA,CAAO,OAAA,CAAQ,QAAQ,OAAO,CAAA,CAAE,QAAQ,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM;AAClD,YAAA,OAAA,CAAQ,CAAA,CAAE,WAAA,EAAa,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAK,CAAA;AAAA,UACxD,CAAC,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,OAAO,KAAK,aAAA,CAAc;AAAA,QACxB,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,OAAA;AAAA,QACA,OAAA;AAAA,QACA,eAAe,OAAA,CAAQ;AAAA,OACxB,CAAA;AAAA,IACH,SAAS,GAAA,EAAU;AACjB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,eAAA,EAAiB,SAAA;AAAA,QACjB,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,KAAA,EAAO,CAAA,mCAAA,EAAsC,GAAA,CAAI,OAAO,CAAA;AAAA,OAC1D;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,qBAAqB,OAAA,EAAgD;AACnF,EAAA,OAAO,IAAI,eAAe,OAAO,CAAA;AACnC","file":"index.mjs","sourcesContent":["import {\n GatewayName,\n UnifiedCreateOrderOptions,\n UnifiedOrderResult,\n UnifiedPaymentVerificationOptions,\n UnifiedPaymentVerificationResult,\n UnifiedRefundOptions,\n UnifiedRefundResult,\n WebhookVerificationOptions,\n WebhookVerificationResult,\n} from '../types';\n\nexport abstract class BasePaymentAdapter {\n public abstract readonly name: GatewayName;\n\n /**\n * Create an order or payment session on the gateway.\n */\n public abstract createOrder(options: UnifiedCreateOrderOptions): Promise<UnifiedOrderResult>;\n\n /**\n * Verify checkout completion signature or status query.\n */\n public abstract verifyPayment(\n options: UnifiedPaymentVerificationOptions\n ): Promise<UnifiedPaymentVerificationResult>;\n\n /**\n * Initiate a refund back to the customer.\n */\n public abstract refund(options: UnifiedRefundOptions): Promise<UnifiedRefundResult>;\n\n /**\n * Verify server-to-server webhook authenticity and parse payload.\n */\n public abstract verifyWebhook(\n options: WebhookVerificationOptions\n ): Promise<WebhookVerificationResult>;\n\n /**\n * Safe helper to extract single string header value from request headers.\n */\n protected getHeader(\n headers: Record<string, string | string[] | undefined>,\n name: string\n ): string | undefined {\n const direct = headers[name] ?? headers[name.toLowerCase()] ?? headers[name.toUpperCase()];\n if (Array.isArray(direct)) return direct[0];\n return direct;\n }\n\n /**\n * Helper to perform HTTP JSON requests with standard error extraction.\n */\n protected async fetchJson<T = any>(\n url: string,\n options: {\n method?: 'GET' | 'POST' | 'PATCH' | 'DELETE';\n headers?: Record<string, string>;\n body?: any;\n } = {}\n ): Promise<T> {\n const { method = 'GET', headers = {}, body } = options;\n const requestHeaders: Record<string, string> = {\n Accept: 'application/json',\n ...headers,\n };\n\n let serializedBody: string | undefined;\n if (body !== undefined) {\n if (typeof body === 'string') {\n serializedBody = body;\n } else if (headers['Content-Type'] === 'application/x-www-form-urlencoded') {\n serializedBody = new URLSearchParams(body).toString();\n } else {\n requestHeaders['Content-Type'] = 'application/json';\n serializedBody = JSON.stringify(body);\n }\n }\n\n const res = await fetch(url, {\n method,\n headers: requestHeaders,\n body: serializedBody,\n });\n\n const text = await res.text();\n let data: any;\n try {\n data = JSON.parse(text);\n } catch {\n data = text;\n }\n\n if (!res.ok) {\n const errMsg =\n data?.message ||\n data?.error?.description ||\n data?.error?.message ||\n data?.description ||\n (typeof data === 'string' ? data : `HTTP ${res.status} ${res.statusText}`);\n throw new Error(`[${this.name.toUpperCase()} API Error] ${errMsg}`);\n }\n\n return data as T;\n }\n}\n","import crypto from 'crypto';\n\n/**\n * Computes HMAC-SHA256 hex digest.\n */\nexport function hmacSha256(data: string | Buffer, secret: string): string {\n return crypto.createHmac('sha256', secret).update(data).digest('hex');\n}\n\n/**\n * Computes standard SHA-256 hex digest.\n */\nexport function sha256(data: string | Buffer): string {\n return crypto.createHash('sha256').update(data).digest('hex');\n}\n\n/**\n * Encodes string into Base64.\n */\nexport function base64Encode(data: string | object): string {\n const str = typeof data === 'string' ? data : JSON.stringify(data);\n return Buffer.from(str, 'utf8').toString('base64');\n}\n\n/**\n * Decodes Base64 into utf-8 string.\n */\nexport function base64Decode(encoded: string): string {\n return Buffer.from(encoded, 'base64').toString('utf8');\n}\n\n/**\n * Constant-time safe string comparison to prevent timing attacks on signatures.\n */\nexport function safeCompare(a: string, b: string): boolean {\n try {\n const bufA = Buffer.from(a, 'utf8');\n const bufB = Buffer.from(b, 'utf8');\n if (bufA.length !== bufB.length) return false;\n return crypto.timingSafeEqual(bufA, bufB);\n } catch {\n return false;\n }\n}\n","import { GatewayName } from '../types';\n\nexport class PaymentError extends Error {\n public readonly gateway?: GatewayName;\n public readonly statusCode?: number;\n public readonly rawError?: any;\n\n constructor(message: string, options?: { gateway?: GatewayName; statusCode?: number; rawError?: any }) {\n super(message);\n this.name = 'PaymentError';\n this.gateway = options?.gateway;\n this.statusCode = options?.statusCode;\n this.rawError = options?.rawError;\n Object.setPrototypeOf(this, PaymentError.prototype);\n }\n}\n\nexport class GatewayNotConfiguredError extends PaymentError {\n constructor(gateway: GatewayName) {\n super(`Payment gateway '${gateway}' is not configured in PaymentManager.`, { gateway, statusCode: 400 });\n this.name = 'GatewayNotConfiguredError';\n Object.setPrototypeOf(this, GatewayNotConfiguredError.prototype);\n }\n}\n\nexport class SignatureVerificationError extends PaymentError {\n constructor(gateway: GatewayName, details?: string) {\n super(`Invalid webhook/payment signature for gateway '${gateway}'. ${details || ''}`.trim(), {\n gateway,\n statusCode: 401,\n });\n this.name = 'SignatureVerificationError';\n Object.setPrototypeOf(this, SignatureVerificationError.prototype);\n }\n}\n","import { BasePaymentAdapter } from './base.adapter';\nimport {\n GatewayName,\n NormalizedWebhookEvent,\n RazorpayConfig,\n UnifiedCreateOrderOptions,\n UnifiedOrderResult,\n UnifiedPaymentVerificationOptions,\n UnifiedPaymentVerificationResult,\n UnifiedRefundOptions,\n UnifiedRefundResult,\n WebhookVerificationOptions,\n WebhookVerificationResult,\n} from '../types';\nimport { hmacSha256, safeCompare } from '../utils/crypto';\nimport { PaymentError } from '../utils/errors';\n\nexport class RazorpayAdapter extends BasePaymentAdapter {\n public readonly name: GatewayName = 'razorpay';\n private readonly baseUrl = 'https://api.razorpay.com/v1';\n\n constructor(private readonly config: RazorpayConfig) {\n super();\n if (!config.keyId || !config.keySecret) {\n throw new PaymentError('Razorpay keyId and keySecret are required.', { gateway: 'razorpay' });\n }\n }\n\n private getAuthHeader(): string {\n const creds = `${this.config.keyId}:${this.config.keySecret}`;\n return `Basic ${Buffer.from(creds).toString('base64')}`;\n }\n\n public async createOrder(options: UnifiedCreateOrderOptions): Promise<UnifiedOrderResult> {\n // Normalization: Razorpay expects amount in smallest currency unit (paise)\n const amountInSubunits = Math.round(options.amount * 100);\n\n const payload = {\n amount: amountInSubunits,\n currency: options.currency.toUpperCase(),\n receipt: options.receipt,\n notes: {\n customer_name: options.customer.name,\n customer_email: options.customer.email,\n customer_phone: options.customer.phone,\n ...options.notes,\n },\n };\n\n const res = await this.fetchJson(`${this.baseUrl}/orders`, {\n method: 'POST',\n headers: {\n Authorization: this.getAuthHeader(),\n },\n body: payload,\n });\n\n return {\n gateway: 'razorpay',\n orderId: options.receipt,\n gatewayOrderId: res.id,\n amount: options.amount,\n currency: options.currency.toUpperCase(),\n status: 'CREATED',\n rawResponse: res,\n };\n }\n\n public async verifyPayment(\n options: UnifiedPaymentVerificationOptions\n ): Promise<UnifiedPaymentVerificationResult> {\n if (!options.paymentId) {\n throw new PaymentError('Razorpay payment verification requires paymentId.', { gateway: 'razorpay' });\n }\n\n let isSignatureValid = false;\n if (options.signature) {\n const expectedSignature = hmacSha256(\n `${options.orderId}|${options.paymentId}`,\n this.config.keySecret\n );\n isSignatureValid = safeCompare(expectedSignature, options.signature);\n }\n\n const payment = await this.fetchJson(`${this.baseUrl}/payments/${options.paymentId}`, {\n method: 'GET',\n headers: {\n Authorization: this.getAuthHeader(),\n },\n });\n\n const isCaptured = payment.status === 'captured' || payment.status === 'authorized';\n\n return {\n gateway: 'razorpay',\n isSuccessful: (options.signature ? isSignatureValid : true) && isCaptured,\n paymentId: payment.id,\n orderId: options.orderId,\n amount: payment.amount / 100, // Normalized back to standard currency units\n currency: payment.currency,\n paymentMethod: payment.method,\n rawResponse: payment,\n };\n }\n\n public async refund(options: UnifiedRefundOptions): Promise<UnifiedRefundResult> {\n const payload: Record<string, any> = {\n notes: { reason: options.reason || 'Merchant requested refund' },\n };\n if (options.amount) {\n payload.amount = Math.round(options.amount * 100);\n }\n\n const res = await this.fetchJson(`${this.baseUrl}/payments/${options.paymentId}/refund`, {\n method: 'POST',\n headers: {\n Authorization: this.getAuthHeader(),\n },\n body: payload,\n });\n\n return {\n gateway: 'razorpay',\n refundId: res.id,\n paymentId: options.paymentId,\n amount: res.amount / 100, // Normalized to standard currency units\n status: res.status === 'processed' ? 'SUCCESS' : 'PENDING',\n rawResponse: res,\n };\n }\n\n public async verifyWebhook(\n options: WebhookVerificationOptions\n ): Promise<WebhookVerificationResult> {\n const secret = options.webhookSecret || this.config.webhookSecret;\n if (!secret) {\n return {\n isValid: false,\n normalizedEvent: 'UNKNOWN',\n gateway: 'razorpay',\n error: 'Razorpay webhookSecret is not configured.',\n };\n }\n\n const signature = this.getHeader(options.headers, 'x-razorpay-signature');\n if (!signature) {\n return {\n isValid: false,\n normalizedEvent: 'UNKNOWN',\n gateway: 'razorpay',\n error: 'Missing x-razorpay-signature header.',\n };\n }\n\n const rawString =\n typeof options.rawBody === 'string'\n ? options.rawBody\n : options.rawBody.toString('utf8');\n\n const expectedSignature = hmacSha256(rawString, secret);\n const isValid = safeCompare(expectedSignature, signature);\n\n let parsed: any;\n try {\n parsed = JSON.parse(rawString);\n } catch {\n parsed = null;\n }\n\n const rawEvent = parsed?.event || '';\n let normalizedEvent: NormalizedWebhookEvent = 'UNKNOWN';\n\n if (rawEvent === 'order.paid' || rawEvent === 'payment.captured' || rawEvent === 'payment.authorized') {\n normalizedEvent = 'PAYMENT_SUCCESS';\n } else if (rawEvent === 'payment.failed') {\n normalizedEvent = 'PAYMENT_FAILED';\n } else if (rawEvent === 'refund.processed' || rawEvent === 'refund.created') {\n normalizedEvent = 'REFUND_PROCESSED';\n } else if (rawEvent === 'refund.failed') {\n normalizedEvent = 'REFUND_FAILED';\n } else if (rawEvent?.includes('dispute')) {\n normalizedEvent = 'DISPUTE_CREATED';\n }\n\n const paymentEntity = parsed?.payload?.payment?.entity;\n const orderEntity = parsed?.payload?.order?.entity;\n\n const orderId = orderEntity?.receipt || paymentEntity?.order_id || orderEntity?.id;\n const paymentId = paymentEntity?.id;\n const amount = paymentEntity?.amount ? paymentEntity.amount / 100 : (orderEntity?.amount ? orderEntity.amount / 100 : undefined);\n const currency = paymentEntity?.currency || orderEntity?.currency;\n\n return {\n isValid,\n normalizedEvent,\n rawEvent,\n gateway: 'razorpay',\n orderId,\n paymentId,\n amount,\n currency,\n data: parsed?.payload,\n };\n }\n}\n","import { BasePaymentAdapter } from './base.adapter';\nimport {\n CashfreeConfig,\n GatewayName,\n NormalizedWebhookEvent,\n UnifiedCreateOrderOptions,\n UnifiedOrderResult,\n UnifiedPaymentVerificationOptions,\n UnifiedPaymentVerificationResult,\n UnifiedRefundOptions,\n UnifiedRefundResult,\n WebhookVerificationOptions,\n WebhookVerificationResult,\n} from '../types';\nimport { hmacSha256, safeCompare } from '../utils/crypto';\nimport { PaymentError } from '../utils/errors';\n\nexport class CashfreeAdapter extends BasePaymentAdapter {\n public readonly name: GatewayName = 'cashfree';\n private readonly baseUrl: string;\n private readonly apiVersion: string;\n\n constructor(private readonly config: CashfreeConfig) {\n super();\n if (!config.appId || !config.secretKey) {\n throw new PaymentError('Cashfree appId and secretKey are required.', { gateway: 'cashfree' });\n }\n this.baseUrl =\n config.env === 'PRODUCTION'\n ? 'https://api.cashfree.com/pg'\n : 'https://sandbox.cashfree.com/pg';\n this.apiVersion = config.apiVersion || '2023-08-01';\n }\n\n private getHeaders(): Record<string, string> {\n return {\n 'x-client-id': this.config.appId,\n 'x-client-secret': this.config.secretKey,\n 'x-api-version': this.apiVersion,\n 'Content-Type': 'application/json',\n };\n }\n\n public async createOrder(options: UnifiedCreateOrderOptions): Promise<UnifiedOrderResult> {\n // Normalization: Cashfree expects amount in standard currency units (e.g. 1499.00)\n const payload = {\n order_id: options.receipt,\n order_amount: options.amount,\n order_currency: options.currency.toUpperCase(),\n customer_details: {\n customer_id: options.customer.id || `cust_${Date.now()}`,\n customer_name: options.customer.name,\n customer_email: options.customer.email,\n customer_phone: options.customer.phone,\n },\n order_meta: {\n return_url: options.redirectUrl,\n notify_url: options.callbackUrl,\n },\n order_note: options.notes ? JSON.stringify(options.notes) : 'Order via Boost Payments',\n };\n\n const res = await this.fetchJson(`${this.baseUrl}/orders`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: payload,\n });\n\n return {\n gateway: 'cashfree',\n orderId: options.receipt,\n gatewayOrderId: res.order_id,\n amount: options.amount,\n currency: options.currency.toUpperCase(),\n status: res.order_status === 'ACTIVE' ? 'CREATED' : 'PENDING',\n paymentSessionId: res.payment_session_id,\n rawResponse: res,\n };\n }\n\n public async verifyPayment(\n options: UnifiedPaymentVerificationOptions\n ): Promise<UnifiedPaymentVerificationResult> {\n const order = await this.fetchJson(`${this.baseUrl}/orders/${options.orderId}`, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n const isSuccessful = order.order_status === 'PAID';\n let paymentMethod = 'unknown';\n let paymentId = options.paymentId || order.order_id;\n\n if (isSuccessful) {\n try {\n const payments = await this.fetchJson(`${this.baseUrl}/orders/${options.orderId}/payments`, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n if (Array.isArray(payments) && payments.length > 0) {\n const latest = payments[0];\n paymentId = String(latest.cf_payment_id || paymentId);\n paymentMethod = latest.payment_group || (latest.payment_method ? Object.keys(latest.payment_method)[0] : 'online');\n }\n } catch {\n // Fallback to order details\n }\n }\n\n return {\n gateway: 'cashfree',\n isSuccessful,\n paymentId,\n orderId: order.order_id,\n amount: order.order_amount,\n currency: order.order_currency,\n paymentMethod,\n rawResponse: order,\n };\n }\n\n public async refund(options: UnifiedRefundOptions): Promise<UnifiedRefundResult> {\n if (!options.orderId) {\n throw new PaymentError('Cashfree refund requires orderId.', { gateway: 'cashfree' });\n }\n\n const payload = {\n refund_id: `rfnd_${Date.now()}`,\n refund_amount: options.amount,\n refund_note: options.reason || 'Merchant initiated refund',\n };\n\n const res = await this.fetchJson(`${this.baseUrl}/orders/${options.orderId}/refunds`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: payload,\n });\n\n return {\n gateway: 'cashfree',\n refundId: res.refund_id,\n paymentId: options.paymentId,\n amount: res.refund_amount,\n status: res.refund_status === 'SUCCESS' ? 'SUCCESS' : 'PENDING',\n rawResponse: res,\n };\n }\n\n public async verifyWebhook(\n options: WebhookVerificationOptions\n ): Promise<WebhookVerificationResult> {\n const signature = this.getHeader(options.headers, 'x-webhook-signature');\n const timestamp = this.getHeader(options.headers, 'x-webhook-timestamp');\n\n const rawString =\n typeof options.rawBody === 'string'\n ? options.rawBody\n : options.rawBody.toString('utf8');\n\n let isValid = false;\n if (signature && timestamp) {\n const signedData = `${timestamp}${rawString}`;\n const expectedSignature = Buffer.from(\n hmacSha256(signedData, this.config.secretKey),\n 'hex'\n ).toString('base64');\n isValid = safeCompare(expectedSignature, signature);\n } else if (signature) {\n const expectedSignature = Buffer.from(\n hmacSha256(rawString, this.config.secretKey),\n 'hex'\n ).toString('base64');\n isValid = safeCompare(expectedSignature, signature);\n }\n\n let parsed: any;\n try {\n parsed = JSON.parse(rawString);\n } catch {\n parsed = null;\n }\n\n const rawEvent = parsed?.type || '';\n let normalizedEvent: NormalizedWebhookEvent = 'UNKNOWN';\n\n if (rawEvent === 'PAYMENT_SUCCESS_WEBHOOK') {\n normalizedEvent = 'PAYMENT_SUCCESS';\n } else if (rawEvent === 'PAYMENT_FAILED_WEBHOOK' || rawEvent === 'USER_DROPPED_WEBHOOK') {\n normalizedEvent = 'PAYMENT_FAILED';\n } else if (rawEvent === 'REFUND_STATUS_WEBHOOK') {\n const refundStatus = parsed?.data?.refund?.refund_status;\n normalizedEvent = refundStatus === 'SUCCESS' ? 'REFUND_PROCESSED' : 'REFUND_FAILED';\n } else if (rawEvent?.includes('DISPUTE')) {\n normalizedEvent = 'DISPUTE_CREATED';\n }\n\n const orderData = parsed?.data?.order;\n const paymentData = parsed?.data?.payment;\n const refundData = parsed?.data?.refund;\n\n const orderId = orderData?.order_id || refundData?.order_id;\n const paymentId = paymentData ? String(paymentData.cf_payment_id) : (refundData ? String(refundData.cf_payment_id) : undefined);\n const amount = paymentData?.payment_amount ?? orderData?.order_amount ?? refundData?.refund_amount;\n const currency = paymentData?.payment_currency || orderData?.order_currency;\n\n return {\n isValid,\n normalizedEvent,\n rawEvent,\n gateway: 'cashfree',\n orderId,\n paymentId,\n amount,\n currency,\n data: parsed?.data,\n };\n }\n}\n","import { BasePaymentAdapter } from './base.adapter';\nimport {\n GatewayName,\n NormalizedWebhookEvent,\n PhonePeConfig,\n UnifiedCreateOrderOptions,\n UnifiedOrderResult,\n UnifiedPaymentVerificationOptions,\n UnifiedPaymentVerificationResult,\n UnifiedRefundOptions,\n UnifiedRefundResult,\n WebhookVerificationOptions,\n WebhookVerificationResult,\n} from '../types';\nimport { base64Decode, base64Encode, sha256 } from '../utils/crypto';\nimport { PaymentError } from '../utils/errors';\n\nexport class PhonePeAdapter extends BasePaymentAdapter {\n public readonly name: GatewayName = 'phonepe';\n private readonly baseUrl: string;\n private readonly saltIndex: string;\n\n constructor(private readonly config: PhonePeConfig) {\n super();\n if (!config.merchantId || !config.saltKey) {\n throw new PaymentError('PhonePe merchantId and saltKey are required.', { gateway: 'phonepe' });\n }\n this.baseUrl =\n config.env === 'PRODUCTION'\n ? 'https://api.phonepe.com/apis/hermes'\n : 'https://api-preprod.phonepe.com/apis/pg-sandbox';\n this.saltIndex = config.saltIndex || '1';\n }\n\n private calculateXVerify(base64Payload: string, endpoint: string): string {\n const stringToHash = `${base64Payload}${endpoint}${this.config.saltKey}`;\n const hash = sha256(stringToHash);\n return `${hash}###${this.saltIndex}`;\n }\n\n public async createOrder(options: UnifiedCreateOrderOptions): Promise<UnifiedOrderResult> {\n // Normalization: PhonePe /pg/v1/pay API expects amount in paise\n const amountInPaise = Math.round(options.amount * 100);\n\n const payload = {\n merchantId: this.config.merchantId,\n merchantTransactionId: options.receipt,\n merchantUserId: options.customer.id || `MUID_${Date.now()}`,\n amount: amountInPaise,\n redirectUrl: options.redirectUrl || 'https://yourstore.com/order-success',\n redirectMode: 'POST',\n callbackUrl: options.callbackUrl || 'https://api.yourstore.com/webhooks/phonepe',\n mobileNumber: options.customer.phone.replace(/[^0-9]/g, '').slice(-10),\n paymentInstrument: {\n type: 'PAY_PAGE',\n },\n };\n\n const base64Payload = base64Encode(payload);\n const endpoint = '/pg/v1/pay';\n const xVerify = this.calculateXVerify(base64Payload, endpoint);\n\n const res = await this.fetchJson(`${this.baseUrl}${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-VERIFY': xVerify,\n },\n body: {\n request: base64Payload,\n },\n });\n\n const redirectUrl = res?.data?.instrumentResponse?.redirectInfo?.url;\n\n return {\n gateway: 'phonepe',\n orderId: options.receipt,\n gatewayOrderId: options.receipt,\n amount: options.amount,\n currency: options.currency.toUpperCase(),\n status: res.success ? 'CREATED' : 'FAILED',\n redirectUrl,\n rawResponse: res,\n };\n }\n\n public async verifyPayment(\n options: UnifiedPaymentVerificationOptions\n ): Promise<UnifiedPaymentVerificationResult> {\n const endpoint = `/pg/v1/status/${this.config.merchantId}/${options.orderId}`;\n const stringToHash = `${endpoint}${this.config.saltKey}`;\n const xVerify = `${sha256(stringToHash)}###${this.saltIndex}`;\n\n const res = await this.fetchJson(`${this.baseUrl}${endpoint}`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'X-VERIFY': xVerify,\n 'X-MERCHANT-ID': this.config.merchantId,\n },\n });\n\n const isSuccessful = res.code === 'PAYMENT_SUCCESS';\n const amount = res.data?.amount ? res.data.amount / 100 : 0; // Normalized to standard currency units\n const paymentId = res.data?.transactionId || options.orderId;\n\n return {\n gateway: 'phonepe',\n isSuccessful,\n paymentId,\n orderId: options.orderId,\n amount,\n currency: 'INR',\n paymentMethod: res.data?.paymentInstrument?.type || 'UPI',\n rawResponse: res,\n };\n }\n\n public async refund(options: UnifiedRefundOptions): Promise<UnifiedRefundResult> {\n const refundTxnId = `RF_${Date.now()}`;\n const amountInPaise = options.amount ? Math.round(options.amount * 100) : 0;\n\n const payload = {\n merchantId: this.config.merchantId,\n merchantTransactionId: refundTxnId,\n originalTransactionId: options.orderId || options.paymentId,\n amount: amountInPaise,\n callbackUrl: 'https://api.yourstore.com/webhooks/phonepe',\n };\n\n const base64Payload = base64Encode(payload);\n const endpoint = '/pg/v1/refund';\n const xVerify = this.calculateXVerify(base64Payload, endpoint);\n\n const res = await this.fetchJson(`${this.baseUrl}${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-VERIFY': xVerify,\n },\n body: {\n request: base64Payload,\n },\n });\n\n return {\n gateway: 'phonepe',\n refundId: refundTxnId,\n paymentId: options.paymentId,\n amount: options.amount || 0,\n status: res.success ? 'SUCCESS' : 'FAILED',\n rawResponse: res,\n };\n }\n\n public async verifyWebhook(\n options: WebhookVerificationOptions\n ): Promise<WebhookVerificationResult> {\n const rawString =\n typeof options.rawBody === 'string'\n ? options.rawBody\n : options.rawBody.toString('utf8');\n\n let parsed: any;\n try {\n parsed = JSON.parse(rawString);\n } catch {\n return { isValid: false, normalizedEvent: 'UNKNOWN', gateway: 'phonepe', error: 'Invalid JSON payload' };\n }\n\n if (!parsed.response) {\n return { isValid: false, normalizedEvent: 'UNKNOWN', gateway: 'phonepe', error: 'Missing response field in PhonePe callback' };\n }\n\n let decoded: any = {};\n try {\n decoded = JSON.parse(base64Decode(parsed.response));\n } catch {\n return { isValid: false, normalizedEvent: 'UNKNOWN', gateway: 'phonepe', error: 'Failed to decode base64 PhonePe response' };\n }\n\n const rawEvent = decoded.code || '';\n let normalizedEvent: NormalizedWebhookEvent = 'UNKNOWN';\n\n if (rawEvent === 'PAYMENT_SUCCESS') {\n normalizedEvent = 'PAYMENT_SUCCESS';\n } else if (rawEvent === 'PAYMENT_ERROR' || rawEvent === 'PAYMENT_DECLINED') {\n normalizedEvent = 'PAYMENT_FAILED';\n }\n\n const orderId = decoded.data?.merchantTransactionId;\n const paymentId = decoded.data?.transactionId;\n const amount = decoded.data?.amount ? decoded.data.amount / 100 : undefined;\n\n return {\n isValid: true,\n normalizedEvent,\n rawEvent,\n gateway: 'phonepe',\n orderId,\n paymentId,\n amount,\n currency: 'INR',\n data: decoded.data,\n };\n }\n}\n","import { BasePaymentAdapter } from './base.adapter';\nimport {\n GatewayName,\n NormalizedWebhookEvent,\n PaytmConfig,\n UnifiedCreateOrderOptions,\n UnifiedOrderResult,\n UnifiedPaymentVerificationOptions,\n UnifiedPaymentVerificationResult,\n UnifiedRefundOptions,\n UnifiedRefundResult,\n WebhookVerificationOptions,\n WebhookVerificationResult,\n} from '../types';\nimport { PaymentError } from '../utils/errors';\n\nexport class PaytmAdapter extends BasePaymentAdapter {\n public readonly name: GatewayName = 'paytm';\n private readonly baseUrl: string;\n\n constructor(private readonly config: PaytmConfig) {\n super();\n if (!config.mid || !config.merchantKey) {\n throw new PaymentError('Paytm mid and merchantKey are required.', { gateway: 'paytm' });\n }\n this.baseUrl =\n config.env === 'PRODUCTION'\n ? 'https://securegw.paytm.in'\n : 'https://securegw-stage.paytm.in';\n }\n\n public async createOrder(options: UnifiedCreateOrderOptions): Promise<UnifiedOrderResult> {\n const payload = {\n body: {\n requestType: 'Payment',\n mid: this.config.mid,\n websiteName: this.config.website || 'DEFAULT',\n orderId: options.receipt,\n callbackUrl: options.callbackUrl || 'https://api.yourstore.com/webhooks/paytm',\n txnAmount: {\n value: options.amount.toFixed(2),\n currency: 'INR',\n },\n userInfo: {\n custId: options.customer.id || `CUST_${Date.now()}`,\n mobile: options.customer.phone.replace(/[^0-9]/g, '').slice(-10),\n email: options.customer.email,\n },\n },\n };\n\n const url = `${this.baseUrl}/theia/api/v1/initiateTransaction?mid=${this.config.mid}&orderId=${options.receipt}`;\n const res = await this.fetchJson(url, {\n method: 'POST',\n body: payload,\n });\n\n const txnToken = res?.body?.txnToken;\n\n return {\n gateway: 'paytm',\n orderId: options.receipt,\n gatewayOrderId: options.receipt,\n amount: options.amount,\n currency: 'INR',\n status: txnToken ? 'CREATED' : 'FAILED',\n txnToken,\n rawResponse: res,\n };\n }\n\n public async verifyPayment(\n options: UnifiedPaymentVerificationOptions\n ): Promise<UnifiedPaymentVerificationResult> {\n const url = `${this.baseUrl}/v3/order/status`;\n const payload = {\n body: {\n mid: this.config.mid,\n orderId: options.orderId,\n },\n };\n\n const res = await this.fetchJson(url, {\n method: 'POST',\n body: payload,\n });\n\n const body = res?.body || {};\n const isSuccessful = body.resultInfo?.resultStatus === 'TXN_SUCCESS';\n\n return {\n gateway: 'paytm',\n isSuccessful,\n paymentId: body.txnId || options.orderId,\n orderId: options.orderId,\n amount: parseFloat(body.txnAmount || '0'),\n currency: 'INR',\n paymentMethod: body.paymentMode || 'ONLINE',\n rawResponse: res,\n };\n }\n\n public async refund(options: UnifiedRefundOptions): Promise<UnifiedRefundResult> {\n const refundRefId = `RF_${Date.now()}`;\n const url = `${this.baseUrl}/refund/apply`;\n const payload = {\n body: {\n mid: this.config.mid,\n txnType: 'REFUND',\n orderId: options.orderId,\n txnId: options.paymentId,\n refId: refundRefId,\n refundAmount: (options.amount || 0).toFixed(2),\n },\n };\n\n const res = await this.fetchJson(url, {\n method: 'POST',\n body: payload,\n });\n\n const body = res?.body || {};\n const isSuccess = body.resultInfo?.resultStatus === 'TXN_SUCCESS' || body.resultInfo?.resultStatus === 'PENDING';\n\n return {\n gateway: 'paytm',\n refundId: body.refundId || refundRefId,\n paymentId: options.paymentId,\n amount: options.amount || 0,\n status: isSuccess ? 'SUCCESS' : 'FAILED',\n rawResponse: res,\n };\n }\n\n public async verifyWebhook(\n options: WebhookVerificationOptions\n ): Promise<WebhookVerificationResult> {\n const rawString =\n typeof options.rawBody === 'string'\n ? options.rawBody\n : options.rawBody.toString('utf8');\n\n let parsed: any;\n try {\n parsed = JSON.parse(rawString);\n } catch {\n const params = new URLSearchParams(rawString);\n parsed = Object.fromEntries(params.entries());\n }\n\n const rawStatus = parsed?.STATUS || parsed?.resultInfo?.resultStatus;\n const isSuccess = rawStatus === 'TXN_SUCCESS';\n const normalizedEvent: NormalizedWebhookEvent = isSuccess ? 'PAYMENT_SUCCESS' : 'PAYMENT_FAILED';\n\n const orderId = parsed?.ORDERID || parsed?.orderId;\n const paymentId = parsed?.TXNID || parsed?.txnId;\n const amount = parsed?.TXNAMOUNT ? parseFloat(parsed.TXNAMOUNT) : undefined;\n\n return {\n isValid: true,\n normalizedEvent,\n rawEvent: rawStatus,\n gateway: 'paytm',\n orderId,\n paymentId,\n amount,\n currency: 'INR',\n data: parsed,\n };\n }\n}\n","import { BasePaymentAdapter } from './base.adapter';\nimport {\n GatewayName,\n NormalizedWebhookEvent,\n StripeConfig,\n UnifiedCreateOrderOptions,\n UnifiedOrderResult,\n UnifiedPaymentVerificationOptions,\n UnifiedPaymentVerificationResult,\n UnifiedRefundOptions,\n UnifiedRefundResult,\n WebhookVerificationOptions,\n WebhookVerificationResult,\n} from '../types';\nimport { hmacSha256, safeCompare } from '../utils/crypto';\nimport { PaymentError } from '../utils/errors';\n\nexport class StripeAdapter extends BasePaymentAdapter {\n public readonly name: GatewayName = 'stripe';\n private readonly baseUrl = 'https://api.stripe.com/v1';\n\n constructor(private readonly config: StripeConfig) {\n super();\n if (!config.secretKey) {\n throw new PaymentError('Stripe secretKey is required.', { gateway: 'stripe' });\n }\n }\n\n private getAuthHeader(): Record<string, string> {\n return {\n Authorization: `Bearer ${this.config.secretKey}`,\n 'Content-Type': 'application/x-www-form-urlencoded',\n };\n }\n\n public async createOrder(options: UnifiedCreateOrderOptions): Promise<UnifiedOrderResult> {\n // Normalization: Stripe expects amount in smallest currency unit (cents)\n const amountInCents = Math.round(options.amount * 100);\n\n const body: Record<string, string> = {\n 'payment_method_types[0]': 'card',\n mode: 'payment',\n client_reference_id: options.receipt,\n customer_email: options.customer.email,\n 'line_items[0][price_data][currency]': options.currency.toLowerCase(),\n 'line_items[0][price_data][unit_amount]': String(amountInCents),\n 'line_items[0][price_data][product_data][name]': `Order #${options.receipt}`,\n 'line_items[0][quantity]': '1',\n success_url: options.redirectUrl || 'https://yourstore.com/order-success?session_id={CHECKOUT_SESSION_ID}',\n cancel_url: 'https://yourstore.com/cart',\n };\n\n const res = await this.fetchJson(`${this.baseUrl}/checkout/sessions`, {\n method: 'POST',\n headers: this.getAuthHeader(),\n body,\n });\n\n return {\n gateway: 'stripe',\n orderId: options.receipt,\n gatewayOrderId: res.id,\n amount: options.amount,\n currency: options.currency.toUpperCase(),\n status: 'CREATED',\n redirectUrl: res.url,\n rawResponse: res,\n };\n }\n\n public async verifyPayment(\n options: UnifiedPaymentVerificationOptions\n ): Promise<UnifiedPaymentVerificationResult> {\n const session = await this.fetchJson(`${this.baseUrl}/checkout/sessions/${options.orderId}`, {\n method: 'GET',\n headers: this.getAuthHeader(),\n });\n\n const isSuccessful = session.payment_status === 'paid';\n const amount = session.amount_total ? session.amount_total / 100 : 0; // Normalized back to standard currency units\n const paymentId = (session.payment_intent as string) || session.id;\n\n return {\n gateway: 'stripe',\n isSuccessful,\n paymentId,\n orderId: session.client_reference_id || session.id,\n amount,\n currency: (session.currency || 'USD').toUpperCase(),\n paymentMethod: 'card',\n rawResponse: session,\n };\n }\n\n public async refund(options: UnifiedRefundOptions): Promise<UnifiedRefundResult> {\n const body: Record<string, string> = {\n payment_intent: options.paymentId,\n };\n if (options.amount) {\n body.amount = String(Math.round(options.amount * 100));\n }\n if (options.reason) {\n body.reason = 'requested_by_customer';\n }\n\n const res = await this.fetchJson(`${this.baseUrl}/refunds`, {\n method: 'POST',\n headers: this.getAuthHeader(),\n body,\n });\n\n return {\n gateway: 'stripe',\n refundId: res.id,\n paymentId: options.paymentId,\n amount: res.amount / 100, // Normalized to standard currency units\n status: res.status === 'succeeded' ? 'SUCCESS' : 'PENDING',\n rawResponse: res,\n };\n }\n\n public async verifyWebhook(\n options: WebhookVerificationOptions\n ): Promise<WebhookVerificationResult> {\n const secret = options.webhookSecret || this.config.webhookSecret;\n if (!secret) {\n return { isValid: false, normalizedEvent: 'UNKNOWN', gateway: 'stripe', error: 'Stripe webhookSecret is not configured.' };\n }\n\n const sigHeader = this.getHeader(options.headers, 'stripe-signature');\n if (!sigHeader || typeof sigHeader !== 'string') {\n return { isValid: false, normalizedEvent: 'UNKNOWN', gateway: 'stripe', error: 'Missing stripe-signature header.' };\n }\n\n const parts = sigHeader.split(',');\n let timestamp = '';\n const signatures: string[] = [];\n\n parts.forEach((part) => {\n const [key, val] = part.split('=');\n if (key === 't') timestamp = val;\n if (key === 'v1') signatures.push(val);\n });\n\n const rawString =\n typeof options.rawBody === 'string'\n ? options.rawBody\n : options.rawBody.toString('utf8');\n\n const signedPayload = `${timestamp}.${rawString}`;\n const expectedSignature = hmacSha256(signedPayload, secret);\n const isValid = signatures.some((sig) => safeCompare(expectedSignature, sig));\n\n let parsed: any;\n try {\n parsed = JSON.parse(rawString);\n } catch {\n parsed = null;\n }\n\n const rawEvent = parsed?.type || '';\n let normalizedEvent: NormalizedWebhookEvent = 'UNKNOWN';\n\n if (rawEvent === 'checkout.session.completed' || rawEvent === 'payment_intent.succeeded') {\n normalizedEvent = 'PAYMENT_SUCCESS';\n } else if (rawEvent === 'payment_intent.payment_failed') {\n normalizedEvent = 'PAYMENT_FAILED';\n } else if (rawEvent === 'charge.refunded') {\n normalizedEvent = 'REFUND_PROCESSED';\n } else if (rawEvent?.includes('dispute')) {\n normalizedEvent = 'DISPUTE_CREATED';\n }\n\n const obj = parsed?.data?.object;\n const orderId = obj?.client_reference_id || obj?.metadata?.order_id || obj?.id;\n const paymentId = obj?.payment_intent || obj?.id;\n const amount = obj?.amount_total ? obj.amount_total / 100 : (obj?.amount ? obj.amount / 100 : undefined);\n const currency = obj?.currency ? obj.currency.toUpperCase() : undefined;\n\n return {\n isValid,\n normalizedEvent,\n rawEvent,\n gateway: 'stripe',\n orderId,\n paymentId,\n amount,\n currency,\n data: obj,\n };\n }\n}\n","import { BasePaymentAdapter } from './base.adapter';\nimport {\n CODConfig,\n GatewayName,\n UnifiedCreateOrderOptions,\n UnifiedOrderResult,\n UnifiedPaymentVerificationOptions,\n UnifiedPaymentVerificationResult,\n UnifiedRefundOptions,\n UnifiedRefundResult,\n WebhookVerificationOptions,\n WebhookVerificationResult,\n} from '../types';\nimport { PaymentError } from '../utils/errors';\n\nexport class CODAdapter extends BasePaymentAdapter {\n public readonly name: GatewayName = 'cod';\n\n constructor(private readonly config: CODConfig = {}) {\n super();\n }\n\n public async createOrder(options: UnifiedCreateOrderOptions): Promise<UnifiedOrderResult> {\n const min = this.config.minOrderValue ?? 0;\n const max = this.config.maxOrderValue ?? 10000;\n\n if (options.amount < min) {\n throw new PaymentError(`Order amount ${options.amount} is below minimum COD threshold of ${min}`, {\n gateway: 'cod',\n statusCode: 400,\n });\n }\n\n if (options.amount > max) {\n throw new PaymentError(`Order amount ${options.amount} exceeds maximum COD limit of ${max}`, {\n gateway: 'cod',\n statusCode: 400,\n });\n }\n\n const codFee = this.config.extraFee || 0;\n const totalAmount = options.amount + codFee;\n\n return {\n gateway: 'cod',\n orderId: options.receipt,\n gatewayOrderId: `COD_${options.receipt}`,\n amount: totalAmount,\n currency: options.currency.toUpperCase(),\n status: 'CREATED',\n rawResponse: {\n paymentMode: 'Cash On Delivery',\n baseAmount: options.amount,\n codFee,\n totalPayable: totalAmount,\n },\n };\n }\n\n public async verifyPayment(\n options: UnifiedPaymentVerificationOptions\n ): Promise<UnifiedPaymentVerificationResult> {\n return {\n gateway: 'cod',\n isSuccessful: true,\n paymentId: `COD_COLLECTED_${options.orderId}`,\n orderId: options.orderId,\n amount: 0,\n currency: 'INR',\n paymentMethod: 'cash_on_delivery',\n rawResponse: { status: 'COLLECTED' },\n };\n }\n\n public async refund(options: UnifiedRefundOptions): Promise<UnifiedRefundResult> {\n return {\n gateway: 'cod',\n refundId: `COD_RF_${Date.now()}`,\n paymentId: options.paymentId,\n amount: options.amount || 0,\n status: 'SUCCESS',\n rawResponse: { note: 'Manual cash/store-credit refund for COD' },\n };\n }\n\n public async verifyWebhook(\n _options: WebhookVerificationOptions\n ): Promise<WebhookVerificationResult> {\n return {\n isValid: true,\n normalizedEvent: 'PAYMENT_SUCCESS',\n rawEvent: 'COD_ORDER',\n gateway: 'cod',\n data: {},\n };\n }\n}\n","import {\n GatewayName,\n PaymentManagerOptions,\n UnifiedCreateOrderOptions,\n UnifiedOrderResult,\n UnifiedPaymentVerificationOptions,\n UnifiedPaymentVerificationResult,\n UnifiedRefundOptions,\n UnifiedRefundResult,\n WebhookVerificationOptions,\n WebhookVerificationResult,\n} from './types';\nimport { BasePaymentAdapter } from './adapters/base.adapter';\nimport { RazorpayAdapter } from './adapters/razorpay.adapter';\nimport { CashfreeAdapter } from './adapters/cashfree.adapter';\nimport { PhonePeAdapter } from './adapters/phonepe.adapter';\nimport { PaytmAdapter } from './adapters/paytm.adapter';\nimport { StripeAdapter } from './adapters/stripe.adapter';\nimport { CODAdapter } from './adapters/cod.adapter';\nimport { GatewayNotConfiguredError, PaymentError } from './utils/errors';\n\nexport class PaymentManager {\n private readonly adapters: Map<GatewayName, BasePaymentAdapter> = new Map();\n private readonly defaultGateway?: GatewayName;\n private readonly smartRouting?: PaymentManagerOptions['smartRouting'];\n\n constructor(options: PaymentManagerOptions) {\n this.defaultGateway = options.defaultGateway;\n this.smartRouting = options.smartRouting;\n\n // Initialize configured gateways\n const { gateways } = options;\n if (gateways.razorpay) {\n this.adapters.set('razorpay', new RazorpayAdapter(gateways.razorpay));\n }\n if (gateways.cashfree) {\n this.adapters.set('cashfree', new CashfreeAdapter(gateways.cashfree));\n }\n if (gateways.phonepe) {\n this.adapters.set('phonepe', new PhonePeAdapter(gateways.phonepe));\n }\n if (gateways.paytm) {\n this.adapters.set('paytm', new PaytmAdapter(gateways.paytm));\n }\n if (gateways.stripe) {\n this.adapters.set('stripe', new StripeAdapter(gateways.stripe));\n }\n if (gateways.cod) {\n this.adapters.set('cod', new CODAdapter(gateways.cod));\n }\n\n if (this.adapters.size === 0) {\n console.warn('⚠️ [PaymentManager] No payment gateways were configured in PaymentManager.');\n }\n }\n\n /**\n * Returns an active adapter instance by gateway name.\n */\n public getAdapter(gateway: GatewayName): BasePaymentAdapter {\n const adapter = this.adapters.get(gateway);\n if (!adapter) {\n throw new GatewayNotConfiguredError(gateway);\n }\n return adapter;\n }\n\n /**\n * Lists all currently registered gateway names.\n */\n public listConfiguredGateways(): GatewayName[] {\n return Array.from(this.adapters.keys());\n }\n\n /**\n * Resolves the optimal gateway based on currency rules, explicit override, or default.\n */\n public resolveGateway(options: { gateway?: GatewayName; currency?: string }): GatewayName {\n if (options.gateway) {\n return options.gateway;\n }\n\n if (options.currency && this.smartRouting?.currencyMap) {\n const mapped = this.smartRouting.currencyMap[options.currency.toUpperCase()];\n if (mapped && this.adapters.has(mapped)) {\n return mapped;\n }\n }\n\n if (this.defaultGateway && this.adapters.has(this.defaultGateway)) {\n return this.defaultGateway;\n }\n\n const firstAvailable = this.adapters.keys().next().value;\n if (firstAvailable) {\n return firstAvailable;\n }\n\n throw new PaymentError('No payment gateways configured to process order.');\n }\n\n /**\n * Create an order using the chosen or automatically resolved gateway.\n */\n public async createOrder(options: UnifiedCreateOrderOptions): Promise<UnifiedOrderResult> {\n const targetGateway = this.resolveGateway({\n gateway: options.gateway,\n currency: options.currency,\n });\n const adapter = this.getAdapter(targetGateway);\n return adapter.createOrder(options);\n }\n\n /**\n * Smart Fallback: Attempts creation on primary gateway. If it throws an error or fails,\n * it automatically routes through fallback gateways in sequence!\n */\n public async createOrderWithFallback(\n options: UnifiedCreateOrderOptions & { fallbackChain?: GatewayName[] }\n ): Promise<UnifiedOrderResult> {\n const chain =\n options.fallbackChain ||\n this.smartRouting?.fallbackChain ||\n (this.listConfiguredGateways());\n\n if (chain.length === 0) {\n throw new PaymentError('Fallback chain is empty. Configure at least one gateway.');\n }\n\n let lastError: any;\n for (const gw of chain) {\n if (!this.adapters.has(gw)) continue;\n try {\n const adapter = this.getAdapter(gw);\n const result = await adapter.createOrder({ ...options, gateway: gw });\n return result;\n } catch (err: any) {\n lastError = err;\n console.warn(`[PaymentManager Fallback] Gateway '${gw}' failed (${err.message}). Trying next gateway in chain...`);\n }\n }\n\n throw new PaymentError(\n `All gateways in fallback chain [${chain.join(', ')}] failed. Last error: ${lastError?.message || 'Unknown'}`,\n { rawError: lastError }\n );\n }\n\n /**\n * Verifies payment completion signature or status query.\n */\n public async verifyPayment(\n options: UnifiedPaymentVerificationOptions\n ): Promise<UnifiedPaymentVerificationResult> {\n const adapter = this.getAdapter(options.gateway);\n return adapter.verifyPayment(options);\n }\n\n /**\n * Initiates a customer refund.\n */\n public async refund(options: UnifiedRefundOptions): Promise<UnifiedRefundResult> {\n const adapter = this.getAdapter(options.gateway);\n return adapter.refund(options);\n }\n\n /**\n * Verifies incoming webhook authenticity and decodes payload.\n */\n public async verifyWebhook(\n options: WebhookVerificationOptions\n ): Promise<WebhookVerificationResult> {\n const adapter = this.getAdapter(options.gateway);\n return adapter.verifyWebhook(options);\n }\n\n /**\n * Ready-made Next.js 13/14/15 App Router Route Handler Webhook Authenticator.\n * Directly consumes the standard web Request object with raw stream body handling:\n *\n * ```typescript\n * export async function POST(req: Request) {\n * const result = await payments.verifyNextJsWebhook(req, { gateway: 'razorpay' });\n * if (!result.isValid) return new Response('Invalid Signature', { status: 400 });\n * console.log('Event:', result.normalizedEvent, result.orderId);\n * return new Response('OK');\n * }\n * ```\n */\n public async verifyNextJsWebhook(\n request: Request | any,\n options: { gateway: GatewayName; webhookSecret?: string }\n ): Promise<WebhookVerificationResult> {\n try {\n let rawBody = '';\n if (typeof request.text === 'function') {\n rawBody = await request.text();\n } else if (typeof request.body === 'string') {\n rawBody = request.body;\n } else if (Buffer.isBuffer(request.body)) {\n rawBody = request.body.toString('utf8');\n }\n\n const headers: Record<string, string> = {};\n if (request.headers) {\n if (typeof request.headers.forEach === 'function') {\n request.headers.forEach((val: string, key: string) => {\n headers[key.toLowerCase()] = val;\n });\n } else if (typeof request.headers.entries === 'function') {\n for (const [key, val] of request.headers.entries()) {\n headers[key.toLowerCase()] = val;\n }\n } else if (typeof request.headers === 'object') {\n Object.entries(request.headers).forEach(([k, v]) => {\n headers[k.toLowerCase()] = Array.isArray(v) ? v[0] : (v as string);\n });\n }\n }\n\n return this.verifyWebhook({\n gateway: options.gateway,\n rawBody,\n headers,\n webhookSecret: options.webhookSecret,\n });\n } catch (err: any) {\n return {\n isValid: false,\n normalizedEvent: 'UNKNOWN',\n gateway: options.gateway,\n error: `Failed to process Next.js webhook: ${err.message}`,\n };\n }\n }\n}\n\n/**\n * Factory function to instantiate a PaymentManager.\n */\nexport function createPaymentManager(options: PaymentManagerOptions): PaymentManager {\n return new PaymentManager(options);\n}\n"]}
|
package/dist/react.cjs
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var react = require('react');
|
|
5
|
+
|
|
6
|
+
function loadScript(src) {
|
|
7
|
+
return new Promise((resolve) => {
|
|
8
|
+
if (typeof window === "undefined") {
|
|
9
|
+
return resolve(false);
|
|
10
|
+
}
|
|
11
|
+
if (document.querySelector(`script[src="${src}"]`)) {
|
|
12
|
+
return resolve(true);
|
|
13
|
+
}
|
|
14
|
+
const script = document.createElement("script");
|
|
15
|
+
script.src = src;
|
|
16
|
+
script.async = true;
|
|
17
|
+
script.onload = () => resolve(true);
|
|
18
|
+
script.onerror = () => resolve(false);
|
|
19
|
+
document.body.appendChild(script);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
async function loadRazorpay() {
|
|
23
|
+
return loadScript("https://checkout.razorpay.com/v1/checkout.js");
|
|
24
|
+
}
|
|
25
|
+
async function loadCashfree() {
|
|
26
|
+
return loadScript("https://sdk.cashfree.com/js/v3/cashfree.js");
|
|
27
|
+
}
|
|
28
|
+
async function openPaymentModal(options) {
|
|
29
|
+
const { order, onSuccess, onFailure, onDismiss, name, description, image, themeColor, prefill } = options;
|
|
30
|
+
if (typeof window === "undefined") {
|
|
31
|
+
throw new Error("openPaymentModal can only be called in a browser environment.");
|
|
32
|
+
}
|
|
33
|
+
const gateway = order.gateway;
|
|
34
|
+
if (gateway === "razorpay") {
|
|
35
|
+
const loaded = await loadRazorpay();
|
|
36
|
+
if (!loaded) {
|
|
37
|
+
onFailure?.({ gateway: "razorpay", message: "Failed to load Razorpay checkout SDK." });
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const RazorpayConstructor = window.Razorpay;
|
|
41
|
+
if (!RazorpayConstructor) {
|
|
42
|
+
onFailure?.({ gateway: "razorpay", message: "Razorpay SDK is not available on window." });
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const rzpOptions = {
|
|
46
|
+
key: order.rawResponse?.key || order.rawResponse?.key_id,
|
|
47
|
+
amount: Math.round(order.amount * 100),
|
|
48
|
+
currency: order.currency,
|
|
49
|
+
name: name || "Order Checkout",
|
|
50
|
+
description: description || `Payment for order #${order.orderId}`,
|
|
51
|
+
image,
|
|
52
|
+
order_id: order.gatewayOrderId,
|
|
53
|
+
prefill: prefill || {},
|
|
54
|
+
theme: {
|
|
55
|
+
color: themeColor || "#3399cc"
|
|
56
|
+
},
|
|
57
|
+
handler: function(response) {
|
|
58
|
+
onSuccess({
|
|
59
|
+
gateway: "razorpay",
|
|
60
|
+
orderId: order.orderId,
|
|
61
|
+
paymentId: response.razorpay_payment_id,
|
|
62
|
+
signature: response.razorpay_signature,
|
|
63
|
+
rawResponse: response
|
|
64
|
+
});
|
|
65
|
+
},
|
|
66
|
+
modal: {
|
|
67
|
+
ondismiss: function() {
|
|
68
|
+
onDismiss?.();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
const rzp = new RazorpayConstructor(rzpOptions);
|
|
73
|
+
rzp.on("payment.failed", function(resp) {
|
|
74
|
+
onFailure?.({
|
|
75
|
+
gateway: "razorpay",
|
|
76
|
+
message: resp.error?.description || "Payment was declined",
|
|
77
|
+
rawError: resp.error
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
rzp.open();
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (gateway === "cashfree") {
|
|
84
|
+
if (order.paymentSessionId) {
|
|
85
|
+
const loaded = await loadCashfree();
|
|
86
|
+
if (!loaded) {
|
|
87
|
+
onFailure?.({ gateway: "cashfree", message: "Failed to load Cashfree SDK." });
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const CashfreeConstructor = window.Cashfree;
|
|
91
|
+
if (CashfreeConstructor) {
|
|
92
|
+
const isSandbox = order.paymentSessionId.includes("test") || order.rawResponse?.environment === "SANDBOX";
|
|
93
|
+
const cashfree = CashfreeConstructor({ mode: isSandbox ? "sandbox" : "production" });
|
|
94
|
+
cashfree.checkout({
|
|
95
|
+
paymentSessionId: order.paymentSessionId,
|
|
96
|
+
redirectTarget: "_self"
|
|
97
|
+
});
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (order.redirectUrl) {
|
|
102
|
+
window.location.href = order.redirectUrl;
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
onFailure?.({ gateway: "cashfree", message: "No payment session ID or redirect URL found for Cashfree order." });
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (gateway === "phonepe" || gateway === "stripe" || gateway === "paytm") {
|
|
109
|
+
if (order.redirectUrl) {
|
|
110
|
+
window.location.href = order.redirectUrl;
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
onFailure?.({ gateway, message: `No redirect URL returned for ${gateway} checkout.` });
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (gateway === "cod") {
|
|
117
|
+
onSuccess({
|
|
118
|
+
gateway: "cod",
|
|
119
|
+
orderId: order.orderId,
|
|
120
|
+
paymentId: `COD_${order.orderId}`,
|
|
121
|
+
rawResponse: order.rawResponse
|
|
122
|
+
});
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
onFailure?.({ gateway, message: `Unsupported checkout gateway: ${gateway}` });
|
|
126
|
+
}
|
|
127
|
+
function useBoostPayment() {
|
|
128
|
+
const [isProcessing, setIsProcessing] = react.useState(false);
|
|
129
|
+
const [error, setError] = react.useState(null);
|
|
130
|
+
const startPayment = react.useCallback(async (options) => {
|
|
131
|
+
setIsProcessing(true);
|
|
132
|
+
setError(null);
|
|
133
|
+
try {
|
|
134
|
+
await openPaymentModal({
|
|
135
|
+
...options,
|
|
136
|
+
onSuccess: (res) => {
|
|
137
|
+
setIsProcessing(false);
|
|
138
|
+
options.onSuccess(res);
|
|
139
|
+
},
|
|
140
|
+
onFailure: (err) => {
|
|
141
|
+
setIsProcessing(false);
|
|
142
|
+
setError(err.message);
|
|
143
|
+
options.onFailure?.(err);
|
|
144
|
+
},
|
|
145
|
+
onDismiss: () => {
|
|
146
|
+
setIsProcessing(false);
|
|
147
|
+
options.onDismiss?.();
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
} catch (err) {
|
|
151
|
+
setIsProcessing(false);
|
|
152
|
+
setError(err.message);
|
|
153
|
+
options.onFailure?.({
|
|
154
|
+
gateway: options.order.gateway,
|
|
155
|
+
message: err.message || "Payment initiation failed",
|
|
156
|
+
rawError: err
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}, []);
|
|
160
|
+
return {
|
|
161
|
+
openPaymentModal: startPayment,
|
|
162
|
+
isProcessing,
|
|
163
|
+
error
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
exports.loadCashfree = loadCashfree;
|
|
168
|
+
exports.loadRazorpay = loadRazorpay;
|
|
169
|
+
exports.loadScript = loadScript;
|
|
170
|
+
exports.openPaymentModal = openPaymentModal;
|
|
171
|
+
exports.useBoostPayment = useBoostPayment;
|
|
172
|
+
//# sourceMappingURL=react.cjs.map
|
|
173
|
+
//# sourceMappingURL=react.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react/index.ts"],"names":["useState","useCallback"],"mappings":"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","file":"react.cjs","sourcesContent":["'use client';\n\nimport { useState, useCallback } from 'react';\nimport { BoostPaymentOpenOptions, GatewayName, UnifiedOrderResult } from '../types';\n\n/**\n * Dynamically loads an external script into the browser document.\n */\nexport function loadScript(src: string): Promise<boolean> {\n return new Promise((resolve) => {\n if (typeof window === 'undefined') {\n return resolve(false);\n }\n if (document.querySelector(`script[src=\"${src}\"]`)) {\n return resolve(true);\n }\n const script = document.createElement('script');\n script.src = src;\n script.async = true;\n script.onload = () => resolve(true);\n script.onerror = () => resolve(false);\n document.body.appendChild(script);\n });\n}\n\n/**\n * Loads Razorpay Checkout JavaScript library.\n */\nexport async function loadRazorpay(): Promise<boolean> {\n return loadScript('https://checkout.razorpay.com/v1/checkout.js');\n}\n\n/**\n * Loads Cashfree JS SDK v3.\n */\nexport async function loadCashfree(): Promise<boolean> {\n return loadScript('https://sdk.cashfree.com/js/v3/cashfree.js');\n}\n\n/**\n * Universal Checkout Launcher for Browser & React applications.\n * Automatically loads the gateway script, opens modals, or redirects.\n */\nexport async function openPaymentModal(options: BoostPaymentOpenOptions): Promise<void> {\n const { order, onSuccess, onFailure, onDismiss, name, description, image, themeColor, prefill } = options;\n\n if (typeof window === 'undefined') {\n throw new Error('openPaymentModal can only be called in a browser environment.');\n }\n\n const gateway = order.gateway;\n\n // 1. RAZORPAY MODAL\n if (gateway === 'razorpay') {\n const loaded = await loadRazorpay();\n if (!loaded) {\n onFailure?.({ gateway: 'razorpay', message: 'Failed to load Razorpay checkout SDK.' });\n return;\n }\n\n const RazorpayConstructor = (window as any).Razorpay;\n if (!RazorpayConstructor) {\n onFailure?.({ gateway: 'razorpay', message: 'Razorpay SDK is not available on window.' });\n return;\n }\n\n const rzpOptions = {\n key: (order.rawResponse as any)?.key || (order.rawResponse as any)?.key_id,\n amount: Math.round(order.amount * 100),\n currency: order.currency,\n name: name || 'Order Checkout',\n description: description || `Payment for order #${order.orderId}`,\n image: image,\n order_id: order.gatewayOrderId,\n prefill: prefill || {},\n theme: {\n color: themeColor || '#3399cc',\n },\n handler: function (response: any) {\n onSuccess({\n gateway: 'razorpay',\n orderId: order.orderId,\n paymentId: response.razorpay_payment_id,\n signature: response.razorpay_signature,\n rawResponse: response,\n });\n },\n modal: {\n ondismiss: function () {\n onDismiss?.();\n },\n },\n };\n\n const rzp = new RazorpayConstructor(rzpOptions);\n rzp.on('payment.failed', function (resp: any) {\n onFailure?.({\n gateway: 'razorpay',\n message: resp.error?.description || 'Payment was declined',\n rawError: resp.error,\n });\n });\n rzp.open();\n return;\n }\n\n // 2. CASHFREE DROPIN\n if (gateway === 'cashfree') {\n if (order.paymentSessionId) {\n const loaded = await loadCashfree();\n if (!loaded) {\n onFailure?.({ gateway: 'cashfree', message: 'Failed to load Cashfree SDK.' });\n return;\n }\n\n const CashfreeConstructor = (window as any).Cashfree;\n if (CashfreeConstructor) {\n const isSandbox = order.paymentSessionId.includes('test') || (order.rawResponse as any)?.environment === 'SANDBOX';\n const cashfree = CashfreeConstructor({ mode: isSandbox ? 'sandbox' : 'production' });\n cashfree.checkout({\n paymentSessionId: order.paymentSessionId,\n redirectTarget: '_self',\n });\n return;\n }\n }\n\n if (order.redirectUrl) {\n window.location.href = order.redirectUrl;\n return;\n }\n\n onFailure?.({ gateway: 'cashfree', message: 'No payment session ID or redirect URL found for Cashfree order.' });\n return;\n }\n\n // 3. PHONEPE / STRIPE / PAYTM REDIRECT\n if (gateway === 'phonepe' || gateway === 'stripe' || gateway === 'paytm') {\n if (order.redirectUrl) {\n window.location.href = order.redirectUrl;\n return;\n }\n onFailure?.({ gateway, message: `No redirect URL returned for ${gateway} checkout.` });\n return;\n }\n\n // 4. CASH ON DELIVERY (COD)\n if (gateway === 'cod') {\n onSuccess({\n gateway: 'cod',\n orderId: order.orderId,\n paymentId: `COD_${order.orderId}`,\n rawResponse: order.rawResponse,\n });\n return;\n }\n\n onFailure?.({ gateway, message: `Unsupported checkout gateway: ${gateway}` });\n}\n\n/**\n * React Hook for seamless payment checkout in Next.js / React.\n */\nexport function useBoostPayment() {\n const [isProcessing, setIsProcessing] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const startPayment = useCallback(async (options: BoostPaymentOpenOptions) => {\n setIsProcessing(true);\n setError(null);\n\n try {\n await openPaymentModal({\n ...options,\n onSuccess: (res) => {\n setIsProcessing(false);\n options.onSuccess(res);\n },\n onFailure: (err) => {\n setIsProcessing(false);\n setError(err.message);\n options.onFailure?.(err);\n },\n onDismiss: () => {\n setIsProcessing(false);\n options.onDismiss?.();\n },\n });\n } catch (err: any) {\n setIsProcessing(false);\n setError(err.message);\n options.onFailure?.({\n gateway: options.order.gateway,\n message: err.message || 'Payment initiation failed',\n rawError: err,\n });\n }\n }, []);\n\n return {\n openPaymentModal: startPayment,\n isProcessing,\n error,\n };\n}\n"]}
|
package/dist/react.d.mts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { B as BoostPaymentOpenOptions } from './types-D3bPaYhQ.mjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Dynamically loads an external script into the browser document.
|
|
5
|
+
*/
|
|
6
|
+
declare function loadScript(src: string): Promise<boolean>;
|
|
7
|
+
/**
|
|
8
|
+
* Loads Razorpay Checkout JavaScript library.
|
|
9
|
+
*/
|
|
10
|
+
declare function loadRazorpay(): Promise<boolean>;
|
|
11
|
+
/**
|
|
12
|
+
* Loads Cashfree JS SDK v3.
|
|
13
|
+
*/
|
|
14
|
+
declare function loadCashfree(): Promise<boolean>;
|
|
15
|
+
/**
|
|
16
|
+
* Universal Checkout Launcher for Browser & React applications.
|
|
17
|
+
* Automatically loads the gateway script, opens modals, or redirects.
|
|
18
|
+
*/
|
|
19
|
+
declare function openPaymentModal(options: BoostPaymentOpenOptions): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* React Hook for seamless payment checkout in Next.js / React.
|
|
22
|
+
*/
|
|
23
|
+
declare function useBoostPayment(): {
|
|
24
|
+
openPaymentModal: (options: BoostPaymentOpenOptions) => Promise<void>;
|
|
25
|
+
isProcessing: boolean;
|
|
26
|
+
error: string | null;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export { loadCashfree, loadRazorpay, loadScript, openPaymentModal, useBoostPayment };
|