{"version":3,"sources":["../src/index.ts","../src/lib/Database.ts","../src/lib/Trigger.ts"],"sourcesContent":["import { Table, Database } from './lib/Database';\r\nimport type { DatabaseRecord, WhereCallback } from './@types/Database';\r\n\r\nexport default Database;\r\nexport { \r\n    Table, \r\n    Database,\r\n    type DatabaseRecord,\r\n    type WhereCallback\r\n};","import fs from 'fs';\r\nimport { QueryEngine, ComputedFieldProcessor, TriggerProcessor } from \"@dbcube/core\";\r\nimport { DatabaseRecord, DML, WhereCallback, WhereCondition } from \"../@types/Database\";\r\nimport { Trigger } from './Trigger';\r\n\r\n/**\r\n * Main class to handle MySQL database connections and queries.\r\n * Implements the Singleton pattern to ensure a single instance of the connection pool.\r\n */\r\nexport class Database {\r\n    private name: string;\r\n    private engine: any;\r\n    private computedFields: any[];\r\n    private triggers: any[];\r\n\r\n    constructor(name: string) {\r\n        this.name = name;\r\n        const engine = new QueryEngine(name);\r\n        this.engine = engine;\r\n        this.computedFields = [];\r\n        this.triggers = [];\r\n    }\r\n\r\n    async useComputes(): Promise<Database> {\r\n        const newDatabase = new Database(this.name); \r\n        const arrayComputedFields = await ComputedFieldProcessor.getComputedFields(this.name);\r\n        newDatabase.setComputedFields(arrayComputedFields);\r\n        return newDatabase;\r\n    }\r\n\r\n    async useTriggers(): Promise<Database> {\r\n        const newDatabase = new Database(this.name); \r\n        const arrayTriggers = await TriggerProcessor.getTriggers(this.name);\r\n        newDatabase.setTriggers(arrayTriggers);\r\n        return newDatabase;\r\n    }\r\n\r\n    async connect(): Promise<void> {\r\n        const response = await this.engine.run('query_engine', [\r\n            '--action', 'connect',\r\n        ]);\r\n        if (response.status != 200) {\r\n            returnFormattedError(response.status, response.message);\r\n        }\r\n        return response.data;\r\n    }\r\n\r\n    async disconnect(): Promise<void> {\r\n        return this.engine.run('query_engine', [\r\n            '--action', 'disconnect',\r\n        ]);\r\n    }\r\n\r\n    /**\r\n     * Creates and returns a new instance of `Table` for the specified table.\r\n     * This method is used to start building queries for a specific table.\r\n     * It provides a fluent interface for common database operations like select, insert, update, and delete.\r\n     *\r\n     * @param {string} tableName - The name of the table to query.\r\n     * @returns {Table} - Returns a new instance of `Table` for the specified table.\r\n     *\r\n     * @example\r\n     * // Select all records from a table\r\n     * const users = await db.table('users').get();\r\n     * \r\n     * // Select records with conditions\r\n     * const activeUsers = await db.table('users')\r\n     *     .where('status', '=', 'active')\r\n     *     .orderBy('created_at', 'DESC')\r\n     *     .limit(10)\r\n     *     .get();\r\n     * \r\n     * // Insert records\r\n     * await db.table('users').insert([\r\n     *     { name: 'John', email: 'john@example.com', age: 30 }\r\n     * ]);\r\n     * \r\n     * // Update records\r\n     * await db.table('users')\r\n     *     .where('id', '=', 1)\r\n     *     .update({ status: 'inactive' });\r\n     * \r\n     * // Delete records\r\n     * await db.table('users')\r\n     *     .where('status', '=', 'deleted')\r\n     *     .delete();\r\n     * \r\n     * // Access column management\r\n     * const columns = await db.table('users').columns().get();\r\n     */\r\n    table(tableName: string): Table {\r\n        return new Table(this, this.name, tableName, this.engine, this.computedFields, this.triggers);\r\n    }\r\n\r\n    private setComputedFields(computedFields: any[]){\r\n        this.computedFields = computedFields;\r\n    }\r\n\r\n    private setTriggers(triggers: any[]){\r\n        this.triggers = triggers;\r\n    }\r\n}\r\n\r\n/**\r\n * Class to build and execute SQL queries for a specific table.\r\n * Supports operations like SELECT, INSERT, UPDATE, DELETE, and more.\r\n */\r\nexport class Table {\r\n    private engine: any;\r\n    private nextType: 'AND' | 'OR' = 'AND';\r\n    private dml: DML;\r\n    private computedFields: any[] = [];\r\n    private trigger: any;\r\n    private triggers: any;\r\n\r\n    constructor(instance: any, databaseName: string, tableName: string, engine: any = null, computedFields: any[] = [], triggers: any[] = []) {\r\n        this.engine = engine;\r\n        this.computedFields = computedFields;\r\n        this.triggers = triggers;\r\n        this.trigger = new Trigger(instance, databaseName, triggers);\r\n        this.nextType = 'AND';\r\n\r\n        this.dml = {\r\n            type: 'select',\r\n            database: databaseName,\r\n            table: tableName,\r\n            columns: ['*'],\r\n            distinct: false,\r\n            joins: [],\r\n            where: [],\r\n            orderBy: [],\r\n            groupBy: [],\r\n            limit: null,\r\n            offset: null,\r\n            data: null,\r\n            aggregation: null\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Specifies the columns to select in a SELECT query.\r\n     *\r\n     * @param {string[]} fields - Array of column names to select. If empty, selects all columns.\r\n     * @returns {Table} - Returns the current instance of Table for method chaining.\r\n     *\r\n     * @example\r\n     * const users = await db.table('users').select(['id', 'name']).get();\r\n     * console.log(users); // [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]\r\n     */\r\n    select(fields: string[] = []): Table {\r\n        const clone = this.clone();\r\n        clone.dml.type = 'select';\r\n        clone.dml.columns = fields.length > 0 ? fields : ['*'];\r\n        clone.dml.aggregation = null;\r\n        return clone;\r\n    }\r\n\r\n    /**\r\n     * Adds a WHERE condition to the query.\r\n     *\r\n     * @param {string} column - The column to filter by.\r\n     * @param {string} operator - The comparison operator (e.g., '=', '>', '<', 'IS NULL', 'IS NOT NULL').\r\n     * @param {any} value - The value to compare against (optional for IS NULL/IS NOT NULL).\r\n     * @returns {Table} - Returns the current instance of Table for method chaining.\r\n     *\r\n     * @example\r\n     * const users = await db.table('users').where('age', '>', 25).get();\r\n     * const nullUsers = await db.table('users').where('email', 'IS NULL').get();\r\n     * console.log(users); // [{ id: 1, name: 'John', age: 30 }]\r\n     */\r\n    where(column: string, operator: 'IS NULL' | 'IS NOT NULL'): Table;\r\n    where(column: string, operator: '=' | '!=' | '<>' | '>' | '<' | '>=' | '<=' | 'LIKE' | 'NOT LIKE' | 'IN' | 'NOT IN' | 'BETWEEN' | 'NOT BETWEEN', value: any): Table;\r\n    where(column: string, operator: string, value?: any): Table {\r\n        const clone = this.clone();\r\n        clone.dml.where.push({\r\n            column,\r\n            operator,\r\n            value,\r\n            type: clone.nextType,\r\n            isGroup: false\r\n        });\r\n        clone.nextType = 'AND';\r\n        return clone;\r\n    }\r\n\r\n    /**\r\n     * Adds an OR WHERE condition to the query.\r\n     *\r\n     * @param {string} column - The column to filter by.\r\n     * @param {string} operator - The comparison operator (e.g., '=', '>', '<', 'IS NULL', 'IS NOT NULL').\r\n     * @param {any} value - The value to compare against (optional for IS NULL/IS NOT NULL).\r\n     * @returns {Table} - Returns the current instance of Table for method chaining.\r\n     *\r\n     * @example\r\n     * const users = await db.table('users').where('age', '>', 25).orWhere('name', '=', 'Jane').get();\r\n     * const nullUsers = await db.table('users').where('active', '=', true).orWhere('email', 'IS NULL').get();\r\n     * console.log(users); // [{ id: 1, name: 'John', age: 30 }, { id: 2, name: 'Jane', age: 25 }]\r\n     */\r\n    orWhere(column: string, operator: 'IS NULL' | 'IS NOT NULL'): Table;\r\n    orWhere(column: string, operator: '=' | '!=' | '<>' | '>' | '<' | '>=' | '<=' | 'LIKE' | 'NOT LIKE' | 'IN' | 'NOT IN' | 'BETWEEN' | 'NOT BETWEEN', value: any): Table;\r\n    orWhere(column: string, operator: string, value?: any): Table {\r\n        const clone = this.clone();\r\n        clone.dml.where.push({\r\n            column,\r\n            operator,\r\n            value,\r\n            type: 'OR',\r\n            isGroup: false\r\n        });\r\n        return clone;\r\n    }\r\n\r\n    /**\r\n     * Adds a grouped WHERE condition to the query.\r\n     *\r\n     * @param {WhereCallback} callback - A callback function that receives a new Table instance to build the grouped conditions.\r\n     * @returns {Table} - Returns the current instance of Table for method chaining.\r\n     *\r\n     * @example\r\n     * const users = await db.table('users').whereGroup(query => {\r\n     *     query.where('age', '>', 25).orWhere('name', '=', 'Jane');\r\n     * }).get();\r\n     * console.log(users); // [{ id: 1, name: 'John', age: 30 }, { id: 2, name: 'Jane', age: 25 }]\r\n     */\r\n    whereGroup(callback: WhereCallback): Table {\r\n        const clone = this.clone();\r\n        const groupQuery = new Table(this, clone.dml.database, clone.dml.table, clone.engine);\r\n        callback(groupQuery);\r\n\r\n        clone.dml.where.push({\r\n            type: clone.nextType,\r\n            isGroup: true,\r\n            conditions: groupQuery.dml.where as WhereCondition[]\r\n        });\r\n        clone.nextType = 'AND';\r\n        return clone;\r\n    }\r\n\r\n    or(): Table {\r\n        const clone = this.clone();\r\n        clone.nextType = 'OR';\r\n        return clone;\r\n    }\r\n\r\n    and(): Table {\r\n        const clone = this.clone();\r\n        clone.nextType = 'AND';\r\n        return clone;\r\n    }\r\n\r\n    /**\r\n     * Adds a WHERE BETWEEN condition to the query.\r\n     *\r\n     * @param {string} column - The column to filter by.\r\n     * @param {[any, any]} values - A tuple with two values representing the range.\r\n     * @returns {Table} - Returns the current instance of Table for method chaining.\r\n     *\r\n     * @example\r\n     * const users = await db.table('users').whereBetween('age', [20, 30]).get();\r\n     * console.log(users); // [{ id: 1, name: 'John', age: 30 }, { id: 2, name: 'Jane', age: 25 }]\r\n     */\r\n    whereBetween(column: string, values: [any, any]): Table {\r\n        const clone = this.clone();\r\n        const [value1, value2] = values;\r\n        if (value1 !== undefined && value2 !== undefined) {\r\n            clone.dml.where.push({\r\n                column,\r\n                operator: 'BETWEEN',\r\n                value: [value1, value2],\r\n                type: clone.nextType,\r\n                isGroup: false\r\n            });\r\n            clone.nextType = 'AND';\r\n        }\r\n        return clone;\r\n    }\r\n\r\n    /**\r\n     * Adds a WHERE IN condition to the query.\r\n     *\r\n     * @param {string} column - The column to filter by.\r\n     * @param {any[]} values - An array of values to match.\r\n     * @returns {Table} - Returns the current instance of Table for method chaining.\r\n     *\r\n     * @example\r\n     * const users = await db.table('users').whereIn('id', [1, 2]).get();\r\n     * console.log(users); // [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]\r\n     */\r\n    whereIn(column: string, values: any[]): Table {\r\n        const clone = this.clone();\r\n        if (Array.isArray(values) && values.length > 0) {\r\n            clone.dml.where.push({\r\n                column,\r\n                operator: 'IN',\r\n                value: values,\r\n                type: clone.nextType,\r\n                isGroup: false\r\n            });\r\n            clone.nextType = 'AND';\r\n        }\r\n        return clone;\r\n    }\r\n\r\n    /**\r\n    * Adds a WHERE IS NULL condition to the query.\r\n    *\r\n    * @param {string} column - The column to filter by.\r\n    * @returns {Table} - Returns the current instance of Table for method chaining.\r\n    *\r\n    * @example\r\n    * const users = await db.table('users').whereNull('email').get();\r\n    * console.log(users); // [{ id: 3, name: 'Alice', email: null }]\r\n    */\r\n    whereNull(column: string): Table {\r\n        const clone = this.clone();\r\n        clone.dml.where.push({\r\n            column,\r\n            operator: 'IS NULL',\r\n            type: clone.nextType,\r\n            isGroup: false\r\n        });\r\n        clone.nextType = 'AND';\r\n        return clone;\r\n    }\r\n\r\n    /**\r\n     * Adds a WHERE IS NOT NULL condition to the query.\r\n     *\r\n     * @param {string} column - The column to filter by.\r\n     * @returns {Table} - Returns the current instance of Table for method chaining.\r\n     *\r\n     * @example\r\n     * const users = await db.table('users').whereNotNull('email').get();\r\n     * console.log(users); // [{ id: 1, name: 'John', email: 'john@example.com' }]\r\n     */\r\n    whereNotNull(column: string): Table {\r\n        const clone = this.clone();\r\n        clone.dml.where.push({\r\n            column,\r\n            operator: 'IS NOT NULL',\r\n            type: clone.nextType,\r\n            isGroup: false\r\n        });\r\n        clone.nextType = 'AND';\r\n        return clone;\r\n    }\r\n\r\n    /**\r\n     * Adds a JOIN clause to the query.\r\n     *\r\n     * @param {string} table - The table to join.\r\n     * @param {string} column1 - The column from the current table.\r\n     * @param {string} operator - The comparison operator (e.g., '=', '>', '<').\r\n     * @param {string} column2 - The column from the joined table.\r\n     * @returns {Table} - Returns the current instance of Table for method chaining.\r\n     *\r\n     * @example\r\n     * const users = await db.table('users').join('orders', 'users.id', '=', 'orders.user_id').get();\r\n     * console.log(users); // [{ id: 1, name: 'John', order_id: 101 }]\r\n     */\r\n    join(table: string, column1: string, operator: string, column2: string): Table {\r\n        const clone = this.clone();\r\n        clone.dml.joins.push({\r\n            type: 'INNER',\r\n            table,\r\n            on: {\r\n                column1,\r\n                operator,\r\n                column2\r\n            }\r\n        });\r\n        return clone;\r\n    }\r\n\r\n    /**\r\n     * Adds a LEFT JOIN clause to the query.\r\n     *\r\n     * @param {string} table - The table to join.\r\n     * @param {string} column1 - The column from the current table.\r\n     * @param {string} operator - The comparison operator (e.g., '=', '>', '<').\r\n     * @param {string} column2 - The column from the joined table.\r\n     * @returns {Table} - Returns the current instance of Table for method chaining.\r\n     *\r\n     * @example\r\n     * const users = await db.table('users').leftJoin('orders', 'users.id', '=', 'orders.user_id').get();\r\n     * console.log(users); // [{ id: 1, name: 'John', order_id: 101 }, { id: 2, name: 'Jane', order_id: null }]\r\n     */\r\n    leftJoin(table: string, column1: string, operator: string, column2: string): Table {\r\n        const clone = this.clone();\r\n        clone.dml.joins.push({\r\n            type: 'LEFT',\r\n            table,\r\n            on: {\r\n                column1,\r\n                operator,\r\n                column2\r\n            }\r\n        });\r\n        return clone;\r\n    }\r\n\r\n    /**\r\n     * Adds a RIGHT JOIN clause to the query.\r\n     *\r\n     * @param {string} table - The table to join.\r\n     * @param {string} column1 - The column from the current table.\r\n     * @param {string} operator - The comparison operator (e.g., '=', '>', '<').\r\n     * @param {string} column2 - The column from the joined table.\r\n     * @returns {Table} - Returns the current instance of Table for method chaining.\r\n     *\r\n     * @example\r\n     * const users = await db.table('users').rightJoin('orders', 'users.id', '=', 'orders.user_id').get();\r\n     * console.log(users); // [{ id: 1, name: 'John', order_id: 101 }, { id: null, name: null, order_id: 102 }]\r\n     */\r\n    rightJoin(table: string, column1: string, operator: string, column2: string): Table {\r\n        const clone = this.clone();\r\n        clone.dml.joins.push({\r\n            type: 'RIGHT',\r\n            table,\r\n            on: {\r\n                column1,\r\n                operator,\r\n                column2\r\n            }\r\n        });\r\n        return clone;\r\n    }\r\n\r\n    /**\r\n     * Adds an ORDER BY clause to the query.\r\n     *\r\n     * @param {string} column - The column to order by.\r\n     * @param {'ASC' | 'DESC'} direction - The sorting direction ('ASC' or 'DESC').\r\n     * @returns {Table} - Returns the current instance of Table for method chaining.\r\n     *\r\n     * @example\r\n     * const users = await db.table('users').orderBy('name', 'ASC').get();\r\n     * console.log(users); // [{ id: 2, name: 'Jane' }, { id: 1, name: 'John' }]\r\n     */\r\n    orderBy(column: string, direction: 'ASC' | 'DESC' = 'ASC'): Table {\r\n        const clone = this.clone();\r\n        const validDirections: ('ASC' | 'DESC')[] = ['ASC', 'DESC'];\r\n        if (validDirections.includes(direction.toUpperCase() as 'ASC' | 'DESC')) {\r\n            clone.dml.orderBy.push({\r\n                column,\r\n                direction: direction.toUpperCase() as 'ASC' | 'DESC'\r\n            });\r\n        } else {\r\n            throw new Error(`Invalid direction: ${direction}. Use 'ASC' or 'DESC'.`);\r\n        }\r\n        return clone;\r\n    }\r\n\r\n    /**\r\n     * Adds a GROUP BY clause to the query.\r\n     *\r\n     * @param {string} column - The column to group by.\r\n     * @returns {Table} - Returns the current instance of Table for method chaining.\r\n     *\r\n     * @example\r\n     * const users = await db.table('users').groupBy('age').get();\r\n     * console.log(users); // [{ age: 30, count: 1 }, { age: 25, count: 1 }]\r\n     */\r\n    groupBy(column: string): Table {\r\n        const clone = this.clone();\r\n        clone.dml.groupBy.push(column);\r\n        return clone;\r\n    }\r\n\r\n    /**\r\n     * Adds a DISTINCT clause to the query.\r\n     *\r\n     * @returns {Table} - Returns the current instance of Table for method chaining.\r\n     *\r\n     * @example\r\n     * const users = await db.table('users').distinct().select(['name']).get();\r\n     * console.log(users); // [{ name: 'John' }, { name: 'Jane' }]\r\n     */\r\n    distinct(): Table {\r\n        const clone = this.clone();\r\n        clone.dml.distinct = true;\r\n        return clone;\r\n    }\r\n\r\n    /**\r\n     * Adds a COUNT clause to the query.\r\n     *\r\n     * @param {string} column - The column to count (default is '*').\r\n     * @returns {Table} - Returns the current instance of Table for method chaining.\r\n     *\r\n     * @example\r\n     * const count = await db.table('users').count().first();\r\n     * console.log(count); // { count: 2 }\r\n     */\r\n    async count(column: string = '*'): Promise<Number> {\r\n        const clone = this.clone();\r\n        clone.dml.type = 'select';\r\n        clone.dml.aggregation = {\r\n            type: 'COUNT',\r\n            column,\r\n            alias: 'count'\r\n        }\r\n        clone.dml.columns = [`COUNT(${column}) AS count`];\r\n        clone.dml.data = null;\r\n        clone.dml.limit = null;  // Remover limit para contar todos\r\n        clone.dml.offset = null;  // Remover offset también\r\n        try {\r\n            const result = await clone.getResponse();\r\n            const res = result[0] || null;\r\n            if (res) {\r\n                return res.count;\r\n            }\r\n            return 0;\r\n        }\r\n        catch (error) {\r\n            throw error;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Adds a SUM clause to the query.\r\n     *\r\n     * @param {string} column - The column to sum.\r\n     * @returns {Table} - Returns the current instance of Table for method chaining.\r\n     *\r\n     * @example\r\n     * const totalAge = await db.table('users').sum('age').first();\r\n     * console.log(totalAge); // { sum: 55 }\r\n     */\r\n    async sum(column: string): Promise<Number> {\r\n        const clone = this.clone();\r\n        clone.dml.type = 'select';\r\n        clone.dml.aggregation = {\r\n            type: 'SUM',\r\n            column,\r\n            alias: 'sum'\r\n        }\r\n        clone.dml.columns = [`SUM(${column}) AS sum`];\r\n        clone.dml.data = null;\r\n        clone.dml.limit = 1;\r\n        try {\r\n            const result = await clone.getResponse();\r\n            const res = result[0] || null;\r\n            if (res) {\r\n                return res.sum;\r\n            }\r\n            return 0;\r\n        }\r\n        catch (error) {\r\n            throw error;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Adds an AVG clause to the query.\r\n     *\r\n     * @param {string} column - The column to calculate the average.\r\n     * @returns {Table} - Returns the current instance of Table for method chaining.\r\n     *\r\n     * @example\r\n     * const avgAge = await db.table('users').avg('age').first();\r\n     * console.log(avgAge); // { avg: 27.5 }\r\n     */\r\n    async avg(column: string): Promise<Number> {\r\n        const clone = this.clone();\r\n        clone.dml.type = 'select';\r\n        clone.dml.aggregation = {\r\n            type: 'AVG',\r\n            column,\r\n            alias: 'avg'\r\n        }\r\n        clone.dml.columns = [`AVG(${column}) AS avg`];\r\n        clone.dml.data = null;\r\n        clone.dml.limit = 1;\r\n        try {\r\n            const result = await clone.getResponse();\r\n            const res = result[0] || null;\r\n            if (res) {\r\n                return res.avg;\r\n            }\r\n            return 0;\r\n        }\r\n        catch (error) {\r\n            throw error;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Adds a MAX clause to the query.\r\n     *\r\n     * @param {string} column - The column to find the maximum value.\r\n     * @returns {Table} - Returns the current instance of Table for method chaining.\r\n     *\r\n     * @example\r\n     * const maxAge = await db.table('users').max('age').first();\r\n     * console.log(maxAge); // { max: 30 }\r\n     */\r\n    async max(column: string): Promise<Number> {\r\n        const clone = this.clone();\r\n        clone.dml.type = 'select';\r\n        clone.dml.aggregation = {\r\n            type: 'MAX',\r\n            column,\r\n            alias: 'max'\r\n        }\r\n        clone.dml.columns = [`MAX(${column}) AS max`];\r\n        clone.dml.data = null;\r\n        clone.dml.limit = 1;\r\n        try {\r\n            const result = await clone.getResponse();\r\n            const res = result[0] || null;\r\n            if (res) {\r\n                return res.max;\r\n            }\r\n            return 0;\r\n        }\r\n        catch (error) {\r\n            throw error;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Adds a MIN clause to the query.\r\n     *\r\n     * @param {string} column - The column to find the minimum value.\r\n     * @returns {Table} - Returns the current instance of Table for method chaining.\r\n     *\r\n     * @example\r\n     * const minAge = await db.table('users').min('age').first();\r\n     * console.log(minAge); // { min: 25 }\r\n     */\r\n    async min(column: string): Promise<Number> {\r\n        const clone = this.clone();\r\n        clone.dml.type = 'select';\r\n        clone.dml.aggregation = {\r\n            type: 'MIN',\r\n            column,\r\n            alias: 'min'\r\n        }\r\n        clone.dml.columns = [`MIN(${column}) AS min`];\r\n        clone.dml.data = null;\r\n        clone.dml.limit = 1;\r\n        try {\r\n            const result = await clone.getResponse();\r\n            const res = result[0] || null;\r\n            if (res) {\r\n                return res.min;\r\n            }\r\n            return 0;\r\n        }\r\n        catch (error) {\r\n            throw error;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Adds a LIMIT clause to the query.\r\n     *\r\n     * @param {number} number - The maximum number of rows to return.\r\n     * @returns {Table} - Returns the current instance of Table for method chaining.\r\n     *\r\n     * @example\r\n     * const users = await db.table('users').limit(1).get();\r\n     * console.log(users); // [{ id: 1, name: 'John', age: 30 }]\r\n     */\r\n    limit(number: number): Table {\r\n        const clone = this.clone();\r\n        clone.dml.limit = Number(number);\r\n        return clone;\r\n    }\r\n\r\n    /**\r\n     * Adds pagination to the query using LIMIT and OFFSET.\r\n     *\r\n     * @param {number} number - The page number (starting from 1).\r\n     * @returns {Table} - Returns the current instance of Table for method chaining.\r\n     *\r\n     * @example\r\n     * const users = await db.table('users').limit(1).page(2).get();\r\n     * console.log(users); // [{ id: 2, name: 'Jane', age: 25 }]\r\n     */\r\n    page(number: number): Table {\r\n        const clone = this.clone();\r\n        const pageNum = Number(number);\r\n        if (clone.dml.limit) {\r\n            clone.dml.offset = (pageNum - 1) * clone.dml.limit;\r\n        }\r\n        return clone;\r\n    }\r\n\r\n    /**\r\n    * Executes the query and returns all matching rows.\r\n    *\r\n    * @returns {Promise<DatabaseRecord[]>} - Returns an array of rows.\r\n    *\r\n    * @example\r\n    * const users = await db.table('users').get();\r\n    * console.log(users); // [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]\r\n    */\r\n    async get(): Promise<DatabaseRecord[]> {\r\n        try {\r\n            const clone = this.clone();\r\n            clone.dml.type = 'select';\r\n            clone.dml.data = null;\r\n            clone.dml.aggregation = null;\r\n            const result = await clone.getResponse();\r\n            return result;\r\n        }\r\n        catch (error) {\r\n            throw error;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Executes the query and returns the first matching row.\r\n     *\r\n     * @returns {Promise<DatabaseRecord | null>} - Returns the first row or null if no rows match.\r\n     *\r\n     * @example\r\n     * const user = await db.table('users').first();\r\n     * console.log(user); // { id: 1, name: 'John' }\r\n     */\r\n    async first(): Promise<DatabaseRecord | null> {\r\n        const clone = this.clone();\r\n        clone.dml.type = 'select';\r\n        clone.dml.data = null;\r\n        clone.dml.aggregation = null;\r\n        clone.dml.limit = 1;\r\n        try {\r\n            const result = await clone.getResponse();\r\n            return result[0] || null;\r\n        }\r\n        catch (error) {\r\n            throw error;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Finds a row by a specific column value.\r\n     *\r\n     * @param {any} value - The value to search for.\r\n     * @param {string} column - The column to search in (default is 'id').\r\n     * @returns {Promise<DatabaseRecord | null>} - Returns the first matching row or null if no rows match.\r\n     *\r\n     * @example\r\n     * const user = await db.table('users').find(1);\r\n     * console.log(user); // { id: 1, name: 'John' }\r\n     */\r\n    async find(value: any, column: string = 'id'): Promise<DatabaseRecord | null> {\r\n        const clone = this.clone();\r\n        clone.dml.type = 'select';\r\n        clone.dml.data = null;\r\n        clone.dml.aggregation = null;\r\n        clone.where(column, '=', value);\r\n        clone.dml.limit = 1;\r\n        try {\r\n            const result = await clone.getResponse();\r\n            return result[0] || null;\r\n        }\r\n        catch (error) {\r\n            throw error;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Inserts one or more rows into the table.\r\n     *\r\n     * @param {DatabaseRecord[]} data - An array of objects representing the rows to insert.\r\n     * @returns {Promise<DatabaseRecord[]>} - Returns an array of the inserted rows.\r\n     *\r\n     * @example\r\n     * const newUsers = await db.table('users').insert([\r\n     *     { name: 'Alice', age: 28 },\r\n     *     { name: 'Bob', age: 32 }\r\n     * ]);\r\n     * console.log(newUsers); // [{ id: 3, name: 'Alice', age: 28 }, { id: 4, name: 'Bob', age: 32 }]\r\n     */\r\n    async insert(data: DatabaseRecord[]): Promise<DatabaseRecord[]> {\r\n        const clone = this.clone();\r\n        if (!Array.isArray(data)) {\r\n            throw new Error('The insert method requires an array of objects with key-value pairs.');\r\n        }\r\n\r\n        if (!data.every(item => typeof item === 'object' && item !== null)) {\r\n            throw new Error('The array must contain only valid objects.');\r\n        }\r\n\r\n        clone.dml.type = 'insert';\r\n        clone.dml.data = data;\r\n\r\n        await clone.getResponse(clone.dml, 'Add');\r\n\r\n        return data;\r\n    }\r\n\r\n    /**\r\n     * Updates rows in the table based on the defined conditions.\r\n     *\r\n     * @param {DatabaseRecord} data - An object with key-value pairs representing the fields to update.\r\n     * @returns {Promise<any>} - Returns the result of the update operation.\r\n     *\r\n     * @example\r\n     * const result = await db.table('users')\r\n     *     .where('id', '=', 1)\r\n     *     .update({ name: 'John Updated', age: 31 });\r\n     * console.log(result); // { affectedRows: 1 }\r\n     */\r\n    async update(data: DatabaseRecord): Promise<any> {\r\n        const clone = this.clone();\r\n        if (typeof data !== 'object' || Array.isArray(data)) {\r\n            throw new Error('The update method requires an object with key-value pairs.');\r\n        }\r\n\r\n        if (clone.dml.where.length === 0) {\r\n            throw new Error('You must specify at least one WHERE condition to perform an update.');\r\n        }\r\n\r\n        clone.dml.type = 'update';\r\n        clone.dml.data = data;\r\n\r\n        await clone.getResponse(clone.dml, 'Update');\r\n\r\n        return data;\r\n    }\r\n\r\n    /**\r\n     * Deletes rows from the table based on the defined conditions.\r\n     *\r\n     * @returns {Promise<any>} - Returns the result of the delete operation.\r\n     *\r\n     * @example\r\n     * const result = await db.table('users').where('id', '=', 1).delete();\r\n     * console.log(result); // { affectedRows: 1 }\r\n     */\r\n    async delete(): Promise<any> {\r\n        const clone = this.clone();\r\n        if (clone.dml.where.length === 0) {\r\n            throw new Error('You must specify at least one WHERE condition to perform a delete.');\r\n        }\r\n\r\n        clone.dml.type = 'delete';\r\n\r\n        const deleteData = await clone.getResponse(clone.dml, 'Delete');\r\n        return deleteData;\r\n    }\r\n\r\n    private async getResponse(dml: any = null, type: any = null): Promise<any> {\r\n        const localDML = dml ? dml : this.dml;\r\n        const computedFieldsNeeded: any[] = [];\r\n        let dependeciesArrray: any[] = [];\r\n\r\n        if (this.computedFields.length > 0) {\r\n            let columns = localDML.columns;\r\n\r\n            for (const field of localDML.columns) {\r\n                const computedField = this.computedFields.find(cf => cf.column === field);\r\n\r\n                if (computedField) {\r\n                    computedFieldsNeeded.push(computedField);\r\n                    // Add dependencies to real fields\r\n                    const dependencies = ComputedFieldProcessor.extractDependencies(computedField.instruction);\r\n                    dependeciesArrray = [...dependeciesArrray, ...dependencies];\r\n                    columns = Array.from(new Set([...columns, ...dependencies]));\r\n                    columns = columns.filter((col: string) => col != field);\r\n                }\r\n            }\r\n            localDML.columns = columns;\r\n        }\r\n\r\n        let arrayResult = [];\r\n        if (type) {\r\n            const beffore = this.trigger.get('before' + type);\r\n            const after = this.trigger.get('after' + type);\r\n            if (this.triggers.length > 0 && (beffore || after)) {\r\n                const dataset = localDML.data;\r\n                for (let index = 0; index < dataset.length; index++) {\r\n                    const data = dataset[index];\r\n                    const newDML = { ...localDML, data: [data] };\r\n                    if (beffore) {\r\n                        const interceptor = await this.trigger.execute('before' + type, data);\r\n                        const response = await this.engine.run('query_engine', [\r\n                            '--action', 'execute',\r\n                            '--dml', JSON.stringify(newDML)\r\n                        ]);\r\n\r\n                        if (response.status != 200) {\r\n                            interceptor.discard();\r\n                            returnFormattedError(response.status, response.message);\r\n                        }\r\n                        await interceptor.commit();\r\n                        arrayResult = response.data;\r\n                    }\r\n                    if (after) {\r\n\r\n                        const response = await this.engine.run('query_engine', [\r\n                            '--action', 'execute',\r\n                            '--dml', JSON.stringify(newDML)\r\n                        ]);\r\n\r\n                        if (response.status != 200) {\r\n                            returnFormattedError(response.status, response.message);\r\n                        }\r\n                        const interceptor = await this.trigger.execute('after' + type, data);\r\n                        await interceptor.commit();\r\n                    }\r\n                }\r\n            } else {\r\n                const response = await this.engine.run('query_engine', [\r\n                    '--action', 'execute',\r\n                    '--dml', JSON.stringify(localDML)\r\n                ]);\r\n\r\n                if (response.status != 200) {\r\n                    returnFormattedError(response.status, response.message);\r\n                }\r\n\r\n                arrayResult = response.data;\r\n            }\r\n        } else {\r\n            const response = await this.engine.run('query_engine', [\r\n                '--action', 'execute',\r\n                '--dml', JSON.stringify(localDML)\r\n            ]);\r\n\r\n            if (response.status != 200) {\r\n                returnFormattedError(response.status, response.message);\r\n            }\r\n\r\n            arrayResult = response.data;\r\n        }\r\n\r\n        if (computedFieldsNeeded.length > 0) {\r\n            let newDataset: any = ComputedFieldProcessor.computedFields(arrayResult, computedFieldsNeeded);\r\n            const result = newDataset.map((obj: any) => {\r\n                const newObj = { ...obj };\r\n                dependeciesArrray.forEach(key => delete newObj[key]);\r\n                return newObj;\r\n            });\r\n            return result;\r\n        }\r\n        return arrayResult;\r\n    }\r\n\r\n    private clone(): Table {\r\n        const cloned = Object.create(Object.getPrototypeOf(this));\r\n        cloned.engine = this.engine;\r\n        cloned.nextType = this.nextType;\r\n        cloned.computedFields = this.computedFields;\r\n        cloned.trigger = this.trigger;\r\n        cloned.triggers = this.triggers;\r\n\r\n        cloned.dml = {\r\n            ...this.dml,\r\n            columns: [...this.dml.columns],\r\n            joins: [...this.dml.joins],\r\n            where: [...this.dml.where],\r\n            orderBy: [...this.dml.orderBy],\r\n            groupBy: [...this.dml.groupBy],\r\n            // Clonar propiedades que faltaban para evitar mutación compartida\r\n            data: this.dml.data ? (Array.isArray(this.dml.data) ? [...this.dml.data] : { ...this.dml.data }) : null,\r\n            aggregation: this.dml.aggregation ? { ...this.dml.aggregation } : null\r\n        };\r\n        return cloned;\r\n    }\r\n\r\n}\r\n\r\nfunction returnFormattedError(status: number, message: string) {\r\n    const RESET = '\\x1b[0m';\r\n    const RED = '\\x1b[31m';\r\n    const YELLOW = '\\x1b[33m';\r\n    const BOLD = '\\x1b[1m';\r\n    const CYAN = '\\x1b[36m';\r\n    const GRAY = '\\x1b[90m';\r\n    const UNDERLINE = '\\x1b[4m';\r\n    const MAGENTA = '\\x1b[35m';\r\n\r\n    let output = '';\r\n    let help = '';\r\n    const color = status === 600 ? YELLOW : RED;\r\n\r\n\r\n    if (message.includes(\"[help]\")) {\r\n        const parts = message.split(\"[help]\");\r\n        output += `\\n${RED}${BOLD}${parts[0]}${RESET}`;\r\n        help += `\\n${MAGENTA}${BOLD}[help]${RESET} ${GRAY}${parts[1]}${RESET}\\n`;\r\n    } else {\r\n        output += `\\n${color}${BOLD}${message}${RESET}\\n`;\r\n    }\r\n\r\n    const err = new Error();\r\n    const stackLines = err.stack?.split('\\n') || [];\r\n\r\n    // Buscamos la primera línea del stack fuera de node_modules\r\n    const relevantStackLine = stackLines.find(line =>\r\n        line.includes('.js:') && !line.includes('node_modules')\r\n    );\r\n\r\n    if (relevantStackLine) {\r\n        const match = relevantStackLine.match(/\\((.*):(\\d+):(\\d+)\\)/) ||\r\n            relevantStackLine.match(/at (.*):(\\d+):(\\d+)/);\r\n\r\n        if (match) {\r\n            const [, filePath, lineStr, columnStr] = match;\r\n            const lineNum = parseInt(lineStr, 10);\r\n            const errorLocation = `${filePath}:${lineStr}:${columnStr}`;\r\n\r\n            // Leemos el archivo y sacamos las líneas relevantes\r\n            try {\r\n                const codeLines = fs.readFileSync(filePath, 'utf-8').split('\\n');\r\n                const start = Math.max(0, lineNum - 3);\r\n                const end = Math.min(codeLines.length, lineNum + 2);\r\n\r\n                output += `\\n${CYAN}${BOLD}[code] ${RESET}${YELLOW} ${UNDERLINE}${errorLocation}${RESET}\\n`;\r\n\r\n                for (let i = start; i < end; i++) {\r\n                    const line = codeLines[i];\r\n                    const lineLabel = `${i + 1}`.padStart(4, ' ');\r\n                    const pointer = i + 1 === lineNum ? `${RED}<-${RESET}` : '  ';\r\n                    output += `${GRAY}${lineLabel}${RESET} ${pointer} ${line}\\n`;\r\n                }\r\n            } catch (err) {\r\n                output += `${YELLOW}⚠️ No se pudo leer el archivo de origen: ${filePath}${RESET}\\n`;\r\n                output += `\\n${CYAN}${BOLD}Stack Trace:${RESET}\\n${stackLines.slice(2).join('\\n')}\\n`;\r\n            }\r\n        }\r\n    }\r\n    output += help;\r\n    console.error(output);\r\n}\r\n\r\nexport default Database;\r\n","import path from \"path\";\r\nimport { FileLogger } from \"@dbcube/core\";\r\nimport { createRequire } from 'module';\r\n\r\nexport class Trigger{\r\n    private triggers: any[];\r\n    private databaseName: string;\r\n    private instance: any;\r\n\r\n    constructor(instance:any, databaseName:string, metadata: any[]){\r\n        this.triggers = metadata;\r\n        this.databaseName = databaseName;\r\n        this.instance = instance;\r\n    }\r\n\r\n    get(type:string){\r\n        return this.triggers.find((tr:any)=> tr.type === type);\r\n    }\r\n\r\n    async execute(type: string, row:any){\r\n        const trigger = this.triggers.find((tr:any)=> tr.type === type);\r\n        if (trigger) {\r\n            const logFilePath = path.resolve(\r\n                process.cwd(),\r\n                'dbcube',\r\n                'logs',\r\n                'triggers',\r\n                this.databaseName,\r\n                `${trigger.table_ref}_${trigger.type}.log`\r\n            );\r\n            \r\n            const interceptor = FileLogger.interceptConsole(logFilePath, {\r\n                keepOriginal: false,\r\n                useBuffer: true\r\n            });\r\n            const pathFile = path.resolve(process.cwd(), 'dbcube', 'triggers', `${trigger.database_ref}_${trigger.table_ref}_${trigger.type}.js`);\r\n            // Use __filename for CJS, process.cwd() for ESM\r\n            const requireUrl = typeof __filename !== 'undefined' ? __filename : process.cwd();\r\n            const require = createRequire(requireUrl);\r\n            // Clear require cache to ensure fresh load\r\n            delete require.cache[require.resolve(pathFile)];\r\n            const triggerModule = require(pathFile);\r\n            const dataProcess = triggerModule.default || triggerModule;\r\n            await dataProcess({db: this.instance, oldData: row, newData: row});\r\n            interceptor.restore(); \r\n            return interceptor;\r\n        }\r\n        return null;\r\n    }\r\n}"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,gBAAe;AACf,IAAAA,eAAsE;;;ACDtE,kBAAiB;AACjB,kBAA2B;AAC3B,oBAA8B;AAEvB,IAAM,UAAN,MAAa;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,UAAc,cAAqB,UAAgB;AAC3D,SAAK,WAAW;AAChB,SAAK,eAAe;AACpB,SAAK,WAAW;AAAA,EACpB;AAAA,EAEA,IAAI,MAAY;AACZ,WAAO,KAAK,SAAS,KAAK,CAAC,OAAU,GAAG,SAAS,IAAI;AAAA,EACzD;AAAA,EAEA,MAAM,QAAQ,MAAc,KAAQ;AAChC,UAAM,UAAU,KAAK,SAAS,KAAK,CAAC,OAAU,GAAG,SAAS,IAAI;AAC9D,QAAI,SAAS;AACT,YAAM,cAAc,YAAAC,QAAK;AAAA,QACrB,QAAQ,IAAI;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL,GAAG,QAAQ,SAAS,IAAI,QAAQ,IAAI;AAAA,MACxC;AAEA,YAAM,cAAc,uBAAW,iBAAiB,aAAa;AAAA,QACzD,cAAc;AAAA,QACd,WAAW;AAAA,MACf,CAAC;AACD,YAAM,WAAW,YAAAA,QAAK,QAAQ,QAAQ,IAAI,GAAG,UAAU,YAAY,GAAG,QAAQ,YAAY,IAAI,QAAQ,SAAS,IAAI,QAAQ,IAAI,KAAK;AAEpI,YAAM,aAAa,OAAO,eAAe,cAAc,aAAa,QAAQ,IAAI;AAChF,YAAMC,eAAU,6BAAc,UAAU;AAExC,aAAOA,SAAQ,MAAMA,SAAQ,QAAQ,QAAQ,CAAC;AAC9C,YAAM,gBAAgBA,SAAQ,QAAQ;AACtC,YAAM,cAAc,cAAc,WAAW;AAC7C,YAAM,YAAY,EAAC,IAAI,KAAK,UAAU,SAAS,KAAK,SAAS,IAAG,CAAC;AACjE,kBAAY,QAAQ;AACpB,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AACJ;;;ADxCO,IAAM,WAAN,MAAM,UAAS;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,MAAc;AACtB,SAAK,OAAO;AACZ,UAAM,SAAS,IAAI,yBAAY,IAAI;AACnC,SAAK,SAAS;AACd,SAAK,iBAAiB,CAAC;AACvB,SAAK,WAAW,CAAC;AAAA,EACrB;AAAA,EAEA,MAAM,cAAiC;AACnC,UAAM,cAAc,IAAI,UAAS,KAAK,IAAI;AAC1C,UAAM,sBAAsB,MAAM,oCAAuB,kBAAkB,KAAK,IAAI;AACpF,gBAAY,kBAAkB,mBAAmB;AACjD,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,cAAiC;AACnC,UAAM,cAAc,IAAI,UAAS,KAAK,IAAI;AAC1C,UAAM,gBAAgB,MAAM,8BAAiB,YAAY,KAAK,IAAI;AAClE,gBAAY,YAAY,aAAa;AACrC,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,UAAyB;AAC3B,UAAM,WAAW,MAAM,KAAK,OAAO,IAAI,gBAAgB;AAAA,MACnD;AAAA,MAAY;AAAA,IAChB,CAAC;AACD,QAAI,SAAS,UAAU,KAAK;AACxB,2BAAqB,SAAS,QAAQ,SAAS,OAAO;AAAA,IAC1D;AACA,WAAO,SAAS;AAAA,EACpB;AAAA,EAEA,MAAM,aAA4B;AAC9B,WAAO,KAAK,OAAO,IAAI,gBAAgB;AAAA,MACnC;AAAA,MAAY;AAAA,IAChB,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuCA,MAAM,WAA0B;AAC5B,WAAO,IAAI,MAAM,MAAM,KAAK,MAAM,WAAW,KAAK,QAAQ,KAAK,gBAAgB,KAAK,QAAQ;AAAA,EAChG;AAAA,EAEQ,kBAAkB,gBAAsB;AAC5C,SAAK,iBAAiB;AAAA,EAC1B;AAAA,EAEQ,YAAY,UAAgB;AAChC,SAAK,WAAW;AAAA,EACpB;AACJ;AAMO,IAAM,QAAN,MAAM,OAAM;AAAA,EACP;AAAA,EACA,WAAyB;AAAA,EACzB;AAAA,EACA,iBAAwB,CAAC;AAAA,EACzB;AAAA,EACA;AAAA,EAER,YAAY,UAAe,cAAsB,WAAmB,SAAc,MAAM,iBAAwB,CAAC,GAAG,WAAkB,CAAC,GAAG;AACtI,SAAK,SAAS;AACd,SAAK,iBAAiB;AACtB,SAAK,WAAW;AAChB,SAAK,UAAU,IAAI,QAAQ,UAAU,cAAc,QAAQ;AAC3D,SAAK,WAAW;AAEhB,SAAK,MAAM;AAAA,MACP,MAAM;AAAA,MACN,UAAU;AAAA,MACV,OAAO;AAAA,MACP,SAAS,CAAC,GAAG;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC;AAAA,MACR,OAAO,CAAC;AAAA,MACR,SAAS,CAAC;AAAA,MACV,SAAS,CAAC;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,IACjB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,SAAmB,CAAC,GAAU;AACjC,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,IAAI,OAAO;AACjB,UAAM,IAAI,UAAU,OAAO,SAAS,IAAI,SAAS,CAAC,GAAG;AACrD,UAAM,IAAI,cAAc;AACxB,WAAO;AAAA,EACX;AAAA,EAiBA,MAAM,QAAgB,UAAkB,OAAoB;AACxD,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,IAAI,MAAM,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM,MAAM;AAAA,MACZ,SAAS;AAAA,IACb,CAAC;AACD,UAAM,WAAW;AACjB,WAAO;AAAA,EACX;AAAA,EAiBA,QAAQ,QAAgB,UAAkB,OAAoB;AAC1D,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,IAAI,MAAM,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,SAAS;AAAA,IACb,CAAC;AACD,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,WAAW,UAAgC;AACvC,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,aAAa,IAAI,OAAM,MAAM,MAAM,IAAI,UAAU,MAAM,IAAI,OAAO,MAAM,MAAM;AACpF,aAAS,UAAU;AAEnB,UAAM,IAAI,MAAM,KAAK;AAAA,MACjB,MAAM,MAAM;AAAA,MACZ,SAAS;AAAA,MACT,YAAY,WAAW,IAAI;AAAA,IAC/B,CAAC;AACD,UAAM,WAAW;AACjB,WAAO;AAAA,EACX;AAAA,EAEA,KAAY;AACR,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,WAAW;AACjB,WAAO;AAAA,EACX;AAAA,EAEA,MAAa;AACT,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,WAAW;AACjB,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,aAAa,QAAgB,QAA2B;AACpD,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,CAAC,QAAQ,MAAM,IAAI;AACzB,QAAI,WAAW,UAAa,WAAW,QAAW;AAC9C,YAAM,IAAI,MAAM,KAAK;AAAA,QACjB;AAAA,QACA,UAAU;AAAA,QACV,OAAO,CAAC,QAAQ,MAAM;AAAA,QACtB,MAAM,MAAM;AAAA,QACZ,SAAS;AAAA,MACb,CAAC;AACD,YAAM,WAAW;AAAA,IACrB;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,QAAQ,QAAgB,QAAsB;AAC1C,UAAM,QAAQ,KAAK,MAAM;AACzB,QAAI,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,GAAG;AAC5C,YAAM,IAAI,MAAM,KAAK;AAAA,QACjB;AAAA,QACA,UAAU;AAAA,QACV,OAAO;AAAA,QACP,MAAM,MAAM;AAAA,QACZ,SAAS;AAAA,MACb,CAAC;AACD,YAAM,WAAW;AAAA,IACrB;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,UAAU,QAAuB;AAC7B,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,IAAI,MAAM,KAAK;AAAA,MACjB;AAAA,MACA,UAAU;AAAA,MACV,MAAM,MAAM;AAAA,MACZ,SAAS;AAAA,IACb,CAAC;AACD,UAAM,WAAW;AACjB,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,aAAa,QAAuB;AAChC,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,IAAI,MAAM,KAAK;AAAA,MACjB;AAAA,MACA,UAAU;AAAA,MACV,MAAM,MAAM;AAAA,MACZ,SAAS;AAAA,IACb,CAAC;AACD,UAAM,WAAW;AACjB,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,KAAK,OAAe,SAAiB,UAAkB,SAAwB;AAC3E,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,IAAI,MAAM,KAAK;AAAA,MACjB,MAAM;AAAA,MACN;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ,CAAC;AACD,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,SAAS,OAAe,SAAiB,UAAkB,SAAwB;AAC/E,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,IAAI,MAAM,KAAK;AAAA,MACjB,MAAM;AAAA,MACN;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ,CAAC;AACD,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,UAAU,OAAe,SAAiB,UAAkB,SAAwB;AAChF,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,IAAI,MAAM,KAAK;AAAA,MACjB,MAAM;AAAA,MACN;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ,CAAC;AACD,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,QAAQ,QAAgB,YAA4B,OAAc;AAC9D,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,kBAAsC,CAAC,OAAO,MAAM;AAC1D,QAAI,gBAAgB,SAAS,UAAU,YAAY,CAAmB,GAAG;AACrE,YAAM,IAAI,QAAQ,KAAK;AAAA,QACnB;AAAA,QACA,WAAW,UAAU,YAAY;AAAA,MACrC,CAAC;AAAA,IACL,OAAO;AACH,YAAM,IAAI,MAAM,sBAAsB,SAAS,wBAAwB;AAAA,IAC3E;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,QAAQ,QAAuB;AAC3B,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,IAAI,QAAQ,KAAK,MAAM;AAC7B,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,WAAkB;AACd,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,IAAI,WAAW;AACrB,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,MAAM,SAAiB,KAAsB;AAC/C,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,IAAI,OAAO;AACjB,UAAM,IAAI,cAAc;AAAA,MACpB,MAAM;AAAA,MACN;AAAA,MACA,OAAO;AAAA,IACX;AACA,UAAM,IAAI,UAAU,CAAC,SAAS,MAAM,YAAY;AAChD,UAAM,IAAI,OAAO;AACjB,UAAM,IAAI,QAAQ;AAClB,UAAM,IAAI,SAAS;AACnB,QAAI;AACA,YAAM,SAAS,MAAM,MAAM,YAAY;AACvC,YAAM,MAAM,OAAO,CAAC,KAAK;AACzB,UAAI,KAAK;AACL,eAAO,IAAI;AAAA,MACf;AACA,aAAO;AAAA,IACX,SACO,OAAO;AACV,YAAM;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,IAAI,QAAiC;AACvC,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,IAAI,OAAO;AACjB,UAAM,IAAI,cAAc;AAAA,MACpB,MAAM;AAAA,MACN;AAAA,MACA,OAAO;AAAA,IACX;AACA,UAAM,IAAI,UAAU,CAAC,OAAO,MAAM,UAAU;AAC5C,UAAM,IAAI,OAAO;AACjB,UAAM,IAAI,QAAQ;AAClB,QAAI;AACA,YAAM,SAAS,MAAM,MAAM,YAAY;AACvC,YAAM,MAAM,OAAO,CAAC,KAAK;AACzB,UAAI,KAAK;AACL,eAAO,IAAI;AAAA,MACf;AACA,aAAO;AAAA,IACX,SACO,OAAO;AACV,YAAM;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,IAAI,QAAiC;AACvC,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,IAAI,OAAO;AACjB,UAAM,IAAI,cAAc;AAAA,MACpB,MAAM;AAAA,MACN;AAAA,MACA,OAAO;AAAA,IACX;AACA,UAAM,IAAI,UAAU,CAAC,OAAO,MAAM,UAAU;AAC5C,UAAM,IAAI,OAAO;AACjB,UAAM,IAAI,QAAQ;AAClB,QAAI;AACA,YAAM,SAAS,MAAM,MAAM,YAAY;AACvC,YAAM,MAAM,OAAO,CAAC,KAAK;AACzB,UAAI,KAAK;AACL,eAAO,IAAI;AAAA,MACf;AACA,aAAO;AAAA,IACX,SACO,OAAO;AACV,YAAM;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,IAAI,QAAiC;AACvC,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,IAAI,OAAO;AACjB,UAAM,IAAI,cAAc;AAAA,MACpB,MAAM;AAAA,MACN;AAAA,MACA,OAAO;AAAA,IACX;AACA,UAAM,IAAI,UAAU,CAAC,OAAO,MAAM,UAAU;AAC5C,UAAM,IAAI,OAAO;AACjB,UAAM,IAAI,QAAQ;AAClB,QAAI;AACA,YAAM,SAAS,MAAM,MAAM,YAAY;AACvC,YAAM,MAAM,OAAO,CAAC,KAAK;AACzB,UAAI,KAAK;AACL,eAAO,IAAI;AAAA,MACf;AACA,aAAO;AAAA,IACX,SACO,OAAO;AACV,YAAM;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,IAAI,QAAiC;AACvC,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,IAAI,OAAO;AACjB,UAAM,IAAI,cAAc;AAAA,MACpB,MAAM;AAAA,MACN;AAAA,MACA,OAAO;AAAA,IACX;AACA,UAAM,IAAI,UAAU,CAAC,OAAO,MAAM,UAAU;AAC5C,UAAM,IAAI,OAAO;AACjB,UAAM,IAAI,QAAQ;AAClB,QAAI;AACA,YAAM,SAAS,MAAM,MAAM,YAAY;AACvC,YAAM,MAAM,OAAO,CAAC,KAAK;AACzB,UAAI,KAAK;AACL,eAAO,IAAI;AAAA,MACf;AACA,aAAO;AAAA,IACX,SACO,OAAO;AACV,YAAM;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,QAAuB;AACzB,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,IAAI,QAAQ,OAAO,MAAM;AAC/B,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,KAAK,QAAuB;AACxB,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,UAAU,OAAO,MAAM;AAC7B,QAAI,MAAM,IAAI,OAAO;AACjB,YAAM,IAAI,UAAU,UAAU,KAAK,MAAM,IAAI;AAAA,IACjD;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,MAAiC;AACnC,QAAI;AACA,YAAM,QAAQ,KAAK,MAAM;AACzB,YAAM,IAAI,OAAO;AACjB,YAAM,IAAI,OAAO;AACjB,YAAM,IAAI,cAAc;AACxB,YAAM,SAAS,MAAM,MAAM,YAAY;AACvC,aAAO;AAAA,IACX,SACO,OAAO;AACV,YAAM;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,QAAwC;AAC1C,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,IAAI,OAAO;AACjB,UAAM,IAAI,OAAO;AACjB,UAAM,IAAI,cAAc;AACxB,UAAM,IAAI,QAAQ;AAClB,QAAI;AACA,YAAM,SAAS,MAAM,MAAM,YAAY;AACvC,aAAO,OAAO,CAAC,KAAK;AAAA,IACxB,SACO,OAAO;AACV,YAAM;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,KAAK,OAAY,SAAiB,MAAsC;AAC1E,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,IAAI,OAAO;AACjB,UAAM,IAAI,OAAO;AACjB,UAAM,IAAI,cAAc;AACxB,UAAM,MAAM,QAAQ,KAAK,KAAK;AAC9B,UAAM,IAAI,QAAQ;AAClB,QAAI;AACA,YAAM,SAAS,MAAM,MAAM,YAAY;AACvC,aAAO,OAAO,CAAC,KAAK;AAAA,IACxB,SACO,OAAO;AACV,YAAM;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,OAAO,MAAmD;AAC5D,UAAM,QAAQ,KAAK,MAAM;AACzB,QAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACtB,YAAM,IAAI,MAAM,sEAAsE;AAAA,IAC1F;AAEA,QAAI,CAAC,KAAK,MAAM,UAAQ,OAAO,SAAS,YAAY,SAAS,IAAI,GAAG;AAChE,YAAM,IAAI,MAAM,4CAA4C;AAAA,IAChE;AAEA,UAAM,IAAI,OAAO;AACjB,UAAM,IAAI,OAAO;AAEjB,UAAM,MAAM,YAAY,MAAM,KAAK,KAAK;AAExC,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,OAAO,MAAoC;AAC7C,UAAM,QAAQ,KAAK,MAAM;AACzB,QAAI,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,GAAG;AACjD,YAAM,IAAI,MAAM,4DAA4D;AAAA,IAChF;AAEA,QAAI,MAAM,IAAI,MAAM,WAAW,GAAG;AAC9B,YAAM,IAAI,MAAM,qEAAqE;AAAA,IACzF;AAEA,UAAM,IAAI,OAAO;AACjB,UAAM,IAAI,OAAO;AAEjB,UAAM,MAAM,YAAY,MAAM,KAAK,QAAQ;AAE3C,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,SAAuB;AACzB,UAAM,QAAQ,KAAK,MAAM;AACzB,QAAI,MAAM,IAAI,MAAM,WAAW,GAAG;AAC9B,YAAM,IAAI,MAAM,oEAAoE;AAAA,IACxF;AAEA,UAAM,IAAI,OAAO;AAEjB,UAAM,aAAa,MAAM,MAAM,YAAY,MAAM,KAAK,QAAQ;AAC9D,WAAO;AAAA,EACX;AAAA,EAEA,MAAc,YAAY,MAAW,MAAM,OAAY,MAAoB;AACvE,UAAM,WAAW,MAAM,MAAM,KAAK;AAClC,UAAM,uBAA8B,CAAC;AACrC,QAAI,oBAA2B,CAAC;AAEhC,QAAI,KAAK,eAAe,SAAS,GAAG;AAChC,UAAI,UAAU,SAAS;AAEvB,iBAAW,SAAS,SAAS,SAAS;AAClC,cAAM,gBAAgB,KAAK,eAAe,KAAK,QAAM,GAAG,WAAW,KAAK;AAExE,YAAI,eAAe;AACf,+BAAqB,KAAK,aAAa;AAEvC,gBAAM,eAAe,oCAAuB,oBAAoB,cAAc,WAAW;AACzF,8BAAoB,CAAC,GAAG,mBAAmB,GAAG,YAAY;AAC1D,oBAAU,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAG,SAAS,GAAG,YAAY,CAAC,CAAC;AAC3D,oBAAU,QAAQ,OAAO,CAAC,QAAgB,OAAO,KAAK;AAAA,QAC1D;AAAA,MACJ;AACA,eAAS,UAAU;AAAA,IACvB;AAEA,QAAI,cAAc,CAAC;AACnB,QAAI,MAAM;AACN,YAAM,UAAU,KAAK,QAAQ,IAAI,WAAW,IAAI;AAChD,YAAM,QAAQ,KAAK,QAAQ,IAAI,UAAU,IAAI;AAC7C,UAAI,KAAK,SAAS,SAAS,MAAM,WAAW,QAAQ;AAChD,cAAM,UAAU,SAAS;AACzB,iBAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS;AACjD,gBAAM,OAAO,QAAQ,KAAK;AAC1B,gBAAM,SAAS,EAAE,GAAG,UAAU,MAAM,CAAC,IAAI,EAAE;AAC3C,cAAI,SAAS;AACT,kBAAM,cAAc,MAAM,KAAK,QAAQ,QAAQ,WAAW,MAAM,IAAI;AACpE,kBAAM,WAAW,MAAM,KAAK,OAAO,IAAI,gBAAgB;AAAA,cACnD;AAAA,cAAY;AAAA,cACZ;AAAA,cAAS,KAAK,UAAU,MAAM;AAAA,YAClC,CAAC;AAED,gBAAI,SAAS,UAAU,KAAK;AACxB,0BAAY,QAAQ;AACpB,mCAAqB,SAAS,QAAQ,SAAS,OAAO;AAAA,YAC1D;AACA,kBAAM,YAAY,OAAO;AACzB,0BAAc,SAAS;AAAA,UAC3B;AACA,cAAI,OAAO;AAEP,kBAAM,WAAW,MAAM,KAAK,OAAO,IAAI,gBAAgB;AAAA,cACnD;AAAA,cAAY;AAAA,cACZ;AAAA,cAAS,KAAK,UAAU,MAAM;AAAA,YAClC,CAAC;AAED,gBAAI,SAAS,UAAU,KAAK;AACxB,mCAAqB,SAAS,QAAQ,SAAS,OAAO;AAAA,YAC1D;AACA,kBAAM,cAAc,MAAM,KAAK,QAAQ,QAAQ,UAAU,MAAM,IAAI;AACnE,kBAAM,YAAY,OAAO;AAAA,UAC7B;AAAA,QACJ;AAAA,MACJ,OAAO;AACH,cAAM,WAAW,MAAM,KAAK,OAAO,IAAI,gBAAgB;AAAA,UACnD;AAAA,UAAY;AAAA,UACZ;AAAA,UAAS,KAAK,UAAU,QAAQ;AAAA,QACpC,CAAC;AAED,YAAI,SAAS,UAAU,KAAK;AACxB,+BAAqB,SAAS,QAAQ,SAAS,OAAO;AAAA,QAC1D;AAEA,sBAAc,SAAS;AAAA,MAC3B;AAAA,IACJ,OAAO;AACH,YAAM,WAAW,MAAM,KAAK,OAAO,IAAI,gBAAgB;AAAA,QACnD;AAAA,QAAY;AAAA,QACZ;AAAA,QAAS,KAAK,UAAU,QAAQ;AAAA,MACpC,CAAC;AAED,UAAI,SAAS,UAAU,KAAK;AACxB,6BAAqB,SAAS,QAAQ,SAAS,OAAO;AAAA,MAC1D;AAEA,oBAAc,SAAS;AAAA,IAC3B;AAEA,QAAI,qBAAqB,SAAS,GAAG;AACjC,UAAI,aAAkB,oCAAuB,eAAe,aAAa,oBAAoB;AAC7F,YAAM,SAAS,WAAW,IAAI,CAAC,QAAa;AACxC,cAAM,SAAS,EAAE,GAAG,IAAI;AACxB,0BAAkB,QAAQ,SAAO,OAAO,OAAO,GAAG,CAAC;AACnD,eAAO;AAAA,MACX,CAAC;AACD,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAAA,EAEQ,QAAe;AACnB,UAAM,SAAS,OAAO,OAAO,OAAO,eAAe,IAAI,CAAC;AACxD,WAAO,SAAS,KAAK;AACrB,WAAO,WAAW,KAAK;AACvB,WAAO,iBAAiB,KAAK;AAC7B,WAAO,UAAU,KAAK;AACtB,WAAO,WAAW,KAAK;AAEvB,WAAO,MAAM;AAAA,MACT,GAAG,KAAK;AAAA,MACR,SAAS,CAAC,GAAG,KAAK,IAAI,OAAO;AAAA,MAC7B,OAAO,CAAC,GAAG,KAAK,IAAI,KAAK;AAAA,MACzB,OAAO,CAAC,GAAG,KAAK,IAAI,KAAK;AAAA,MACzB,SAAS,CAAC,GAAG,KAAK,IAAI,OAAO;AAAA,MAC7B,SAAS,CAAC,GAAG,KAAK,IAAI,OAAO;AAAA;AAAA,MAE7B,MAAM,KAAK,IAAI,OAAQ,MAAM,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,IAAI,EAAE,GAAG,KAAK,IAAI,KAAK,IAAK;AAAA,MACnG,aAAa,KAAK,IAAI,cAAc,EAAE,GAAG,KAAK,IAAI,YAAY,IAAI;AAAA,IACtE;AACA,WAAO;AAAA,EACX;AAEJ;AAEA,SAAS,qBAAqB,QAAgB,SAAiB;AAC3D,QAAM,QAAQ;AACd,QAAM,MAAM;AACZ,QAAM,SAAS;AACf,QAAM,OAAO;AACb,QAAM,OAAO;AACb,QAAM,OAAO;AACb,QAAM,YAAY;AAClB,QAAM,UAAU;AAEhB,MAAI,SAAS;AACb,MAAI,OAAO;AACX,QAAM,QAAQ,WAAW,MAAM,SAAS;AAGxC,MAAI,QAAQ,SAAS,QAAQ,GAAG;AAC5B,UAAM,QAAQ,QAAQ,MAAM,QAAQ;AACpC,cAAU;AAAA,EAAK,GAAG,GAAG,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,KAAK;AAC5C,YAAQ;AAAA,EAAK,OAAO,GAAG,IAAI,SAAS,KAAK,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,KAAK;AAAA;AAAA,EACxE,OAAO;AACH,cAAU;AAAA,EAAK,KAAK,GAAG,IAAI,GAAG,OAAO,GAAG,KAAK;AAAA;AAAA,EACjD;AAEA,QAAM,MAAM,IAAI,MAAM;AACtB,QAAM,aAAa,IAAI,OAAO,MAAM,IAAI,KAAK,CAAC;AAG9C,QAAM,oBAAoB,WAAW;AAAA,IAAK,UACtC,KAAK,SAAS,MAAM,KAAK,CAAC,KAAK,SAAS,cAAc;AAAA,EAC1D;AAEA,MAAI,mBAAmB;AACnB,UAAM,QAAQ,kBAAkB,MAAM,sBAAsB,KACxD,kBAAkB,MAAM,qBAAqB;AAEjD,QAAI,OAAO;AACP,YAAM,CAAC,EAAE,UAAU,SAAS,SAAS,IAAI;AACzC,YAAM,UAAU,SAAS,SAAS,EAAE;AACpC,YAAM,gBAAgB,GAAG,QAAQ,IAAI,OAAO,IAAI,SAAS;AAGzD,UAAI;AACA,cAAM,YAAY,UAAAC,QAAG,aAAa,UAAU,OAAO,EAAE,MAAM,IAAI;AAC/D,cAAM,QAAQ,KAAK,IAAI,GAAG,UAAU,CAAC;AACrC,cAAM,MAAM,KAAK,IAAI,UAAU,QAAQ,UAAU,CAAC;AAElD,kBAAU;AAAA,EAAK,IAAI,GAAG,IAAI,UAAU,KAAK,GAAG,MAAM,IAAI,SAAS,GAAG,aAAa,GAAG,KAAK;AAAA;AAEvF,iBAAS,IAAI,OAAO,IAAI,KAAK,KAAK;AAC9B,gBAAM,OAAO,UAAU,CAAC;AACxB,gBAAM,YAAY,GAAG,IAAI,CAAC,GAAG,SAAS,GAAG,GAAG;AAC5C,gBAAM,UAAU,IAAI,MAAM,UAAU,GAAG,GAAG,KAAK,KAAK,KAAK;AACzD,oBAAU,GAAG,IAAI,GAAG,SAAS,GAAG,KAAK,IAAI,OAAO,IAAI,IAAI;AAAA;AAAA,QAC5D;AAAA,MACJ,SAASC,MAAK;AACV,kBAAU,GAAG,MAAM,sDAA4C,QAAQ,GAAG,KAAK;AAAA;AAC/E,kBAAU;AAAA,EAAK,IAAI,GAAG,IAAI,eAAe,KAAK;AAAA,EAAK,WAAW,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,MACrF;AAAA,IACJ;AAAA,EACJ;AACA,YAAU;AACV,UAAQ,MAAM,MAAM;AACxB;;;ADlgCA,IAAO,gBAAQ;","names":["import_core","path","require","fs","err"]}