/home/suroeste/public_html/payments.transportessuroeste.com/sql
NameSizeModeActions
database-cpanel.sql277870644editdlrm
database.sql269710644editdlrm
database_xampp.sql209730644editdlrm
Edit: /home/suroeste/public_html/payments.transportessuroeste.com/sql/database_xampp.sql (20973B)
-- ============================================================================ -- BASE DE DATOS - TRANSPORTES SUROESTE - PASARELA DE PAGOS EPAYCO -- ============================================================================ -- Corregido para XAMPP con MySQL -- ============================================================================ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ============================================================================ -- CREAR BASE DE DATOS -- ============================================================================ CREATE DATABASE IF NOT EXISTS `transportes_suroeste_payments` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE `transportes_suroeste_payments`; -- ============================================================================ -- TABLA: api_clients - Clientes autorizados para consumir la API -- ============================================================================ DROP TABLE IF EXISTS `webhook_deliveries`; DROP TABLE IF EXISTS `refunds`; DROP TABLE IF EXISTS `daily_reconciliation`; DROP TABLE IF EXISTS `transaction_logs`; DROP TABLE IF EXISTS `transaction_status_history`; DROP TABLE IF EXISTS `security_events`; DROP TABLE IF EXISTS `audit_trail`; DROP TABLE IF EXISTS `rate_limit_tracking`; DROP TABLE IF EXISTS `blocked_ips`; DROP TABLE IF EXISTS `transactions`; DROP TABLE IF EXISTS `api_clients`; DROP TABLE IF EXISTS `system_config`; CREATE TABLE `api_clients` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `client_uuid` CHAR(36) NOT NULL COMMENT 'UUID unico del cliente', `client_name` VARCHAR(100) NOT NULL COMMENT 'Nombre del cliente/empresa', `api_key` VARCHAR(64) NOT NULL COMMENT 'API Key publica', `api_secret_hash` VARCHAR(255) NOT NULL COMMENT 'Secret hasheado con Argon2id', `webhook_url` VARCHAR(500) NULL COMMENT 'URL para callbacks', `webhook_secret` VARCHAR(64) NULL COMMENT 'Secret para firmar webhooks', `allowed_ips` TEXT NULL COMMENT 'IPs permitidas en formato JSON', `rate_limit` INT UNSIGNED DEFAULT 100 COMMENT 'Limite de peticiones por minuto', `is_active` TINYINT(1) DEFAULT 1, `environment` VARCHAR(20) DEFAULT 'sandbox', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `last_access_at` DATETIME NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_client_uuid` (`client_uuid`), UNIQUE KEY `uk_api_key` (`api_key`), INDEX `idx_is_active` (`is_active`), INDEX `idx_environment` (`environment`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Clientes autorizados para consumir la API'; -- ============================================================================ -- TABLA: transactions - Transacciones de pago principales -- ============================================================================ CREATE TABLE `transactions` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `transaction_uuid` CHAR(36) NOT NULL COMMENT 'UUID unico de transaccion', `client_id` BIGINT UNSIGNED NOT NULL COMMENT 'FK a api_clients', `ticket_reference` VARCHAR(100) NOT NULL COMMENT 'Referencia del ticket del cliente', `internal_reference` VARCHAR(50) NOT NULL COMMENT 'Referencia interna unica', `epayco_ref` VARCHAR(50) NULL COMMENT 'Referencia de ePayco', `epayco_transaction_id` VARCHAR(50) NULL COMMENT 'ID de transaccion ePayco', `amount` DECIMAL(15,2) NOT NULL COMMENT 'Monto de la transaccion', `currency` CHAR(3) DEFAULT 'COP' COMMENT 'Codigo ISO de moneda', `tax` DECIMAL(15,2) DEFAULT 0.00 COMMENT 'Impuesto', `tax_base` DECIMAL(15,2) DEFAULT 0.00 COMMENT 'Base gravable', `status` VARCHAR(20) DEFAULT 'pending', `status_code` VARCHAR(10) NULL COMMENT 'Codigo de estado ePayco', `status_message` VARCHAR(255) NULL COMMENT 'Mensaje de estado', `payment_method` VARCHAR(50) NULL COMMENT 'Metodo de pago usado', `payment_method_type` VARCHAR(20) NULL, `card_last_four` CHAR(4) NULL COMMENT 'Ultimos 4 digitos de tarjeta', `card_brand` VARCHAR(20) NULL COMMENT 'Marca de la tarjeta', `bank_name` VARCHAR(100) NULL COMMENT 'Nombre del banco', `payer_email` VARCHAR(500) NULL COMMENT 'Email del pagador (cifrado)', `payer_document_type` VARCHAR(10) NULL COMMENT 'Tipo documento', `payer_document` VARCHAR(255) NULL COMMENT 'Numero documento (cifrado)', `payer_name` VARCHAR(500) NULL COMMENT 'Nombre pagador (cifrado)', `payer_phone` VARCHAR(255) NULL COMMENT 'Telefono pagador (cifrado)', `description` VARCHAR(500) NULL COMMENT 'Descripcion de la compra', `ip_address` VARCHAR(45) NOT NULL COMMENT 'IP del cliente', `user_agent` VARCHAR(500) NULL, `request_signature` VARCHAR(128) NOT NULL COMMENT 'Firma HMAC de la solicitud', `response_signature` VARCHAR(128) NULL COMMENT 'Firma de respuesta ePayco', `extra_data` TEXT NULL COMMENT 'Datos adicionales del ticket', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `processed_at` DATETIME NULL COMMENT 'Fecha de procesamiento', `expires_at` DATETIME NULL COMMENT 'Fecha de expiracion', PRIMARY KEY (`id`), UNIQUE KEY `uk_transaction_uuid` (`transaction_uuid`), UNIQUE KEY `uk_internal_reference` (`internal_reference`), INDEX `idx_client_id` (`client_id`), INDEX `idx_status` (`status`), INDEX `idx_created_at` (`created_at`), INDEX `idx_epayco_ref` (`epayco_ref`), INDEX `idx_ticket_reference` (`ticket_reference`), INDEX `idx_status_created` (`status`, `created_at`), CONSTRAINT `fk_transactions_client` FOREIGN KEY (`client_id`) REFERENCES `api_clients` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Transacciones de pago - Tabla principal'; -- ============================================================================ -- TABLA: transaction_status_history - Historial de estados -- ============================================================================ CREATE TABLE `transaction_status_history` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `transaction_id` BIGINT UNSIGNED NOT NULL, `previous_status` VARCHAR(20) NULL, `new_status` VARCHAR(20) NOT NULL, `status_code` VARCHAR(10) NULL, `status_message` VARCHAR(255) NULL, `changed_by` VARCHAR(100) DEFAULT 'system' COMMENT 'Quien cambio el estado', `ip_address` VARCHAR(45) NULL, `extra_data` TEXT NULL, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), INDEX `idx_transaction_id` (`transaction_id`), INDEX `idx_created_at` (`created_at`), INDEX `idx_new_status` (`new_status`), CONSTRAINT `fk_status_history_transaction` FOREIGN KEY (`transaction_id`) REFERENCES `transactions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Historial de cambios de estado - Auditoria'; -- ============================================================================ -- TABLA: transaction_logs - Logs detallados de transacciones -- ============================================================================ CREATE TABLE `transaction_logs` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `transaction_id` BIGINT UNSIGNED NULL, `log_uuid` CHAR(36) NOT NULL, `log_type` VARCHAR(20) NOT NULL, `action` VARCHAR(100) NOT NULL COMMENT 'Accion realizada', `endpoint` VARCHAR(255) NULL COMMENT 'Endpoint llamado', `http_method` VARCHAR(10) NULL, `http_status` SMALLINT UNSIGNED NULL, `request_headers` TEXT NULL COMMENT 'Headers de la peticion (sanitizados)', `request_body` TEXT NULL COMMENT 'Body de la peticion (cifrado)', `response_body` TEXT NULL COMMENT 'Body de la respuesta (cifrado)', `response_time_ms` INT UNSIGNED NULL COMMENT 'Tiempo de respuesta en ms', `ip_address` VARCHAR(45) NOT NULL, `user_agent` VARCHAR(500) NULL, `error_code` VARCHAR(50) NULL, `error_message` TEXT NULL, `stack_trace` TEXT NULL COMMENT 'Solo en ambiente desarrollo', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_log_uuid` (`log_uuid`), INDEX `idx_transaction_id` (`transaction_id`), INDEX `idx_log_type` (`log_type`), INDEX `idx_action` (`action`), INDEX `idx_created_at` (`created_at`), INDEX `idx_ip_address` (`ip_address`), CONSTRAINT `fk_logs_transaction` FOREIGN KEY (`transaction_id`) REFERENCES `transactions` (`id`) ON DELETE SET NULL ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Logs detallados de todas las operaciones'; -- ============================================================================ -- TABLA: audit_trail - Auditoria completa del sistema (Compliance) -- ============================================================================ CREATE TABLE `audit_trail` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `audit_uuid` CHAR(36) NOT NULL, `entity_type` VARCHAR(50) NOT NULL COMMENT 'Tipo de entidad afectada', `entity_id` VARCHAR(50) NULL COMMENT 'ID de la entidad', `action` VARCHAR(30) NOT NULL, `actor_type` VARCHAR(20) NOT NULL, `actor_id` VARCHAR(100) NULL, `actor_ip` VARCHAR(45) NOT NULL, `actor_user_agent` VARCHAR(500) NULL, `old_values` TEXT NULL COMMENT 'Valores anteriores (cifrado si sensible)', `new_values` TEXT NULL COMMENT 'Valores nuevos (cifrado si sensible)', `description` VARCHAR(500) NULL, `request_id` CHAR(36) NULL COMMENT 'ID unico de la peticion', `session_id` VARCHAR(100) NULL, `risk_level` VARCHAR(20) DEFAULT 'low', `is_suspicious` TINYINT(1) DEFAULT 0, `metadata` TEXT NULL, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_audit_uuid` (`audit_uuid`), INDEX `idx_entity` (`entity_type`, `entity_id`), INDEX `idx_action` (`action`), INDEX `idx_actor` (`actor_type`, `actor_id`), INDEX `idx_created_at` (`created_at`), INDEX `idx_risk_level` (`risk_level`), INDEX `idx_is_suspicious` (`is_suspicious`), INDEX `idx_request_id` (`request_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Auditoria completa - Cumplimiento normativo bancario'; -- ============================================================================ -- TABLA: security_events - Eventos de seguridad -- ============================================================================ CREATE TABLE `security_events` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `event_uuid` CHAR(36) NOT NULL, `event_type` VARCHAR(50) NOT NULL, `severity` VARCHAR(20) NOT NULL, `source_ip` VARCHAR(45) NOT NULL, `target_resource` VARCHAR(255) NULL, `client_id` BIGINT UNSIGNED NULL, `description` TEXT NOT NULL, `raw_request` TEXT NULL COMMENT 'Peticion completa (para analisis)', `blocked` TINYINT(1) DEFAULT 0 COMMENT 'Si se bloqueo la peticion', `reported` TINYINT(1) DEFAULT 0 COMMENT 'Si se reporto a seguridad', `resolved` TINYINT(1) DEFAULT 0, `resolved_at` DATETIME NULL, `resolved_by` VARCHAR(100) NULL, `resolution_notes` TEXT NULL, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_event_uuid` (`event_uuid`), INDEX `idx_event_type` (`event_type`), INDEX `idx_severity` (`severity`), INDEX `idx_source_ip` (`source_ip`), INDEX `idx_client_id` (`client_id`), INDEX `idx_created_at` (`created_at`), INDEX `idx_resolved` (`resolved`), CONSTRAINT `fk_security_client` FOREIGN KEY (`client_id`) REFERENCES `api_clients` (`id`) ON DELETE SET NULL ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Registro de eventos de seguridad'; -- ============================================================================ -- TABLA: rate_limit_tracking - Control de limite de peticiones (Anti-DDoS) -- ============================================================================ CREATE TABLE `rate_limit_tracking` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `identifier` VARCHAR(100) NOT NULL COMMENT 'IP o API Key', `identifier_type` VARCHAR(20) NOT NULL, `endpoint` VARCHAR(255) NOT NULL, `request_count` INT UNSIGNED DEFAULT 1, `window_start` DATETIME NOT NULL, `window_end` DATETIME NOT NULL, `is_blocked` TINYINT(1) DEFAULT 0, `blocked_until` DATETIME NULL, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), INDEX `idx_identifier` (`identifier`), INDEX `idx_is_blocked` (`is_blocked`), INDEX `idx_window` (`window_start`, `window_end`), INDEX `idx_blocked_until` (`blocked_until`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Control de rate limiting para prevencion DDoS'; -- ============================================================================ -- TABLA: blocked_ips - IPs bloqueadas -- ============================================================================ CREATE TABLE `blocked_ips` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `ip_address` VARCHAR(45) NOT NULL, `reason` VARCHAR(255) NOT NULL, `blocked_by` VARCHAR(100) DEFAULT 'system', `is_permanent` TINYINT(1) DEFAULT 0, `expires_at` DATETIME NULL, `request_count_at_block` INT UNSIGNED NULL, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_ip_address` (`ip_address`), INDEX `idx_expires_at` (`expires_at`), INDEX `idx_is_permanent` (`is_permanent`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Lista de IPs bloqueadas'; -- ============================================================================ -- TABLA: webhook_deliveries - Entregas de webhooks -- ============================================================================ CREATE TABLE `webhook_deliveries` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `delivery_uuid` CHAR(36) NOT NULL, `transaction_id` BIGINT UNSIGNED NOT NULL, `client_id` BIGINT UNSIGNED NOT NULL, `webhook_url` VARCHAR(500) NOT NULL, `payload` TEXT NOT NULL COMMENT 'Payload enviado (cifrado)', `signature` VARCHAR(128) NOT NULL COMMENT 'Firma HMAC del payload', `http_status` SMALLINT UNSIGNED NULL, `response_body` TEXT NULL, `response_time_ms` INT UNSIGNED NULL, `attempt_number` TINYINT UNSIGNED DEFAULT 1, `max_attempts` TINYINT UNSIGNED DEFAULT 5, `status` VARCHAR(20) DEFAULT 'pending', `error_message` TEXT NULL, `next_retry_at` DATETIME NULL, `delivered_at` DATETIME NULL, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_delivery_uuid` (`delivery_uuid`), INDEX `idx_transaction_id` (`transaction_id`), INDEX `idx_client_id` (`client_id`), INDEX `idx_status` (`status`), INDEX `idx_next_retry` (`next_retry_at`), CONSTRAINT `fk_webhook_transaction` FOREIGN KEY (`transaction_id`) REFERENCES `transactions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `fk_webhook_client` FOREIGN KEY (`client_id`) REFERENCES `api_clients` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Registro de entregas de webhooks'; -- ============================================================================ -- TABLA: refunds - Reembolsos -- ============================================================================ CREATE TABLE `refunds` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `refund_uuid` CHAR(36) NOT NULL, `transaction_id` BIGINT UNSIGNED NOT NULL, `epayco_refund_id` VARCHAR(50) NULL, `amount` DECIMAL(15,2) NOT NULL, `reason` VARCHAR(500) NOT NULL, `status` VARCHAR(20) DEFAULT 'pending', `status_message` VARCHAR(255) NULL, `requested_by` VARCHAR(100) NOT NULL, `approved_by` VARCHAR(100) NULL, `processed_at` DATETIME NULL, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_refund_uuid` (`refund_uuid`), INDEX `idx_transaction_id` (`transaction_id`), INDEX `idx_status` (`status`), CONSTRAINT `fk_refund_transaction` FOREIGN KEY (`transaction_id`) REFERENCES `transactions` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Registro de reembolsos'; -- ============================================================================ -- TABLA: daily_reconciliation - Conciliacion diaria -- ============================================================================ CREATE TABLE `daily_reconciliation` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `reconciliation_date` DATE NOT NULL, `client_id` BIGINT UNSIGNED NULL COMMENT 'NULL para totales generales', `total_transactions` INT UNSIGNED DEFAULT 0, `approved_count` INT UNSIGNED DEFAULT 0, `rejected_count` INT UNSIGNED DEFAULT 0, `pending_count` INT UNSIGNED DEFAULT 0, `total_amount` DECIMAL(18,2) DEFAULT 0.00, `approved_amount` DECIMAL(18,2) DEFAULT 0.00, `refunded_amount` DECIMAL(18,2) DEFAULT 0.00, `net_amount` DECIMAL(18,2) DEFAULT 0.00, `commission_amount` DECIMAL(18,2) DEFAULT 0.00, `status` VARCHAR(20) DEFAULT 'pending', `discrepancy_notes` TEXT NULL, `reconciled_by` VARCHAR(100) NULL, `reconciled_at` DATETIME NULL, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), INDEX `idx_reconciliation_date` (`reconciliation_date`), INDEX `idx_status` (`status`), CONSTRAINT `fk_reconciliation_client` FOREIGN KEY (`client_id`) REFERENCES `api_clients` (`id`) ON DELETE SET NULL ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Conciliacion diaria de transacciones'; -- ============================================================================ -- TABLA: system_config - Configuracion del sistema -- ============================================================================ CREATE TABLE `system_config` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `config_key` VARCHAR(100) NOT NULL, `config_value` TEXT NOT NULL, `config_type` VARCHAR(20) DEFAULT 'string', `is_encrypted` TINYINT(1) DEFAULT 0, `description` VARCHAR(255) NULL, `updated_by` VARCHAR(100) NULL, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_config_key` (`config_key`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Configuracion del sistema'; SET FOREIGN_KEY_CHECKS = 1; -- ============================================================================ -- DATOS INICIALES -- ============================================================================ -- Configuracion inicial del sistema INSERT INTO `system_config` (`config_key`, `config_value`, `config_type`, `description`) VALUES ('maintenance_mode', 'false', 'boolean', 'Modo mantenimiento activo'), ('max_transaction_amount', '10000000', 'integer', 'Monto maximo por transaccion en centavos'), ('min_transaction_amount', '1000', 'integer', 'Monto minimo por transaccion en centavos'), ('transaction_timeout_seconds', '300', 'integer', 'Tiempo de expiracion de transaccion'), ('webhook_max_retries', '5', 'integer', 'Intentos maximos de webhook'), ('rate_limit_requests_per_minute', '100', 'integer', 'Limite de peticiones por minuto'), ('rate_limit_ban_duration_minutes', '60', 'integer', 'Duracion del baneo por exceder limite'); -- Cliente de prueba para desarrollo INSERT INTO `api_clients` (`client_uuid`, `client_name`, `api_key`, `api_secret_hash`, `webhook_url`, `webhook_secret`, `is_active`, `environment`) VALUES ('550e8400-e29b-41d4-a716-446655440000', 'Cliente de Prueba', 'ts_test_key_1234567890abcdef1234567890abcdef', '$argon2id$v=19$m=65536,t=4,p=1$dGVzdA$hashedvalue', 'http://localhost/webhook/receive', 'webhook_secret_test_123', 1, 'sandbox'); -- ============================================================================ -- FIN DEL SCRIPT -- ============================================================================