@reevit/react 0.2.7 β†’ 0.2.8

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/index.ts","../src/api/client.ts","../src/hooks/useReevit.ts","../src/components/PaymentMethodSelector.tsx","../src/components/MobileMoneyForm.tsx","../src/bridges/PaystackBridge.tsx","../src/components/ReevitCheckout.tsx","../src/bridges/HubtelBridge.tsx","../src/bridges/FlutterwaveBridge.tsx","../src/bridges/StripeBridge.tsx","../src/bridges/MonnifyBridge.tsx","../src/bridges/MPesaBridge.tsx"],"names":["useEffect","useCallback","jsxs","jsx","useRef","useState","result","error"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Utility functions for the Reevit React SDK\n */\n\n/**\n * Format amount for display\n */\nexport function formatAmount(amount: number, currency: string): string {\n const formatter = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: currency,\n minimumFractionDigits: 2,\n });\n\n // Amount is in smallest unit (pesewas, kobo, cents)\n return formatter.format(amount / 100);\n}\n\n/**\n * Generate a unique reference if not provided\n */\nexport function generateReference(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `reevit_${timestamp}_${random}`;\n}\n\n/**\n * Validate phone number for mobile money\n */\nexport function validatePhone(phone: string, network?: string): boolean {\n // Remove spaces and dashes\n const cleaned = phone.replace(/[\\s-]/g, '');\n\n // Check for valid Ghana phone number formats\n const patterns = {\n mtn: /^(0|233|\\+233)?(24|54|55|59)\\d{7}$/,\n vodafone: /^(0|233|\\+233)?(20|50)\\d{7}$/,\n airteltigo: /^(0|233|\\+233)?(26|27|56|57)\\d{7}$/,\n };\n\n if (network && patterns[network as keyof typeof patterns]) {\n return patterns[network as keyof typeof patterns].test(cleaned);\n }\n\n // If no network specified, check all patterns\n return Object.values(patterns).some((pattern) => pattern.test(cleaned));\n}\n\n/**\n * Format phone number for display\n */\nexport function formatPhone(phone: string): string {\n const cleaned = phone.replace(/[\\s-]/g, '');\n\n // Format as 0XX XXX XXXX\n if (cleaned.startsWith('0') && cleaned.length === 10) {\n return `${cleaned.slice(0, 3)} ${cleaned.slice(3, 6)} ${cleaned.slice(6)}`;\n }\n\n // Format +233 XX XXX XXXX\n if (cleaned.startsWith('+233') && cleaned.length === 13) {\n return `${cleaned.slice(0, 4)} ${cleaned.slice(4, 6)} ${cleaned.slice(6, 9)} ${cleaned.slice(9)}`;\n }\n\n return phone;\n}\n\n/**\n * Detect mobile money network from phone number\n */\nexport function detectNetwork(phone: string): string | null {\n const cleaned = phone.replace(/[\\s-]/g, '');\n\n const prefixes: Record<string, string[]> = {\n mtn: ['024', '054', '055', '059', '23324', '23354', '23355', '23359'],\n vodafone: ['020', '050', '23320', '23350'],\n airteltigo: ['026', '027', '056', '057', '23326', '23327', '23356', '23357'],\n };\n\n for (const [network, networkPrefixes] of Object.entries(prefixes)) {\n for (const prefix of networkPrefixes) {\n if (cleaned.startsWith(prefix) || cleaned.startsWith('0' + prefix.slice(3))) {\n return network;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Create CSS variables from theme\n */\nexport function createThemeVariables(theme: Record<string, string | undefined>): Record<string, string> {\n const variables: Record<string, string> = {};\n\n if (theme.primaryColor) {\n variables['--reevit-primary'] = theme.primaryColor;\n }\n if (theme.backgroundColor) {\n variables['--reevit-background'] = theme.backgroundColor;\n }\n if (theme.textColor) {\n variables['--reevit-text'] = theme.textColor;\n }\n if (theme.borderRadius) {\n variables['--reevit-radius'] = theme.borderRadius;\n }\n if (theme.fontFamily) {\n variables['--reevit-font'] = theme.fontFamily;\n }\n\n return variables;\n}\n\n/**\n * Merge class names\n */\nexport function cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n","/**\n * Reevit API Client\n * \n * Handles communication with the Reevit backend for payment operations.\n */\n\nimport type { PaymentMethod, ReevitCheckoutConfig, PaymentError } from '../types';\n\n// API Response Types (matching backend handlers_payments.go)\nexport interface CreatePaymentIntentRequest {\n amount: number;\n currency: string;\n method: string;\n country: string;\n customer_id?: string;\n metadata?: Record<string, unknown>;\n description?: string;\n policy?: {\n prefer?: string[];\n max_amount?: number;\n blocked_bins?: string[];\n allowed_bins?: string[];\n velocity_max_per_minute?: number;\n };\n}\n\nexport interface PaymentIntentResponse {\n id: string;\n connection_id: string;\n provider: string;\n status: string;\n client_secret: string;\n psp_public_key?: string;\n amount: number;\n currency: string;\n fee_amount: number;\n fee_currency: string;\n net_amount: number;\n}\n\nexport interface ConfirmPaymentRequest {\n provider_ref_id: string;\n provider_data?: Record<string, unknown>;\n}\n\nexport interface PaymentDetailResponse {\n id: string;\n connection_id: string;\n provider: string;\n method: string;\n status: string;\n amount: number;\n currency: string;\n fee_amount: number;\n fee_currency: string;\n net_amount: number;\n customer_id?: string;\n client_secret: string;\n provider_ref_id?: string;\n metadata?: Record<string, unknown>;\n created_at: string;\n updated_at: string;\n}\n\nexport interface APIErrorResponse {\n code: string;\n message: string;\n details?: Record<string, string>;\n}\n\n// API Client configuration\nexport interface ReevitAPIClientConfig {\n /** Your Reevit public key */\n publicKey: string;\n /** Base URL for the Reevit API (defaults to production) */\n baseUrl?: string;\n /** Request timeout in milliseconds */\n timeout?: number;\n}\n\n// Default API base URLs\nconst API_BASE_URL_PRODUCTION = 'https://api.reevit.io';\nconst API_BASE_URL_SANDBOX = 'https://sandbox-api.reevit.io';\nconst DEFAULT_TIMEOUT = 30000; // 30 seconds\n\n/**\n * Determines if a public key is for sandbox mode\n */\nfunction isSandboxKey(publicKey: string): boolean {\n // Support various test/sandbox key prefixes\n return publicKey.startsWith('pk_test_') ||\n publicKey.startsWith('pk_sandbox_') ||\n publicKey.startsWith('pfk_test_') ||\n publicKey.startsWith('pfk_sandbox_');\n}\n\n/**\n * Creates a PaymentError from an API error response\n */\nfunction createPaymentError(response: Response, errorData: APIErrorResponse): PaymentError {\n return {\n code: errorData.code || 'api_error',\n message: errorData.message || 'An unexpected error occurred',\n details: {\n httpStatus: response.status,\n ...errorData.details,\n },\n };\n}\n\n/**\n * Reevit API Client\n */\nexport class ReevitAPIClient {\n private readonly publicKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n constructor(config: ReevitAPIClientConfig) {\n this.publicKey = config.publicKey;\n this.baseUrl = config.baseUrl || (isSandboxKey(config.publicKey)\n ? API_BASE_URL_SANDBOX\n : API_BASE_URL_PRODUCTION);\n this.timeout = config.timeout || DEFAULT_TIMEOUT;\n }\n\n /**\n * Makes an authenticated API request\n */\n private async request<T>(\n method: string,\n path: string,\n body?: unknown\n ): Promise<{ data?: T; error?: PaymentError }> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n // Generate idempotency key for POST requests\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Reevit-Key': this.publicKey,\n 'X-Reevit-Client': '@reevit/react',\n 'X-Reevit-Client-Version': '0.2.5',\n };\n\n // Add idempotency key for mutating requests\n if (method === 'POST' || method === 'PATCH' || method === 'PUT') {\n headers['Idempotency-Key'] = `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;\n }\n\n try {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const responseData = await response.json().catch(() => ({}));\n\n if (!response.ok) {\n return {\n error: createPaymentError(response, responseData as APIErrorResponse),\n };\n }\n\n return { data: responseData as T };\n } catch (err) {\n clearTimeout(timeoutId);\n\n if (err instanceof Error) {\n if (err.name === 'AbortError') {\n return {\n error: {\n code: 'request_timeout',\n message: 'The request timed out. Please try again.',\n },\n };\n }\n\n if (err.message.includes('Failed to fetch') || err.message.includes('NetworkError')) {\n return {\n error: {\n code: 'network_error',\n message: 'Unable to connect to Reevit. Please check your internet connection.',\n },\n };\n }\n }\n\n return {\n error: {\n code: 'unknown_error',\n message: 'An unexpected error occurred. Please try again.',\n },\n };\n }\n }\n\n /**\n * Creates a payment intent\n */\n async createPaymentIntent(\n config: ReevitCheckoutConfig,\n method: PaymentMethod,\n country: string = 'GH'\n ): Promise<{ data?: PaymentIntentResponse; error?: PaymentError }> {\n // Build metadata with customer_email for PSP providers that require it\n const metadata: Record<string, unknown> = { ...config.metadata };\n if (config.email) {\n metadata.customer_email = config.email;\n }\n if (config.phone) {\n metadata.customer_phone = config.phone;\n }\n\n const request: CreatePaymentIntentRequest = {\n amount: config.amount,\n currency: config.currency,\n method: this.mapPaymentMethod(method),\n country,\n customer_id: config.email || (config.metadata?.customerId as string | undefined),\n metadata,\n };\n\n return this.request<PaymentIntentResponse>('POST', '/v1/payments/intents', request);\n }\n\n /**\n * Retrieves a payment intent by ID\n */\n async getPaymentIntent(paymentId: string): Promise<{ data?: PaymentDetailResponse; error?: PaymentError }> {\n return this.request<PaymentDetailResponse>('GET', `/v1/payments/${paymentId}`);\n }\n\n /**\n * Confirms a payment after PSP callback\n */\n async confirmPayment(paymentId: string): Promise<{ data?: PaymentDetailResponse; error?: PaymentError }> {\n return this.request<PaymentDetailResponse>('POST', `/v1/payments/${paymentId}/confirm`);\n }\n\n /**\n * Cancels a payment intent\n */\n async cancelPaymentIntent(paymentId: string): Promise<{ data?: PaymentDetailResponse; error?: PaymentError }> {\n return this.request<PaymentDetailResponse>('POST', `/v1/payments/${paymentId}/cancel`);\n }\n\n /**\n * Maps SDK payment method to backend format\n */\n private mapPaymentMethod(method: PaymentMethod): string {\n switch (method) {\n case 'card':\n return 'card';\n case 'mobile_money':\n return 'mobile_money';\n case 'bank_transfer':\n return 'bank_transfer';\n default:\n return method;\n }\n }\n}\n\n/**\n * Creates a new Reevit API client instance\n */\nexport function createReevitClient(config: ReevitAPIClientConfig): ReevitAPIClient {\n return new ReevitAPIClient(config);\n}\n","/**\n * useReevit hook\n * Core hook for managing Reevit checkout state and API interactions\n */\n\nimport { useCallback, useReducer, useEffect, useRef } from 'react';\nimport type {\n ReevitCheckoutConfig,\n CheckoutState,\n PaymentMethod,\n PaymentResult,\n PaymentError,\n PaymentIntent,\n} from '../types';\nimport { generateReference } from '../utils';\nimport { ReevitAPIClient, type PaymentIntentResponse } from '../api';\n\n// State shape\ninterface ReevitState {\n status: CheckoutState;\n paymentIntent: PaymentIntent | null;\n selectedMethod: PaymentMethod | null;\n error: PaymentError | null;\n result: PaymentResult | null;\n}\n\n// Actions\ntype ReevitAction =\n | { type: 'INIT_START' }\n | { type: 'INIT_SUCCESS'; payload: PaymentIntent }\n | { type: 'INIT_ERROR'; payload: PaymentError }\n | { type: 'SELECT_METHOD'; payload: PaymentMethod }\n | { type: 'PROCESS_START' }\n | { type: 'PROCESS_SUCCESS'; payload: PaymentResult }\n | { type: 'PROCESS_ERROR'; payload: PaymentError }\n | { type: 'RESET' }\n | { type: 'CLOSE' };\n\n// Initial state\nconst initialState: ReevitState = {\n status: 'idle',\n paymentIntent: null,\n selectedMethod: null,\n error: null,\n result: null,\n};\n\n// Reducer\nfunction reevitReducer(state: ReevitState, action: ReevitAction): ReevitState {\n switch (action.type) {\n case 'INIT_START':\n return { ...state, status: 'loading', error: null };\n case 'INIT_SUCCESS':\n return { ...state, status: 'ready', paymentIntent: action.payload };\n case 'INIT_ERROR':\n return { ...state, status: 'failed', error: action.payload };\n case 'SELECT_METHOD':\n return { ...state, status: 'method_selected', selectedMethod: action.payload };\n case 'PROCESS_START':\n return { ...state, status: 'processing', error: null };\n case 'PROCESS_SUCCESS':\n return { ...state, status: 'success', result: action.payload };\n case 'PROCESS_ERROR':\n return { ...state, status: 'failed', error: action.payload };\n case 'RESET':\n return { ...initialState, status: 'ready', paymentIntent: state.paymentIntent };\n case 'CLOSE':\n return { ...state, status: 'closed' };\n default:\n return state;\n }\n}\n\ninterface UseReevitOptions {\n config: ReevitCheckoutConfig;\n onSuccess?: (result: PaymentResult) => void;\n onError?: (error: PaymentError) => void;\n onClose?: () => void;\n onStateChange?: (state: CheckoutState) => void;\n /** Custom API base URL (for testing or self-hosted deployments) */\n apiBaseUrl?: string;\n}\n\n/**\n * Maps PSP provider names from backend to PSP type used by bridges\n */\nfunction mapProviderToPsp(provider: string): 'paystack' | 'hubtel' | 'flutterwave' {\n const providerLower = provider.toLowerCase();\n if (providerLower.includes('paystack')) return 'paystack';\n if (providerLower.includes('hubtel')) return 'hubtel';\n if (providerLower.includes('flutterwave')) return 'flutterwave';\n // Default to paystack if unknown\n return 'paystack';\n}\n\n/**\n * Maps backend payment intent response to SDK PaymentIntent type\n */\nfunction mapToPaymentIntent(\n response: PaymentIntentResponse,\n config: ReevitCheckoutConfig\n): PaymentIntent {\n return {\n id: response.id,\n clientSecret: response.client_secret,\n pspPublicKey: response.psp_public_key,\n amount: response.amount,\n currency: response.currency,\n status: response.status as 'pending' | 'processing' | 'succeeded' | 'failed' | 'cancelled',\n recommendedPsp: mapProviderToPsp(response.provider),\n availableMethods: config.paymentMethods || ['card', 'mobile_money'],\n connectionId: response.connection_id,\n provider: response.provider,\n feeAmount: response.fee_amount,\n feeCurrency: response.fee_currency,\n netAmount: response.net_amount,\n metadata: config.metadata,\n };\n}\n\nexport function useReevit(options: UseReevitOptions) {\n const { config, onSuccess, onError, onClose, onStateChange, apiBaseUrl } = options;\n const [state, dispatch] = useReducer(reevitReducer, initialState);\n\n // Create API client ref (stable across re-renders)\n const apiClientRef = useRef<ReevitAPIClient | null>(null);\n\n // Initialize API client\n if (!apiClientRef.current) {\n apiClientRef.current = new ReevitAPIClient({\n publicKey: config.publicKey,\n baseUrl: apiBaseUrl,\n });\n }\n\n // Notify on state changes\n useEffect(() => {\n onStateChange?.(state.status);\n }, [state.status, onStateChange]);\n\n // Initialize payment intent\n const initialize = useCallback(\n async (method?: PaymentMethod) => {\n dispatch({ type: 'INIT_START' });\n\n try {\n const apiClient = apiClientRef.current;\n if (!apiClient) {\n throw new Error('API client not initialized');\n }\n\n // Generate reference if not provided\n const reference = config.reference || generateReference();\n\n // Determine country from currency (can be enhanced with IP detection)\n const country = detectCountryFromCurrency(config.currency);\n\n // Select payment method to send to backend\n const paymentMethod = method || config.paymentMethods?.[0] || 'card';\n\n // Call the Reevit API to create a payment intent\n const { data, error } = await apiClient.createPaymentIntent(\n { ...config, reference },\n paymentMethod,\n country\n );\n\n if (error) {\n dispatch({ type: 'INIT_ERROR', payload: error });\n onError?.(error);\n return;\n }\n\n if (!data) {\n const noDataError: PaymentError = {\n code: 'INIT_FAILED',\n message: 'No data received from API',\n recoverable: true,\n };\n dispatch({ type: 'INIT_ERROR', payload: noDataError });\n onError?.(noDataError);\n return;\n }\n\n // Map response to PaymentIntent\n const paymentIntent = mapToPaymentIntent(data, { ...config, reference });\n\n dispatch({ type: 'INIT_SUCCESS', payload: paymentIntent });\n } catch (err) {\n const error: PaymentError = {\n code: 'INIT_FAILED',\n message: err instanceof Error ? err.message : 'Failed to initialize checkout',\n recoverable: true,\n originalError: err,\n };\n dispatch({ type: 'INIT_ERROR', payload: error });\n onError?.(error);\n }\n },\n [config, onError, apiBaseUrl]\n );\n\n // Select payment method\n const selectMethod = useCallback((method: PaymentMethod) => {\n dispatch({ type: 'SELECT_METHOD', payload: method });\n }, []);\n\n // Process payment - called after PSP bridge returns success\n const processPayment = useCallback(\n async (paymentData: Record<string, unknown>) => {\n if (!state.paymentIntent || !state.selectedMethod) {\n return;\n }\n\n dispatch({ type: 'PROCESS_START' });\n\n try {\n const apiClient = apiClientRef.current;\n if (!apiClient) {\n throw new Error('API client not initialized');\n }\n\n // Confirm the payment with the backend\n const { data, error } = await apiClient.confirmPayment(state.paymentIntent.id);\n\n if (error) {\n dispatch({ type: 'PROCESS_ERROR', payload: error });\n onError?.(error);\n return;\n }\n\n // Build successful payment result\n const result: PaymentResult = {\n paymentId: state.paymentIntent.id,\n reference: (paymentData.reference as string) ||\n (state.paymentIntent.metadata?.reference as string) || '',\n amount: state.paymentIntent.amount,\n currency: state.paymentIntent.currency,\n paymentMethod: state.selectedMethod,\n psp: state.paymentIntent.recommendedPsp,\n pspReference: (paymentData.pspReference as string) ||\n (data?.provider_ref_id as string) || '',\n status: 'success',\n metadata: paymentData,\n };\n\n dispatch({ type: 'PROCESS_SUCCESS', payload: result });\n onSuccess?.(result);\n } catch (err) {\n const error: PaymentError = {\n code: 'PAYMENT_FAILED',\n message: err instanceof Error ? err.message : 'Payment failed. Please try again.',\n recoverable: true,\n originalError: err,\n };\n dispatch({ type: 'PROCESS_ERROR', payload: error });\n onError?.(error);\n }\n },\n [state.paymentIntent, state.selectedMethod, onSuccess, onError]\n );\n\n // Handle PSP bridge success (called by PSP bridge components)\n const handlePspSuccess = useCallback(\n async (pspData: Record<string, unknown>) => {\n await processPayment(pspData);\n },\n [processPayment]\n );\n\n // Handle PSP bridge failure\n const handlePspError = useCallback(\n (error: PaymentError) => {\n dispatch({ type: 'PROCESS_ERROR', payload: error });\n onError?.(error);\n },\n [onError]\n );\n\n // Reset checkout\n const reset = useCallback(() => {\n dispatch({ type: 'RESET' });\n }, []);\n\n // Close checkout\n const close = useCallback(async () => {\n // Cancel the payment intent if it exists and is still pending\n if (state.paymentIntent && state.status !== 'success') {\n try {\n const apiClient = apiClientRef.current;\n if (apiClient) {\n await apiClient.cancelPaymentIntent(state.paymentIntent.id);\n }\n } catch {\n // Silently ignore cancel errors\n }\n }\n\n dispatch({ type: 'CLOSE' });\n onClose?.();\n }, [onClose, state.paymentIntent, state.status]);\n\n return {\n // State\n status: state.status,\n paymentIntent: state.paymentIntent,\n selectedMethod: state.selectedMethod,\n error: state.error,\n result: state.result,\n\n // Actions\n initialize,\n selectMethod,\n processPayment,\n handlePspSuccess,\n handlePspError,\n reset,\n close,\n\n // Computed\n isLoading: state.status === 'loading' || state.status === 'processing',\n isReady: state.status === 'ready' || state.status === 'method_selected',\n isComplete: state.status === 'success',\n canRetry: state.error?.recoverable ?? false,\n };\n}\n\n/**\n * Detects country code from currency\n * This is a simple heuristic; in production, you might use IP geolocation\n */\nfunction detectCountryFromCurrency(currency: string): string {\n const currencyToCountry: Record<string, string> = {\n GHS: 'GH', // Ghana\n NGN: 'NG', // Nigeria\n KES: 'KE', // Kenya\n UGX: 'UG', // Uganda\n TZS: 'TZ', // Tanzania\n ZAR: 'ZA', // South Africa\n XOF: 'CI', // CΓ΄te d'Ivoire (CFA)\n XAF: 'CM', // Cameroon (CFA)\n USD: 'US', // United States\n EUR: 'DE', // Europe (default to Germany)\n GBP: 'GB', // United Kingdom\n };\n\n return currencyToCountry[currency.toUpperCase()] || 'GH';\n}\n","/**\n * PaymentMethodSelector Component\n * Displays available payment methods for user selection\n */\n\nimport type { PaymentMethod } from '../types';\nimport { cn } from '../utils';\n\ninterface PaymentMethodSelectorProps {\n methods: PaymentMethod[];\n selectedMethod: PaymentMethod | null;\n onSelect: (method: PaymentMethod) => void;\n disabled?: boolean;\n}\n\n// Payment method configuration\nconst methodConfig: Record<PaymentMethod, { label: string; icon: string; description: string }> = {\n card: {\n label: 'Card',\n icon: 'πŸ’³',\n description: 'Pay with Visa, Mastercard, or other cards',\n },\n mobile_money: {\n label: 'Mobile Money',\n icon: 'πŸ“±',\n description: 'MTN, Vodafone Cash, AirtelTigo Money',\n },\n bank_transfer: {\n label: 'Bank Transfer',\n icon: '🏦',\n description: 'Pay directly from your bank account',\n },\n};\n\nexport function PaymentMethodSelector({\n methods,\n selectedMethod,\n onSelect,\n disabled = false,\n}: PaymentMethodSelectorProps) {\n return (\n <div className=\"reevit-method-selector\">\n <div className=\"reevit-method-selector__label\">Select payment method</div>\n <div className=\"reevit-method-selector__options\">\n {methods.map((method) => {\n const config = methodConfig[method];\n const isSelected = selectedMethod === method;\n\n return (\n <button\n key={method}\n type=\"button\"\n className={cn(\n 'reevit-method-option',\n isSelected && 'reevit-method-option--selected',\n disabled && 'reevit-method-option--disabled'\n )}\n onClick={() => onSelect(method)}\n disabled={disabled}\n aria-pressed={isSelected}\n >\n <span className=\"reevit-method-option__icon\">{config.icon}</span>\n <div className=\"reevit-method-option__content\">\n <span className=\"reevit-method-option__label\">{config.label}</span>\n <span className=\"reevit-method-option__description\">{config.description}</span>\n </div>\n {isSelected && (\n <span className=\"reevit-method-option__check\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M16.667 5L7.5 14.167 3.333 10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","/**\n * MobileMoneyForm Component\n * Form for collecting mobile money payment details\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport type { MobileMoneyNetwork, MobileMoneyFormData } from '../types';\nimport { validatePhone, detectNetwork, formatPhone, cn } from '../utils';\n\ninterface MobileMoneyFormProps {\n onSubmit: (data: MobileMoneyFormData) => void;\n onCancel: () => void;\n isLoading?: boolean;\n initialPhone?: string;\n}\n\nconst networks: { id: MobileMoneyNetwork; name: string; color: string }[] = [\n { id: 'mtn', name: 'MTN', color: '#FFCC00' },\n { id: 'vodafone', name: 'Vodafone', color: '#E60000' },\n { id: 'airteltigo', name: 'AirtelTigo', color: '#E4002B' },\n];\n\nexport function MobileMoneyForm({\n onSubmit,\n onCancel,\n isLoading = false,\n initialPhone = '',\n}: MobileMoneyFormProps) {\n const [phone, setPhone] = useState(initialPhone);\n const [network, setNetwork] = useState<MobileMoneyNetwork | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [touched, setTouched] = useState(false);\n\n // Auto-detect network from phone number\n useEffect(() => {\n if (phone.length >= 3) {\n const detected = detectNetwork(phone);\n if (detected) {\n setNetwork(detected as MobileMoneyNetwork);\n }\n }\n }, [phone]);\n\n // Validate on change\n useEffect(() => {\n if (touched && phone) {\n if (!validatePhone(phone)) {\n setError('Please enter a valid Ghana phone number');\n } else if (network && !validatePhone(phone, network)) {\n setError(`This number doesn't match the selected network`);\n } else {\n setError(null);\n }\n }\n }, [phone, network, touched]);\n\n const handlePhoneChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value.replace(/[^0-9+]/g, '');\n setPhone(value);\n }, []);\n\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault();\n setTouched(true);\n\n if (!phone || !network) {\n setError('Please enter your phone number and select a network');\n return;\n }\n\n if (!validatePhone(phone, network)) {\n setError('Invalid phone number for selected network');\n return;\n }\n\n onSubmit({ phone, network });\n },\n [phone, network, onSubmit]\n );\n\n const isValid = phone && network && validatePhone(phone, network);\n\n return (\n <form className=\"reevit-momo-form\" onSubmit={handleSubmit}>\n <div className=\"reevit-momo-form__field\">\n <label htmlFor=\"reevit-phone\" className=\"reevit-momo-form__label\">\n Phone Number\n </label>\n <input\n id=\"reevit-phone\"\n type=\"tel\"\n className={cn('reevit-momo-form__input', !!error && 'reevit-momo-form__input--error')}\n placeholder=\"024 XXX XXXX\"\n value={phone}\n onChange={handlePhoneChange}\n onBlur={() => setTouched(true)}\n disabled={isLoading}\n autoComplete=\"tel\"\n />\n {phone && !error && (\n <div className=\"reevit-momo-form__formatted\">{formatPhone(phone)}</div>\n )}\n {error && <div className=\"reevit-momo-form__error\">{error}</div>}\n </div>\n\n <div className=\"reevit-momo-form__field\">\n <label className=\"reevit-momo-form__label\">Select Network</label>\n <div className=\"reevit-momo-form__networks\">\n {networks.map((n) => (\n <button\n key={n.id}\n type=\"button\"\n className={cn(\n 'reevit-network-btn',\n network === n.id && 'reevit-network-btn--selected'\n )}\n style={{ '--network-color': n.color } as React.CSSProperties}\n onClick={() => setNetwork(n.id)}\n disabled={isLoading}\n >\n {n.name}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"reevit-momo-form__actions\">\n <button\n type=\"button\"\n className=\"reevit-btn reevit-btn--secondary\"\n onClick={onCancel}\n disabled={isLoading}\n >\n Back\n </button>\n <button\n type=\"submit\"\n className=\"reevit-btn reevit-btn--primary\"\n disabled={!isValid || isLoading}\n >\n {isLoading ? (\n <span className=\"reevit-spinner\" />\n ) : (\n 'Continue'\n )}\n </button>\n </div>\n\n <p className=\"reevit-momo-form__hint\">\n You will receive a USSD prompt on your phone to authorize the payment.\n </p>\n </form>\n );\n}\n","/**\n * Paystack Bridge\n * Handles integration with Paystack popup checkout\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport type { PaymentResult, PaymentError } from '../types';\n\ndeclare global {\n interface Window {\n PaystackPop?: PaystackPopupInterface;\n }\n}\n\ninterface PaystackPopupInterface {\n setup: (config: PaystackConfig) => { openIframe: () => void };\n}\n\ninterface PaystackConfig {\n key: string;\n email: string;\n amount: number;\n currency?: string;\n ref?: string;\n metadata?: Record<string, unknown>;\n channels?: string[];\n callback: (response: PaystackResponse) => void;\n onClose: () => void;\n}\n\ninterface PaystackResponse {\n reference: string;\n trans: string;\n status: string;\n message: string;\n transaction: string;\n trxref: string;\n}\n\ninterface PaystackBridgeProps {\n publicKey: string;\n email: string;\n amount: number;\n currency?: string;\n reference?: string;\n metadata?: Record<string, unknown>;\n channels?: ('card' | 'bank' | 'ussd' | 'qr' | 'mobile_money' | 'bank_transfer')[];\n onSuccess: (result: PaymentResult) => void;\n onError: (error: PaymentError) => void;\n onClose: () => void;\n autoStart?: boolean;\n}\n\n// Load Paystack script\nfunction loadPaystackScript(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (window.PaystackPop) {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.src = 'https://js.paystack.co/v2/inline.js';\n script.async = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load Paystack script'));\n document.head.appendChild(script);\n });\n}\n\nexport function PaystackBridge({\n publicKey,\n email,\n amount,\n currency = 'GHS',\n reference,\n metadata,\n channels = ['card', 'mobile_money'],\n onSuccess,\n onError,\n onClose,\n autoStart = true,\n}: PaystackBridgeProps) {\n const initialized = useRef(false);\n\n const startPayment = useCallback(async () => {\n try {\n // Validate required parameters before attempting to load Paystack\n if (!publicKey) {\n throw new Error('Paystack public key is required but was empty');\n }\n if (!email) {\n throw new Error('Email is required for Paystack payments');\n }\n if (!amount || amount <= 0) {\n throw new Error('Valid amount is required for Paystack payments');\n }\n\n await loadPaystackScript();\n\n if (!window.PaystackPop) {\n throw new Error('Paystack script loaded but PaystackPop not available');\n }\n\n const handler = window.PaystackPop.setup({\n key: publicKey,\n email,\n amount, // Paystack expects amount in kobo/pesewas (smallest unit)\n currency,\n ref: reference,\n metadata,\n channels,\n callback: (response: PaystackResponse) => {\n const result: PaymentResult = {\n paymentId: response.transaction,\n reference: response.reference,\n amount,\n currency,\n paymentMethod: 'card', // Paystack handles this internally\n psp: 'paystack',\n pspReference: response.trans,\n status: response.status === 'success' ? 'success' : 'pending',\n metadata: { trxref: response.trxref },\n };\n onSuccess(result);\n },\n onClose: () => {\n onClose();\n },\n });\n\n handler.openIframe();\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to initialize Paystack';\n const error: PaymentError = {\n code: 'PSP_ERROR',\n message: errorMessage,\n recoverable: true,\n originalError: err,\n };\n onError(error);\n }\n }, [publicKey, email, amount, currency, reference, metadata, channels, onSuccess, onError, onClose]);\n\n useEffect(() => {\n if (autoStart && !initialized.current) {\n initialized.current = true;\n startPayment();\n }\n }, [autoStart, startPayment]);\n\n return (\n <div className=\"reevit-psp-bridge reevit-psp-bridge--paystack\">\n <div className=\"reevit-psp-bridge__loading\">\n <div className=\"reevit-spinner\" />\n <p>Connecting to Paystack...</p>\n </div>\n </div>\n );\n}\n\n// Export utility for manual initialization\nexport { loadPaystackScript };","/**\n * ReevitCheckout Component\n * Main checkout component that orchestrates the payment flow\n */\n\nimport { useEffect, useState, useCallback, createContext, useContext } from 'react';\nimport type { ReevitCheckoutProps, PaymentMethod, MobileMoneyFormData } from '../types';\nimport { useReevit } from '../hooks/useReevit';\nimport { PaymentMethodSelector } from './PaymentMethodSelector';\nimport { MobileMoneyForm } from './MobileMoneyForm';\nimport { PaystackBridge } from '../bridges/PaystackBridge';\nimport { formatAmount, createThemeVariables, cn } from '../utils';\n\n// Context for nested components\ninterface ReevitContextValue {\n publicKey: string;\n amount: number;\n currency: string;\n}\n\nconst ReevitContext = createContext<ReevitContextValue | null>(null);\n\nexport function useReevitContext() {\n const context = useContext(ReevitContext);\n if (!context) {\n throw new Error('useReevitContext must be used within ReevitCheckout');\n }\n return context;\n}\n\nexport function ReevitCheckout({\n // Config\n publicKey,\n amount,\n currency,\n email = '',\n phone = '',\n reference,\n metadata,\n paymentMethods = ['card', 'mobile_money'],\n // Callbacks\n onSuccess,\n onError,\n onClose,\n onStateChange,\n // UI\n children,\n autoOpen = false,\n theme,\n apiBaseUrl,\n}: ReevitCheckoutProps) {\n const [isOpen, setIsOpen] = useState(autoOpen);\n const [showPSPBridge, setShowPSPBridge] = useState(false);\n const [momoData, setMomoData] = useState<MobileMoneyFormData | null>(null);\n\n const {\n status,\n paymentIntent,\n selectedMethod,\n error,\n result,\n initialize,\n selectMethod,\n processPayment,\n reset,\n close: closeCheckout,\n isLoading,\n isComplete,\n } = useReevit({\n config: { publicKey, amount, currency, email, phone, reference, metadata, paymentMethods },\n apiBaseUrl,\n onSuccess: (result) => {\n onSuccess?.(result);\n // Keep modal open briefly to show success\n setTimeout(() => {\n setIsOpen(false);\n }, 2000);\n },\n onError,\n onClose: () => {\n setIsOpen(false);\n onClose?.();\n },\n onStateChange,\n });\n\n // Initialize when opened\n useEffect(() => {\n if (isOpen && status === 'idle') {\n initialize();\n }\n }, [isOpen, status, initialize]);\n\n // Open modal\n const handleOpen = useCallback(() => {\n setIsOpen(true);\n setShowPSPBridge(false);\n setMomoData(null);\n }, []);\n\n // Close modal\n const handleClose = useCallback(() => {\n closeCheckout();\n setIsOpen(false);\n setShowPSPBridge(false);\n setMomoData(null);\n }, [closeCheckout]);\n\n // Handle payment method selection\n const handleMethodSelect = useCallback(\n (method: PaymentMethod) => {\n selectMethod(method);\n },\n [selectMethod]\n );\n\n // Handle continue after method selection\n const handleContinue = useCallback(() => {\n if (!selectedMethod) return;\n\n if (selectedMethod === 'card') {\n // For card payments, show PSP bridge (Paystack popup)\n setShowPSPBridge(true);\n }\n // Mobile money form is already shown when selected\n }, [selectedMethod]);\n\n // Handle mobile money form submission\n const handleMomoSubmit = useCallback(\n (data: MobileMoneyFormData) => {\n setMomoData(data);\n setShowPSPBridge(true);\n },\n []\n );\n\n // Handle PSP callback\n const handlePSPSuccess = useCallback(\n (pspResult: any) => {\n processPayment({ ...pspResult, momoData });\n },\n [processPayment, momoData]\n );\n\n const handlePSPError = useCallback(\n (error: any) => {\n setShowPSPBridge(false);\n onError?.(error);\n },\n [onError]\n );\n\n const handlePSPClose = useCallback(() => {\n setShowPSPBridge(false);\n }, []);\n\n // Back button handler\n const handleBack = useCallback(() => {\n reset();\n setMomoData(null);\n setShowPSPBridge(false);\n }, [reset]);\n\n // Theme styles\n const themeStyles = theme ? createThemeVariables(theme as unknown as Record<string, string | undefined>) : {};\n\n // Render trigger\n const trigger = children ? (\n <span onClick={handleOpen} role=\"button\" tabIndex={0}>\n {children}\n </span>\n ) : (\n <button className=\"reevit-trigger-btn\" onClick={handleOpen}>\n Pay {formatAmount(amount, currency)}\n </button>\n );\n\n // Render content based on state\n const renderContent = () => {\n // Loading state\n if (status === 'loading') {\n return (\n <div className=\"reevit-loading\">\n <div className=\"reevit-spinner\" />\n <p>Preparing checkout...</p>\n </div>\n );\n }\n\n // Success state\n if (status === 'success' && result) {\n return (\n <div className=\"reevit-success\">\n <div className=\"reevit-success__icon\">βœ“</div>\n <h3>Payment Successful</h3>\n <p>Reference: {result.reference}</p>\n </div>\n );\n }\n\n // Error state (only if not recoverable)\n if (status === 'failed' && error && !error.recoverable) {\n return (\n <div className=\"reevit-error\">\n <div className=\"reevit-error__icon\">βœ•</div>\n <h3>Payment Failed</h3>\n <p>{error.message}</p>\n <button className=\"reevit-btn reevit-btn--primary\" onClick={handleBack}>\n Try Again\n </button>\n </div>\n );\n }\n\n // PSP Bridge (Paystack popup)\n if (showPSPBridge) {\n // Use PSP public key from payment intent if available, otherwise fall back to Reevit public key\n const pspKey = paymentIntent?.pspPublicKey || publicKey;\n return (\n <PaystackBridge\n publicKey={pspKey}\n email={email}\n amount={paymentIntent?.amount ?? amount}\n currency={paymentIntent?.currency ?? currency}\n reference={reference}\n metadata={{\n ...metadata,\n // Override with correct payment intent ID for webhook routing\n // This ensures Paystack webhook includes the correct ID to find the payment\n payment_id: paymentIntent?.id,\n connection_id: paymentIntent?.connectionId ?? (metadata?.connection_id as string),\n }}\n channels={selectedMethod === 'mobile_money' ? ['mobile_money'] : ['card']}\n onSuccess={handlePSPSuccess}\n onError={handlePSPError}\n onClose={handlePSPClose}\n />\n );\n }\n\n // Mobile money form\n if (selectedMethod === 'mobile_money' && !showPSPBridge) {\n return (\n <MobileMoneyForm\n onSubmit={handleMomoSubmit}\n onCancel={handleBack}\n isLoading={isLoading}\n initialPhone={phone}\n />\n );\n }\n\n // Method selection\n return (\n <div className=\"reevit-method-step\">\n <PaymentMethodSelector\n methods={paymentMethods}\n selectedMethod={selectedMethod}\n onSelect={handleMethodSelect}\n disabled={isLoading}\n />\n\n {selectedMethod && selectedMethod !== 'mobile_money' && (\n <div className=\"reevit-method-step__actions\">\n <button\n className=\"reevit-btn reevit-btn--primary\"\n onClick={handleContinue}\n disabled={isLoading}\n >\n Continue\n </button>\n </div>\n )}\n </div>\n );\n };\n\n return (\n <ReevitContext.Provider value={{ publicKey, amount, currency }}>\n {trigger}\n\n {isOpen && (\n <div className=\"reevit-overlay\" onClick={handleClose}>\n <div\n className={cn('reevit-modal', isComplete && 'reevit-modal--success')}\n style={themeStyles}\n onClick={(e) => e.stopPropagation()}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n {/* Header */}\n <div className=\"reevit-modal__header\">\n <div className=\"reevit-modal__branding\">\n <img\n src=\"https://i.imgur.com/bzUR5Lm.png\"\n alt=\"Reevit\"\n className=\"reevit-modal__logo\"\n />\n </div>\n <button\n className=\"reevit-modal__close\"\n onClick={handleClose}\n aria-label=\"Close\"\n >\n βœ•\n </button>\n </div>\n\n {/* Amount display */}\n <div className=\"reevit-modal__amount\">\n <span className=\"reevit-modal__amount-label\">Amount</span>\n <span className=\"reevit-modal__amount-value\">\n {formatAmount(amount, currency)}\n </span>\n </div>\n\n {/* Content */}\n <div className=\"reevit-modal__content\">\n {renderContent()}\n </div>\n\n {/* Footer */}\n <div className=\"reevit-modal__footer\">\n <span className=\"reevit-modal__secured\">\n πŸ”’ Secured by Reevit\n </span>\n </div>\n </div>\n </div>\n )}\n </ReevitContext.Provider>\n );\n}\n","/**\n * Hubtel Bridge\n * Handles integration with Hubtel payment popup\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport type { PaymentResult, PaymentError } from '../types';\n\ndeclare global {\n interface Window {\n HubtelCheckout?: HubtelCheckoutInterface;\n }\n}\n\ninterface HubtelCheckoutInterface {\n initPayment: (config: HubtelConfig) => void;\n}\n\ninterface HubtelConfig {\n merchantAccount: string;\n basicDescription: string;\n totalAmount: number;\n currency: string;\n clientReference: string;\n customerEmail?: string;\n customerMsisdn?: string;\n callbackUrl?: string;\n onComplete?: (response: HubtelResponse) => void;\n onCancel?: () => void;\n}\n\ninterface HubtelResponse {\n status: 'Success' | 'Failed' | 'Cancelled';\n transactionId: string;\n clientReference: string;\n amount: number;\n currency: string;\n message?: string;\n}\n\ninterface HubtelBridgeProps {\n merchantAccount: string;\n amount: number;\n currency?: string;\n reference?: string;\n email?: string;\n phone?: string;\n description?: string;\n onSuccess: (result: PaymentResult) => void;\n onError: (error: PaymentError) => void;\n onClose: () => void;\n autoStart?: boolean;\n}\n\n// Load Hubtel script\nfunction loadHubtelScript(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (window.HubtelCheckout) {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.src = 'https://checkout.hubtel.com/checkout.js';\n script.async = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load Hubtel script'));\n document.head.appendChild(script);\n });\n}\n\nexport function HubtelBridge({\n merchantAccount,\n amount,\n currency = 'GHS',\n reference,\n email,\n phone,\n description = 'Payment',\n onSuccess,\n onError,\n onClose,\n autoStart = true,\n}: HubtelBridgeProps) {\n const initialized = useRef(false);\n\n const startPayment = useCallback(async () => {\n try {\n await loadHubtelScript();\n\n if (!window.HubtelCheckout) {\n throw new Error('Hubtel checkout not available');\n }\n\n window.HubtelCheckout.initPayment({\n merchantAccount,\n basicDescription: description,\n totalAmount: amount / 100, // Hubtel expects amount in major units (GHS, not pesewas)\n currency,\n clientReference: reference || `hubtel_${Date.now()}`,\n customerEmail: email,\n customerMsisdn: phone,\n onComplete: (response: HubtelResponse) => {\n if (response.status === 'Success') {\n const result: PaymentResult = {\n paymentId: response.transactionId,\n reference: response.clientReference,\n amount: Math.round(response.amount * 100), // Convert back to pesewas\n currency: response.currency,\n paymentMethod: 'mobile_money',\n psp: 'hubtel',\n pspReference: response.transactionId,\n status: 'success',\n };\n onSuccess(result);\n } else {\n const error: PaymentError = {\n code: 'PAYMENT_FAILED',\n message: response.message || 'Payment failed',\n recoverable: true,\n };\n onError(error);\n }\n },\n onCancel: () => {\n onClose();\n },\n });\n } catch (err) {\n const error: PaymentError = {\n code: 'PSP_ERROR',\n message: 'Failed to initialize Hubtel',\n recoverable: true,\n originalError: err,\n };\n onError(error);\n }\n }, [merchantAccount, amount, currency, reference, email, phone, description, onSuccess, onError, onClose]);\n\n useEffect(() => {\n if (autoStart && !initialized.current) {\n initialized.current = true;\n startPayment();\n }\n }, [autoStart, startPayment]);\n\n return (\n <div className=\"reevit-psp-bridge reevit-psp-bridge--hubtel\">\n <div className=\"reevit-psp-bridge__loading\">\n <div className=\"reevit-spinner\" />\n <p>Connecting to Hubtel...</p>\n </div>\n </div>\n );\n}\n\nexport { loadHubtelScript };\n","/**\n * Flutterwave Bridge\n * Handles integration with Flutterwave payment modal\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport type { PaymentResult, PaymentError } from '../types';\n\ndeclare global {\n interface Window {\n FlutterwaveCheckout?: (config: FlutterwaveConfig) => void;\n }\n}\n\ninterface FlutterwaveConfig {\n public_key: string;\n tx_ref: string;\n amount: number;\n currency: string;\n payment_options?: string;\n customer: {\n email: string;\n phone_number?: string;\n name?: string;\n };\n customizations?: {\n title?: string;\n description?: string;\n logo?: string;\n };\n meta?: Record<string, unknown>;\n callback: (response: FlutterwaveResponse) => void;\n onclose: () => void;\n}\n\ninterface FlutterwaveResponse {\n status: 'successful' | 'failed' | 'cancelled';\n transaction_id: number;\n tx_ref: string;\n flw_ref: string;\n amount: number;\n currency: string;\n charged_amount: number;\n payment_type: string;\n}\n\ninterface FlutterwaveBridgeProps {\n publicKey: string;\n amount: number;\n currency?: string;\n reference?: string;\n email: string;\n phone?: string;\n name?: string;\n paymentOptions?: string;\n title?: string;\n description?: string;\n logo?: string;\n metadata?: Record<string, unknown>;\n onSuccess: (result: PaymentResult) => void;\n onError: (error: PaymentError) => void;\n onClose: () => void;\n autoStart?: boolean;\n}\n\n// Load Flutterwave script\nfunction loadFlutterwaveScript(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (window.FlutterwaveCheckout) {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.src = 'https://checkout.flutterwave.com/v3.js';\n script.async = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load Flutterwave script'));\n document.head.appendChild(script);\n });\n}\n\nexport function FlutterwaveBridge({\n publicKey,\n amount,\n currency = 'GHS',\n reference,\n email,\n phone,\n name,\n paymentOptions = 'card,mobilemoney,ussd',\n title,\n description,\n logo,\n metadata,\n onSuccess,\n onError,\n onClose,\n autoStart = true,\n}: FlutterwaveBridgeProps) {\n const initialized = useRef(false);\n\n const startPayment = useCallback(async () => {\n try {\n await loadFlutterwaveScript();\n\n if (!window.FlutterwaveCheckout) {\n throw new Error('Flutterwave checkout not available');\n }\n\n const txRef = reference || `flw_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n\n window.FlutterwaveCheckout({\n public_key: publicKey,\n tx_ref: txRef,\n amount: amount / 100, // Flutterwave expects amount in major units\n currency,\n payment_options: paymentOptions,\n customer: {\n email,\n phone_number: phone,\n name,\n },\n customizations: {\n title,\n description,\n logo,\n },\n meta: metadata,\n callback: (response: FlutterwaveResponse) => {\n if (response.status === 'successful') {\n const result: PaymentResult = {\n paymentId: response.transaction_id.toString(),\n reference: response.tx_ref,\n amount: Math.round(response.amount * 100),\n currency: response.currency,\n paymentMethod: response.payment_type === 'mobilemoney' ? 'mobile_money' : 'card',\n psp: 'flutterwave',\n pspReference: response.flw_ref,\n status: 'success',\n metadata: {\n charged_amount: response.charged_amount,\n payment_type: response.payment_type,\n },\n };\n onSuccess(result);\n } else {\n const error: PaymentError = {\n code: response.status === 'cancelled' ? 'CANCELLED' : 'PAYMENT_FAILED',\n message: response.status === 'cancelled' ? 'Payment was cancelled' : 'Payment failed',\n recoverable: true,\n };\n onError(error);\n }\n },\n onclose: () => {\n onClose();\n },\n });\n } catch (err) {\n const error: PaymentError = {\n code: 'PSP_ERROR',\n message: 'Failed to initialize Flutterwave',\n recoverable: true,\n originalError: err,\n };\n onError(error);\n }\n }, [\n publicKey,\n amount,\n currency,\n reference,\n email,\n phone,\n name,\n paymentOptions,\n title,\n description,\n logo,\n metadata,\n onSuccess,\n onError,\n onClose,\n ]);\n\n useEffect(() => {\n if (autoStart && !initialized.current) {\n initialized.current = true;\n startPayment();\n }\n }, [autoStart, startPayment]);\n\n return (\n <div className=\"reevit-psp-bridge reevit-psp-bridge--flutterwave\">\n <div className=\"reevit-psp-bridge__loading\">\n <div className=\"reevit-spinner\" />\n <p>Connecting to Flutterwave...</p>\n </div>\n </div>\n );\n}\n\nexport { loadFlutterwaveScript };\n","/**\n * StripeBridge.tsx\n * React component for Stripe payment integration\n */\n\nimport { useEffect, useState, useCallback, useRef } from 'react';\n\ndeclare global {\n interface Window {\n Stripe?: (publishableKey: string) => StripeInstance;\n }\n}\n\ninterface StripeInstance {\n elements: (options?: { clientSecret: string; appearance?: StripeAppearance }) => StripeElements;\n confirmPayment: (options: {\n elements: StripeElements;\n confirmParams?: { return_url?: string };\n redirect?: 'if_required';\n }) => Promise<{ error?: StripeError; paymentIntent?: { id: string; status: string } }>;\n}\n\ninterface StripeElements {\n create: (type: 'payment' | 'card', options?: Record<string, unknown>) => StripeElement;\n getElement: (type: string) => StripeElement | null;\n submit: () => Promise<{ error?: StripeError }>;\n}\n\ninterface StripeElement {\n mount: (selector: string | HTMLElement) => void;\n unmount: () => void;\n on: (event: string, handler: (e: any) => void) => void;\n destroy: () => void;\n}\n\ninterface StripeError {\n type: string;\n message: string;\n code?: string;\n}\n\ninterface StripeAppearance {\n theme?: 'stripe' | 'night' | 'flat';\n variables?: Record<string, string>;\n rules?: Record<string, Record<string, string>>;\n}\n\nexport interface StripeBridgeProps {\n publishableKey: string;\n clientSecret: string;\n amount: number;\n currency: string;\n appearance?: StripeAppearance;\n onSuccess: (result: { paymentIntentId: string; status: string }) => void;\n onError: (error: { code: string; message: string }) => void;\n onReady?: () => void;\n onCancel?: () => void;\n}\n\nconst STRIPE_SCRIPT_URL = 'https://js.stripe.com/v3/';\nlet stripeScriptPromise: Promise<void> | null = null;\n\nexport function loadStripeScript(): Promise<void> {\n if (stripeScriptPromise) return stripeScriptPromise;\n\n if (document.getElementById('stripe-js-script')) {\n stripeScriptPromise = Promise.resolve();\n return stripeScriptPromise;\n }\n\n stripeScriptPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.id = 'stripe-js-script';\n script.src = STRIPE_SCRIPT_URL;\n script.async = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load Stripe.js'));\n document.head.appendChild(script);\n });\n\n return stripeScriptPromise;\n}\n\nexport function StripeBridge({\n publishableKey,\n clientSecret,\n amount,\n currency,\n appearance,\n onSuccess,\n onError,\n onReady,\n onCancel,\n}: StripeBridgeProps) {\n const [isLoading, setIsLoading] = useState(true);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const stripeRef = useRef<StripeInstance | null>(null);\n const elementsRef = useRef<StripeElements | null>(null);\n const paymentElementRef = useRef<StripeElement | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n let mounted = true;\n\n const initStripe = async () => {\n try {\n await loadStripeScript();\n\n if (!mounted || !window.Stripe) {\n throw new Error('Stripe not available');\n }\n\n stripeRef.current = window.Stripe(publishableKey);\n\n elementsRef.current = stripeRef.current.elements({\n clientSecret,\n appearance: appearance || { theme: 'stripe' },\n });\n\n paymentElementRef.current = elementsRef.current.create('payment');\n\n if (containerRef.current) {\n paymentElementRef.current.mount(containerRef.current);\n }\n\n paymentElementRef.current.on('ready', () => {\n if (mounted) {\n setIsLoading(false);\n onReady?.();\n }\n });\n\n paymentElementRef.current.on('change', (event: any) => {\n if (event.error) {\n setError(event.error.message);\n } else {\n setError(null);\n }\n });\n } catch (err) {\n if (mounted) {\n const message = err instanceof Error ? err.message : 'Failed to initialize Stripe';\n setError(message);\n setIsLoading(false);\n onError({ code: 'STRIPE_INIT_ERROR', message });\n }\n }\n };\n\n initStripe();\n\n return () => {\n mounted = false;\n paymentElementRef.current?.destroy();\n };\n }, [publishableKey, clientSecret, appearance, onReady, onError]);\n\n const handleSubmit = useCallback(async () => {\n if (!stripeRef.current || !elementsRef.current) {\n onError({ code: 'NOT_INITIALIZED', message: 'Stripe not initialized' });\n return;\n }\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n // Validate the form first\n const { error: submitError } = await elementsRef.current.submit();\n if (submitError) {\n setError(submitError.message);\n onError({ code: submitError.code || 'VALIDATION_ERROR', message: submitError.message });\n setIsSubmitting(false);\n return;\n }\n\n // Confirm the payment\n const { error: confirmError, paymentIntent } = await stripeRef.current.confirmPayment({\n elements: elementsRef.current,\n redirect: 'if_required',\n });\n\n if (confirmError) {\n setError(confirmError.message);\n onError({ code: confirmError.code || 'PAYMENT_ERROR', message: confirmError.message });\n } else if (paymentIntent) {\n onSuccess({\n paymentIntentId: paymentIntent.id,\n status: paymentIntent.status,\n });\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Payment failed';\n setError(message);\n onError({ code: 'UNKNOWN_ERROR', message });\n } finally {\n setIsSubmitting(false);\n }\n }, [onSuccess, onError]);\n\n return (\n <div className=\"reevit-stripe-bridge\">\n {isLoading && (\n <div className=\"reevit-stripe-loading\">\n <div className=\"reevit-spinner\" />\n <p>Loading secure payment form...</p>\n </div>\n )}\n\n <div\n ref={containerRef}\n className=\"reevit-stripe-element\"\n style={{ display: isLoading ? 'none' : 'block', minHeight: '200px' }}\n />\n\n {error && (\n <div className=\"reevit-stripe-error\">\n <p>{error}</p>\n </div>\n )}\n\n <div className=\"reevit-stripe-actions\">\n <button\n type=\"button\"\n className=\"reevit-submit-btn\"\n onClick={handleSubmit}\n disabled={isLoading || isSubmitting}\n >\n {isSubmitting ? (\n <span className=\"reevit-spinner\" />\n ) : (\n <>Pay {currency} {(amount / 100).toFixed(2)}</>\n )}\n </button>\n\n {onCancel && (\n <button\n type=\"button\"\n className=\"reevit-cancel-btn\"\n onClick={onCancel}\n disabled={isSubmitting}\n >\n Cancel\n </button>\n )}\n </div>\n </div>\n );\n}\n","/**\n * MonnifyBridge.tsx\n * React component for Monnify payment integration (Nigeria)\n */\n\nimport { useEffect, useCallback, useState } from 'react';\n\ndeclare global {\n interface Window {\n MonnifySDK?: {\n initialize: (config: MonnifyConfig) => void;\n };\n }\n}\n\ninterface MonnifyConfig {\n amount: number;\n currency: string;\n reference: string;\n customerName: string;\n customerEmail: string;\n customerMobileNumber?: string;\n apiKey: string;\n contractCode: string;\n paymentDescription?: string;\n isTestMode?: boolean;\n metadata?: Record<string, unknown>;\n onComplete: (response: MonnifyResponse) => void;\n onClose: () => void;\n}\n\ninterface MonnifyResponse {\n status: 'SUCCESS' | 'FAILED' | 'PENDING';\n message: string;\n transactionReference: string;\n paymentReference: string;\n authorizedAmount?: number;\n paymentStatus?: string;\n}\n\nexport interface MonnifyBridgeProps {\n apiKey: string;\n contractCode: string;\n amount: number;\n currency: string;\n reference: string;\n customerName: string;\n customerEmail: string;\n customerPhone?: string;\n paymentDescription?: string;\n isTestMode?: boolean;\n metadata?: Record<string, unknown>;\n autoOpen?: boolean;\n onSuccess: (result: {\n transactionReference: string;\n paymentReference: string;\n amount: number;\n }) => void;\n onError: (error: { code: string; message: string }) => void;\n onClose?: () => void;\n}\n\nconst MONNIFY_SCRIPT_URL = 'https://sdk.monnify.com/plugin/monnify.js';\nlet monnifyScriptPromise: Promise<void> | null = null;\n\nexport function loadMonnifyScript(): Promise<void> {\n if (monnifyScriptPromise) return monnifyScriptPromise;\n\n if (document.getElementById('monnify-sdk-script')) {\n monnifyScriptPromise = Promise.resolve();\n return monnifyScriptPromise;\n }\n\n monnifyScriptPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.id = 'monnify-sdk-script';\n script.src = MONNIFY_SCRIPT_URL;\n script.async = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load Monnify SDK'));\n document.head.appendChild(script);\n });\n\n return monnifyScriptPromise;\n}\n\nexport function MonnifyBridge({\n apiKey,\n contractCode,\n amount,\n currency,\n reference,\n customerName,\n customerEmail,\n customerPhone,\n paymentDescription,\n isTestMode = false,\n metadata,\n autoOpen = true,\n onSuccess,\n onError,\n onClose,\n}: MonnifyBridgeProps) {\n const [isLoading, setIsLoading] = useState(true);\n const [isReady, setIsReady] = useState(false);\n\n const openMonnify = useCallback(async () => {\n try {\n await loadMonnifyScript();\n\n if (!window.MonnifySDK) {\n throw new Error('Monnify SDK not available');\n }\n\n window.MonnifySDK.initialize({\n amount,\n currency: currency || 'NGN',\n reference,\n customerName,\n customerEmail,\n customerMobileNumber: customerPhone,\n apiKey,\n contractCode,\n paymentDescription: paymentDescription || 'Payment',\n isTestMode,\n metadata,\n onComplete: (response: MonnifyResponse) => {\n if (response.status === 'SUCCESS') {\n onSuccess({\n transactionReference: response.transactionReference,\n paymentReference: response.paymentReference,\n amount: response.authorizedAmount || amount,\n });\n } else {\n onError({\n code: 'MONNIFY_PAYMENT_FAILED',\n message: response.message || 'Payment was not successful',\n });\n }\n },\n onClose: () => {\n onClose?.();\n },\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to open Monnify';\n onError({ code: 'MONNIFY_INIT_ERROR', message });\n }\n }, [\n amount, currency, reference, customerName, customerEmail, customerPhone,\n apiKey, contractCode, paymentDescription, isTestMode, metadata,\n onSuccess, onError, onClose\n ]);\n\n useEffect(() => {\n const init = async () => {\n try {\n await loadMonnifyScript();\n setIsReady(true);\n setIsLoading(false);\n\n if (autoOpen) {\n openMonnify();\n }\n } catch (err) {\n setIsLoading(false);\n const message = err instanceof Error ? err.message : 'Failed to load Monnify';\n onError({ code: 'MONNIFY_LOAD_ERROR', message });\n }\n };\n\n init();\n }, [autoOpen, openMonnify, onError]);\n\n if (isLoading) {\n return (\n <div className=\"reevit-monnify-bridge\">\n <div className=\"reevit-monnify-loading\">\n <div className=\"reevit-spinner\" />\n <p>Loading Monnify checkout...</p>\n </div>\n </div>\n );\n }\n\n if (!autoOpen && isReady) {\n return (\n <div className=\"reevit-monnify-bridge\">\n <button\n type=\"button\"\n className=\"reevit-submit-btn\"\n onClick={openMonnify}\n >\n Pay with Monnify\n </button>\n </div>\n );\n }\n\n return null;\n}\n","/**\n * MPesaBridge.tsx\n * React component for M-Pesa STK Push integration (Kenya/Tanzania)\n * \n * Note: M-Pesa uses server-to-server STK Push initiated by the backend.\n * This component handles the UI flow while the customer approves on their phone.\n */\n\nimport { useState, useCallback } from 'react';\n\nexport interface MPesaBridgeProps {\n /** API endpoint to initiate STK Push (your backend) */\n apiEndpoint: string;\n /** Customer phone number in format 254XXXXXXXXX */\n phoneNumber: string;\n /** Amount to charge */\n amount: number;\n /** Currency (KES or TZS) */\n currency: string;\n /** Unique transaction reference */\n reference: string;\n /** Payment description */\n description?: string;\n /** Called when STK Push is successfully sent */\n onInitiated?: (checkoutRequestId: string) => void;\n /** Called when payment is confirmed (via webhook/polling) */\n onSuccess: (result: { transactionId: string; reference: string }) => void;\n /** Called on error */\n onError: (error: { code: string; message: string }) => void;\n /** Custom headers for API calls (e.g., authorization) */\n headers?: Record<string, string>;\n}\n\ntype MPesaState = 'idle' | 'initiating' | 'waiting' | 'success' | 'failed';\n\nexport function MPesaBridge({\n apiEndpoint,\n phoneNumber,\n amount,\n currency,\n reference,\n description,\n onInitiated,\n onSuccess,\n onError,\n headers = {},\n}: MPesaBridgeProps) {\n const [state, setState] = useState<MPesaState>('idle');\n const [error, setError] = useState<string | null>(null);\n const [checkoutRequestId, setCheckoutRequestId] = useState<string | null>(null);\n\n const initiateSTKPush = useCallback(async () => {\n setState('initiating');\n setError(null);\n\n try {\n const response = await fetch(apiEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: JSON.stringify({\n phone_number: phoneNumber,\n amount,\n currency,\n reference,\n description: description || `Payment ${reference}`,\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Request failed: ${response.status}`);\n }\n\n const data = await response.json();\n const requestId = data.checkout_request_id || data.checkoutRequestId || data.transaction_id;\n\n setCheckoutRequestId(requestId);\n setState('waiting');\n onInitiated?.(requestId);\n\n // Note: Success will come via webhook or polling on parent component\n // This bridge just handles the UI for initiating the push\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to initiate M-Pesa payment';\n setError(message);\n setState('failed');\n onError({ code: 'MPESA_INIT_ERROR', message });\n }\n }, [apiEndpoint, phoneNumber, amount, currency, reference, description, headers, onInitiated, onError]);\n\n const handleRetry = useCallback(() => {\n setState('idle');\n setError(null);\n initiateSTKPush();\n }, [initiateSTKPush]);\n\n // Idle state - show initiate button\n if (state === 'idle') {\n return (\n <div className=\"reevit-mpesa-bridge\">\n <div className=\"reevit-mpesa-info\">\n <div className=\"reevit-mpesa-icon\">πŸ“±</div>\n <h3>Pay with M-Pesa</h3>\n <p>You will receive a prompt on your phone to complete the payment.</p>\n <p className=\"reevit-mpesa-phone\">Phone: {phoneNumber}</p>\n </div>\n <button\n type=\"button\"\n className=\"reevit-submit-btn reevit-mpesa-btn\"\n onClick={initiateSTKPush}\n >\n Send Payment Request\n </button>\n </div>\n );\n }\n\n // Initiating state - show loading\n if (state === 'initiating') {\n return (\n <div className=\"reevit-mpesa-bridge\">\n <div className=\"reevit-mpesa-loading\">\n <div className=\"reevit-spinner reevit-spinner--large\" />\n <p>Sending payment request to your phone...</p>\n </div>\n </div>\n );\n }\n\n // Waiting state - customer should check their phone\n if (state === 'waiting') {\n return (\n <div className=\"reevit-mpesa-bridge\">\n <div className=\"reevit-mpesa-waiting\">\n <div className=\"reevit-mpesa-phone-icon\">πŸ“²</div>\n <h3>Check Your Phone</h3>\n <p>\n An M-Pesa payment request has been sent to <strong>{phoneNumber}</strong>.\n </p>\n <ol className=\"reevit-mpesa-steps\">\n <li>Check for the M-Pesa prompt on your phone</li>\n <li>Enter your M-Pesa PIN to authorize</li>\n <li>Wait for confirmation</li>\n </ol>\n <div className=\"reevit-mpesa-waiting-indicator\">\n <div className=\"reevit-spinner\" />\n <span>Waiting for payment confirmation...</span>\n </div>\n {checkoutRequestId && (\n <p className=\"reevit-mpesa-ref\">Request ID: {checkoutRequestId}</p>\n )}\n </div>\n </div>\n );\n }\n\n // Failed state - show error and retry\n if (state === 'failed') {\n return (\n <div className=\"reevit-mpesa-bridge\">\n <div className=\"reevit-mpesa-error\">\n <div className=\"reevit-error-icon\">⚠️</div>\n <h3>Payment Request Failed</h3>\n <p>{error || 'Something went wrong. Please try again.'}</p>\n <button\n type=\"button\"\n className=\"reevit-retry-btn\"\n onClick={handleRetry}\n >\n Try Again\n </button>\n </div>\n </div>\n );\n }\n\n return null;\n}\n\n/**\n * Hook for M-Pesa payment status polling\n * Use this to check payment status after STK Push is initiated\n */\nexport function useMPesaStatusPolling(\n statusEndpoint: string,\n checkoutRequestId: string | null,\n options: {\n interval?: number;\n maxAttempts?: number;\n headers?: Record<string, string>;\n onSuccess: (result: { transactionId: string }) => void;\n onFailed: (error: { message: string }) => void;\n onTimeout: () => void;\n }\n) {\n const { interval = 5000, maxAttempts = 24, headers = {}, onSuccess, onFailed, onTimeout } = options;\n\n const startPolling = useCallback(async () => {\n if (!checkoutRequestId) return;\n\n let attempts = 0;\n\n const poll = async () => {\n if (attempts >= maxAttempts) {\n onTimeout();\n return;\n }\n\n try {\n const response = await fetch(`${statusEndpoint}?checkout_request_id=${checkoutRequestId}`, {\n headers,\n });\n\n if (!response.ok) {\n attempts++;\n setTimeout(poll, interval);\n return;\n }\n\n const data = await response.json();\n\n if (data.status === 'success' || data.status === 'completed') {\n onSuccess({ transactionId: data.transaction_id || data.mpesa_receipt });\n } else if (data.status === 'failed' || data.status === 'cancelled') {\n onFailed({ message: data.message || 'Payment failed or was cancelled' });\n } else {\n // Still pending, continue polling\n attempts++;\n setTimeout(poll, interval);\n }\n } catch {\n attempts++;\n setTimeout(poll, interval);\n }\n };\n\n poll();\n }, [checkoutRequestId, statusEndpoint, interval, maxAttempts, headers, onSuccess, onFailed, onTimeout]);\n\n return { startPolling };\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/index.ts","../src/api/client.ts","../src/hooks/useReevit.ts","../src/components/PaymentMethodSelector.tsx","../src/components/MobileMoneyForm.tsx","../src/bridges/PaystackBridge.tsx","../src/components/ReevitCheckout.tsx","../src/bridges/HubtelBridge.tsx","../src/bridges/FlutterwaveBridge.tsx","../src/bridges/StripeBridge.tsx","../src/bridges/MonnifyBridge.tsx","../src/bridges/MPesaBridge.tsx"],"names":["useEffect","useCallback","jsxs","jsx","useRef","useState","result","error"],"mappings":";;;;;;AAOO,SAAS,YAAA,CAAa,QAAgB,QAAA,EAA0B;AACrE,EAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS;AAAA,IAC/C,KAAA,EAAO,UAAA;AAAA,IACP,QAAA;AAAA,IACA,qBAAA,EAAuB;AAAA,GACxB,CAAA;AAGD,EAAA,OAAO,SAAA,CAAU,MAAA,CAAO,MAAA,GAAS,GAAG,CAAA;AACtC;AAKO,SAAS,iBAAA,GAA4B;AAC1C,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAA;AACxC,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,CAAC,CAAA;AACxD,EAAA,OAAO,CAAA,OAAA,EAAU,SAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AACtC;AAKO,SAAS,aAAA,CAAc,OAAe,OAAA,EAA2B;AAEtE,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAG1C,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,GAAA,EAAK,oCAAA;AAAA,IACL,QAAA,EAAU,8BAAA;AAAA,IACV,UAAA,EAAY;AAAA,GACd;AAEA,EAAA,IAAI,OAAA,IAAW,QAAA,CAAS,OAAgC,CAAA,EAAG;AACzD,IAAA,OAAO,QAAA,CAAS,OAAgC,CAAA,CAAE,IAAA,CAAK,OAAO,CAAA;AAAA,EAChE;AAGA,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,OAAA,KAAY,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAC,CAAA;AACxE;AAKO,SAAS,YAAY,KAAA,EAAuB;AACjD,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAG1C,EAAA,IAAI,QAAQ,UAAA,CAAW,GAAG,CAAA,IAAK,OAAA,CAAQ,WAAW,EAAA,EAAI;AACpD,IAAA,OAAO,GAAG,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,EAC1E;AAGA,EAAA,IAAI,QAAQ,UAAA,CAAW,MAAM,CAAA,IAAK,OAAA,CAAQ,WAAW,EAAA,EAAI;AACvD,IAAA,OAAO,CAAA,EAAG,QAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,EACjG;AAEA,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,cAAc,KAAA,EAA8B;AAC1D,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAE1C,EAAA,MAAM,QAAA,GAAqC;AAAA,IACzC,GAAA,EAAK,CAAC,KAAA,EAAO,KAAA,EAAO,OAAO,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA;AAAA,IACpE,QAAA,EAAU,CAAC,KAAA,EAAO,KAAA,EAAO,SAAS,OAAO,CAAA;AAAA,IACzC,UAAA,EAAY,CAAC,KAAA,EAAO,KAAA,EAAO,OAAO,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,OAAO;AAAA,GAC7E;AAEA,EAAA,KAAA,MAAW,CAAC,OAAA,EAAS,eAAe,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACjE,IAAA,KAAA,MAAW,UAAU,eAAA,EAAiB;AACpC,MAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA,IAAK,OAAA,CAAQ,UAAA,CAAW,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG;AAC3E,QAAA,OAAO,OAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,qBAAqB,KAAA,EAAmE;AACtG,EAAA,MAAM,YAAoC,EAAC;AAE3C,EAAA,IAAI,MAAM,YAAA,EAAc;AACtB,IAAA,SAAA,CAAU,kBAAkB,IAAI,KAAA,CAAM,YAAA;AAAA,EACxC;AACA,EAAA,IAAI,MAAM,eAAA,EAAiB;AACzB,IAAA,SAAA,CAAU,qBAAqB,IAAI,KAAA,CAAM,eAAA;AAAA,EAC3C;AACA,EAAA,IAAI,MAAM,SAAA,EAAW;AACnB,IAAA,SAAA,CAAU,eAAe,IAAI,KAAA,CAAM,SAAA;AAAA,EACrC;AACA,EAAA,IAAI,MAAM,YAAA,EAAc;AACtB,IAAA,SAAA,CAAU,iBAAiB,IAAI,KAAA,CAAM,YAAA;AAAA,EACvC;AACA,EAAA,IAAI,MAAM,UAAA,EAAY;AACpB,IAAA,SAAA,CAAU,eAAe,IAAI,KAAA,CAAM,UAAA;AAAA,EACrC;AAEA,EAAA,OAAO,SAAA;AACT;AAKO,SAAS,MAAM,OAAA,EAAiD;AACrE,EAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACzC;;;ACxCA,IAAM,uBAAA,GAA0B,uBAAA;AAChC,IAAM,oBAAA,GAAuB,+BAAA;AAC7B,IAAM,eAAA,GAAkB,GAAA;AAKxB,SAAS,aAAa,SAAA,EAA4B;AAEhD,EAAA,OAAO,SAAA,CAAU,UAAA,CAAW,UAAU,CAAA,IACpC,UAAU,UAAA,CAAW,aAAa,CAAA,IAClC,SAAA,CAAU,UAAA,CAAW,WAAW,CAAA,IAChC,SAAA,CAAU,WAAW,cAAc,CAAA;AACvC;AAKA,SAAS,kBAAA,CAAmB,UAAoB,SAAA,EAA2C;AACzF,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAU,IAAA,IAAQ,WAAA;AAAA,IACxB,OAAA,EAAS,UAAU,OAAA,IAAW,8BAAA;AAAA,IAC9B,OAAA,EAAS;AAAA,MACP,YAAY,QAAA,CAAS,MAAA;AAAA,MACrB,GAAG,SAAA,CAAU;AAAA;AACf,GACF;AACF;AAKO,IAAM,kBAAN,MAAsB;AAAA,EAK3B,YAAY,MAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,SAAA;AACxB,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA,KAAY,aAAa,MAAA,CAAO,SAAS,IAC3D,oBAAA,GACA,uBAAA,CAAA;AACJ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,eAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,OAAA,CACZ,MAAA,EACA,IAAA,EACA,IAAA,EAC6C;AAC7C,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,OAAO,CAAA;AAGnE,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,gBAAgB,IAAA,CAAK,SAAA;AAAA,MACrB,iBAAA,EAAmB,eAAA;AAAA,MACnB,yBAAA,EAA2B;AAAA,KAC7B;AAGA,IAAA,IAAI,MAAA,KAAW,MAAA,IAAU,MAAA,KAAW,OAAA,IAAW,WAAW,KAAA,EAAO;AAC/D,MAAA,OAAA,CAAQ,iBAAiB,CAAA,GAAI,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,IAC3F;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI;AAAA,QACrD,MAAA;AAAA,QACA,OAAA;AAAA,QACA,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,QACpC,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAE3D,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,kBAAA,CAAmB,QAAA,EAAU,YAAgC;AAAA,SACtE;AAAA,MACF;AAEA,MAAA,OAAO,EAAE,MAAM,YAAA,EAAkB;AAAA,IACnC,SAAS,GAAA,EAAK;AACZ,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,eAAe,KAAA,EAAO;AACxB,QAAA,IAAI,GAAA,CAAI,SAAS,YAAA,EAAc;AAC7B,UAAA,OAAO;AAAA,YACL,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,iBAAA;AAAA,cACN,OAAA,EAAS;AAAA;AACX,WACF;AAAA,QACF;AAEA,QAAA,IAAI,GAAA,CAAI,QAAQ,QAAA,CAAS,iBAAiB,KAAK,GAAA,CAAI,OAAA,CAAQ,QAAA,CAAS,cAAc,CAAA,EAAG;AACnF,UAAA,OAAO;AAAA,YACL,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,eAAA;AAAA,cACN,OAAA,EAAS;AAAA;AACX,WACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,eAAA;AAAA,UACN,OAAA,EAAS;AAAA;AACX,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAA,CACJ,MAAA,EACA,MAAA,EACA,UAAkB,IAAA,EAC+C;AAEjE,IAAA,MAAM,QAAA,GAAoC,EAAE,GAAG,MAAA,CAAO,QAAA,EAAS;AAC/D,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,QAAA,CAAS,iBAAiB,MAAA,CAAO,KAAA;AAAA,IACnC;AACA,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,QAAA,CAAS,iBAAiB,MAAA,CAAO,KAAA;AAAA,IACnC;AAEA,IAAA,MAAM,OAAA,GAAsC;AAAA,MAC1C,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,MAAA,EAAQ,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAA;AAAA,MACpC,OAAA;AAAA,MACA,WAAA,EAAa,MAAA,CAAO,KAAA,IAAU,MAAA,CAAO,QAAA,EAAU,UAAA;AAAA,MAC/C;AAAA,KACF;AAEA,IAAA,OAAO,IAAA,CAAK,OAAA,CAA+B,MAAA,EAAQ,sBAAA,EAAwB,OAAO,CAAA;AAAA,EACpF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,SAAA,EAAoF;AACzG,IAAA,OAAO,IAAA,CAAK,OAAA,CAA+B,KAAA,EAAO,CAAA,aAAA,EAAgB,SAAS,CAAA,CAAE,CAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,SAAA,EAAoF;AACvG,IAAA,OAAO,IAAA,CAAK,OAAA,CAA+B,MAAA,EAAQ,CAAA,aAAA,EAAgB,SAAS,CAAA,QAAA,CAAU,CAAA;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,SAAA,EAAoF;AAC5G,IAAA,OAAO,IAAA,CAAK,OAAA,CAA+B,MAAA,EAAQ,CAAA,aAAA,EAAgB,SAAS,CAAA,OAAA,CAAS,CAAA;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,MAAA,EAA+B;AACtD,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,MAAA;AACH,QAAA,OAAO,MAAA;AAAA,MACT,KAAK,cAAA;AACH,QAAA,OAAO,cAAA;AAAA,MACT,KAAK,eAAA;AACH,QAAA,OAAO,eAAA;AAAA,MACT;AACE,QAAA,OAAO,MAAA;AAAA;AACX,EACF;AACF;AAKO,SAAS,mBAAmB,MAAA,EAAgD;AACjF,EAAA,OAAO,IAAI,gBAAgB,MAAM,CAAA;AACnC;;;AC1OA,IAAM,YAAA,GAA4B;AAAA,EAChC,MAAA,EAAQ,MAAA;AAAA,EACR,aAAA,EAAe,IAAA;AAAA,EACf,cAAA,EAAgB,IAAA;AAAA,EAChB,KAAA,EAAO,IAAA;AAAA,EACP,MAAA,EAAQ;AACV,CAAA;AAGA,SAAS,aAAA,CAAc,OAAoB,MAAA,EAAmC;AAC5E,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,YAAA;AACH,MAAA,OAAO,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,SAAA,EAAW,OAAO,IAAA,EAAK;AAAA,IACpD,KAAK,cAAA;AACH,MAAA,OAAO,EAAE,GAAG,KAAA,EAAO,QAAQ,OAAA,EAAS,aAAA,EAAe,OAAO,OAAA,EAAQ;AAAA,IACpE,KAAK,YAAA;AACH,MAAA,OAAO,EAAE,GAAG,KAAA,EAAO,QAAQ,QAAA,EAAU,KAAA,EAAO,OAAO,OAAA,EAAQ;AAAA,IAC7D,KAAK,eAAA;AACH,MAAA,OAAO,EAAE,GAAG,KAAA,EAAO,QAAQ,iBAAA,EAAmB,cAAA,EAAgB,OAAO,OAAA,EAAQ;AAAA,IAC/E,KAAK,eAAA;AACH,MAAA,OAAO,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,YAAA,EAAc,OAAO,IAAA,EAAK;AAAA,IACvD,KAAK,iBAAA;AACH,MAAA,OAAO,EAAE,GAAG,KAAA,EAAO,QAAQ,SAAA,EAAW,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,IAC/D,KAAK,eAAA;AACH,MAAA,OAAO,EAAE,GAAG,KAAA,EAAO,QAAQ,QAAA,EAAU,KAAA,EAAO,OAAO,OAAA,EAAQ;AAAA,IAC7D,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,GAAG,YAAA,EAAc,QAAQ,OAAA,EAAS,aAAA,EAAe,MAAM,aAAA,EAAc;AAAA,IAChF,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAS;AAAA,IACtC;AACE,MAAA,OAAO,KAAA;AAAA;AAEb;AAeA,SAAS,iBAAiB,QAAA,EAAyD;AACjF,EAAA,MAAM,aAAA,GAAgB,SAAS,WAAA,EAAY;AAC3C,EAAA,IAAI,aAAA,CAAc,QAAA,CAAS,UAAU,CAAA,EAAG,OAAO,UAAA;AAC/C,EAAA,IAAI,aAAA,CAAc,QAAA,CAAS,QAAQ,CAAA,EAAG,OAAO,QAAA;AAC7C,EAAA,IAAI,aAAA,CAAc,QAAA,CAAS,aAAa,CAAA,EAAG,OAAO,aAAA;AAElD,EAAA,OAAO,UAAA;AACT;AAKA,SAAS,kBAAA,CACP,UACA,MAAA,EACe;AACf,EAAA,OAAO;AAAA,IACL,IAAI,QAAA,CAAS,EAAA;AAAA,IACb,cAAc,QAAA,CAAS,aAAA;AAAA,IACvB,cAAc,QAAA,CAAS,cAAA;AAAA,IACvB,QAAQ,QAAA,CAAS,MAAA;AAAA,IACjB,UAAU,QAAA,CAAS,QAAA;AAAA,IACnB,QAAQ,QAAA,CAAS,MAAA;AAAA,IACjB,cAAA,EAAgB,gBAAA,CAAiB,QAAA,CAAS,QAAQ,CAAA;AAAA,IAClD,gBAAA,EAAkB,MAAA,CAAO,cAAA,IAAkB,CAAC,QAAQ,cAAc,CAAA;AAAA,IAClE,cAAc,QAAA,CAAS,aAAA;AAAA,IACvB,UAAU,QAAA,CAAS,QAAA;AAAA,IACnB,WAAW,QAAA,CAAS,UAAA;AAAA,IACpB,aAAa,QAAA,CAAS,YAAA;AAAA,IACtB,WAAW,QAAA,CAAS,UAAA;AAAA,IACpB,UAAU,MAAA,CAAO;AAAA,GACnB;AACF;AAEO,SAAS,UAAU,OAAA,EAA2B;AACnD,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAW,SAAS,OAAA,EAAS,aAAA,EAAe,YAAW,GAAI,OAAA;AAC3E,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,UAAA,CAAW,eAAe,YAAY,CAAA;AAGhE,EAAA,MAAM,YAAA,GAAe,OAA+B,IAAI,CAAA;AAGxD,EAAA,MAAM,eAAA,GAAkB,OAAO,KAAK,CAAA;AAGpC,EAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AACzB,IAAA,YAAA,CAAa,OAAA,GAAU,IAAI,eAAA,CAAgB;AAAA,MACzC,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAGA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,aAAA,GAAgB,MAAM,MAAM,CAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,KAAA,CAAM,MAAA,EAAQ,aAAa,CAAC,CAAA;AAGhC,EAAA,MAAM,UAAA,GAAa,WAAA;AAAA,IACjB,OAAO,MAAA,KAA2B;AAEhC,MAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,QAAA;AAAA,MACF;AACA,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAE1B,MAAA,QAAA,CAAS,EAAE,IAAA,EAAM,YAAA,EAAc,CAAA;AAE/B,MAAA,IAAI;AACF,QAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,eAAA,CAAgB,OAAA,GAAU,KAAA;AAC1B,UAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,QAC9C;AAGA,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,SAAA,IAAa,iBAAA,EAAkB;AAGxD,QAAA,MAAM,OAAA,GAAU,yBAAA,CAA0B,MAAA,CAAO,QAAQ,CAAA;AAGzD,QAAA,MAAM,aAAA,GAAgB,MAAA,IAAU,MAAA,CAAO,cAAA,GAAiB,CAAC,CAAA,IAAK,MAAA;AAG9D,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,SAAA,CAAU,mBAAA;AAAA,UACtC,EAAE,GAAG,MAAA,EAAQ,SAAA,EAAU;AAAA,UACvB,aAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,QAAA,CAAS,EAAE,IAAA,EAAM,YAAA,EAAc,OAAA,EAAS,OAAO,CAAA;AAC/C,UAAA,OAAA,GAAU,KAAK,CAAA;AACf,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA,MAAM,WAAA,GAA4B;AAAA,YAChC,IAAA,EAAM,aAAA;AAAA,YACN,OAAA,EAAS,2BAAA;AAAA,YACT,WAAA,EAAa;AAAA,WACf;AACA,UAAA,QAAA,CAAS,EAAE,IAAA,EAAM,YAAA,EAAc,OAAA,EAAS,aAAa,CAAA;AACrD,UAAA,OAAA,GAAU,WAAW,CAAA;AACrB,UAAA,eAAA,CAAgB,OAAA,GAAU,KAAA;AAC1B,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,gBAAgB,kBAAA,CAAmB,IAAA,EAAM,EAAE,GAAG,MAAA,EAAQ,WAAW,CAAA;AAEvE,QAAA,QAAA,CAAS,EAAE,IAAA,EAAM,cAAA,EAAgB,OAAA,EAAS,eAAe,CAAA;AAAA,MAE3D,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,KAAA,GAAsB;AAAA,UAC1B,IAAA,EAAM,aAAA;AAAA,UACN,OAAA,EAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,+BAAA;AAAA,UAC9C,WAAA,EAAa,IAAA;AAAA,UACb,aAAA,EAAe;AAAA,SACjB;AACA,QAAA,QAAA,CAAS,EAAE,IAAA,EAAM,YAAA,EAAc,OAAA,EAAS,OAAO,CAAA;AAC/C,QAAA,OAAA,GAAU,KAAK,CAAA;AACf,QAAA,eAAA,CAAgB,OAAA,GAAU,KAAA;AAAA,MAC5B;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,OAAA,EAAS,UAAU;AAAA,GAC9B;AAGA,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,MAAA,KAA0B;AAC1D,IAAA,QAAA,CAAS,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAS,QAAQ,CAAA;AAAA,EACrD,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,cAAA,GAAiB,WAAA;AAAA,IACrB,OAAO,WAAA,KAAyC;AAC9C,MAAA,IAAI,CAAC,KAAA,CAAM,aAAA,IAAiB,CAAC,MAAM,cAAA,EAAgB;AACjD,QAAA;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,EAAE,IAAA,EAAM,eAAA,EAAiB,CAAA;AAElC,MAAA,IAAI;AACF,QAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,QAC9C;AAGA,QAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,SAAA,CAAU,cAAA,CAAe,KAAA,CAAM,aAAA,CAAc,EAAE,CAAA;AAE7E,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,QAAA,CAAS,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAS,OAAO,CAAA;AAClD,UAAA,OAAA,GAAU,KAAK,CAAA;AACf,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,MAAA,GAAwB;AAAA,UAC5B,SAAA,EAAW,MAAM,aAAA,CAAc,EAAA;AAAA,UAC/B,WAAY,WAAA,CAAY,SAAA,IACrB,KAAA,CAAM,aAAA,CAAc,UAAU,SAAA,IAAwB,EAAA;AAAA,UACzD,MAAA,EAAQ,MAAM,aAAA,CAAc,MAAA;AAAA,UAC5B,QAAA,EAAU,MAAM,aAAA,CAAc,QAAA;AAAA,UAC9B,eAAe,KAAA,CAAM,cAAA;AAAA,UACrB,GAAA,EAAK,MAAM,aAAA,CAAc,cAAA;AAAA,UACzB,YAAA,EAAe,WAAA,CAAY,YAAA,IACxB,IAAA,EAAM,eAAA,IAA8B,EAAA;AAAA,UACvC,MAAA,EAAQ,SAAA;AAAA,UACR,QAAA,EAAU;AAAA,SACZ;AAEA,QAAA,QAAA,CAAS,EAAE,IAAA,EAAM,iBAAA,EAAmB,OAAA,EAAS,QAAQ,CAAA;AACrD,QAAA,SAAA,GAAY,MAAM,CAAA;AAAA,MACpB,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,KAAA,GAAsB;AAAA,UAC1B,IAAA,EAAM,gBAAA;AAAA,UACN,OAAA,EAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,mCAAA;AAAA,UAC9C,WAAA,EAAa,IAAA;AAAA,UACb,aAAA,EAAe;AAAA,SACjB;AACA,QAAA,QAAA,CAAS,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAS,OAAO,CAAA;AAClD,QAAA,OAAA,GAAU,KAAK,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,KAAA,CAAM,aAAA,EAAe,KAAA,CAAM,cAAA,EAAgB,WAAW,OAAO;AAAA,GAChE;AAGA,EAAA,MAAM,gBAAA,GAAmB,WAAA;AAAA,IACvB,OAAO,OAAA,KAAqC;AAC1C,MAAA,MAAM,eAAe,OAAO,CAAA;AAAA,IAC9B,CAAA;AAAA,IACA,CAAC,cAAc;AAAA,GACjB;AAGA,EAAA,MAAM,cAAA,GAAiB,WAAA;AAAA,IACrB,CAAC,KAAA,KAAwB;AACvB,MAAA,QAAA,CAAS,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAS,OAAO,CAAA;AAClD,MAAA,OAAA,GAAU,KAAK,CAAA;AAAA,IACjB,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAGA,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,IAAA,eAAA,CAAgB,OAAA,GAAU,KAAA;AAC1B,IAAA,QAAA,CAAS,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,EAC5B,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,KAAA,GAAQ,YAAY,YAAY;AAEpC,IAAA,IAAI,KAAA,CAAM,aAAA,IAAiB,KAAA,CAAM,MAAA,KAAW,SAAA,EAAW;AACrD,MAAA,IAAI;AACF,QAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAM,SAAA,CAAU,mBAAA,CAAoB,KAAA,CAAM,aAAA,CAAc,EAAE,CAAA;AAAA,QAC5D;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAC1B,IAAA,OAAA,IAAU;AAAA,EACZ,GAAG,CAAC,OAAA,EAAS,MAAM,aAAA,EAAe,KAAA,CAAM,MAAM,CAAC,CAAA;AAE/C,EAAA,OAAO;AAAA;AAAA,IAEL,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,eAAe,KAAA,CAAM,aAAA;AAAA,IACrB,gBAAgB,KAAA,CAAM,cAAA;AAAA,IACtB,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,QAAQ,KAAA,CAAM,MAAA;AAAA;AAAA,IAGd,UAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,gBAAA;AAAA,IACA,cAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA;AAAA,IAGA,SAAA,EAAW,KAAA,CAAM,MAAA,KAAW,SAAA,IAAa,MAAM,MAAA,KAAW,YAAA;AAAA,IAC1D,OAAA,EAAS,KAAA,CAAM,MAAA,KAAW,OAAA,IAAW,MAAM,MAAA,KAAW,iBAAA;AAAA,IACtD,UAAA,EAAY,MAAM,MAAA,KAAW,SAAA;AAAA,IAC7B,QAAA,EAAU,KAAA,CAAM,KAAA,EAAO,WAAA,IAAe;AAAA,GACxC;AACF;AAMA,SAAS,0BAA0B,QAAA,EAA0B;AAC3D,EAAA,MAAM,iBAAA,GAA4C;AAAA,IAChD,GAAA,EAAK,IAAA;AAAA;AAAA,IACL,GAAA,EAAK,IAAA;AAAA;AAAA,IACL,GAAA,EAAK,IAAA;AAAA;AAAA,IACL,GAAA,EAAK,IAAA;AAAA;AAAA,IACL,GAAA,EAAK,IAAA;AAAA;AAAA,IACL,GAAA,EAAK,IAAA;AAAA;AAAA,IACL,GAAA,EAAK,IAAA;AAAA;AAAA,IACL,GAAA,EAAK,IAAA;AAAA;AAAA,IACL,GAAA,EAAK,IAAA;AAAA;AAAA,IACL,GAAA,EAAK,IAAA;AAAA;AAAA,IACL,GAAA,EAAK;AAAA;AAAA,GACP;AAEA,EAAA,OAAO,iBAAA,CAAkB,QAAA,CAAS,WAAA,EAAa,CAAA,IAAK,IAAA;AACtD;ACzVA,IAAM,YAAA,GAA4F;AAAA,EAChG,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,WAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,KAAA,EAAO,cAAA;AAAA,IACP,IAAA,EAAM,WAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,aAAA,EAAe;AAAA,IACb,KAAA,EAAO,eAAA;AAAA,IACP,IAAA,EAAM,WAAA;AAAA,IACN,WAAA,EAAa;AAAA;AAEjB,CAAA;AAEO,SAAS,qBAAA,CAAsB;AAAA,EACpC,OAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,EAA+B;AAC7B,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,uBAAA,EAAqB,CAAA;AAAA,wBACnE,KAAA,EAAA,EAAI,SAAA,EAAU,mCACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AACvB,MAAA,MAAM,MAAA,GAAS,aAAa,MAAM,CAAA;AAClC,MAAA,MAAM,aAAa,cAAA,KAAmB,MAAA;AAEtC,MAAA,uBACE,IAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAW,EAAA;AAAA,YACT,sBAAA;AAAA,YACA,UAAA,IAAc,gCAAA;AAAA,YACd,QAAA,IAAY;AAAA,WACd;AAAA,UACA,OAAA,EAAS,MAAM,QAAA,CAAS,MAAM,CAAA;AAAA,UAC9B,QAAA;AAAA,UACA,cAAA,EAAc,UAAA;AAAA,UAEd,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA8B,QAAA,EAAA,MAAA,CAAO,IAAA,EAAK,CAAA;AAAA,4BAC1D,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EAA+B,QAAA,EAAA,MAAA,CAAO,KAAA,EAAM,CAAA;AAAA,8BAC5D,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EAAqC,iBAAO,WAAA,EAAY;AAAA,aAAA,EAC1E,CAAA;AAAA,YACC,UAAA,oBACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BACd,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,MAAK,MAAA,EACnD,QAAA,kBAAA,GAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,CAAA,EAAE,+BAAA;AAAA,gBACF,MAAA,EAAO,cAAA;AAAA,gBACP,WAAA,EAAY,GAAA;AAAA,gBACZ,aAAA,EAAc,OAAA;AAAA,gBACd,cAAA,EAAe;AAAA;AAAA,eAEnB,CAAA,EACF;AAAA;AAAA,SAAA;AAAA,QA3BG;AAAA,OA6BP;AAAA,IAEJ,CAAC,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;ACrEA,IAAM,QAAA,GAAsE;AAAA,EAC1E,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,OAAO,SAAA,EAAU;AAAA,EAC3C,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,UAAA,EAAY,OAAO,SAAA,EAAU;AAAA,EACrD,EAAE,EAAA,EAAI,YAAA,EAAc,IAAA,EAAM,YAAA,EAAc,OAAO,SAAA;AACjD,CAAA;AAEO,SAAS,eAAA,CAAgB;AAAA,EAC9B,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,YAAA,GAAe;AACjB,CAAA,EAAyB;AACvB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,YAAY,CAAA;AAC/C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAoC,IAAI,CAAA;AACtE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAG5C,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,MAAA,MAAM,QAAA,GAAW,cAAc,KAAK,CAAA;AACpC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,UAAA,CAAW,QAA8B,CAAA;AAAA,MAC3C;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAGV,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,WAAW,KAAA,EAAO;AACpB,MAAA,IAAI,CAAC,aAAA,CAAc,KAAK,CAAA,EAAG;AACzB,QAAA,QAAA,CAAS,yCAAyC,CAAA;AAAA,MACpD,WAAW,OAAA,IAAW,CAAC,aAAA,CAAc,KAAA,EAAO,OAAO,CAAA,EAAG;AACpD,QAAA,QAAA,CAAS,CAAA,8CAAA,CAAgD,CAAA;AAAA,MAC3D,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA,MACf;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,OAAA,EAAS,OAAO,CAAC,CAAA;AAE5B,EAAA,MAAM,iBAAA,GAAoBC,WAAAA,CAAY,CAAC,CAAA,KAA2C;AAChF,IAAA,MAAM,QAAQ,CAAA,CAAE,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,YAAY,EAAE,CAAA;AACnD,IAAA,QAAA,CAAS,KAAK,CAAA;AAAA,EAChB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAeA,WAAAA;AAAA,IACnB,CAAC,CAAA,KAAuB;AACtB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,UAAA,CAAW,IAAI,CAAA;AAEf,MAAA,IAAI,CAAC,KAAA,IAAS,CAAC,OAAA,EAAS;AACtB,QAAA,QAAA,CAAS,qDAAqD,CAAA;AAC9D,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,aAAA,CAAc,KAAA,EAAO,OAAO,CAAA,EAAG;AAClC,QAAA,QAAA,CAAS,2CAA2C,CAAA;AACpD,QAAA;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,EAAE,KAAA,EAAO,OAAA,EAAS,CAAA;AAAA,IAC7B,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,OAAA,EAAS,QAAQ;AAAA,GAC3B;AAEA,EAAA,MAAM,OAAA,GAAU,KAAA,IAAS,OAAA,IAAW,aAAA,CAAc,OAAO,OAAO,CAAA;AAEhE,EAAA,uBACEC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAmB,UAAU,YAAA,EAC3C,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,IAAC,OAAA,EAAA,EAAM,OAAA,EAAQ,cAAA,EAAe,SAAA,EAAU,2BAA0B,QAAA,EAAA,cAAA,EAElE,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAG,cAAA;AAAA,UACH,IAAA,EAAK,KAAA;AAAA,UACL,WAAW,EAAA,CAAG,yBAAA,EAA2B,CAAC,CAAC,SAAS,gCAAgC,CAAA;AAAA,UACpF,WAAA,EAAY,cAAA;AAAA,UACZ,KAAA,EAAO,KAAA;AAAA,UACP,QAAA,EAAU,iBAAA;AAAA,UACV,MAAA,EAAQ,MAAM,UAAA,CAAW,IAAI,CAAA;AAAA,UAC7B,QAAA,EAAU,SAAA;AAAA,UACV,YAAA,EAAa;AAAA;AAAA,OACf;AAAA,MACC,KAAA,IAAS,CAAC,KAAA,oBACTA,GAAAA,CAAC,SAAI,SAAA,EAAU,6BAAA,EAA+B,QAAA,EAAA,WAAA,CAAY,KAAK,CAAA,EAAE,CAAA;AAAA,MAElE,yBAASA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAA2B,QAAA,EAAA,KAAA,EAAM;AAAA,KAAA,EAC5D,CAAA;AAAA,oBAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,sBACzDA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BACZ,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,qBACbA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAW,EAAA;AAAA,YACT,oBAAA;AAAA,YACA,OAAA,KAAY,EAAE,EAAA,IAAM;AAAA,WACtB;AAAA,UACA,KAAA,EAAO,EAAE,iBAAA,EAAmB,CAAA,CAAE,KAAA,EAAM;AAAA,UACpC,OAAA,EAAS,MAAM,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAAA,UAC9B,QAAA,EAAU,SAAA;AAAA,UAET,QAAA,EAAA,CAAA,CAAE;AAAA,SAAA;AAAA,QAVE,CAAA,CAAE;AAAA,OAYV,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,kCAAA;AAAA,UACV,OAAA,EAAS,QAAA;AAAA,UACT,QAAA,EAAU,SAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,gCAAA;AAAA,UACV,QAAA,EAAU,CAAC,OAAA,IAAW,SAAA;AAAA,UAErB,sCACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAiB,CAAA,GAEjC;AAAA;AAAA;AAEJ,KAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0BAAyB,QAAA,EAAA,wEAAA,EAEtC;AAAA,GAAA,EACF,CAAA;AAEJ;ACpGA,SAAS,kBAAA,GAAoC;AAC3C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,IAAI,OAAO,WAAA,EAAa;AACtB,MAAA,OAAA,EAAQ;AACR,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,GAAA,GAAM,qCAAA;AACb,IAAA,MAAA,CAAO,KAAA,GAAQ,IAAA;AACf,IAAA,MAAA,CAAO,MAAA,GAAS,MAAM,OAAA,EAAQ;AAC9B,IAAA,MAAA,CAAO,UAAU,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,gCAAgC,CAAC,CAAA;AACzE,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,EAClC,CAAC,CAAA;AACH;AAEO,SAAS,cAAA,CAAe;AAAA,EAC7B,SAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,CAAC,MAAA,EAAQ,cAAc,CAAA;AAAA,EAClC,SAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAAwB;AACtB,EAAA,MAAM,WAAA,GAAcC,OAAO,KAAK,CAAA;AAEhC,EAAA,MAAM,YAAA,GAAeH,YAAY,YAAY;AAC3C,IAAA,IAAI;AAEF,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,MACjE;AACA,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,MAC3D;AACA,MAAA,IAAI,CAAC,MAAA,IAAU,MAAA,IAAU,CAAA,EAAG;AAC1B,QAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,MAClE;AAEA,MAAA,MAAM,kBAAA,EAAmB;AAEzB,MAAA,IAAI,CAAC,OAAO,WAAA,EAAa;AACvB,QAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAAA,MACxE;AAEA,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,WAAA,CAAY,KAAA,CAAM;AAAA,QACvC,GAAA,EAAK,SAAA;AAAA,QACL,KAAA;AAAA,QACA,MAAA;AAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAA,EAAK,SAAA;AAAA,QACL,QAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAA,EAAU,CAAC,QAAA,KAA+B;AACxC,UAAA,MAAM,MAAA,GAAwB;AAAA,YAC5B,WAAW,QAAA,CAAS,WAAA;AAAA,YACpB,WAAW,QAAA,CAAS,SAAA;AAAA,YACpB,MAAA;AAAA,YACA,QAAA;AAAA,YACA,aAAA,EAAe,MAAA;AAAA;AAAA,YACf,GAAA,EAAK,UAAA;AAAA,YACL,cAAc,QAAA,CAAS,KAAA;AAAA,YACvB,MAAA,EAAQ,QAAA,CAAS,MAAA,KAAW,SAAA,GAAY,SAAA,GAAY,SAAA;AAAA,YACpD,QAAA,EAAU,EAAE,MAAA,EAAQ,QAAA,CAAS,MAAA;AAAO,WACtC;AACA,UAAA,SAAA,CAAU,MAAM,CAAA;AAAA,QAClB,CAAA;AAAA,QACA,SAAS,MAAM;AACb,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,OACD,CAAA;AAED,MAAA,OAAA,CAAQ,UAAA,EAAW;AAAA,IACrB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,YAAA,GAAe,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,+BAAA;AAC1D,MAAA,MAAM,KAAA,GAAsB;AAAA,QAC1B,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,YAAA;AAAA,QACT,WAAA,EAAa,IAAA;AAAA,QACb,aAAA,EAAe;AAAA,OACjB;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,SAAA,EAAW,OAAA,EAAS,OAAO,CAAC,CAAA;AAEnG,EAAAD,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,IAAa,CAAC,WAAA,CAAY,OAAA,EAAS;AACrC,MAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,MAAA,YAAA,EAAa;AAAA,IACf;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,YAAY,CAAC,CAAA;AAE5B,EAAA,uBACEG,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAiB,CAAA;AAAA,oBAChCA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,2BAAA,EAAyB;AAAA,GAAA,EAC9B,CAAA,EACF,CAAA;AAEJ;AC3IA,IAAM,aAAA,GAAgB,cAAyC,IAAI,CAAA;AAE5D,SAAS,gBAAA,GAAmB;AACjC,EAAA,MAAM,OAAA,GAAU,WAAW,aAAa,CAAA;AACxC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,EACvE;AACA,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,cAAA,CAAe;AAAA;AAAA,EAE7B,SAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,EAAA;AAAA,EACR,KAAA,GAAQ,EAAA;AAAA,EACR,SAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA,GAAiB,CAAC,MAAA,EAAQ,cAAc,CAAA;AAAA;AAAA,EAExC,SAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA;AAAA,EAEA,QAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,KAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIE,SAAS,QAAQ,CAAA;AAC7C,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,SAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAqC,IAAI,CAAA;AAEzE,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA,EAAO,aAAA;AAAA,IACP,SAAA;AAAA,IACA;AAAA,MACE,SAAA,CAAU;AAAA,IACZ,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAA,EAAQ,UAAU,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,cAAA,EAAe;AAAA,IACzF,UAAA;AAAA,IACA,SAAA,EAAW,CAACC,OAAAA,KAAW;AACrB,MAAA,SAAA,GAAYA,OAAM,CAAA;AAElB,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA,MACjB,GAAG,GAAI,CAAA;AAAA,IACT,CAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAS,MAAM;AACb,MAAA,SAAA,CAAU,KAAK,CAAA;AACf,MAAA,OAAA,IAAU;AAAA,IACZ,CAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAAN,UAAU,MAAM;AACd,IAAA,IAAI,MAAA,IAAU,WAAW,MAAA,EAAQ;AAC/B,MAAA,UAAA,EAAW;AAAA,IACb;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,MAAA,EAAQ,UAAU,CAAC,CAAA;AAG/B,EAAA,MAAM,UAAA,GAAaC,YAAY,MAAM;AACnC,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,IAAA,WAAA,CAAY,IAAI,CAAA;AAAA,EAClB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,WAAA,GAAcA,YAAY,MAAM;AACpC,IAAA,aAAA,EAAc;AACd,IAAA,SAAA,CAAU,KAAK,CAAA;AACf,IAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,IAAA,WAAA,CAAY,IAAI,CAAA;AAAA,EAClB,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAGlB,EAAA,MAAM,kBAAA,GAAqBA,WAAAA;AAAA,IACzB,CAAC,MAAA,KAA0B;AACzB,MAAA,YAAA,CAAa,MAAM,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAGA,EAAA,MAAM,cAAA,GAAiBA,YAAY,MAAM;AACvC,IAAA,IAAI,CAAC,cAAA,EAAgB;AAErB,IAAA,IAAI,mBAAmB,MAAA,EAAQ;AAE7B,MAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,IACvB;AAAA,EAEF,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAGnB,EAAA,MAAM,gBAAA,GAAmBA,WAAAA;AAAA,IACvB,CAAC,IAAA,KAA8B;AAC7B,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,IACvB,CAAA;AAAA,IACA;AAAC,GACH;AAGA,EAAA,MAAM,gBAAA,GAAmBA,WAAAA;AAAA,IACvB,CAAC,SAAA,KAAmB;AAClB,MAAA,cAAA,CAAe,EAAE,GAAG,SAAA,EAAW,QAAA,EAAU,CAAA;AAAA,IAC3C,CAAA;AAAA,IACA,CAAC,gBAAgB,QAAQ;AAAA,GAC3B;AAEA,EAAA,MAAM,cAAA,GAAiBA,WAAAA;AAAA,IACrB,CAACM,MAAAA,KAAe;AACd,MAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,MAAA,OAAA,GAAUA,MAAK,CAAA;AAAA,IACjB,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,cAAA,GAAiBN,YAAY,MAAM;AACvC,IAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,EACxB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,UAAA,GAAaA,YAAY,MAAM;AACnC,IAAA,KAAA,EAAM;AACN,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,EACxB,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAGV,EAAA,MAAM,WAAA,GAAc,KAAA,GAAQ,oBAAA,CAAqB,KAAsD,IAAI,EAAC;AAG5G,EAAA,MAAM,UAAU,QAAA,mBACdE,IAAC,MAAA,EAAA,EAAK,OAAA,EAAS,YAAY,IAAA,EAAK,QAAA,EAAS,UAAU,CAAA,EAChD,QAAA,EACH,oBAEAD,IAAAA,CAAC,YAAO,SAAA,EAAU,oBAAA,EAAqB,SAAS,UAAA,EAAY,QAAA,EAAA;AAAA,IAAA,MAAA;AAAA,IACrD,YAAA,CAAa,QAAQ,QAAQ;AAAA,GAAA,EACpC,CAAA;AAIF,EAAA,MAAM,gBAAgB,MAAM;AAE1B,IAAA,IAAI,WAAW,SAAA,EAAW;AACxB,MAAA,uBACEA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAiB,CAAA;AAAA,wBAChCA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,uBAAA,EAAqB;AAAA,OAAA,EAC1B,CAAA;AAAA,IAEJ;AAGA,IAAA,IAAI,MAAA,KAAW,aAAa,MAAA,EAAQ;AAClC,MAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBACvCA,GAAAA,CAAC,IAAA,EAAA,EAAG,QAAA,EAAA,oBAAA,EAAkB,CAAA;AAAA,wBACtBD,KAAC,GAAA,EAAA,EAAE,QAAA,EAAA;AAAA,UAAA,aAAA;AAAA,UAAY,MAAA,CAAO;AAAA,SAAA,EAAU;AAAA,OAAA,EAClC,CAAA;AAAA,IAEJ;AAGA,IAAA,IAAI,MAAA,KAAW,QAAA,IAAY,KAAA,IAAS,CAAC,MAAM,WAAA,EAAa;AACtD,MAAA,uBACEA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAqB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBACrCA,GAAAA,CAAC,IAAA,EAAA,EAAG,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,wBAClBA,GAAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,KAAA,CAAM,OAAA,EAAQ,CAAA;AAAA,wBAClBA,GAAAA,CAAC,QAAA,EAAA,EAAO,WAAU,gCAAA,EAAiC,OAAA,EAAS,YAAY,QAAA,EAAA,WAAA,EAExE;AAAA,OAAA,EACF,CAAA;AAAA,IAEJ;AAGA,IAAA,IAAI,aAAA,EAAe;AAEjB,MAAA,MAAM,MAAA,GAAS,eAAe,YAAA,IAAgB,SAAA;AAC9C,MAAA,uBACEA,GAAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,MAAA;AAAA,UACX,KAAA;AAAA,UACA,MAAA,EAAQ,eAAe,MAAA,IAAU,MAAA;AAAA,UACjC,QAAA,EAAU,eAAe,QAAA,IAAY,QAAA;AAAA,UACrC,SAAA;AAAA,UACA,QAAA,EAAU;AAAA,YACR,GAAG,QAAA;AAAA;AAAA;AAAA,YAGH,YAAY,aAAA,EAAe,EAAA;AAAA,YAC3B,aAAA,EAAe,aAAA,EAAe,YAAA,IAAiB,QAAA,EAAU;AAAA,WAC3D;AAAA,UACA,UAAU,cAAA,KAAmB,cAAA,GAAiB,CAAC,cAAc,CAAA,GAAI,CAAC,MAAM,CAAA;AAAA,UACxE,SAAA,EAAW,gBAAA;AAAA,UACX,OAAA,EAAS,cAAA;AAAA,UACT,OAAA,EAAS;AAAA;AAAA,OACX;AAAA,IAEJ;AAGA,IAAA,IAAI,cAAA,KAAmB,cAAA,IAAkB,CAAC,aAAA,EAAe;AACvD,MAAA,uBACEA,GAAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAU,gBAAA;AAAA,UACV,QAAA,EAAU,UAAA;AAAA,UACV,SAAA;AAAA,UACA,YAAA,EAAc;AAAA;AAAA,OAChB;AAAA,IAEJ;AAGA,IAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,qBAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,cAAA;AAAA,UACT,cAAA;AAAA,UACA,QAAA,EAAU,kBAAA;AAAA,UACV,QAAA,EAAU;AAAA;AAAA,OACZ;AAAA,MAEC,cAAA,IAAkB,mBAAmB,cAAA,oBACpCA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BACb,QAAA,kBAAAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,gCAAA;AAAA,UACV,OAAA,EAAS,cAAA;AAAA,UACT,QAAA,EAAU,SAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA,OAED,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,uBACED,IAAAA,CAAC,aAAA,CAAc,QAAA,EAAd,EAAuB,OAAO,EAAE,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAS,EAC1D,QAAA,EAAA;AAAA,IAAA,OAAA;AAAA,IAEA,MAAA,oBACCC,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gBAAA,EAAiB,OAAA,EAAS,aACvC,QAAA,kBAAAD,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA,CAAG,cAAA,EAAgB,UAAA,IAAc,uBAAuB,CAAA;AAAA,QACnE,KAAA,EAAO,WAAA;AAAA,QACP,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,QAClC,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAW,MAAA;AAAA,QAGX,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,kBAAAA,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,GAAA,EAAI,iCAAA;AAAA,gBACJ,GAAA,EAAI,QAAA;AAAA,gBACJ,SAAA,EAAU;AAAA;AAAA,aACZ,EACF,CAAA;AAAA,4BACAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,qBAAA;AAAA,gBACV,OAAA,EAAS,WAAA;AAAA,gBACT,YAAA,EAAW,OAAA;AAAA,gBACZ,QAAA,EAAA;AAAA;AAAA;AAED,WAAA,EACF,CAAA;AAAA,0BAGAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA6B,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,4BACnDA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BACb,QAAA,EAAA,YAAA,CAAa,MAAA,EAAQ,QAAQ,CAAA,EAChC;AAAA,WAAA,EACF,CAAA;AAAA,0BAGAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACZ,yBAAc,EACjB,CAAA;AAAA,0BAGAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,6BAAA,EAExC,CAAA,EACF;AAAA;AAAA;AAAA,KACF,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACrRA,SAAS,gBAAA,GAAkC;AACzC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,MAAA,OAAA,EAAQ;AACR,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,GAAA,GAAM,yCAAA;AACb,IAAA,MAAA,CAAO,KAAA,GAAQ,IAAA;AACf,IAAA,MAAA,CAAO,MAAA,GAAS,MAAM,OAAA,EAAQ;AAC9B,IAAA,MAAA,CAAO,UAAU,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,8BAA8B,CAAC,CAAA;AACvE,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,EAClC,CAAC,CAAA;AACH;AAEO,SAAS,YAAA,CAAa;AAAA,EAC3B,eAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,SAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA,GAAc,SAAA;AAAA,EACd,SAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAAsB;AACpB,EAAA,MAAM,WAAA,GAAcC,OAAO,KAAK,CAAA;AAEhC,EAAA,MAAM,YAAA,GAAeH,YAAY,YAAY;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,gBAAA,EAAiB;AAEvB,MAAA,IAAI,CAAC,OAAO,cAAA,EAAgB;AAC1B,QAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,MACjD;AAEA,MAAA,MAAA,CAAO,eAAe,WAAA,CAAY;AAAA,QAChC,eAAA;AAAA,QACA,gBAAA,EAAkB,WAAA;AAAA,QAClB,aAAa,MAAA,GAAS,GAAA;AAAA;AAAA,QACtB,QAAA;AAAA,QACA,eAAA,EAAiB,SAAA,IAAa,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,QAClD,aAAA,EAAe,KAAA;AAAA,QACf,cAAA,EAAgB,KAAA;AAAA,QAChB,UAAA,EAAY,CAAC,QAAA,KAA6B;AACxC,UAAA,IAAI,QAAA,CAAS,WAAW,SAAA,EAAW;AACjC,YAAA,MAAM,MAAA,GAAwB;AAAA,cAC5B,WAAW,QAAA,CAAS,aAAA;AAAA,cACpB,WAAW,QAAA,CAAS,eAAA;AAAA,cACpB,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,SAAS,GAAG,CAAA;AAAA;AAAA,cACxC,UAAU,QAAA,CAAS,QAAA;AAAA,cACnB,aAAA,EAAe,cAAA;AAAA,cACf,GAAA,EAAK,QAAA;AAAA,cACL,cAAc,QAAA,CAAS,aAAA;AAAA,cACvB,MAAA,EAAQ;AAAA,aACV;AACA,YAAA,SAAA,CAAU,MAAM,CAAA;AAAA,UAClB,CAAA,MAAO;AACL,YAAA,MAAM,KAAA,GAAsB;AAAA,cAC1B,IAAA,EAAM,gBAAA;AAAA,cACN,OAAA,EAAS,SAAS,OAAA,IAAW,gBAAA;AAAA,cAC7B,WAAA,EAAa;AAAA,aACf;AACA,YAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,UACf;AAAA,QACF,CAAA;AAAA,QACA,UAAU,MAAM;AACd,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,OACD,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,KAAA,GAAsB;AAAA,QAC1B,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,6BAAA;AAAA,QACT,WAAA,EAAa,IAAA;AAAA,QACb,aAAA,EAAe;AAAA,OACjB;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,CAAA,EAAG,CAAC,eAAA,EAAiB,MAAA,EAAQ,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,KAAA,EAAO,WAAA,EAAa,SAAA,EAAW,OAAA,EAAS,OAAO,CAAC,CAAA;AAEzG,EAAAD,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,IAAa,CAAC,WAAA,CAAY,OAAA,EAAS;AACrC,MAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,MAAA,YAAA,EAAa;AAAA,IACf;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,YAAY,CAAC,CAAA;AAE5B,EAAA,uBACEG,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAiB,CAAA;AAAA,oBAChCA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,yBAAA,EAAuB;AAAA,GAAA,EAC5B,CAAA,EACF,CAAA;AAEJ;ACxFA,SAAS,qBAAA,GAAuC;AAC9C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,IAAI,OAAO,mBAAA,EAAqB;AAC9B,MAAA,OAAA,EAAQ;AACR,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,GAAA,GAAM,wCAAA;AACb,IAAA,MAAA,CAAO,KAAA,GAAQ,IAAA;AACf,IAAA,MAAA,CAAO,MAAA,GAAS,MAAM,OAAA,EAAQ;AAC9B,IAAA,MAAA,CAAO,UAAU,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,mCAAmC,CAAC,CAAA;AAC5E,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,EAClC,CAAC,CAAA;AACH;AAEO,SAAS,iBAAA,CAAkB;AAAA,EAChC,SAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,SAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,cAAA,GAAiB,uBAAA;AAAA,EACjB,KAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAA2B;AACzB,EAAA,MAAM,WAAA,GAAcC,OAAO,KAAK,CAAA;AAEhC,EAAA,MAAM,YAAA,GAAeH,YAAY,YAAY;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,qBAAA,EAAsB;AAE5B,MAAA,IAAI,CAAC,OAAO,mBAAA,EAAqB;AAC/B,QAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,MACtD;AAEA,MAAA,MAAM,KAAA,GAAQ,SAAA,IAAa,CAAA,IAAA,EAAO,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAEnF,MAAA,MAAA,CAAO,mBAAA,CAAoB;AAAA,QACzB,UAAA,EAAY,SAAA;AAAA,QACZ,MAAA,EAAQ,KAAA;AAAA,QACR,QAAQ,MAAA,GAAS,GAAA;AAAA;AAAA,QACjB,QAAA;AAAA,QACA,eAAA,EAAiB,cAAA;AAAA,QACjB,QAAA,EAAU;AAAA,UACR,KAAA;AAAA,UACA,YAAA,EAAc,KAAA;AAAA,UACd;AAAA,SACF;AAAA,QACA,cAAA,EAAgB;AAAA,UACd,KAAA;AAAA,UACA,WAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,IAAA,EAAM,QAAA;AAAA,QACN,QAAA,EAAU,CAAC,QAAA,KAAkC;AAC3C,UAAA,IAAI,QAAA,CAAS,WAAW,YAAA,EAAc;AACpC,YAAA,MAAM,MAAA,GAAwB;AAAA,cAC5B,SAAA,EAAW,QAAA,CAAS,cAAA,CAAe,QAAA,EAAS;AAAA,cAC5C,WAAW,QAAA,CAAS,MAAA;AAAA,cACpB,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,SAAS,GAAG,CAAA;AAAA,cACxC,UAAU,QAAA,CAAS,QAAA;AAAA,cACnB,aAAA,EAAe,QAAA,CAAS,YAAA,KAAiB,aAAA,GAAgB,cAAA,GAAiB,MAAA;AAAA,cAC1E,GAAA,EAAK,aAAA;AAAA,cACL,cAAc,QAAA,CAAS,OAAA;AAAA,cACvB,MAAA,EAAQ,SAAA;AAAA,cACR,QAAA,EAAU;AAAA,gBACR,gBAAgB,QAAA,CAAS,cAAA;AAAA,gBACzB,cAAc,QAAA,CAAS;AAAA;AACzB,aACF;AACA,YAAA,SAAA,CAAU,MAAM,CAAA;AAAA,UAClB,CAAA,MAAO;AACL,YAAA,MAAM,KAAA,GAAsB;AAAA,cAC1B,IAAA,EAAM,QAAA,CAAS,MAAA,KAAW,WAAA,GAAc,WAAA,GAAc,gBAAA;AAAA,cACtD,OAAA,EAAS,QAAA,CAAS,MAAA,KAAW,WAAA,GAAc,uBAAA,GAA0B,gBAAA;AAAA,cACrE,WAAA,EAAa;AAAA,aACf;AACA,YAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,UACf;AAAA,QACF,CAAA;AAAA,QACA,SAAS,MAAM;AACb,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,OACD,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,KAAA,GAAsB;AAAA,QAC1B,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,kCAAA;AAAA,QACT,WAAA,EAAa,IAAA;AAAA,QACb,aAAA,EAAe;AAAA,OACjB;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,CAAA,EAAG;AAAA,IACD,SAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,cAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAAD,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,IAAa,CAAC,WAAA,CAAY,OAAA,EAAS;AACrC,MAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,MAAA,YAAA,EAAa;AAAA,IACf;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,YAAY,CAAC,CAAA;AAE5B,EAAA,uBACEG,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oDACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAiB,CAAA;AAAA,oBAChCA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,8BAAA,EAA4B;AAAA,GAAA,EACjC,CAAA,EACF,CAAA;AAEJ;AC9IA,IAAM,iBAAA,GAAoB,2BAAA;AAC1B,IAAI,mBAAA,GAA4C,IAAA;AAEzC,SAAS,gBAAA,GAAkC;AAChD,EAAA,IAAI,qBAAqB,OAAO,mBAAA;AAEhC,EAAA,IAAI,QAAA,CAAS,cAAA,CAAe,kBAAkB,CAAA,EAAG;AAC/C,IAAA,mBAAA,GAAsB,QAAQ,OAAA,EAAQ;AACtC,IAAA,OAAO,mBAAA;AAAA,EACT;AAEA,EAAA,mBAAA,GAAsB,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACrD,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,EAAA,GAAK,kBAAA;AACZ,IAAA,MAAA,CAAO,GAAA,GAAM,iBAAA;AACb,IAAA,MAAA,CAAO,KAAA,GAAQ,IAAA;AACf,IAAA,MAAA,CAAO,MAAA,GAAS,MAAM,OAAA,EAAQ;AAC9B,IAAA,MAAA,CAAO,UAAU,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,0BAA0B,CAAC,CAAA;AACnE,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,EAClC,CAAC,CAAA;AAED,EAAA,OAAO,mBAAA;AACT;AAEO,SAAS,YAAA,CAAa;AAAA,EAC3B,cAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIE,SAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,SAAA,GAAYD,OAA8B,IAAI,CAAA;AACpD,EAAA,MAAM,WAAA,GAAcA,OAA8B,IAAI,CAAA;AACtD,EAAA,MAAM,iBAAA,GAAoBA,OAA6B,IAAI,CAAA;AAC3D,EAAA,MAAM,YAAA,GAAeA,OAAuB,IAAI,CAAA;AAEhD,EAAAJ,UAAU,MAAM;AACd,IAAA,IAAI,OAAA,GAAU,IAAA;AAEd,IAAA,MAAM,aAAa,YAAY;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,gBAAA,EAAiB;AAEvB,QAAA,IAAI,CAAC,OAAA,IAAW,CAAC,MAAA,CAAO,MAAA,EAAQ;AAC9B,UAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,QACxC;AAEA,QAAA,SAAA,CAAU,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,cAAc,CAAA;AAEhD,QAAA,WAAA,CAAY,OAAA,GAAU,SAAA,CAAU,OAAA,CAAQ,QAAA,CAAS;AAAA,UAC/C,YAAA;AAAA,UACA,UAAA,EAAY,UAAA,IAAc,EAAE,KAAA,EAAO,QAAA;AAAS,SAC7C,CAAA;AAED,QAAA,iBAAA,CAAkB,OAAA,GAAU,WAAA,CAAY,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA;AAEhE,QAAA,IAAI,aAAa,OAAA,EAAS;AACxB,UAAA,iBAAA,CAAkB,OAAA,CAAQ,KAAA,CAAM,YAAA,CAAa,OAAO,CAAA;AAAA,QACtD;AAEA,QAAA,iBAAA,CAAkB,OAAA,CAAQ,EAAA,CAAG,OAAA,EAAS,MAAM;AAC1C,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,YAAA,CAAa,KAAK,CAAA;AAClB,YAAA,OAAA,IAAU;AAAA,UACZ;AAAA,QACF,CAAC,CAAA;AAED,QAAA,iBAAA,CAAkB,OAAA,CAAQ,EAAA,CAAG,QAAA,EAAU,CAAC,KAAA,KAAe;AACrD,UAAA,IAAI,MAAM,KAAA,EAAO;AACf,YAAA,QAAA,CAAS,KAAA,CAAM,MAAM,OAAO,CAAA;AAAA,UAC9B,CAAA,MAAO;AACL,YAAA,QAAA,CAAS,IAAI,CAAA;AAAA,UACf;AAAA,QACF,CAAC,CAAA;AAAA,MACH,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,6BAAA;AACrD,UAAA,QAAA,CAAS,OAAO,CAAA;AAChB,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA,OAAA,CAAQ,EAAE,IAAA,EAAM,mBAAA,EAAqB,OAAA,EAAS,CAAA;AAAA,QAChD;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,UAAA,EAAW;AAEX,IAAA,OAAO,MAAM;AACX,MAAA,OAAA,GAAU,KAAA;AACV,MAAA,iBAAA,CAAkB,SAAS,OAAA,EAAQ;AAAA,IACrC,CAAA;AAAA,EACF,GAAG,CAAC,cAAA,EAAgB,cAAc,UAAA,EAAY,OAAA,EAAS,OAAO,CAAC,CAAA;AAE/D,EAAA,MAAM,YAAA,GAAeC,YAAY,YAAY;AAC3C,IAAA,IAAI,CAAC,SAAA,CAAU,OAAA,IAAW,CAAC,YAAY,OAAA,EAAS;AAC9C,MAAA,OAAA,CAAQ,EAAE,IAAA,EAAM,iBAAA,EAAmB,OAAA,EAAS,0BAA0B,CAAA;AACtE,MAAA;AAAA,IACF;AAEA,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AAEF,MAAA,MAAM,EAAE,KAAA,EAAO,WAAA,KAAgB,MAAM,WAAA,CAAY,QAAQ,MAAA,EAAO;AAChE,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,QAAA,CAAS,YAAY,OAAO,CAAA;AAC5B,QAAA,OAAA,CAAQ,EAAE,MAAM,WAAA,CAAY,IAAA,IAAQ,oBAAoB,OAAA,EAAS,WAAA,CAAY,SAAS,CAAA;AACtF,QAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,EAAE,OAAO,YAAA,EAAc,aAAA,KAAkB,MAAM,SAAA,CAAU,QAAQ,cAAA,CAAe;AAAA,QACpF,UAAU,WAAA,CAAY,OAAA;AAAA,QACtB,QAAA,EAAU;AAAA,OACX,CAAA;AAED,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,QAAA,CAAS,aAAa,OAAO,CAAA;AAC7B,QAAA,OAAA,CAAQ,EAAE,MAAM,YAAA,CAAa,IAAA,IAAQ,iBAAiB,OAAA,EAAS,YAAA,CAAa,SAAS,CAAA;AAAA,MACvF,WAAW,aAAA,EAAe;AACxB,QAAA,SAAA,CAAU;AAAA,UACR,iBAAiB,aAAA,CAAc,EAAA;AAAA,UAC/B,QAAQ,aAAA,CAAc;AAAA,SACvB,CAAA;AAAA,MACH;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,gBAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAChB,MAAA,OAAA,CAAQ,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAS,CAAA;AAAA,IAC5C,CAAA,SAAE;AACA,MAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,IACvB;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,OAAO,CAAC,CAAA;AAEvB,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACZ,QAAA,EAAA;AAAA,IAAA,SAAA,oBACCA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAiB,CAAA;AAAA,sBAChCA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,gCAAA,EAA8B;AAAA,KAAA,EACnC,CAAA;AAAA,oBAGFA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,YAAA;AAAA,QACL,SAAA,EAAU,uBAAA;AAAA,QACV,OAAO,EAAE,OAAA,EAAS,YAAY,MAAA,GAAS,OAAA,EAAS,WAAW,OAAA;AAAQ;AAAA,KACrE;AAAA,IAEC,KAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBACb,QAAA,kBAAAA,GAAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,KAAA,EAAM,CAAA,EACZ,CAAA;AAAA,oBAGFD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,mBAAA;AAAA,UACV,OAAA,EAAS,YAAA;AAAA,UACT,UAAU,SAAA,IAAa,YAAA;AAAA,UAEtB,QAAA,EAAA,YAAA,mBACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gBAAA,EAAiB,CAAA,mBAEjCD,IAAAA,CAAA,QAAA,EAAA,EAAE,QAAA,EAAA;AAAA,YAAA,MAAA;AAAA,YAAK,QAAA;AAAA,YAAS,GAAA;AAAA,YAAA,CAAG,MAAA,GAAS,GAAA,EAAK,OAAA,CAAQ,CAAC;AAAA,WAAA,EAAE;AAAA;AAAA,OAEhD;AAAA,MAEC,4BACCC,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,mBAAA;AAAA,UACV,OAAA,EAAS,QAAA;AAAA,UACT,QAAA,EAAU,YAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AC5LA,IAAM,kBAAA,GAAqB,2CAAA;AAC3B,IAAI,oBAAA,GAA6C,IAAA;AAE1C,SAAS,iBAAA,GAAmC;AACjD,EAAA,IAAI,sBAAsB,OAAO,oBAAA;AAEjC,EAAA,IAAI,QAAA,CAAS,cAAA,CAAe,oBAAoB,CAAA,EAAG;AACjD,IAAA,oBAAA,GAAuB,QAAQ,OAAA,EAAQ;AACvC,IAAA,OAAO,oBAAA;AAAA,EACT;AAEA,EAAA,oBAAA,GAAuB,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtD,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,EAAA,GAAK,oBAAA;AACZ,IAAA,MAAA,CAAO,GAAA,GAAM,kBAAA;AACb,IAAA,MAAA,CAAO,KAAA,GAAQ,IAAA;AACf,IAAA,MAAA,CAAO,MAAA,GAAS,MAAM,OAAA,EAAQ;AAC9B,IAAA,MAAA,CAAO,UAAU,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,4BAA4B,CAAC,CAAA;AACrE,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,EAClC,CAAC,CAAA;AAED,EAAA,OAAO,oBAAA;AACT;AAEO,SAAS,aAAA,CAAc;AAAA,EAC5B,MAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,kBAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,QAAA;AAAA,EACA,QAAA,GAAW,IAAA;AAAA,EACX,SAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIE,SAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE5C,EAAA,MAAM,WAAA,GAAcJ,YAAY,YAAY;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,iBAAA,EAAkB;AAExB,MAAA,IAAI,CAAC,OAAO,UAAA,EAAY;AACtB,QAAA,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAAA,MAC7C;AAEA,MAAA,MAAA,CAAO,WAAW,UAAA,CAAW;AAAA,QAC3B,MAAA;AAAA,QACA,UAAU,QAAA,IAAY,KAAA;AAAA,QACtB,SAAA;AAAA,QACA,YAAA;AAAA,QACA,aAAA;AAAA,QACA,oBAAA,EAAsB,aAAA;AAAA,QACtB,MAAA;AAAA,QACA,YAAA;AAAA,QACA,oBAAoB,kBAAA,IAAsB,SAAA;AAAA,QAC1C,UAAA;AAAA,QACA,QAAA;AAAA,QACA,UAAA,EAAY,CAAC,QAAA,KAA8B;AACzC,UAAA,IAAI,QAAA,CAAS,WAAW,SAAA,EAAW;AACjC,YAAA,SAAA,CAAU;AAAA,cACR,sBAAsB,QAAA,CAAS,oBAAA;AAAA,cAC/B,kBAAkB,QAAA,CAAS,gBAAA;AAAA,cAC3B,MAAA,EAAQ,SAAS,gBAAA,IAAoB;AAAA,aACtC,CAAA;AAAA,UACH,CAAA,MAAO;AACL,YAAA,OAAA,CAAQ;AAAA,cACN,IAAA,EAAM,wBAAA;AAAA,cACN,OAAA,EAAS,SAAS,OAAA,IAAW;AAAA,aAC9B,CAAA;AAAA,UACH;AAAA,QACF,CAAA;AAAA,QACA,SAAS,MAAM;AACb,UAAA,OAAA,IAAU;AAAA,QACZ;AAAA,OACD,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,wBAAA;AACrD,MAAA,OAAA,CAAQ,EAAE,IAAA,EAAM,oBAAA,EAAsB,OAAA,EAAS,CAAA;AAAA,IACjD;AAAA,EACF,CAAA,EAAG;AAAA,IACD,MAAA;AAAA,IAAQ,QAAA;AAAA,IAAU,SAAA;AAAA,IAAW,YAAA;AAAA,IAAc,aAAA;AAAA,IAAe,aAAA;AAAA,IAC1D,MAAA;AAAA,IAAQ,YAAA;AAAA,IAAc,kBAAA;AAAA,IAAoB,UAAA;AAAA,IAAY,QAAA;AAAA,IACtD,SAAA;AAAA,IAAW,OAAA;AAAA,IAAS;AAAA,GACrB,CAAA;AAED,EAAAD,UAAU,MAAM;AACd,IAAA,MAAM,OAAO,YAAY;AACvB,MAAA,IAAI;AACF,QAAA,MAAM,iBAAA,EAAkB;AACxB,QAAA,UAAA,CAAW,IAAI,CAAA;AACf,QAAA,YAAA,CAAa,KAAK,CAAA;AAElB,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,WAAA,EAAY;AAAA,QACd;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,wBAAA;AACrD,QAAA,OAAA,CAAQ,EAAE,IAAA,EAAM,oBAAA,EAAsB,OAAA,EAAS,CAAA;AAAA,MACjD;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,EAAK;AAAA,EACP,CAAA,EAAG,CAAC,QAAA,EAAU,WAAA,EAAa,OAAO,CAAC,CAAA;AAEnC,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBACEG,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAiB,CAAA;AAAA,sBAChCA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,6BAAA,EAA2B;AAAA,KAAA,EAChC,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,IAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBACb,QAAA,kBAAAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAU,mBAAA;AAAA,QACV,OAAA,EAAS,WAAA;AAAA,QACV,QAAA,EAAA;AAAA;AAAA,KAED,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,OAAO,IAAA;AACT;ACrKO,SAAS,WAAA,CAAY;AAAA,EAC1B,WAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAU;AACZ,CAAA,EAAqB;AACnB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIE,SAAqB,MAAM,CAAA;AACrD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAE9E,EAAA,MAAM,eAAA,GAAkBJ,YAAY,YAAY;AAC9C,IAAA,QAAA,CAAS,YAAY,CAAA;AACrB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,WAAA,EAAa;AAAA,QACxC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,GAAG;AAAA,SACL;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,YAAA,EAAc,WAAA;AAAA,UACd,MAAA;AAAA,UACA,QAAA;AAAA,UACA,SAAA;AAAA,UACA,WAAA,EAAa,WAAA,IAAe,CAAA,QAAA,EAAW,SAAS,CAAA;AAAA,SACjD;AAAA,OACF,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACxD,QAAA,MAAM,IAAI,KAAA,CAAM,SAAA,CAAU,WAAW,CAAA,gBAAA,EAAmB,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,MAC3E;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,mBAAA,IAAuB,IAAA,CAAK,qBAAqB,IAAA,CAAK,cAAA;AAE7E,MAAA,oBAAA,CAAqB,SAAS,CAAA;AAC9B,MAAA,QAAA,CAAS,SAAS,CAAA;AAClB,MAAA,WAAA,GAAc,SAAS,CAAA;AAAA,IAIzB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,mCAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAChB,MAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,MAAA,OAAA,CAAQ,EAAE,IAAA,EAAM,kBAAA,EAAoB,OAAA,EAAS,CAAA;AAAA,IAC/C;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,WAAA,EAAa,MAAA,EAAQ,QAAA,EAAU,SAAA,EAAW,WAAA,EAAa,OAAA,EAAS,WAAA,EAAa,OAAO,CAAC,CAAA;AAEtG,EAAA,MAAM,WAAA,GAAcA,YAAY,MAAM;AACpC,IAAA,QAAA,CAAS,MAAM,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,eAAA,EAAgB;AAAA,EAClB,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAGpB,EAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,IAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAoB,QAAA,EAAA,WAAA,EAAE,CAAA;AAAA,wBACrCA,GAAAA,CAAC,IAAA,EAAA,EAAG,QAAA,EAAA,iBAAA,EAAe,CAAA;AAAA,wBACnBA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,kEAAA,EAAgE,CAAA;AAAA,wBACnED,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oBAAA,EAAqB,QAAA,EAAA;AAAA,UAAA,SAAA;AAAA,UAAQ;AAAA,SAAA,EAAY;AAAA,OAAA,EACxD,CAAA;AAAA,sBACAC,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,oCAAA;AAAA,UACV,OAAA,EAAS,eAAA;AAAA,UACV,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,UAAU,YAAA,EAAc;AAC1B,IAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EAAuC,CAAA;AAAA,sBACtDA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,0CAAA,EAAwC;AAAA,KAAA,EAC7C,CAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,UAAU,SAAA,EAAW;AACvB,IAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,WAAA,EAAE,CAAA;AAAA,sBAC3CA,GAAAA,CAAC,IAAA,EAAA,EAAG,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,sBACpBD,KAAC,GAAA,EAAA,EAAE,QAAA,EAAA;AAAA,QAAA,6CAAA;AAAA,wBAC0CC,GAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,QAAS;AAAA,OAAA,EAC3E,CAAA;AAAA,sBACAD,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oBAAA,EACZ,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,QAAG,QAAA,EAAA,2CAAA,EAAyC,CAAA;AAAA,wBAC7CA,GAAAA,CAAC,IAAA,EAAA,EAAG,QAAA,EAAA,oCAAA,EAAkC,CAAA;AAAA,wBACtCA,GAAAA,CAAC,IAAA,EAAA,EAAG,QAAA,EAAA,uBAAA,EAAqB;AAAA,OAAA,EAC3B,CAAA;AAAA,sBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAiB,CAAA;AAAA,wBAChCA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,qCAAA,EAAmC;AAAA,OAAA,EAC3C,CAAA;AAAA,MACC,iBAAA,oBACCD,IAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,kBAAA,EAAmB,QAAA,EAAA;AAAA,QAAA,cAAA;AAAA,QAAa;AAAA,OAAA,EAAkB;AAAA,KAAA,EAEnE,CAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,UAAU,QAAA,EAAU;AACtB,IAAA,uBACEC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAoB,QAAA,EAAA,cAAA,EAAE,CAAA;AAAA,sBACrCA,GAAAA,CAAC,IAAA,EAAA,EAAG,QAAA,EAAA,wBAAA,EAAsB,CAAA;AAAA,sBAC1BA,GAAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,KAAA,IAAS,yCAAA,EAA0C,CAAA;AAAA,sBACvDA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,kBAAA;AAAA,UACV,OAAA,EAAS,WAAA;AAAA,UACV,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,OAAO,IAAA;AACT;AAMO,SAAS,qBAAA,CACd,cAAA,EACA,iBAAA,EACA,OAAA,EAQA;AACA,EAAA,MAAM,EAAE,QAAA,GAAW,GAAA,EAAM,WAAA,GAAc,EAAA,EAAI,OAAA,GAAU,EAAC,EAAG,SAAA,EAAW,QAAA,EAAU,SAAA,EAAU,GAAI,OAAA;AAE5F,EAAA,MAAM,YAAA,GAAeF,YAAY,YAAY;AAC3C,IAAA,IAAI,CAAC,iBAAA,EAAmB;AAExB,IAAA,IAAI,QAAA,GAAW,CAAA;AAEf,IAAA,MAAM,OAAO,YAAY;AACvB,MAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,QAAA,SAAA,EAAU;AACV,QAAA;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,cAAc,CAAA,qBAAA,EAAwB,iBAAiB,CAAA,CAAA,EAAI;AAAA,UACzF;AAAA,SACD,CAAA;AAED,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,QAAA,EAAA;AACA,UAAA,UAAA,CAAW,MAAM,QAAQ,CAAA;AACzB,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,QAAA,IAAI,IAAA,CAAK,MAAA,KAAW,SAAA,IAAa,IAAA,CAAK,WAAW,WAAA,EAAa;AAC5D,UAAA,SAAA,CAAU,EAAE,aAAA,EAAe,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,eAAe,CAAA;AAAA,QACxE,WAAW,IAAA,CAAK,MAAA,KAAW,QAAA,IAAY,IAAA,CAAK,WAAW,WAAA,EAAa;AAClE,UAAA,QAAA,CAAS,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,mCAAmC,CAAA;AAAA,QACzE,CAAA,MAAO;AAEL,UAAA,QAAA,EAAA;AACA,UAAA,UAAA,CAAW,MAAM,QAAQ,CAAA;AAAA,QAC3B;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,QAAA,EAAA;AACA,QAAA,UAAA,CAAW,MAAM,QAAQ,CAAA;AAAA,MAC3B;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,EAAK;AAAA,EACP,CAAA,EAAG,CAAC,iBAAA,EAAmB,cAAA,EAAgB,QAAA,EAAU,aAAa,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,SAAS,CAAC,CAAA;AAEtG,EAAA,OAAO,EAAE,YAAA,EAAa;AACxB","file":"index.mjs","sourcesContent":["/**\n * Utility functions for the Reevit React SDK\n */\n\n/**\n * Format amount for display\n */\nexport function formatAmount(amount: number, currency: string): string {\n const formatter = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: currency,\n minimumFractionDigits: 2,\n });\n\n // Amount is in smallest unit (pesewas, kobo, cents)\n return formatter.format(amount / 100);\n}\n\n/**\n * Generate a unique reference if not provided\n */\nexport function generateReference(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `reevit_${timestamp}_${random}`;\n}\n\n/**\n * Validate phone number for mobile money\n */\nexport function validatePhone(phone: string, network?: string): boolean {\n // Remove spaces and dashes\n const cleaned = phone.replace(/[\\s-]/g, '');\n\n // Check for valid Ghana phone number formats\n const patterns = {\n mtn: /^(0|233|\\+233)?(24|54|55|59)\\d{7}$/,\n vodafone: /^(0|233|\\+233)?(20|50)\\d{7}$/,\n airteltigo: /^(0|233|\\+233)?(26|27|56|57)\\d{7}$/,\n };\n\n if (network && patterns[network as keyof typeof patterns]) {\n return patterns[network as keyof typeof patterns].test(cleaned);\n }\n\n // If no network specified, check all patterns\n return Object.values(patterns).some((pattern) => pattern.test(cleaned));\n}\n\n/**\n * Format phone number for display\n */\nexport function formatPhone(phone: string): string {\n const cleaned = phone.replace(/[\\s-]/g, '');\n\n // Format as 0XX XXX XXXX\n if (cleaned.startsWith('0') && cleaned.length === 10) {\n return `${cleaned.slice(0, 3)} ${cleaned.slice(3, 6)} ${cleaned.slice(6)}`;\n }\n\n // Format +233 XX XXX XXXX\n if (cleaned.startsWith('+233') && cleaned.length === 13) {\n return `${cleaned.slice(0, 4)} ${cleaned.slice(4, 6)} ${cleaned.slice(6, 9)} ${cleaned.slice(9)}`;\n }\n\n return phone;\n}\n\n/**\n * Detect mobile money network from phone number\n */\nexport function detectNetwork(phone: string): string | null {\n const cleaned = phone.replace(/[\\s-]/g, '');\n\n const prefixes: Record<string, string[]> = {\n mtn: ['024', '054', '055', '059', '23324', '23354', '23355', '23359'],\n vodafone: ['020', '050', '23320', '23350'],\n airteltigo: ['026', '027', '056', '057', '23326', '23327', '23356', '23357'],\n };\n\n for (const [network, networkPrefixes] of Object.entries(prefixes)) {\n for (const prefix of networkPrefixes) {\n if (cleaned.startsWith(prefix) || cleaned.startsWith('0' + prefix.slice(3))) {\n return network;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Create CSS variables from theme\n */\nexport function createThemeVariables(theme: Record<string, string | undefined>): Record<string, string> {\n const variables: Record<string, string> = {};\n\n if (theme.primaryColor) {\n variables['--reevit-primary'] = theme.primaryColor;\n }\n if (theme.backgroundColor) {\n variables['--reevit-background'] = theme.backgroundColor;\n }\n if (theme.textColor) {\n variables['--reevit-text'] = theme.textColor;\n }\n if (theme.borderRadius) {\n variables['--reevit-radius'] = theme.borderRadius;\n }\n if (theme.fontFamily) {\n variables['--reevit-font'] = theme.fontFamily;\n }\n\n return variables;\n}\n\n/**\n * Merge class names\n */\nexport function cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n","/**\n * Reevit API Client\n * \n * Handles communication with the Reevit backend for payment operations.\n */\n\nimport type { PaymentMethod, ReevitCheckoutConfig, PaymentError } from '../types';\n\n// API Response Types (matching backend handlers_payments.go)\nexport interface CreatePaymentIntentRequest {\n amount: number;\n currency: string;\n method: string;\n country: string;\n customer_id?: string;\n metadata?: Record<string, unknown>;\n description?: string;\n policy?: {\n prefer?: string[];\n max_amount?: number;\n blocked_bins?: string[];\n allowed_bins?: string[];\n velocity_max_per_minute?: number;\n };\n}\n\nexport interface PaymentIntentResponse {\n id: string;\n connection_id: string;\n provider: string;\n status: string;\n client_secret: string;\n psp_public_key?: string;\n amount: number;\n currency: string;\n fee_amount: number;\n fee_currency: string;\n net_amount: number;\n}\n\nexport interface ConfirmPaymentRequest {\n provider_ref_id: string;\n provider_data?: Record<string, unknown>;\n}\n\nexport interface PaymentDetailResponse {\n id: string;\n connection_id: string;\n provider: string;\n method: string;\n status: string;\n amount: number;\n currency: string;\n fee_amount: number;\n fee_currency: string;\n net_amount: number;\n customer_id?: string;\n client_secret: string;\n provider_ref_id?: string;\n metadata?: Record<string, unknown>;\n created_at: string;\n updated_at: string;\n}\n\nexport interface APIErrorResponse {\n code: string;\n message: string;\n details?: Record<string, string>;\n}\n\n// API Client configuration\nexport interface ReevitAPIClientConfig {\n /** Your Reevit public key */\n publicKey: string;\n /** Base URL for the Reevit API (defaults to production) */\n baseUrl?: string;\n /** Request timeout in milliseconds */\n timeout?: number;\n}\n\n// Default API base URLs\nconst API_BASE_URL_PRODUCTION = 'https://api.reevit.io';\nconst API_BASE_URL_SANDBOX = 'https://sandbox-api.reevit.io';\nconst DEFAULT_TIMEOUT = 30000; // 30 seconds\n\n/**\n * Determines if a public key is for sandbox mode\n */\nfunction isSandboxKey(publicKey: string): boolean {\n // Support various test/sandbox key prefixes\n return publicKey.startsWith('pk_test_') ||\n publicKey.startsWith('pk_sandbox_') ||\n publicKey.startsWith('pfk_test_') ||\n publicKey.startsWith('pfk_sandbox_');\n}\n\n/**\n * Creates a PaymentError from an API error response\n */\nfunction createPaymentError(response: Response, errorData: APIErrorResponse): PaymentError {\n return {\n code: errorData.code || 'api_error',\n message: errorData.message || 'An unexpected error occurred',\n details: {\n httpStatus: response.status,\n ...errorData.details,\n },\n };\n}\n\n/**\n * Reevit API Client\n */\nexport class ReevitAPIClient {\n private readonly publicKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n constructor(config: ReevitAPIClientConfig) {\n this.publicKey = config.publicKey;\n this.baseUrl = config.baseUrl || (isSandboxKey(config.publicKey)\n ? API_BASE_URL_SANDBOX\n : API_BASE_URL_PRODUCTION);\n this.timeout = config.timeout || DEFAULT_TIMEOUT;\n }\n\n /**\n * Makes an authenticated API request\n */\n private async request<T>(\n method: string,\n path: string,\n body?: unknown\n ): Promise<{ data?: T; error?: PaymentError }> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n // Generate idempotency key for POST requests\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Reevit-Key': this.publicKey,\n 'X-Reevit-Client': '@reevit/react',\n 'X-Reevit-Client-Version': '0.2.5',\n };\n\n // Add idempotency key for mutating requests\n if (method === 'POST' || method === 'PATCH' || method === 'PUT') {\n headers['Idempotency-Key'] = `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;\n }\n\n try {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const responseData = await response.json().catch(() => ({}));\n\n if (!response.ok) {\n return {\n error: createPaymentError(response, responseData as APIErrorResponse),\n };\n }\n\n return { data: responseData as T };\n } catch (err) {\n clearTimeout(timeoutId);\n\n if (err instanceof Error) {\n if (err.name === 'AbortError') {\n return {\n error: {\n code: 'request_timeout',\n message: 'The request timed out. Please try again.',\n },\n };\n }\n\n if (err.message.includes('Failed to fetch') || err.message.includes('NetworkError')) {\n return {\n error: {\n code: 'network_error',\n message: 'Unable to connect to Reevit. Please check your internet connection.',\n },\n };\n }\n }\n\n return {\n error: {\n code: 'unknown_error',\n message: 'An unexpected error occurred. Please try again.',\n },\n };\n }\n }\n\n /**\n * Creates a payment intent\n */\n async createPaymentIntent(\n config: ReevitCheckoutConfig,\n method: PaymentMethod,\n country: string = 'GH'\n ): Promise<{ data?: PaymentIntentResponse; error?: PaymentError }> {\n // Build metadata with customer_email for PSP providers that require it\n const metadata: Record<string, unknown> = { ...config.metadata };\n if (config.email) {\n metadata.customer_email = config.email;\n }\n if (config.phone) {\n metadata.customer_phone = config.phone;\n }\n\n const request: CreatePaymentIntentRequest = {\n amount: config.amount,\n currency: config.currency,\n method: this.mapPaymentMethod(method),\n country,\n customer_id: config.email || (config.metadata?.customerId as string | undefined),\n metadata,\n };\n\n return this.request<PaymentIntentResponse>('POST', '/v1/payments/intents', request);\n }\n\n /**\n * Retrieves a payment intent by ID\n */\n async getPaymentIntent(paymentId: string): Promise<{ data?: PaymentDetailResponse; error?: PaymentError }> {\n return this.request<PaymentDetailResponse>('GET', `/v1/payments/${paymentId}`);\n }\n\n /**\n * Confirms a payment after PSP callback\n */\n async confirmPayment(paymentId: string): Promise<{ data?: PaymentDetailResponse; error?: PaymentError }> {\n return this.request<PaymentDetailResponse>('POST', `/v1/payments/${paymentId}/confirm`);\n }\n\n /**\n * Cancels a payment intent\n */\n async cancelPaymentIntent(paymentId: string): Promise<{ data?: PaymentDetailResponse; error?: PaymentError }> {\n return this.request<PaymentDetailResponse>('POST', `/v1/payments/${paymentId}/cancel`);\n }\n\n /**\n * Maps SDK payment method to backend format\n */\n private mapPaymentMethod(method: PaymentMethod): string {\n switch (method) {\n case 'card':\n return 'card';\n case 'mobile_money':\n return 'mobile_money';\n case 'bank_transfer':\n return 'bank_transfer';\n default:\n return method;\n }\n }\n}\n\n/**\n * Creates a new Reevit API client instance\n */\nexport function createReevitClient(config: ReevitAPIClientConfig): ReevitAPIClient {\n return new ReevitAPIClient(config);\n}\n","/**\n * useReevit hook\n * Core hook for managing Reevit checkout state and API interactions\n */\n\nimport { useCallback, useReducer, useEffect, useRef } from 'react';\nimport type {\n ReevitCheckoutConfig,\n CheckoutState,\n PaymentMethod,\n PaymentResult,\n PaymentError,\n PaymentIntent,\n} from '../types';\nimport { generateReference } from '../utils';\nimport { ReevitAPIClient, type PaymentIntentResponse } from '../api';\n\n// State shape\ninterface ReevitState {\n status: CheckoutState;\n paymentIntent: PaymentIntent | null;\n selectedMethod: PaymentMethod | null;\n error: PaymentError | null;\n result: PaymentResult | null;\n}\n\n// Actions\ntype ReevitAction =\n | { type: 'INIT_START' }\n | { type: 'INIT_SUCCESS'; payload: PaymentIntent }\n | { type: 'INIT_ERROR'; payload: PaymentError }\n | { type: 'SELECT_METHOD'; payload: PaymentMethod }\n | { type: 'PROCESS_START' }\n | { type: 'PROCESS_SUCCESS'; payload: PaymentResult }\n | { type: 'PROCESS_ERROR'; payload: PaymentError }\n | { type: 'RESET' }\n | { type: 'CLOSE' };\n\n// Initial state\nconst initialState: ReevitState = {\n status: 'idle',\n paymentIntent: null,\n selectedMethod: null,\n error: null,\n result: null,\n};\n\n// Reducer\nfunction reevitReducer(state: ReevitState, action: ReevitAction): ReevitState {\n switch (action.type) {\n case 'INIT_START':\n return { ...state, status: 'loading', error: null };\n case 'INIT_SUCCESS':\n return { ...state, status: 'ready', paymentIntent: action.payload };\n case 'INIT_ERROR':\n return { ...state, status: 'failed', error: action.payload };\n case 'SELECT_METHOD':\n return { ...state, status: 'method_selected', selectedMethod: action.payload };\n case 'PROCESS_START':\n return { ...state, status: 'processing', error: null };\n case 'PROCESS_SUCCESS':\n return { ...state, status: 'success', result: action.payload };\n case 'PROCESS_ERROR':\n return { ...state, status: 'failed', error: action.payload };\n case 'RESET':\n return { ...initialState, status: 'ready', paymentIntent: state.paymentIntent };\n case 'CLOSE':\n return { ...state, status: 'closed' };\n default:\n return state;\n }\n}\n\ninterface UseReevitOptions {\n config: ReevitCheckoutConfig;\n onSuccess?: (result: PaymentResult) => void;\n onError?: (error: PaymentError) => void;\n onClose?: () => void;\n onStateChange?: (state: CheckoutState) => void;\n /** Custom API base URL (for testing or self-hosted deployments) */\n apiBaseUrl?: string;\n}\n\n/**\n * Maps PSP provider names from backend to PSP type used by bridges\n */\nfunction mapProviderToPsp(provider: string): 'paystack' | 'hubtel' | 'flutterwave' {\n const providerLower = provider.toLowerCase();\n if (providerLower.includes('paystack')) return 'paystack';\n if (providerLower.includes('hubtel')) return 'hubtel';\n if (providerLower.includes('flutterwave')) return 'flutterwave';\n // Default to paystack if unknown\n return 'paystack';\n}\n\n/**\n * Maps backend payment intent response to SDK PaymentIntent type\n */\nfunction mapToPaymentIntent(\n response: PaymentIntentResponse,\n config: ReevitCheckoutConfig\n): PaymentIntent {\n return {\n id: response.id,\n clientSecret: response.client_secret,\n pspPublicKey: response.psp_public_key,\n amount: response.amount,\n currency: response.currency,\n status: response.status as 'pending' | 'processing' | 'succeeded' | 'failed' | 'cancelled',\n recommendedPsp: mapProviderToPsp(response.provider),\n availableMethods: config.paymentMethods || ['card', 'mobile_money'],\n connectionId: response.connection_id,\n provider: response.provider,\n feeAmount: response.fee_amount,\n feeCurrency: response.fee_currency,\n netAmount: response.net_amount,\n metadata: config.metadata,\n };\n}\n\nexport function useReevit(options: UseReevitOptions) {\n const { config, onSuccess, onError, onClose, onStateChange, apiBaseUrl } = options;\n const [state, dispatch] = useReducer(reevitReducer, initialState);\n\n // Create API client ref (stable across re-renders)\n const apiClientRef = useRef<ReevitAPIClient | null>(null);\n\n // Guard against duplicate initialize() calls (React StrictMode)\n const initializingRef = useRef(false);\n\n // Initialize API client\n if (!apiClientRef.current) {\n apiClientRef.current = new ReevitAPIClient({\n publicKey: config.publicKey,\n baseUrl: apiBaseUrl,\n });\n }\n\n // Notify on state changes\n useEffect(() => {\n onStateChange?.(state.status);\n }, [state.status, onStateChange]);\n\n // Initialize payment intent\n const initialize = useCallback(\n async (method?: PaymentMethod) => {\n // Guard against duplicate calls (especially in React StrictMode)\n if (initializingRef.current) {\n return;\n }\n initializingRef.current = true;\n\n dispatch({ type: 'INIT_START' });\n\n try {\n const apiClient = apiClientRef.current;\n if (!apiClient) {\n initializingRef.current = false;\n throw new Error('API client not initialized');\n }\n\n // Generate reference if not provided\n const reference = config.reference || generateReference();\n\n // Determine country from currency (can be enhanced with IP detection)\n const country = detectCountryFromCurrency(config.currency);\n\n // Select payment method to send to backend\n const paymentMethod = method || config.paymentMethods?.[0] || 'card';\n\n // Call the Reevit API to create a payment intent\n const { data, error } = await apiClient.createPaymentIntent(\n { ...config, reference },\n paymentMethod,\n country\n );\n\n if (error) {\n dispatch({ type: 'INIT_ERROR', payload: error });\n onError?.(error);\n return;\n }\n\n if (!data) {\n const noDataError: PaymentError = {\n code: 'INIT_FAILED',\n message: 'No data received from API',\n recoverable: true,\n };\n dispatch({ type: 'INIT_ERROR', payload: noDataError });\n onError?.(noDataError);\n initializingRef.current = false;\n return;\n }\n\n // Map response to PaymentIntent\n const paymentIntent = mapToPaymentIntent(data, { ...config, reference });\n\n dispatch({ type: 'INIT_SUCCESS', payload: paymentIntent });\n // Don't reset initializingRef here - once initialized, stay initialized until reset()\n } catch (err) {\n const error: PaymentError = {\n code: 'INIT_FAILED',\n message: err instanceof Error ? err.message : 'Failed to initialize checkout',\n recoverable: true,\n originalError: err,\n };\n dispatch({ type: 'INIT_ERROR', payload: error });\n onError?.(error);\n initializingRef.current = false;\n }\n },\n [config, onError, apiBaseUrl]\n );\n\n // Select payment method\n const selectMethod = useCallback((method: PaymentMethod) => {\n dispatch({ type: 'SELECT_METHOD', payload: method });\n }, []);\n\n // Process payment - called after PSP bridge returns success\n const processPayment = useCallback(\n async (paymentData: Record<string, unknown>) => {\n if (!state.paymentIntent || !state.selectedMethod) {\n return;\n }\n\n dispatch({ type: 'PROCESS_START' });\n\n try {\n const apiClient = apiClientRef.current;\n if (!apiClient) {\n throw new Error('API client not initialized');\n }\n\n // Confirm the payment with the backend\n const { data, error } = await apiClient.confirmPayment(state.paymentIntent.id);\n\n if (error) {\n dispatch({ type: 'PROCESS_ERROR', payload: error });\n onError?.(error);\n return;\n }\n\n // Build successful payment result\n const result: PaymentResult = {\n paymentId: state.paymentIntent.id,\n reference: (paymentData.reference as string) ||\n (state.paymentIntent.metadata?.reference as string) || '',\n amount: state.paymentIntent.amount,\n currency: state.paymentIntent.currency,\n paymentMethod: state.selectedMethod,\n psp: state.paymentIntent.recommendedPsp,\n pspReference: (paymentData.pspReference as string) ||\n (data?.provider_ref_id as string) || '',\n status: 'success',\n metadata: paymentData,\n };\n\n dispatch({ type: 'PROCESS_SUCCESS', payload: result });\n onSuccess?.(result);\n } catch (err) {\n const error: PaymentError = {\n code: 'PAYMENT_FAILED',\n message: err instanceof Error ? err.message : 'Payment failed. Please try again.',\n recoverable: true,\n originalError: err,\n };\n dispatch({ type: 'PROCESS_ERROR', payload: error });\n onError?.(error);\n }\n },\n [state.paymentIntent, state.selectedMethod, onSuccess, onError]\n );\n\n // Handle PSP bridge success (called by PSP bridge components)\n const handlePspSuccess = useCallback(\n async (pspData: Record<string, unknown>) => {\n await processPayment(pspData);\n },\n [processPayment]\n );\n\n // Handle PSP bridge failure\n const handlePspError = useCallback(\n (error: PaymentError) => {\n dispatch({ type: 'PROCESS_ERROR', payload: error });\n onError?.(error);\n },\n [onError]\n );\n\n // Reset checkout\n const reset = useCallback(() => {\n initializingRef.current = false;\n dispatch({ type: 'RESET' });\n }, []);\n\n // Close checkout\n const close = useCallback(async () => {\n // Cancel the payment intent if it exists and is still pending\n if (state.paymentIntent && state.status !== 'success') {\n try {\n const apiClient = apiClientRef.current;\n if (apiClient) {\n await apiClient.cancelPaymentIntent(state.paymentIntent.id);\n }\n } catch {\n // Silently ignore cancel errors\n }\n }\n\n dispatch({ type: 'CLOSE' });\n onClose?.();\n }, [onClose, state.paymentIntent, state.status]);\n\n return {\n // State\n status: state.status,\n paymentIntent: state.paymentIntent,\n selectedMethod: state.selectedMethod,\n error: state.error,\n result: state.result,\n\n // Actions\n initialize,\n selectMethod,\n processPayment,\n handlePspSuccess,\n handlePspError,\n reset,\n close,\n\n // Computed\n isLoading: state.status === 'loading' || state.status === 'processing',\n isReady: state.status === 'ready' || state.status === 'method_selected',\n isComplete: state.status === 'success',\n canRetry: state.error?.recoverable ?? false,\n };\n}\n\n/**\n * Detects country code from currency\n * This is a simple heuristic; in production, you might use IP geolocation\n */\nfunction detectCountryFromCurrency(currency: string): string {\n const currencyToCountry: Record<string, string> = {\n GHS: 'GH', // Ghana\n NGN: 'NG', // Nigeria\n KES: 'KE', // Kenya\n UGX: 'UG', // Uganda\n TZS: 'TZ', // Tanzania\n ZAR: 'ZA', // South Africa\n XOF: 'CI', // CΓ΄te d'Ivoire (CFA)\n XAF: 'CM', // Cameroon (CFA)\n USD: 'US', // United States\n EUR: 'DE', // Europe (default to Germany)\n GBP: 'GB', // United Kingdom\n };\n\n return currencyToCountry[currency.toUpperCase()] || 'GH';\n}\n","/**\n * PaymentMethodSelector Component\n * Displays available payment methods for user selection\n */\n\nimport type { PaymentMethod } from '../types';\nimport { cn } from '../utils';\n\ninterface PaymentMethodSelectorProps {\n methods: PaymentMethod[];\n selectedMethod: PaymentMethod | null;\n onSelect: (method: PaymentMethod) => void;\n disabled?: boolean;\n}\n\n// Payment method configuration\nconst methodConfig: Record<PaymentMethod, { label: string; icon: string; description: string }> = {\n card: {\n label: 'Card',\n icon: 'πŸ’³',\n description: 'Pay with Visa, Mastercard, or other cards',\n },\n mobile_money: {\n label: 'Mobile Money',\n icon: 'πŸ“±',\n description: 'MTN, Vodafone Cash, AirtelTigo Money',\n },\n bank_transfer: {\n label: 'Bank Transfer',\n icon: '🏦',\n description: 'Pay directly from your bank account',\n },\n};\n\nexport function PaymentMethodSelector({\n methods,\n selectedMethod,\n onSelect,\n disabled = false,\n}: PaymentMethodSelectorProps) {\n return (\n <div className=\"reevit-method-selector\">\n <div className=\"reevit-method-selector__label\">Select payment method</div>\n <div className=\"reevit-method-selector__options\">\n {methods.map((method) => {\n const config = methodConfig[method];\n const isSelected = selectedMethod === method;\n\n return (\n <button\n key={method}\n type=\"button\"\n className={cn(\n 'reevit-method-option',\n isSelected && 'reevit-method-option--selected',\n disabled && 'reevit-method-option--disabled'\n )}\n onClick={() => onSelect(method)}\n disabled={disabled}\n aria-pressed={isSelected}\n >\n <span className=\"reevit-method-option__icon\">{config.icon}</span>\n <div className=\"reevit-method-option__content\">\n <span className=\"reevit-method-option__label\">{config.label}</span>\n <span className=\"reevit-method-option__description\">{config.description}</span>\n </div>\n {isSelected && (\n <span className=\"reevit-method-option__check\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M16.667 5L7.5 14.167 3.333 10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","/**\n * MobileMoneyForm Component\n * Form for collecting mobile money payment details\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport type { MobileMoneyNetwork, MobileMoneyFormData } from '../types';\nimport { validatePhone, detectNetwork, formatPhone, cn } from '../utils';\n\ninterface MobileMoneyFormProps {\n onSubmit: (data: MobileMoneyFormData) => void;\n onCancel: () => void;\n isLoading?: boolean;\n initialPhone?: string;\n}\n\nconst networks: { id: MobileMoneyNetwork; name: string; color: string }[] = [\n { id: 'mtn', name: 'MTN', color: '#FFCC00' },\n { id: 'vodafone', name: 'Vodafone', color: '#E60000' },\n { id: 'airteltigo', name: 'AirtelTigo', color: '#E4002B' },\n];\n\nexport function MobileMoneyForm({\n onSubmit,\n onCancel,\n isLoading = false,\n initialPhone = '',\n}: MobileMoneyFormProps) {\n const [phone, setPhone] = useState(initialPhone);\n const [network, setNetwork] = useState<MobileMoneyNetwork | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [touched, setTouched] = useState(false);\n\n // Auto-detect network from phone number\n useEffect(() => {\n if (phone.length >= 3) {\n const detected = detectNetwork(phone);\n if (detected) {\n setNetwork(detected as MobileMoneyNetwork);\n }\n }\n }, [phone]);\n\n // Validate on change\n useEffect(() => {\n if (touched && phone) {\n if (!validatePhone(phone)) {\n setError('Please enter a valid Ghana phone number');\n } else if (network && !validatePhone(phone, network)) {\n setError(`This number doesn't match the selected network`);\n } else {\n setError(null);\n }\n }\n }, [phone, network, touched]);\n\n const handlePhoneChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value.replace(/[^0-9+]/g, '');\n setPhone(value);\n }, []);\n\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault();\n setTouched(true);\n\n if (!phone || !network) {\n setError('Please enter your phone number and select a network');\n return;\n }\n\n if (!validatePhone(phone, network)) {\n setError('Invalid phone number for selected network');\n return;\n }\n\n onSubmit({ phone, network });\n },\n [phone, network, onSubmit]\n );\n\n const isValid = phone && network && validatePhone(phone, network);\n\n return (\n <form className=\"reevit-momo-form\" onSubmit={handleSubmit}>\n <div className=\"reevit-momo-form__field\">\n <label htmlFor=\"reevit-phone\" className=\"reevit-momo-form__label\">\n Phone Number\n </label>\n <input\n id=\"reevit-phone\"\n type=\"tel\"\n className={cn('reevit-momo-form__input', !!error && 'reevit-momo-form__input--error')}\n placeholder=\"024 XXX XXXX\"\n value={phone}\n onChange={handlePhoneChange}\n onBlur={() => setTouched(true)}\n disabled={isLoading}\n autoComplete=\"tel\"\n />\n {phone && !error && (\n <div className=\"reevit-momo-form__formatted\">{formatPhone(phone)}</div>\n )}\n {error && <div className=\"reevit-momo-form__error\">{error}</div>}\n </div>\n\n <div className=\"reevit-momo-form__field\">\n <label className=\"reevit-momo-form__label\">Select Network</label>\n <div className=\"reevit-momo-form__networks\">\n {networks.map((n) => (\n <button\n key={n.id}\n type=\"button\"\n className={cn(\n 'reevit-network-btn',\n network === n.id && 'reevit-network-btn--selected'\n )}\n style={{ '--network-color': n.color } as React.CSSProperties}\n onClick={() => setNetwork(n.id)}\n disabled={isLoading}\n >\n {n.name}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"reevit-momo-form__actions\">\n <button\n type=\"button\"\n className=\"reevit-btn reevit-btn--secondary\"\n onClick={onCancel}\n disabled={isLoading}\n >\n Back\n </button>\n <button\n type=\"submit\"\n className=\"reevit-btn reevit-btn--primary\"\n disabled={!isValid || isLoading}\n >\n {isLoading ? (\n <span className=\"reevit-spinner\" />\n ) : (\n 'Continue'\n )}\n </button>\n </div>\n\n <p className=\"reevit-momo-form__hint\">\n You will receive a USSD prompt on your phone to authorize the payment.\n </p>\n </form>\n );\n}\n","/**\n * Paystack Bridge\n * Handles integration with Paystack popup checkout\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport type { PaymentResult, PaymentError } from '../types';\n\ndeclare global {\n interface Window {\n PaystackPop?: PaystackPopupInterface;\n }\n}\n\ninterface PaystackPopupInterface {\n setup: (config: PaystackConfig) => { openIframe: () => void };\n}\n\ninterface PaystackConfig {\n key: string;\n email: string;\n amount: number;\n currency?: string;\n ref?: string;\n metadata?: Record<string, unknown>;\n channels?: string[];\n callback: (response: PaystackResponse) => void;\n onClose: () => void;\n}\n\ninterface PaystackResponse {\n reference: string;\n trans: string;\n status: string;\n message: string;\n transaction: string;\n trxref: string;\n}\n\ninterface PaystackBridgeProps {\n publicKey: string;\n email: string;\n amount: number;\n currency?: string;\n reference?: string;\n metadata?: Record<string, unknown>;\n channels?: ('card' | 'bank' | 'ussd' | 'qr' | 'mobile_money' | 'bank_transfer')[];\n onSuccess: (result: PaymentResult) => void;\n onError: (error: PaymentError) => void;\n onClose: () => void;\n autoStart?: boolean;\n}\n\n// Load Paystack script\nfunction loadPaystackScript(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (window.PaystackPop) {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.src = 'https://js.paystack.co/v2/inline.js';\n script.async = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load Paystack script'));\n document.head.appendChild(script);\n });\n}\n\nexport function PaystackBridge({\n publicKey,\n email,\n amount,\n currency = 'GHS',\n reference,\n metadata,\n channels = ['card', 'mobile_money'],\n onSuccess,\n onError,\n onClose,\n autoStart = true,\n}: PaystackBridgeProps) {\n const initialized = useRef(false);\n\n const startPayment = useCallback(async () => {\n try {\n // Validate required parameters before attempting to load Paystack\n if (!publicKey) {\n throw new Error('Paystack public key is required but was empty');\n }\n if (!email) {\n throw new Error('Email is required for Paystack payments');\n }\n if (!amount || amount <= 0) {\n throw new Error('Valid amount is required for Paystack payments');\n }\n\n await loadPaystackScript();\n\n if (!window.PaystackPop) {\n throw new Error('Paystack script loaded but PaystackPop not available');\n }\n\n const handler = window.PaystackPop.setup({\n key: publicKey,\n email,\n amount, // Paystack expects amount in kobo/pesewas (smallest unit)\n currency,\n ref: reference,\n metadata,\n channels,\n callback: (response: PaystackResponse) => {\n const result: PaymentResult = {\n paymentId: response.transaction,\n reference: response.reference,\n amount,\n currency,\n paymentMethod: 'card', // Paystack handles this internally\n psp: 'paystack',\n pspReference: response.trans,\n status: response.status === 'success' ? 'success' : 'pending',\n metadata: { trxref: response.trxref },\n };\n onSuccess(result);\n },\n onClose: () => {\n onClose();\n },\n });\n\n handler.openIframe();\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to initialize Paystack';\n const error: PaymentError = {\n code: 'PSP_ERROR',\n message: errorMessage,\n recoverable: true,\n originalError: err,\n };\n onError(error);\n }\n }, [publicKey, email, amount, currency, reference, metadata, channels, onSuccess, onError, onClose]);\n\n useEffect(() => {\n if (autoStart && !initialized.current) {\n initialized.current = true;\n startPayment();\n }\n }, [autoStart, startPayment]);\n\n return (\n <div className=\"reevit-psp-bridge reevit-psp-bridge--paystack\">\n <div className=\"reevit-psp-bridge__loading\">\n <div className=\"reevit-spinner\" />\n <p>Connecting to Paystack...</p>\n </div>\n </div>\n );\n}\n\n// Export utility for manual initialization\nexport { loadPaystackScript };","/**\n * ReevitCheckout Component\n * Main checkout component that orchestrates the payment flow\n */\n\nimport { useEffect, useState, useCallback, createContext, useContext } from 'react';\nimport type { ReevitCheckoutProps, PaymentMethod, MobileMoneyFormData } from '../types';\nimport { useReevit } from '../hooks/useReevit';\nimport { PaymentMethodSelector } from './PaymentMethodSelector';\nimport { MobileMoneyForm } from './MobileMoneyForm';\nimport { PaystackBridge } from '../bridges/PaystackBridge';\nimport { formatAmount, createThemeVariables, cn } from '../utils';\n\n// Context for nested components\ninterface ReevitContextValue {\n publicKey: string;\n amount: number;\n currency: string;\n}\n\nconst ReevitContext = createContext<ReevitContextValue | null>(null);\n\nexport function useReevitContext() {\n const context = useContext(ReevitContext);\n if (!context) {\n throw new Error('useReevitContext must be used within ReevitCheckout');\n }\n return context;\n}\n\nexport function ReevitCheckout({\n // Config\n publicKey,\n amount,\n currency,\n email = '',\n phone = '',\n reference,\n metadata,\n paymentMethods = ['card', 'mobile_money'],\n // Callbacks\n onSuccess,\n onError,\n onClose,\n onStateChange,\n // UI\n children,\n autoOpen = false,\n theme,\n apiBaseUrl,\n}: ReevitCheckoutProps) {\n const [isOpen, setIsOpen] = useState(autoOpen);\n const [showPSPBridge, setShowPSPBridge] = useState(false);\n const [momoData, setMomoData] = useState<MobileMoneyFormData | null>(null);\n\n const {\n status,\n paymentIntent,\n selectedMethod,\n error,\n result,\n initialize,\n selectMethod,\n processPayment,\n reset,\n close: closeCheckout,\n isLoading,\n isComplete,\n } = useReevit({\n config: { publicKey, amount, currency, email, phone, reference, metadata, paymentMethods },\n apiBaseUrl,\n onSuccess: (result) => {\n onSuccess?.(result);\n // Keep modal open briefly to show success\n setTimeout(() => {\n setIsOpen(false);\n }, 2000);\n },\n onError,\n onClose: () => {\n setIsOpen(false);\n onClose?.();\n },\n onStateChange,\n });\n\n // Initialize when opened\n useEffect(() => {\n if (isOpen && status === 'idle') {\n initialize();\n }\n }, [isOpen, status, initialize]);\n\n // Open modal\n const handleOpen = useCallback(() => {\n setIsOpen(true);\n setShowPSPBridge(false);\n setMomoData(null);\n }, []);\n\n // Close modal\n const handleClose = useCallback(() => {\n closeCheckout();\n setIsOpen(false);\n setShowPSPBridge(false);\n setMomoData(null);\n }, [closeCheckout]);\n\n // Handle payment method selection\n const handleMethodSelect = useCallback(\n (method: PaymentMethod) => {\n selectMethod(method);\n },\n [selectMethod]\n );\n\n // Handle continue after method selection\n const handleContinue = useCallback(() => {\n if (!selectedMethod) return;\n\n if (selectedMethod === 'card') {\n // For card payments, show PSP bridge (Paystack popup)\n setShowPSPBridge(true);\n }\n // Mobile money form is already shown when selected\n }, [selectedMethod]);\n\n // Handle mobile money form submission\n const handleMomoSubmit = useCallback(\n (data: MobileMoneyFormData) => {\n setMomoData(data);\n setShowPSPBridge(true);\n },\n []\n );\n\n // Handle PSP callback\n const handlePSPSuccess = useCallback(\n (pspResult: any) => {\n processPayment({ ...pspResult, momoData });\n },\n [processPayment, momoData]\n );\n\n const handlePSPError = useCallback(\n (error: any) => {\n setShowPSPBridge(false);\n onError?.(error);\n },\n [onError]\n );\n\n const handlePSPClose = useCallback(() => {\n setShowPSPBridge(false);\n }, []);\n\n // Back button handler\n const handleBack = useCallback(() => {\n reset();\n setMomoData(null);\n setShowPSPBridge(false);\n }, [reset]);\n\n // Theme styles\n const themeStyles = theme ? createThemeVariables(theme as unknown as Record<string, string | undefined>) : {};\n\n // Render trigger\n const trigger = children ? (\n <span onClick={handleOpen} role=\"button\" tabIndex={0}>\n {children}\n </span>\n ) : (\n <button className=\"reevit-trigger-btn\" onClick={handleOpen}>\n Pay {formatAmount(amount, currency)}\n </button>\n );\n\n // Render content based on state\n const renderContent = () => {\n // Loading state\n if (status === 'loading') {\n return (\n <div className=\"reevit-loading\">\n <div className=\"reevit-spinner\" />\n <p>Preparing checkout...</p>\n </div>\n );\n }\n\n // Success state\n if (status === 'success' && result) {\n return (\n <div className=\"reevit-success\">\n <div className=\"reevit-success__icon\">βœ“</div>\n <h3>Payment Successful</h3>\n <p>Reference: {result.reference}</p>\n </div>\n );\n }\n\n // Error state (only if not recoverable)\n if (status === 'failed' && error && !error.recoverable) {\n return (\n <div className=\"reevit-error\">\n <div className=\"reevit-error__icon\">βœ•</div>\n <h3>Payment Failed</h3>\n <p>{error.message}</p>\n <button className=\"reevit-btn reevit-btn--primary\" onClick={handleBack}>\n Try Again\n </button>\n </div>\n );\n }\n\n // PSP Bridge (Paystack popup)\n if (showPSPBridge) {\n // Use PSP public key from payment intent if available, otherwise fall back to Reevit public key\n const pspKey = paymentIntent?.pspPublicKey || publicKey;\n return (\n <PaystackBridge\n publicKey={pspKey}\n email={email}\n amount={paymentIntent?.amount ?? amount}\n currency={paymentIntent?.currency ?? currency}\n reference={reference}\n metadata={{\n ...metadata,\n // Override with correct payment intent ID for webhook routing\n // This ensures Paystack webhook includes the correct ID to find the payment\n payment_id: paymentIntent?.id,\n connection_id: paymentIntent?.connectionId ?? (metadata?.connection_id as string),\n }}\n channels={selectedMethod === 'mobile_money' ? ['mobile_money'] : ['card']}\n onSuccess={handlePSPSuccess}\n onError={handlePSPError}\n onClose={handlePSPClose}\n />\n );\n }\n\n // Mobile money form\n if (selectedMethod === 'mobile_money' && !showPSPBridge) {\n return (\n <MobileMoneyForm\n onSubmit={handleMomoSubmit}\n onCancel={handleBack}\n isLoading={isLoading}\n initialPhone={phone}\n />\n );\n }\n\n // Method selection\n return (\n <div className=\"reevit-method-step\">\n <PaymentMethodSelector\n methods={paymentMethods}\n selectedMethod={selectedMethod}\n onSelect={handleMethodSelect}\n disabled={isLoading}\n />\n\n {selectedMethod && selectedMethod !== 'mobile_money' && (\n <div className=\"reevit-method-step__actions\">\n <button\n className=\"reevit-btn reevit-btn--primary\"\n onClick={handleContinue}\n disabled={isLoading}\n >\n Continue\n </button>\n </div>\n )}\n </div>\n );\n };\n\n return (\n <ReevitContext.Provider value={{ publicKey, amount, currency }}>\n {trigger}\n\n {isOpen && (\n <div className=\"reevit-overlay\" onClick={handleClose}>\n <div\n className={cn('reevit-modal', isComplete && 'reevit-modal--success')}\n style={themeStyles}\n onClick={(e) => e.stopPropagation()}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n {/* Header */}\n <div className=\"reevit-modal__header\">\n <div className=\"reevit-modal__branding\">\n <img\n src=\"https://i.imgur.com/bzUR5Lm.png\"\n alt=\"Reevit\"\n className=\"reevit-modal__logo\"\n />\n </div>\n <button\n className=\"reevit-modal__close\"\n onClick={handleClose}\n aria-label=\"Close\"\n >\n βœ•\n </button>\n </div>\n\n {/* Amount display */}\n <div className=\"reevit-modal__amount\">\n <span className=\"reevit-modal__amount-label\">Amount</span>\n <span className=\"reevit-modal__amount-value\">\n {formatAmount(amount, currency)}\n </span>\n </div>\n\n {/* Content */}\n <div className=\"reevit-modal__content\">\n {renderContent()}\n </div>\n\n {/* Footer */}\n <div className=\"reevit-modal__footer\">\n <span className=\"reevit-modal__secured\">\n πŸ”’ Secured by Reevit\n </span>\n </div>\n </div>\n </div>\n )}\n </ReevitContext.Provider>\n );\n}\n","/**\n * Hubtel Bridge\n * Handles integration with Hubtel payment popup\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport type { PaymentResult, PaymentError } from '../types';\n\ndeclare global {\n interface Window {\n HubtelCheckout?: HubtelCheckoutInterface;\n }\n}\n\ninterface HubtelCheckoutInterface {\n initPayment: (config: HubtelConfig) => void;\n}\n\ninterface HubtelConfig {\n merchantAccount: string;\n basicDescription: string;\n totalAmount: number;\n currency: string;\n clientReference: string;\n customerEmail?: string;\n customerMsisdn?: string;\n callbackUrl?: string;\n onComplete?: (response: HubtelResponse) => void;\n onCancel?: () => void;\n}\n\ninterface HubtelResponse {\n status: 'Success' | 'Failed' | 'Cancelled';\n transactionId: string;\n clientReference: string;\n amount: number;\n currency: string;\n message?: string;\n}\n\ninterface HubtelBridgeProps {\n merchantAccount: string;\n amount: number;\n currency?: string;\n reference?: string;\n email?: string;\n phone?: string;\n description?: string;\n onSuccess: (result: PaymentResult) => void;\n onError: (error: PaymentError) => void;\n onClose: () => void;\n autoStart?: boolean;\n}\n\n// Load Hubtel script\nfunction loadHubtelScript(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (window.HubtelCheckout) {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.src = 'https://checkout.hubtel.com/checkout.js';\n script.async = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load Hubtel script'));\n document.head.appendChild(script);\n });\n}\n\nexport function HubtelBridge({\n merchantAccount,\n amount,\n currency = 'GHS',\n reference,\n email,\n phone,\n description = 'Payment',\n onSuccess,\n onError,\n onClose,\n autoStart = true,\n}: HubtelBridgeProps) {\n const initialized = useRef(false);\n\n const startPayment = useCallback(async () => {\n try {\n await loadHubtelScript();\n\n if (!window.HubtelCheckout) {\n throw new Error('Hubtel checkout not available');\n }\n\n window.HubtelCheckout.initPayment({\n merchantAccount,\n basicDescription: description,\n totalAmount: amount / 100, // Hubtel expects amount in major units (GHS, not pesewas)\n currency,\n clientReference: reference || `hubtel_${Date.now()}`,\n customerEmail: email,\n customerMsisdn: phone,\n onComplete: (response: HubtelResponse) => {\n if (response.status === 'Success') {\n const result: PaymentResult = {\n paymentId: response.transactionId,\n reference: response.clientReference,\n amount: Math.round(response.amount * 100), // Convert back to pesewas\n currency: response.currency,\n paymentMethod: 'mobile_money',\n psp: 'hubtel',\n pspReference: response.transactionId,\n status: 'success',\n };\n onSuccess(result);\n } else {\n const error: PaymentError = {\n code: 'PAYMENT_FAILED',\n message: response.message || 'Payment failed',\n recoverable: true,\n };\n onError(error);\n }\n },\n onCancel: () => {\n onClose();\n },\n });\n } catch (err) {\n const error: PaymentError = {\n code: 'PSP_ERROR',\n message: 'Failed to initialize Hubtel',\n recoverable: true,\n originalError: err,\n };\n onError(error);\n }\n }, [merchantAccount, amount, currency, reference, email, phone, description, onSuccess, onError, onClose]);\n\n useEffect(() => {\n if (autoStart && !initialized.current) {\n initialized.current = true;\n startPayment();\n }\n }, [autoStart, startPayment]);\n\n return (\n <div className=\"reevit-psp-bridge reevit-psp-bridge--hubtel\">\n <div className=\"reevit-psp-bridge__loading\">\n <div className=\"reevit-spinner\" />\n <p>Connecting to Hubtel...</p>\n </div>\n </div>\n );\n}\n\nexport { loadHubtelScript };\n","/**\n * Flutterwave Bridge\n * Handles integration with Flutterwave payment modal\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport type { PaymentResult, PaymentError } from '../types';\n\ndeclare global {\n interface Window {\n FlutterwaveCheckout?: (config: FlutterwaveConfig) => void;\n }\n}\n\ninterface FlutterwaveConfig {\n public_key: string;\n tx_ref: string;\n amount: number;\n currency: string;\n payment_options?: string;\n customer: {\n email: string;\n phone_number?: string;\n name?: string;\n };\n customizations?: {\n title?: string;\n description?: string;\n logo?: string;\n };\n meta?: Record<string, unknown>;\n callback: (response: FlutterwaveResponse) => void;\n onclose: () => void;\n}\n\ninterface FlutterwaveResponse {\n status: 'successful' | 'failed' | 'cancelled';\n transaction_id: number;\n tx_ref: string;\n flw_ref: string;\n amount: number;\n currency: string;\n charged_amount: number;\n payment_type: string;\n}\n\ninterface FlutterwaveBridgeProps {\n publicKey: string;\n amount: number;\n currency?: string;\n reference?: string;\n email: string;\n phone?: string;\n name?: string;\n paymentOptions?: string;\n title?: string;\n description?: string;\n logo?: string;\n metadata?: Record<string, unknown>;\n onSuccess: (result: PaymentResult) => void;\n onError: (error: PaymentError) => void;\n onClose: () => void;\n autoStart?: boolean;\n}\n\n// Load Flutterwave script\nfunction loadFlutterwaveScript(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (window.FlutterwaveCheckout) {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.src = 'https://checkout.flutterwave.com/v3.js';\n script.async = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load Flutterwave script'));\n document.head.appendChild(script);\n });\n}\n\nexport function FlutterwaveBridge({\n publicKey,\n amount,\n currency = 'GHS',\n reference,\n email,\n phone,\n name,\n paymentOptions = 'card,mobilemoney,ussd',\n title,\n description,\n logo,\n metadata,\n onSuccess,\n onError,\n onClose,\n autoStart = true,\n}: FlutterwaveBridgeProps) {\n const initialized = useRef(false);\n\n const startPayment = useCallback(async () => {\n try {\n await loadFlutterwaveScript();\n\n if (!window.FlutterwaveCheckout) {\n throw new Error('Flutterwave checkout not available');\n }\n\n const txRef = reference || `flw_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n\n window.FlutterwaveCheckout({\n public_key: publicKey,\n tx_ref: txRef,\n amount: amount / 100, // Flutterwave expects amount in major units\n currency,\n payment_options: paymentOptions,\n customer: {\n email,\n phone_number: phone,\n name,\n },\n customizations: {\n title,\n description,\n logo,\n },\n meta: metadata,\n callback: (response: FlutterwaveResponse) => {\n if (response.status === 'successful') {\n const result: PaymentResult = {\n paymentId: response.transaction_id.toString(),\n reference: response.tx_ref,\n amount: Math.round(response.amount * 100),\n currency: response.currency,\n paymentMethod: response.payment_type === 'mobilemoney' ? 'mobile_money' : 'card',\n psp: 'flutterwave',\n pspReference: response.flw_ref,\n status: 'success',\n metadata: {\n charged_amount: response.charged_amount,\n payment_type: response.payment_type,\n },\n };\n onSuccess(result);\n } else {\n const error: PaymentError = {\n code: response.status === 'cancelled' ? 'CANCELLED' : 'PAYMENT_FAILED',\n message: response.status === 'cancelled' ? 'Payment was cancelled' : 'Payment failed',\n recoverable: true,\n };\n onError(error);\n }\n },\n onclose: () => {\n onClose();\n },\n });\n } catch (err) {\n const error: PaymentError = {\n code: 'PSP_ERROR',\n message: 'Failed to initialize Flutterwave',\n recoverable: true,\n originalError: err,\n };\n onError(error);\n }\n }, [\n publicKey,\n amount,\n currency,\n reference,\n email,\n phone,\n name,\n paymentOptions,\n title,\n description,\n logo,\n metadata,\n onSuccess,\n onError,\n onClose,\n ]);\n\n useEffect(() => {\n if (autoStart && !initialized.current) {\n initialized.current = true;\n startPayment();\n }\n }, [autoStart, startPayment]);\n\n return (\n <div className=\"reevit-psp-bridge reevit-psp-bridge--flutterwave\">\n <div className=\"reevit-psp-bridge__loading\">\n <div className=\"reevit-spinner\" />\n <p>Connecting to Flutterwave...</p>\n </div>\n </div>\n );\n}\n\nexport { loadFlutterwaveScript };\n","/**\n * StripeBridge.tsx\n * React component for Stripe payment integration\n */\n\nimport { useEffect, useState, useCallback, useRef } from 'react';\n\ndeclare global {\n interface Window {\n Stripe?: (publishableKey: string) => StripeInstance;\n }\n}\n\ninterface StripeInstance {\n elements: (options?: { clientSecret: string; appearance?: StripeAppearance }) => StripeElements;\n confirmPayment: (options: {\n elements: StripeElements;\n confirmParams?: { return_url?: string };\n redirect?: 'if_required';\n }) => Promise<{ error?: StripeError; paymentIntent?: { id: string; status: string } }>;\n}\n\ninterface StripeElements {\n create: (type: 'payment' | 'card', options?: Record<string, unknown>) => StripeElement;\n getElement: (type: string) => StripeElement | null;\n submit: () => Promise<{ error?: StripeError }>;\n}\n\ninterface StripeElement {\n mount: (selector: string | HTMLElement) => void;\n unmount: () => void;\n on: (event: string, handler: (e: any) => void) => void;\n destroy: () => void;\n}\n\ninterface StripeError {\n type: string;\n message: string;\n code?: string;\n}\n\ninterface StripeAppearance {\n theme?: 'stripe' | 'night' | 'flat';\n variables?: Record<string, string>;\n rules?: Record<string, Record<string, string>>;\n}\n\nexport interface StripeBridgeProps {\n publishableKey: string;\n clientSecret: string;\n amount: number;\n currency: string;\n appearance?: StripeAppearance;\n onSuccess: (result: { paymentIntentId: string; status: string }) => void;\n onError: (error: { code: string; message: string }) => void;\n onReady?: () => void;\n onCancel?: () => void;\n}\n\nconst STRIPE_SCRIPT_URL = 'https://js.stripe.com/v3/';\nlet stripeScriptPromise: Promise<void> | null = null;\n\nexport function loadStripeScript(): Promise<void> {\n if (stripeScriptPromise) return stripeScriptPromise;\n\n if (document.getElementById('stripe-js-script')) {\n stripeScriptPromise = Promise.resolve();\n return stripeScriptPromise;\n }\n\n stripeScriptPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.id = 'stripe-js-script';\n script.src = STRIPE_SCRIPT_URL;\n script.async = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load Stripe.js'));\n document.head.appendChild(script);\n });\n\n return stripeScriptPromise;\n}\n\nexport function StripeBridge({\n publishableKey,\n clientSecret,\n amount,\n currency,\n appearance,\n onSuccess,\n onError,\n onReady,\n onCancel,\n}: StripeBridgeProps) {\n const [isLoading, setIsLoading] = useState(true);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const stripeRef = useRef<StripeInstance | null>(null);\n const elementsRef = useRef<StripeElements | null>(null);\n const paymentElementRef = useRef<StripeElement | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n let mounted = true;\n\n const initStripe = async () => {\n try {\n await loadStripeScript();\n\n if (!mounted || !window.Stripe) {\n throw new Error('Stripe not available');\n }\n\n stripeRef.current = window.Stripe(publishableKey);\n\n elementsRef.current = stripeRef.current.elements({\n clientSecret,\n appearance: appearance || { theme: 'stripe' },\n });\n\n paymentElementRef.current = elementsRef.current.create('payment');\n\n if (containerRef.current) {\n paymentElementRef.current.mount(containerRef.current);\n }\n\n paymentElementRef.current.on('ready', () => {\n if (mounted) {\n setIsLoading(false);\n onReady?.();\n }\n });\n\n paymentElementRef.current.on('change', (event: any) => {\n if (event.error) {\n setError(event.error.message);\n } else {\n setError(null);\n }\n });\n } catch (err) {\n if (mounted) {\n const message = err instanceof Error ? err.message : 'Failed to initialize Stripe';\n setError(message);\n setIsLoading(false);\n onError({ code: 'STRIPE_INIT_ERROR', message });\n }\n }\n };\n\n initStripe();\n\n return () => {\n mounted = false;\n paymentElementRef.current?.destroy();\n };\n }, [publishableKey, clientSecret, appearance, onReady, onError]);\n\n const handleSubmit = useCallback(async () => {\n if (!stripeRef.current || !elementsRef.current) {\n onError({ code: 'NOT_INITIALIZED', message: 'Stripe not initialized' });\n return;\n }\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n // Validate the form first\n const { error: submitError } = await elementsRef.current.submit();\n if (submitError) {\n setError(submitError.message);\n onError({ code: submitError.code || 'VALIDATION_ERROR', message: submitError.message });\n setIsSubmitting(false);\n return;\n }\n\n // Confirm the payment\n const { error: confirmError, paymentIntent } = await stripeRef.current.confirmPayment({\n elements: elementsRef.current,\n redirect: 'if_required',\n });\n\n if (confirmError) {\n setError(confirmError.message);\n onError({ code: confirmError.code || 'PAYMENT_ERROR', message: confirmError.message });\n } else if (paymentIntent) {\n onSuccess({\n paymentIntentId: paymentIntent.id,\n status: paymentIntent.status,\n });\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Payment failed';\n setError(message);\n onError({ code: 'UNKNOWN_ERROR', message });\n } finally {\n setIsSubmitting(false);\n }\n }, [onSuccess, onError]);\n\n return (\n <div className=\"reevit-stripe-bridge\">\n {isLoading && (\n <div className=\"reevit-stripe-loading\">\n <div className=\"reevit-spinner\" />\n <p>Loading secure payment form...</p>\n </div>\n )}\n\n <div\n ref={containerRef}\n className=\"reevit-stripe-element\"\n style={{ display: isLoading ? 'none' : 'block', minHeight: '200px' }}\n />\n\n {error && (\n <div className=\"reevit-stripe-error\">\n <p>{error}</p>\n </div>\n )}\n\n <div className=\"reevit-stripe-actions\">\n <button\n type=\"button\"\n className=\"reevit-submit-btn\"\n onClick={handleSubmit}\n disabled={isLoading || isSubmitting}\n >\n {isSubmitting ? (\n <span className=\"reevit-spinner\" />\n ) : (\n <>Pay {currency} {(amount / 100).toFixed(2)}</>\n )}\n </button>\n\n {onCancel && (\n <button\n type=\"button\"\n className=\"reevit-cancel-btn\"\n onClick={onCancel}\n disabled={isSubmitting}\n >\n Cancel\n </button>\n )}\n </div>\n </div>\n );\n}\n","/**\n * MonnifyBridge.tsx\n * React component for Monnify payment integration (Nigeria)\n */\n\nimport { useEffect, useCallback, useState } from 'react';\n\ndeclare global {\n interface Window {\n MonnifySDK?: {\n initialize: (config: MonnifyConfig) => void;\n };\n }\n}\n\ninterface MonnifyConfig {\n amount: number;\n currency: string;\n reference: string;\n customerName: string;\n customerEmail: string;\n customerMobileNumber?: string;\n apiKey: string;\n contractCode: string;\n paymentDescription?: string;\n isTestMode?: boolean;\n metadata?: Record<string, unknown>;\n onComplete: (response: MonnifyResponse) => void;\n onClose: () => void;\n}\n\ninterface MonnifyResponse {\n status: 'SUCCESS' | 'FAILED' | 'PENDING';\n message: string;\n transactionReference: string;\n paymentReference: string;\n authorizedAmount?: number;\n paymentStatus?: string;\n}\n\nexport interface MonnifyBridgeProps {\n apiKey: string;\n contractCode: string;\n amount: number;\n currency: string;\n reference: string;\n customerName: string;\n customerEmail: string;\n customerPhone?: string;\n paymentDescription?: string;\n isTestMode?: boolean;\n metadata?: Record<string, unknown>;\n autoOpen?: boolean;\n onSuccess: (result: {\n transactionReference: string;\n paymentReference: string;\n amount: number;\n }) => void;\n onError: (error: { code: string; message: string }) => void;\n onClose?: () => void;\n}\n\nconst MONNIFY_SCRIPT_URL = 'https://sdk.monnify.com/plugin/monnify.js';\nlet monnifyScriptPromise: Promise<void> | null = null;\n\nexport function loadMonnifyScript(): Promise<void> {\n if (monnifyScriptPromise) return monnifyScriptPromise;\n\n if (document.getElementById('monnify-sdk-script')) {\n monnifyScriptPromise = Promise.resolve();\n return monnifyScriptPromise;\n }\n\n monnifyScriptPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.id = 'monnify-sdk-script';\n script.src = MONNIFY_SCRIPT_URL;\n script.async = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load Monnify SDK'));\n document.head.appendChild(script);\n });\n\n return monnifyScriptPromise;\n}\n\nexport function MonnifyBridge({\n apiKey,\n contractCode,\n amount,\n currency,\n reference,\n customerName,\n customerEmail,\n customerPhone,\n paymentDescription,\n isTestMode = false,\n metadata,\n autoOpen = true,\n onSuccess,\n onError,\n onClose,\n}: MonnifyBridgeProps) {\n const [isLoading, setIsLoading] = useState(true);\n const [isReady, setIsReady] = useState(false);\n\n const openMonnify = useCallback(async () => {\n try {\n await loadMonnifyScript();\n\n if (!window.MonnifySDK) {\n throw new Error('Monnify SDK not available');\n }\n\n window.MonnifySDK.initialize({\n amount,\n currency: currency || 'NGN',\n reference,\n customerName,\n customerEmail,\n customerMobileNumber: customerPhone,\n apiKey,\n contractCode,\n paymentDescription: paymentDescription || 'Payment',\n isTestMode,\n metadata,\n onComplete: (response: MonnifyResponse) => {\n if (response.status === 'SUCCESS') {\n onSuccess({\n transactionReference: response.transactionReference,\n paymentReference: response.paymentReference,\n amount: response.authorizedAmount || amount,\n });\n } else {\n onError({\n code: 'MONNIFY_PAYMENT_FAILED',\n message: response.message || 'Payment was not successful',\n });\n }\n },\n onClose: () => {\n onClose?.();\n },\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to open Monnify';\n onError({ code: 'MONNIFY_INIT_ERROR', message });\n }\n }, [\n amount, currency, reference, customerName, customerEmail, customerPhone,\n apiKey, contractCode, paymentDescription, isTestMode, metadata,\n onSuccess, onError, onClose\n ]);\n\n useEffect(() => {\n const init = async () => {\n try {\n await loadMonnifyScript();\n setIsReady(true);\n setIsLoading(false);\n\n if (autoOpen) {\n openMonnify();\n }\n } catch (err) {\n setIsLoading(false);\n const message = err instanceof Error ? err.message : 'Failed to load Monnify';\n onError({ code: 'MONNIFY_LOAD_ERROR', message });\n }\n };\n\n init();\n }, [autoOpen, openMonnify, onError]);\n\n if (isLoading) {\n return (\n <div className=\"reevit-monnify-bridge\">\n <div className=\"reevit-monnify-loading\">\n <div className=\"reevit-spinner\" />\n <p>Loading Monnify checkout...</p>\n </div>\n </div>\n );\n }\n\n if (!autoOpen && isReady) {\n return (\n <div className=\"reevit-monnify-bridge\">\n <button\n type=\"button\"\n className=\"reevit-submit-btn\"\n onClick={openMonnify}\n >\n Pay with Monnify\n </button>\n </div>\n );\n }\n\n return null;\n}\n","/**\n * MPesaBridge.tsx\n * React component for M-Pesa STK Push integration (Kenya/Tanzania)\n * \n * Note: M-Pesa uses server-to-server STK Push initiated by the backend.\n * This component handles the UI flow while the customer approves on their phone.\n */\n\nimport { useState, useCallback } from 'react';\n\nexport interface MPesaBridgeProps {\n /** API endpoint to initiate STK Push (your backend) */\n apiEndpoint: string;\n /** Customer phone number in format 254XXXXXXXXX */\n phoneNumber: string;\n /** Amount to charge */\n amount: number;\n /** Currency (KES or TZS) */\n currency: string;\n /** Unique transaction reference */\n reference: string;\n /** Payment description */\n description?: string;\n /** Called when STK Push is successfully sent */\n onInitiated?: (checkoutRequestId: string) => void;\n /** Called when payment is confirmed (via webhook/polling) */\n onSuccess: (result: { transactionId: string; reference: string }) => void;\n /** Called on error */\n onError: (error: { code: string; message: string }) => void;\n /** Custom headers for API calls (e.g., authorization) */\n headers?: Record<string, string>;\n}\n\ntype MPesaState = 'idle' | 'initiating' | 'waiting' | 'success' | 'failed';\n\nexport function MPesaBridge({\n apiEndpoint,\n phoneNumber,\n amount,\n currency,\n reference,\n description,\n onInitiated,\n onSuccess,\n onError,\n headers = {},\n}: MPesaBridgeProps) {\n const [state, setState] = useState<MPesaState>('idle');\n const [error, setError] = useState<string | null>(null);\n const [checkoutRequestId, setCheckoutRequestId] = useState<string | null>(null);\n\n const initiateSTKPush = useCallback(async () => {\n setState('initiating');\n setError(null);\n\n try {\n const response = await fetch(apiEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: JSON.stringify({\n phone_number: phoneNumber,\n amount,\n currency,\n reference,\n description: description || `Payment ${reference}`,\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Request failed: ${response.status}`);\n }\n\n const data = await response.json();\n const requestId = data.checkout_request_id || data.checkoutRequestId || data.transaction_id;\n\n setCheckoutRequestId(requestId);\n setState('waiting');\n onInitiated?.(requestId);\n\n // Note: Success will come via webhook or polling on parent component\n // This bridge just handles the UI for initiating the push\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to initiate M-Pesa payment';\n setError(message);\n setState('failed');\n onError({ code: 'MPESA_INIT_ERROR', message });\n }\n }, [apiEndpoint, phoneNumber, amount, currency, reference, description, headers, onInitiated, onError]);\n\n const handleRetry = useCallback(() => {\n setState('idle');\n setError(null);\n initiateSTKPush();\n }, [initiateSTKPush]);\n\n // Idle state - show initiate button\n if (state === 'idle') {\n return (\n <div className=\"reevit-mpesa-bridge\">\n <div className=\"reevit-mpesa-info\">\n <div className=\"reevit-mpesa-icon\">πŸ“±</div>\n <h3>Pay with M-Pesa</h3>\n <p>You will receive a prompt on your phone to complete the payment.</p>\n <p className=\"reevit-mpesa-phone\">Phone: {phoneNumber}</p>\n </div>\n <button\n type=\"button\"\n className=\"reevit-submit-btn reevit-mpesa-btn\"\n onClick={initiateSTKPush}\n >\n Send Payment Request\n </button>\n </div>\n );\n }\n\n // Initiating state - show loading\n if (state === 'initiating') {\n return (\n <div className=\"reevit-mpesa-bridge\">\n <div className=\"reevit-mpesa-loading\">\n <div className=\"reevit-spinner reevit-spinner--large\" />\n <p>Sending payment request to your phone...</p>\n </div>\n </div>\n );\n }\n\n // Waiting state - customer should check their phone\n if (state === 'waiting') {\n return (\n <div className=\"reevit-mpesa-bridge\">\n <div className=\"reevit-mpesa-waiting\">\n <div className=\"reevit-mpesa-phone-icon\">πŸ“²</div>\n <h3>Check Your Phone</h3>\n <p>\n An M-Pesa payment request has been sent to <strong>{phoneNumber}</strong>.\n </p>\n <ol className=\"reevit-mpesa-steps\">\n <li>Check for the M-Pesa prompt on your phone</li>\n <li>Enter your M-Pesa PIN to authorize</li>\n <li>Wait for confirmation</li>\n </ol>\n <div className=\"reevit-mpesa-waiting-indicator\">\n <div className=\"reevit-spinner\" />\n <span>Waiting for payment confirmation...</span>\n </div>\n {checkoutRequestId && (\n <p className=\"reevit-mpesa-ref\">Request ID: {checkoutRequestId}</p>\n )}\n </div>\n </div>\n );\n }\n\n // Failed state - show error and retry\n if (state === 'failed') {\n return (\n <div className=\"reevit-mpesa-bridge\">\n <div className=\"reevit-mpesa-error\">\n <div className=\"reevit-error-icon\">⚠️</div>\n <h3>Payment Request Failed</h3>\n <p>{error || 'Something went wrong. Please try again.'}</p>\n <button\n type=\"button\"\n className=\"reevit-retry-btn\"\n onClick={handleRetry}\n >\n Try Again\n </button>\n </div>\n </div>\n );\n }\n\n return null;\n}\n\n/**\n * Hook for M-Pesa payment status polling\n * Use this to check payment status after STK Push is initiated\n */\nexport function useMPesaStatusPolling(\n statusEndpoint: string,\n checkoutRequestId: string | null,\n options: {\n interval?: number;\n maxAttempts?: number;\n headers?: Record<string, string>;\n onSuccess: (result: { transactionId: string }) => void;\n onFailed: (error: { message: string }) => void;\n onTimeout: () => void;\n }\n) {\n const { interval = 5000, maxAttempts = 24, headers = {}, onSuccess, onFailed, onTimeout } = options;\n\n const startPolling = useCallback(async () => {\n if (!checkoutRequestId) return;\n\n let attempts = 0;\n\n const poll = async () => {\n if (attempts >= maxAttempts) {\n onTimeout();\n return;\n }\n\n try {\n const response = await fetch(`${statusEndpoint}?checkout_request_id=${checkoutRequestId}`, {\n headers,\n });\n\n if (!response.ok) {\n attempts++;\n setTimeout(poll, interval);\n return;\n }\n\n const data = await response.json();\n\n if (data.status === 'success' || data.status === 'completed') {\n onSuccess({ transactionId: data.transaction_id || data.mpesa_receipt });\n } else if (data.status === 'failed' || data.status === 'cancelled') {\n onFailed({ message: data.message || 'Payment failed or was cancelled' });\n } else {\n // Still pending, continue polling\n attempts++;\n setTimeout(poll, interval);\n }\n } catch {\n attempts++;\n setTimeout(poll, interval);\n }\n };\n\n poll();\n }, [checkoutRequestId, statusEndpoint, interval, maxAttempts, headers, onSuccess, onFailed, onTimeout]);\n\n return { startPolling };\n}\n"]}