hysteria-orm 10.4.1 → 10.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/cli.cjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/errors/hysteria_error.ts","../src/drivers/driver.ts","../src/drivers/driver_constants.ts","../src/drivers/mongo_driver.ts","../src/drivers/mssql_driver.ts","../src/drivers/mysql_driver.ts","../src/drivers/oracledb_driver.ts","../src/drivers/pg_driver.ts","../src/drivers/sqlite3_driver.ts","../src/drivers/drivers_factory.ts","../src/env/env.ts","../src/sql/sql_connection_utils.ts","../src/utils/logger.ts","../src/cli/resources/migration_templates.ts","../src/cli/drop_all_tables_connector.ts","../src/cli/migration_create_connector.ts","../src/cli/migration_utils.ts","../src/utils/importer.ts","../src/cli/migration_run_connector.ts","../src/adminjs/adminjs_types.ts","../src/adminjs/adminjs_adapter.ts","../src/cache/adapters/in_memory.ts","../src/data_source/data_source.ts","../src/openapi/openapi.ts","../src/utils/hash.ts","../src/utils/query.ts","../src/sql/interpreter/mssql/alter_table/add_column.ts","../src/sql/interpreter/mssql/alter_table/add_constraint.ts","../src/sql/interpreter/mssql/alter_table/add_primary_key.ts","../src/sql/interpreter/mssql/alter_table/alter_column_type.ts","../src/sql/ast/query/query.ts","../src/sql/ast/query/node/alter_table/rename_table.ts","../src/utils/case_utils.ts","../src/utils/date_utils.ts","../src/utils/encryption.ts","../src/utils/reflect_metadata.ts","../src/utils/ulid.ts","../src/sql/resources/utils.ts","../src/entity.ts","../src/sql/serializer.ts","../src/sql/sql_runner/sql_runner_constants.ts","../src/sql/models/model_utils.ts","../src/sql/models/model.ts","../src/sql/models/relations/relation.ts","../src/sql/models/relations/belongs_to.ts","../src/sql/models/relations/has_many.ts","../src/sql/models/relations/has_one.ts","../src/sql/models/relations/many_to_many.ts","../src/sql/models/decorators/model_decorators_constants.ts","../src/sql/models/decorators/model_decorators.ts","../src/sql/interpreter/interpreter_utils.ts","../src/sql/interpreter/mssql/alter_table/alter_table.ts","../src/sql/interpreter/mssql/alter_table/drop_column.ts","../src/sql/interpreter/mssql/alter_table/drop_constraint.ts","../src/sql/interpreter/mssql/alter_table/drop_default.ts","../src/sql/interpreter/mssql/alter_table/drop_not_null.ts","../src/sql/interpreter/mssql/alter_table/drop_primary_key.ts","../src/sql/interpreter/mssql/alter_table/rename_column.ts","../src/sql/interpreter/mssql/alter_table/rename_table.ts","../src/sql/ast/query/node/raw/raw_node.ts","../src/sql/interpreter/mssql/alter_table/set_default.ts","../src/sql/interpreter/mssql/alter_table/set_not_null.ts","../src/sql/interpreter/mssql/column/column_type.ts","../src/sql/interpreter/mssql/constraint/after.ts","../src/sql/interpreter/mssql/constraint/constraint.ts","../src/sql/interpreter/mssql/create_table/create_table.ts","../src/sql/interpreter/mssql/delete/delete.ts","../src/sql/interpreter/mssql/distinct/distinct.ts","../src/sql/interpreter/mssql/distinct/distinct_on.ts","../src/sql/interpreter/mssql/drop_table/drop_table.ts","../src/sql/interpreter/mssql/extension/create_extension.ts","../src/sql/interpreter/mssql/from/from.ts","../src/sql/interpreter/mssql/group_by/group_by.ts","../src/sql/interpreter/mssql/having/having.ts","../src/sql/interpreter/mssql/index_op/create_index.ts","../src/sql/interpreter/mssql/index_op/drop_index.ts","../src/sql/interpreter/mssql/insert/insert.ts","../src/sql/interpreter/mssql/join/join.ts","../src/sql/interpreter/mssql/limit/limit.ts","../src/sql/interpreter/mssql/lock/lock.ts","../src/sql/interpreter/mssql/offset/offset.ts","../src/sql/interpreter/mssql/on_duplicate/on_duplicate.ts","../src/sql/interpreter/mssql/order_by/order_by.ts","../src/sql/interpreter/mssql/raw/raw.ts","../src/sql/interpreter/mssql/schema/foreign_key_info.ts","../src/sql/interpreter/mssql/schema/index_info.ts","../src/sql/interpreter/mssql/schema/primary_key_info.ts","../src/sql/interpreter/mssql/schema/table_info.ts","../src/sql/interpreter/mssql/select/select.ts","../src/sql/interpreter/mssql/truncate/truncate.ts","../src/sql/interpreter/mssql/union/union.ts","../src/sql/interpreter/mssql/update/update.ts","../src/sql/interpreter/mssql/where/where.ts","../src/sql/interpreter/mssql/where/where_group.ts","../src/sql/interpreter/mssql/where/where_json.ts","../src/sql/interpreter/mssql/where/where_subquery.ts","../src/sql/interpreter/mssql/with/with.ts","../src/sql/interpreter/mysql/alter_table/add_column.ts","../src/sql/interpreter/mysql/alter_table/add_constraint.ts","../src/sql/interpreter/mysql/alter_table/add_primary_key.ts","../src/sql/interpreter/mysql/alter_table/alter_column_type.ts","../src/sql/interpreter/mysql/alter_table/alter_table.ts","../src/sql/interpreter/mysql/alter_table/drop_column.ts","../src/sql/interpreter/mysql/alter_table/drop_constraint.ts","../src/sql/interpreter/mysql/alter_table/drop_default.ts","../src/sql/interpreter/mysql/alter_table/drop_not_null.ts","../src/sql/interpreter/mysql/alter_table/drop_primary_key.ts","../src/sql/interpreter/mysql/alter_table/rename_column.ts","../src/sql/interpreter/mysql/alter_table/rename_table.ts","../src/sql/interpreter/mysql/alter_table/set_default.ts","../src/sql/interpreter/mysql/alter_table/set_not_null.ts","../src/sql/interpreter/mysql/column/column_type.ts","../src/sql/interpreter/mysql/constraint/after.ts","../src/sql/interpreter/mysql/constraint/constraint.ts","../src/sql/interpreter/mysql/create_table/create_table.ts","../src/sql/interpreter/mysql/delete/delete.ts","../src/sql/interpreter/mysql/distinct/distinct.ts","../src/sql/interpreter/mysql/distinct/distinct_on.ts","../src/sql/interpreter/mysql/drop_table/drop_table.ts","../src/sql/interpreter/mysql/extension/create_extension.ts","../src/sql/interpreter/mysql/from/from.ts","../src/sql/interpreter/mysql/group_by/group_by.ts","../src/sql/interpreter/mysql/having/having.ts","../src/sql/interpreter/mysql/index_op/create_index.ts","../src/sql/interpreter/mysql/index_op/drop_index.ts","../src/sql/interpreter/mysql/insert/insert.ts","../src/sql/interpreter/mysql/join/join.ts","../src/sql/interpreter/mysql/limit/limit.ts","../src/sql/interpreter/mysql/lock/lock.ts","../src/sql/interpreter/mysql/offset/offset.ts","../src/sql/interpreter/mysql/on_duplicate/on_duplicate.ts","../src/sql/interpreter/mysql/order_by/order_by.ts","../src/sql/interpreter/mysql/raw/raw.ts","../src/sql/interpreter/mysql/schema/foreign_key_info.ts","../src/sql/interpreter/mysql/schema/index_info.ts","../src/sql/interpreter/mysql/schema/primary_key_info.ts","../src/sql/interpreter/mysql/schema/table_info.ts","../src/sql/interpreter/mysql/select/select.ts","../src/sql/interpreter/mysql/truncate/truncate.ts","../src/sql/interpreter/mysql/union/union.ts","../src/sql/interpreter/mysql/update/update.ts","../src/sql/interpreter/mysql/where/where.ts","../src/sql/interpreter/mysql/where/where_group.ts","../src/sql/interpreter/mysql/where/where_json.ts","../src/sql/interpreter/mysql/where/where_subquery.ts","../src/sql/interpreter/mysql/with/with.ts","../src/sql/interpreter/oracledb/alter_table/add_column.ts","../src/sql/interpreter/oracledb/alter_table/add_constraint.ts","../src/sql/interpreter/oracledb/alter_table/add_primary_key.ts","../src/sql/interpreter/oracledb/alter_table/alter_column_type.ts","../src/sql/interpreter/oracledb/alter_table/alter_table.ts","../src/sql/interpreter/oracledb/alter_table/drop_column.ts","../src/sql/interpreter/oracledb/alter_table/drop_constraint.ts","../src/sql/interpreter/oracledb/alter_table/drop_default.ts","../src/sql/interpreter/oracledb/alter_table/drop_not_null.ts","../src/sql/interpreter/oracledb/alter_table/drop_primary_key.ts","../src/sql/interpreter/oracledb/alter_table/rename_column.ts","../src/sql/interpreter/oracledb/alter_table/rename_table.ts","../src/sql/interpreter/oracledb/alter_table/set_default.ts","../src/sql/interpreter/oracledb/alter_table/set_not_null.ts","../src/sql/interpreter/oracledb/column/column_type.ts","../src/sql/interpreter/oracledb/constraint/after.ts","../src/sql/interpreter/oracledb/constraint/constraint.ts","../src/sql/interpreter/oracledb/create_table/create_table.ts","../src/sql/interpreter/oracledb/delete/delete.ts","../src/sql/interpreter/oracledb/distinct/distinct.ts","../src/sql/interpreter/oracledb/distinct/distinct_on.ts","../src/sql/interpreter/oracledb/drop_table/drop_table.ts","../src/sql/interpreter/oracledb/extension/create_extension.ts","../src/sql/interpreter/oracledb/from/from.ts","../src/sql/interpreter/oracledb/group_by/group_by.ts","../src/sql/interpreter/oracledb/having/having.ts","../src/sql/interpreter/oracledb/index_op/create_index.ts","../src/sql/interpreter/oracledb/index_op/drop_index.ts","../src/sql/interpreter/oracledb/insert/insert.ts","../src/sql/interpreter/oracledb/join/join.ts","../src/sql/interpreter/oracledb/limit/limit.ts","../src/sql/interpreter/oracledb/lock/lock.ts","../src/sql/interpreter/oracledb/offset/offset.ts","../src/sql/interpreter/oracledb/on_duplicate/on_duplicate.ts","../src/sql/interpreter/oracledb/order_by/order_by.ts","../src/sql/interpreter/oracledb/raw/raw.ts","../src/sql/interpreter/oracledb/schema/foreign_key_info.ts","../src/sql/interpreter/oracledb/schema/index_info.ts","../src/sql/interpreter/oracledb/schema/primary_key_info.ts","../src/sql/interpreter/oracledb/schema/table_info.ts","../src/sql/interpreter/oracledb/select/select.ts","../src/sql/interpreter/oracledb/truncate/truncate.ts","../src/sql/interpreter/oracledb/union/union.ts","../src/sql/interpreter/oracledb/update/update.ts","../src/sql/interpreter/oracledb/where/where.ts","../src/sql/interpreter/oracledb/where/where_group.ts","../src/sql/interpreter/oracledb/where/where_json.ts","../src/sql/interpreter/oracledb/where/where_subquery.ts","../src/sql/interpreter/oracledb/with/with.ts","../src/sql/interpreter/postgres/alter_table/add_column.ts","../src/sql/interpreter/postgres/alter_table/add_constraint.ts","../src/sql/interpreter/postgres/alter_table/add_primary_key.ts","../src/sql/interpreter/postgres/alter_table/alter_column_type.ts","../src/sql/interpreter/postgres/alter_table/alter_table.ts","../src/sql/interpreter/postgres/alter_table/drop_column.ts","../src/sql/interpreter/postgres/alter_table/drop_constraint.ts","../src/sql/interpreter/postgres/alter_table/drop_default.ts","../src/sql/interpreter/postgres/alter_table/drop_not_null.ts","../src/sql/interpreter/postgres/alter_table/drop_primary_key.ts","../src/sql/interpreter/postgres/alter_table/rename_column.ts","../src/sql/interpreter/postgres/alter_table/rename_table.ts","../src/sql/interpreter/postgres/alter_table/set_default.ts","../src/sql/interpreter/postgres/alter_table/set_not_null.ts","../src/sql/interpreter/postgres/column/column_type.ts","../src/sql/interpreter/postgres/constraint/after.ts","../src/sql/interpreter/postgres/constraint/constraint.ts","../src/sql/interpreter/postgres/create_table/create_table.ts","../src/sql/interpreter/postgres/delete/delete.ts","../src/sql/interpreter/postgres/distinct/distinct.ts","../src/sql/interpreter/postgres/distinct/distinct_on.ts","../src/sql/interpreter/postgres/drop_table/drop_table.ts","../src/sql/interpreter/postgres/extension/create_extension.ts","../src/sql/interpreter/postgres/from/from.ts","../src/sql/interpreter/postgres/group_by/group_by.ts","../src/sql/interpreter/postgres/having/having.ts","../src/sql/interpreter/postgres/index_op/create_index.ts","../src/sql/interpreter/postgres/index_op/drop_index.ts","../src/sql/interpreter/postgres/insert/insert.ts","../src/sql/interpreter/postgres/join/join.ts","../src/sql/interpreter/postgres/limit/limit.ts","../src/sql/interpreter/postgres/lock/lock.ts","../src/sql/interpreter/postgres/offset/offset.ts","../src/sql/interpreter/postgres/on_duplicate/on_duplicate.ts","../src/sql/interpreter/postgres/order_by/order_by.ts","../src/sql/interpreter/postgres/raw/raw.ts","../src/sql/interpreter/postgres/schema/foreign_key_info.ts","../src/sql/interpreter/postgres/schema/index_info.ts","../src/sql/interpreter/postgres/schema/primary_key_info.ts","../src/sql/interpreter/postgres/schema/table_info.ts","../src/sql/interpreter/postgres/select/select.ts","../src/sql/interpreter/postgres/truncate/truncate.ts","../src/sql/interpreter/postgres/union/union.ts","../src/sql/interpreter/postgres/update/update.ts","../src/sql/interpreter/postgres/where/where.ts","../src/sql/interpreter/postgres/where/where_group.ts","../src/sql/interpreter/postgres/where/where_json.ts","../src/sql/interpreter/postgres/where/where_subquery.ts","../src/sql/interpreter/postgres/with/with.ts","../src/sql/interpreter/sqlite/alter_table/add_column.ts","../src/sql/interpreter/sqlite/alter_table/add_constraint.ts","../src/sql/interpreter/sqlite/alter_table/alter_column_type.ts","../src/sql/interpreter/sqlite/alter_table/alter_table.ts","../src/sql/interpreter/sqlite/alter_table/drop_column.ts","../src/sql/interpreter/sqlite/alter_table/drop_constraint.ts","../src/sql/interpreter/sqlite/alter_table/drop_default.ts","../src/sql/interpreter/sqlite/alter_table/drop_not_null.ts","../src/sql/interpreter/sqlite/alter_table/drop_primary_key.ts","../src/sql/interpreter/sqlite/alter_table/rename_column.ts","../src/sql/interpreter/sqlite/alter_table/rename_table.ts","../src/sql/interpreter/sqlite/alter_table/set_default.ts","../src/sql/interpreter/sqlite/alter_table/set_not_null.ts","../src/sql/interpreter/sqlite/column/column_type.ts","../src/sql/interpreter/sqlite/constraint/after.ts","../src/sql/interpreter/sqlite/constraint/constraint.ts","../src/sql/interpreter/sqlite/create_table/create_table.ts","../src/sql/interpreter/sqlite/delete/delete.ts","../src/sql/interpreter/sqlite/distinct/distinct.ts","../src/sql/interpreter/sqlite/distinct/distinct_on.ts","../src/sql/interpreter/sqlite/drop_table/drop_table.ts","../src/sql/interpreter/sqlite/extension/create_extension.ts","../src/sql/interpreter/sqlite/from/from.ts","../src/sql/interpreter/sqlite/group_by/group_by.ts","../src/sql/interpreter/sqlite/having/having.ts","../src/sql/interpreter/sqlite/index_op/create_index.ts","../src/sql/interpreter/sqlite/index_op/drop_index.ts","../src/sql/interpreter/sqlite/insert/insert.ts","../src/sql/interpreter/sqlite/join/join.ts","../src/sql/interpreter/sqlite/limit/limit.ts","../src/sql/interpreter/sqlite/lock/lock.ts","../src/sql/interpreter/sqlite/offset/offset.ts","../src/sql/interpreter/sqlite/on_duplicate/on_duplicate.ts","../src/sql/interpreter/sqlite/order_by/order_by.ts","../src/sql/interpreter/sqlite/raw/raw.ts","../src/sql/interpreter/sqlite/schema/foreign_key_info.ts","../src/sql/interpreter/sqlite/schema/index_info.ts","../src/sql/interpreter/sqlite/schema/primary_key_info.ts","../src/sql/interpreter/sqlite/schema/table_info.ts","../src/sql/interpreter/sqlite/select/select.ts","../src/sql/interpreter/sqlite/truncate/truncate.ts","../src/sql/interpreter/sqlite/union/union.ts","../src/sql/interpreter/sqlite/update/update.ts","../src/sql/interpreter/sqlite/where/where.ts","../src/sql/interpreter/sqlite/where/where_group.ts","../src/sql/interpreter/sqlite/where/where_json.ts","../src/sql/interpreter/sqlite/where/where_subquery.ts","../src/sql/interpreter/sqlite/with/with.ts","../src/sql/ast/interpreter_map.ts","../src/sql/ast/parser.ts","../src/sql/ast/query/node/schema/foreign_key_info.ts","../src/sql/ast/query/node/schema/index_info.ts","../src/sql/ast/query/node/schema/primary_key_info.ts","../src/sql/ast/query/node/schema/table_info.ts","../src/sql/ast/query/node/alter_table/add_column.ts","../src/sql/ast/query/node/alter_table/add_constraint.ts","../src/sql/ast/query/node/alter_table/add_primary_key.ts","../src/sql/ast/query/node/alter_table/alter_column_type.ts","../src/sql/ast/query/node/alter_table/alter_table.ts","../src/sql/ast/query/node/alter_table/drop_column.ts","../src/sql/ast/query/node/alter_table/drop_constraint.ts","../src/sql/ast/query/node/alter_table/drop_default.ts","../src/sql/ast/query/node/alter_table/drop_not_null.ts","../src/sql/ast/query/node/alter_table/drop_primary_key.ts","../src/sql/ast/query/node/alter_table/rename_column.ts","../src/sql/ast/query/node/alter_table/set_default.ts","../src/sql/ast/query/node/alter_table/set_not_null.ts","../src/sql/ast/query/node/constraint/constraint.ts","../src/sql/ast/query/node/create_table/create_table.ts","../src/sql/ast/query/node/drop_table/drop_table.ts","../src/sql/ast/query/node/extension/create_extension.ts","../src/sql/ast/query/node/index_op/create_index.ts","../src/sql/ast/query/node/index_op/drop_index.ts","../src/sql/ast/query/node/truncate/truncate.ts","../src/sql/ast/query/node/column/column_type.ts","../src/sql/ast/query/node/lock/lock.ts","../src/sql/ast/query/node/union/union.ts","../src/sql/ast/query/node/with/with.ts","../src/sql/migrations/schema/base_builder.ts","../src/sql/ast/query/node/constraint/after.ts","../src/sql/migrations/schema/constraint_builder.ts","../src/sql/migrations/schema/create_table.ts","../src/sql/migrations/schema/alter_table.ts","../src/sql/migrations/schema/schema.ts","../src/sql/migrations/schema_diff/migration_operation_generator.ts","../src/sql/migrations/schema_diff/drop_order_resolver.ts","../src/sql/migrations/schema_diff/type_normalizer.ts","../src/sql/migrations/schema_diff/schema_diff.ts","../src/sql/ast/query/node/delete/delete.ts","../src/sql/ast/query/node/from/from.ts","../src/sql/ast/query/node/insert/insert.ts","../src/sql/ast/query/node/on_duplicate/on_duplicate.ts","../src/sql/ast/query/node/update/update.ts","../src/sql/ast/query/node/where/where.ts","../src/sql/ast/query/node/where/where_group.ts","../src/sql/ast/query/node/where/where_json.ts","../src/sql/ast/query/node/where/where_subquery.ts","../src/sql/sql_runner/sql_runner.ts","../src/sql/sql_runner/sql_runner_utils.ts","../src/utils/oracle_utils.ts","../src/utils/performance.ts","../src/sql/ast/query/node/select/basic_select.ts","../src/sql/models/model_manager/model_manager_utils.ts","../src/sql/pagination.ts","../src/utils/types.ts","../src/sql/ast/query/node/having/having.ts","../src/sql/ast/query/node/distinct/distinct.ts","../src/sql/ast/query/node/distinct/distinct_on.ts","../src/sql/ast/query/node/join/join.ts","../src/sql/ast/query/node/group_by/group_by.ts","../src/sql/ast/query/node/limit/limit.ts","../src/sql/ast/query/node/offset/offset.ts","../src/sql/ast/query/node/order_by/order_by.ts","../src/sql/query_builder/footer_query_builder.ts","../src/sql/query_builder/join_query_builder.ts","../src/sql/query_builder/select_query_builder.ts","../src/sql/query_builder/where_query_builder.ts","../src/sql/query_builder/json_query_builder.ts","../src/sql/query_builder/query_builder.ts","../src/sql/models/model_query_builder/model_query_builder.ts","../src/sql/models/model_query_builder/dry_model_query_builder.ts","../src/sql/models/model_manager/model_manager.ts","../src/sql/query_builder/dry_query_builder.ts","../src/sql/query_builder/query_builder_utils.ts","../src/sql/transactions/transaction.ts","../src/sql/sql_data_source.ts","../src/sql/migrations/migrator.ts","../src/cli/migration_rollback_connector.ts","../src/cli/resources/generate_migration_template.ts","../src/cli/resources/init_templates.ts","../src/cli/run_sql_connector.ts","../src/cli/resources/seeder_templates.ts","../src/cli/seeder_create_connector.ts","../src/cli/seeder_run_connector.ts","../src/utils/package.ts","../src/cli.ts"],"names":["HysteriaError","caller","code","error","Driver","driverSpecificOptions","_driverSpecificOptions","DriverNotFoundError","driverName","_MongoDriver","client","mongoModule","MongoDriver","_MssqlDriver","mssqlModule","MssqlDriver","_MysqlDriver","mysqlModule","MysqlDriver","_OracleDBDriver","oracledbModule","OracleDBDriver","_PgDriver","pgModule","PgDriver","_Sqlite3Driver","sqliteModule","Sqlite3Driver","DriverFactory","existingDriver","envBase","fillEnvWithDatabaseEnvs","fs","envVar","key","value","trimmedKey","trimmedValue","env","getDriverConnection","type","createSqlPool","input","driver","mysqlInput","pgInput","pgDriver","sqliteDriver","sqliteInput","database","err","mssqlDriver","mssqlInput","options","rest","oracledbDriver","oracledbInput","connectionString","colors","getTimestamp","now","pad","n","formatLogMessage","level","message","timestamp","levelUpper","HysteriaLogger","customLogger","formatParams","params","param","log","query","logs","highlight","logMessage","logger_default","MigrationTemplates","dbType","result","row","name","tables","table","js","migration_templates_default","dropAllTablesConnector","sql","shouldExit","transactional","dbDatabase","trx","shouldUseTransaction","details","templates","parsedTables","dropAllTablesTemplate","fkConstraints","fk","fkResult","getOrCreateMigrationPath","migrationPath","currentPath","path","migration_create_connector_default","mode","migrationFolderPath","migrationFileName","migrationFilePath","migrationTemplate","importTsUniversal","entry","tsconfigPath","bundleRequire","filepath","mod","importMigrationFile","filePath","pathToFileURL","require","createRequire","module","getMigrationTable","sqlConnection","mysqlConnection","pgConnection","promisifySqliteQuery","mssqlConnection","oracleConnection","getMigrations","migrationNames","findMigrationNames","migrations","migrationName","migrationModule","findMigrationModule","migration","loadMigrationModule","pathToFile","migrationModulePath","join","inputMigrationPath","currentUserDirectory","fullPathToMigrationPath","migrationFiles","file","ext","fullFilePath","sqLiteConnection","resolve","reject","results","runMigrationsConnector","runUntil","migrationTable","pendingMigrations","runUntilIndex","filteredMigrations","Migrator","migrator","HYSTERIA_TO_ADMINJS_TYPE_MAP","globalSqlDataSource","applyFilter","filter","model","filterObj","columns","filterValue","column","c","typeString","propertyType","dateFilter","recordToParams","record","createHysteriaResourceClass","adminjs","BaseResourceClass","BaseRecordClass","BasePropertyClass","rawResource","resource","adminJsType","id","ids","primaryKey","existingRecord","updatedRecord","createHysteriaDatabaseClass","BaseDatabaseClass","_database","registerHysteriaAdapter","AdminJS","HysteriaResource","HysteriaDatabase","initializeAdminJs","sqlDataSource","models","resources","modelOptions","adminOptions","validPages","page","initializeAdminJsExpress","admin","AdminJSExpress","router","inMemoryCache","InMemoryAdapter","data","ttl","keys","cacheKey","DataSource","detectColumnType","required","baseType","isColumnRequired","generateColumnProperties","properties","getRequiredFields","generateModelSchema","generateOpenApiModelWithMetadata","hashString","salt","hashInstance","crypto","valueToHash","getSqlDialect","sqlType","formatParam","bindParamsIntoQuery","i","pgPlaceholder","mssqlPlaceholder","oraclePlaceholder","isTableMissingError","formatQuery","formattedQuery","format","MssqlAddColumnInterpreter","node","acNode","ast","AstParser","inlineConstraints","constraintParts","constraint","constraintSql","add_column_default","MssqlAddConstraintInterpreter","add_constraint_default","MssqlAddPrimaryKeyInterpreter","add_primary_key_default","MssqlAlterColumnTypeInterpreter","a","restTokens","typeSql","nullClause","resultSql","defaultValue","alter_column_type_default","QueryNode","keyword","isRawValue","RenameTableNode","newName","toSnake","str","toCamel","group","convertCase","to","x","dayjs","utc","timezone","customParseFormat","getDate","date","d","localDate","utcDate","parseDate","parsed","baseSoftDeleteDate","encryptSymmetric","keyBuffer","iv","cipher","encrypted","decryptSymmetric","stringValue","ivHex","normalizedIv","normalizedEncrypted","decipher","decrypted","encryptAsymmetric","publicKey","symmetricKey","encryptedData","encryptedKey","publicEncrypt","decryptAsymmetric","privateKey","encryptedKeyHex","privateDecrypt","Reflect","metadataKey","metadataValue","target","propertyKey","propStore","metaMap","current","ENCODING","ENCODING_LEN","TIME_LEN","RANDOM_LEN","encodeTime","length","encodeRandom","bytes","randomBytes","randomByte","generateULID","time","random","stripIdentifierQuotes","identifier","remapSelectedColumnToFromAlias","fromAlias","modelTable","cleanCol","col","getColumnValue","deepCloneNode","val","seen","arr","out","v","Entity","parseDatabaseDataIntoModelResponse","typeofModel","modelColumns","modelColumnsMap","modelSelectedColumns","modelAnnotatedColumns","mustRemoveAnnotations","casedModel","hiddenColumnsSet","databaseColumnsMap","modelColumn","modelSelectedColumnsSet","databaseValue","modelKey","processAnnotations","annotationsData","modelAnnotatedColumnsSet","$annotations","objKey","serializeModel","processedSelectedColumns","databaseColumn","processedColumn","columnName","serializedModels","databasesWithReturning","getBaseTableName","className","snakeCaseName","plural","getBaseModelInstance","_Model","descriptor","getPrimaryKey","findOptions","findOneOptions","modelManager","primaryKeyValue","refreshedModel","modelData","modelsData","relation","leftModel","rightModels","joinTableCustomData","m2mRelation","getRelations","r","casedLeftForeignKey","casedRightForeignKey","joinTableModelsToInsert","rightModel","index","ThroughModel","modelSqlInstance","updatePayload","searchCriteria","createData","doesExist","newModel","conflictColumns","recordKeys","columnsToUpdate","upsertResult","lookupQuery","conflictMap","softDeleteOptions","sqlInstance","getModelColumns","getRelationsMetadata","getIndexes","getUniques","args","hasOne","hasMany","belongsTo","manyToMany","SqlDataSource","instance","payload","refreshed","Model","Relation","BelongsTo","relatedModel","foreignKey","HasMany","HasOne","ManyToMany","COLUMN_METADATA_KEY","PRIMARY_KEY_METADATA_KEY","RELATION_METADATA_KEY","INDEX_METADATA_KEY","UNIQUE_METADATA_KEY","getDefaultForeignKey","pluralize","getDefaultIndexName","getDefaultUniqueConstraintName","getDefaultFkConstraintName","leftColumn","rightColumn","getDefaultPrimaryKeyConstraintName","isPrimaryKey","targetModel","databaseName","existingColumns","primaryKeyColumn","dateColumn","booleanColumn","jsonColumn","uuidColumn","ulidColumn","integerColumn","floatColumn","incrementColumn","bigIncrementColumn","symmetric","asymmetric","autoUpdate","autoCreate","fallbackForeignKey","fallbackConstraintName","targetTable","fkColumn","relations","throughModel","throughModelKeys","leftForeignKey","rightForeignKey","wasModelProvided","throughModelTable","primaryModel","fallbackLeftForeignKey","fallbackRightForeignKey","resolvedForeignKey","lazyLoadedModel","InterpreterUtils","foundColumn","casedColumn","alias","values","filteredColumns","filteredValues","_","preparedValue","fromNode","astParser","MssqlAlterTableInterpreter","atNode","tableName","renameNode","parts","bindings","child","childBindings","stmt","alter_table_default","MssqlDropColumnInterpreter","drop_column_default","MssqlDropConstraintInterpreter","drop_constraint_default","MssqlDropDefaultInterpreter","drop_default_default","MssqlDropNotNullInterpreter","drop_not_null_default","MssqlDropPrimaryKeyInterpreter","drop_primary_key_default","MssqlRenameColumnInterpreter","rename_column_default","MssqlRenameTableInterpreter","rename_table_default","RawNode","MssqlSetDefaultInterpreter","set_default_default","MssqlSetNotNullInterpreter","set_not_null_default","MssqlColumnTypeInterpreter","colNode","dt","len","precision","scale","p","column_type_default","MssqlAfterConstraintInterpreter","_node","after_default","MssqlConstraintInterpreter","cNode","utils","sqlPrefix","cols","colsArr","sqlPrefixU","refTable","refCols","constraint_default","MssqlCreateTableInterpreter","ctNode","last","inlineConstraintSql","combined","constraintBindings","columnsSql","create_table_default","MssqlDeleteInterpreter","deleteNode","delete_default","MssqlDistinctInterpreter","distinct_default","MssqlDistinctOnInterpreter","distinct_on_default","MssqlDropTableInterpreter","tableSql","drop_table_default","MssqlCreateExtensionInterpreter","create_extension_default","MssqlFromInterpreter","interpreterUtils","subQueryNodes","aliasSql","from_default","MssqlGroupByInterpreter","groupByNode","group_by_default","MssqlHavingInterpreter","havingNode","idx","placeholders","having_default","MssqlCreateIndexInterpreter","ci","create_index_default","MssqlDropIndexInterpreter","di","drop_index_default","MssqlInsertInterpreter","insertNode","formattedTable","firstRecord","formattedColumns","allValues","valuesClauses","paramIndex","recordValues","returningCols","outputCols","insertedColumns","outputColumns","insert_default","MssqlJoinInterpreter","joinNode","leftColumnStr","rightColumnStr","leftSql","rightSql","join_default","MssqlLimitInterpreter","limitNode","limit_default","MssqlLockInterpreter","lock_default","MssqlOffsetInterpreter","offsetNode","offset_default","MssqlOnDuplicateInterpreter","onDuplicateNode","on_duplicate_default","MssqlOrderByInterpreter","orderByNode","columnSql","directionSql","order_by_default","MssqlRawInterpreter","raw_default","MssqlForeignKeyInfoInterpreter","foreign_key_info_default","MssqlIndexInfoInterpreter","index_info_default","MssqlPrimaryKeyInfoInterpreter","primary_key_info_default","MssqlTableInfoInterpreter","table_info_default","MssqlSelectInterpreter","selectNode","columnResult","sqlFunction","formatted","select_default","MssqlTruncateInterpreter","truncateNode","truncate_default","MssqlUnionInterpreter","unionNode","parser","nodes","union_default","MssqlUpdateInterpreter","updateNode","rawNodeCount","finalBindings","setClause","update_default","MssqlWhereInterpreter","whereNode","formattedRight","formattedColumn","hasRawValue","isMarkedRaw","raw","where_default","MssqlWhereGroupInterpreter","groupNode","where_group_default","MssqlWhereJsonInterpreter","whereJsonNode","where_json_default","MssqlWhereSubqueryInterpreter","subqueryNode","subquery","subquerySql","subqueryBindings","where_subquery_default","MssqlWithInterpreter","withNode","with_default","MysqlAddColumnInterpreter","MysqlAddConstraintInterpreter","MysqlAddPrimaryKeyInterpreter","MysqlAlterColumnTypeInterpreter","nullableSql","MysqlAlterTableInterpreter","isExtendingAddColumn","isNamedTableConstraint","cleaned","ensured","ifExists","MysqlDropColumnInterpreter","MysqlDropConstraintInterpreter","MysqlDropDefaultInterpreter","MysqlDropNotNullInterpreter","MysqlDropPrimaryKeyInterpreter","MysqlRenameColumnInterpreter","MysqlRenameTableInterpreter","MysqlSetDefaultInterpreter","MysqlSetNotNullInterpreter","MysqlColumnTypeInterpreter","MysqlAfterConstraintInterpreter","MysqlConstraintInterpreter","prefix","MysqlCreateTableInterpreter","MysqlDeleteInterpreter","MySqlDistinctInterpreter","MysqlDropTableInterpreter","MysqlCreateExtensionInterpreter","MySqlFromInterpreter","MySqlGroupByInterpreter","MysqlHavingInterpreter","MysqlCreateIndexInterpreter","MysqlDropIndexInterpreter","MysqlInsertInterpreter","MysqlJoinInterpreter","MySqlLimitInterpreter","lockTypeToSql","MysqlLockInterpreter","lockNode","MySqlOffsetInterpreter","MysqlOnDuplicateInterpreter","noOpColumn","formattedNoOpColumn","MySqlOrderByInterpreter","MysqlRawInterpreter","MysqlForeignKeyInfoInterpreter","MysqlIndexInfoInterpreter","MysqlPrimaryKeyInfoInterpreter","MysqlTableInfoInterpreter","MysqlSelectInterpreter","MysqlTruncateInterpreter","MysqlUnionInterpreter","MysqlUpdateInterpreter","MysqlWhereInterpreter","MysqlWhereGroupInterpreter","MysqlWhereJsonInterpreter","MysqlWhereSubqueryInterpreter","MysqlWithInterpreter","OracleAddColumnInterpreter","OracleAddConstraintInterpreter","OracleAddPrimaryKeyInterpreter","OracleAlterColumnTypeInterpreter","OracleAlterTableInterpreter","OracleDropColumnInterpreter","OracleDropConstraintInterpreter","OracleDropDefaultInterpreter","OracleDropNotNullInterpreter","OracleDropPrimaryKeyInterpreter","OracleRenameColumnInterpreter","OracleRenameTableInterpreter","OracleSetDefaultInterpreter","OracleSetNotNullInterpreter","OracleColumnTypeInterpreter","withTz","OracleAfterConstraintInterpreter","OracleConstraintInterpreter","OracleCreateTableInterpreter","OracleDeleteInterpreter","OracleDistinctInterpreter","OracleDistinctOnInterpreter","OracleDropTableInterpreter","OracleCreateExtensionInterpreter","OracleFromInterpreter","OracleGroupByInterpreter","OracleHavingInterpreter","OracleCreateIndexInterpreter","OracleDropIndexInterpreter","OracleInsertInterpreter","insertAllClauses","OracleJoinInterpreter","OracleLimitInterpreter","OracleLockInterpreter","OracleOffsetInterpreter","OracleOnDuplicateInterpreter","formattedConflictColumns","updateSet","OracleOrderByInterpreter","OracleRawInterpreter","OracleForeignKeyInfoInterpreter","OracleIndexInfoInterpreter","OraclePrimaryKeyInfoInterpreter","OracleTableInfoInterpreter","OracleSelectInterpreter","OracleTruncateInterpreter","OracleUnionInterpreter","OracleUpdateInterpreter","OracleWhereInterpreter","OracleWhereGroupInterpreter","OracleWhereJsonInterpreter","OracleWhereSubqueryInterpreter","OracleWithInterpreter","materializedClause","PgAddColumnInterpreter","PgAddConstraintInterpreter","PgAddPrimaryKeyInterpreter","PgAlterColumnTypeInterpreter","PostgresAlterTableInterpreter","PgDropColumnInterpreter","PgDropConstraintInterpreter","PostgresDropDefaultInterpreter","PostgresDropNotNullInterpreter","PgDropPrimaryKeyInterpreter","PgRenameColumnInterpreter","PgRenameTableInterpreter","PostgresSetDefaultInterpreter","PostgresSetNotNullInterpreter","PostgresColumnTypeInterpreter","PgAfterConstraintInterpreter","PostgresConstraintInterpreter","PostgresCreateTableInterpreter","PostgresDeleteInterpreter","PostgresDistinctInterpreter","PostgresDistinctOnInterpreter","PgDropTableInterpreter","PostgresCreateExtensionInterpreter","PostgresFromInterpreter","PostgresGroupByInterpreter","PostgresHavingInterpreter","PgCreateIndexInterpreter","PostgresDropIndexInterpreter","PostgresInsertInterpreter","typeCast","PostgresJoinInterpreter","PostgresLimitInterpreter","PostgresLockInterpreter","PostgresOffsetInterpreter","PostgresOnDuplicateInterpreter","PostgresOrderByInterpreter","PostgresRawInterpreter","PostgresForeignKeyInfoInterpreter","PostgresIndexInfoInterpreter","PostgresPrimaryKeyInfoInterpreter","PostgresTableInfoInterpreter","PostgresSelectInterpreter","PostgresTruncateInterpreter","PostgresUnionInterpreter","PostgresUpdateInterpreter","PostgresWhereInterpreter","PostgresWhereGroupInterpreter","PostgresWhereJsonInterpreter","PostgresWhereSubqueryInterpreter","PostgresWithInterpreter","SqliteAddColumnInterpreter","SqliteAddConstraintInterpreter","SqliteAlterColumnTypeInterpreter","SqliteAlterTableInterpreter","awaitingConstraints","cleanedSql","SqliteDropColumnInterpreter","SqliteDropConstraintInterpreter","SqliteDropDefaultInterpreter","SqliteDropNotNullInterpreter","SqliteDropPrimaryKeyInterpreter","SqliteRenameColumnInterpreter","SqliteRenameTableInterpreter","SqliteSetDefaultInterpreter","SqliteSetNotNullInterpreter","SqliteColumnTypeInterpreter","SqliteAfterConstraintInterpreter","SqliteConstraintInterpreter","autoIncrement","columnType","SqliteCreateTableInterpreter","SqliteDeleteInterpreter","SqliteDistinctInterpreter","SqliteDropTableInterpreter","SqliteCreateExtensionInterpreter","SqliteFromInterpreter","SqliteGroupByInterpreter","SqliteHavingInterpreter","SqliteCreateIndexInterpreter","SqliteDropIndexInterpreter","SqliteInsertInterpreter","SqliteJoinInterpreter","SqliteLimitInterpreter","SqliteLockInterpreter","SqliteOffsetInterpreter","SqliteOnDuplicateInterpreter","SqliteOrderByInterpreter","SqliteRawInterpreter","SqliteForeignKeyInfoInterpreter","SqliteIndexInfoInterpreter","SqlitePrimaryKeyInfoInterpreter","SqliteTableInfoInterpreter","SqliteSelectInterpreter","SqliteTruncateInterpreter","SqliteUnionInterpreter","SqliteUpdateInterpreter","SqliteWhereInterpreter","SqliteWhereGroupInterpreter","SqliteWhereJsonInterpreter","SqliteWhereSubqueryInterpreter","SqliteWithInterpreter","interpreterMap","startBindingIndex","isNestedCondition","distinctOnNode","distinctNode","mssqlTableHints","filteredNodes","hasOffset","hasOrderBy","useMssqlTop","useMssqlOffsetFetch","useOracleOffsetFetch","sqlParts","allBindings","currentSqlKeyword","interpreter","sqlStatement","nextNode","chainWith","keywordToEmit","j","hasRecursive","candidate","topClause","offsetVal","paginationSql","limitParamIdx","hints","ForeignKeyInfoNode","IndexInfoNode","PrimaryKeyInfoNode","TableInfoNode","AddColumnNode","AddConstraintNode","AddPrimaryKeyNode","AlterColumnTypeNode","newType","AlterTableNode","children","DropColumnNode","DropConstraintNode","DropDefaultNode","DropNotNullNode","DropPrimaryKeyNode","RenameColumnNode","oldName","SetDefaultNode","SetNotNullNode","ConstraintNode","constraintType","CreateTableNode","namedConstraints","ifNotExists","DropTableNode","CreateExtensionNode","extensionName","CreateIndexNode","indexName","unique","DropIndexNode","cascade","TruncateNode","ColumnTypeNode","dataType","opts","LockNode","lockType","skipLocked","noWait","UnionNode","isAll","WithNode","clause","body","BaseBuilder","AfterConstraintNode","ConstraintBuilder","columnNode","context","defaultName","references","defaultVal","CreateTableBuilder","AlterTableBuilder","cb","tempNodes","builder","constraints","columnNodes","constraintNode","addColumnNode","columnBuilder","isNullable","nullableNode","hasDefault","foreignTable","foreignColumn","defaultConstraintName","constraintName","Schema","fileExtension","statements","statement","tableBuilder","createTableNode","frag","flushGroup","nodeGroup","oldTable","newTable","alterNode","dropNode","columnsOrConstraintName","computedName","DropOrderResolver","changes","foreignKeys","fkId","dependencies","tableId","columnId","m","items","getDependencies","visited","temp","visit","item","dep","dropDeps","operations","sortedFKs","sortedTables","t","impact","affectedConstraints","mixedOps","pk","dbColumn","MigrationOperationGenerator","fkKey","op","addSet","o","dropSet","churn","k","createTableSql","addColumnSql","uq","dropSql","uniqueDrops","u","schema","dropIndexSql","addPrimaryKeySql","pkConstraintName","addForeignKeySql","effectiveConstraintName","addUqSql","createIndexSql","relationData","explicit","referencesTable","sourceColumnName","modifySql","pkName","pkColumn","throughTable","sourceColumn","applyConstraints","b","columnData","indexData","referencesColumn","foreignKeyColumn","primaryKeyName","relatedModelPKColumn","databaseCaseConvention","relatedModelColumns","specifiedColumn","leftKey","leftKeyStr","leftKeyColumn","onDelete","onUpdate","fkConstraintName","operation","compactWhitespace","stripLengthSuffix","normalizeColumnType","dialect","rawType","lowered","base","rules","s","rule","SchemaDiff","_SchemaDiff","diff","databaseData","dbIndex","modelUniques","expectedConstraintName","modelIndex","dbCol","hasStructChange","defaultChange","expectedName","modelExpectedFkNames","rel","srcCol","srcDb","dbRelation","modelRelation","modelPrimaryKey","modelPrimaryKeyColumn","operationGenerator","formattedOperations","statementsByPhase","dbIndexes","baseCondition","normalizedDbType","normalizedModelType","isFloatingType","modelNullable","dbNullable","expectedRefTable","expectedRefColumn","expectedThroughTable","dbOnDelete","dbOnUpdate","modelOnDelete","modelOnUpdate","mr","expectedReferencedTable","fkName","localColumn","mc","referencedPkName","referencedColumn","dbPrimaryKey","columnsMatch","constraintNamesMatch","modelHasDefault","dbHasDefault","dbDefault","modelDefault","dbNorm","modelNorm","singleQuoted","processed","leftPkName","rightPkName","leftPk","rightPk","leftFkName","rightFkName","dbThrough","leftExpected","rightExpected","leftDbCol","rightDbCol","leftColOk","rightColOk","isLeft","isRight","actualName","pendingAddColumns","leftExpectedRel","rightExpectedRel","leftDbFk","rightDbFk","conflictLeft","conflictRight","tablesNeedingCheck","tableToDbFks","names","modelExpectedByTable","rels","expected","srcColRaw","dbSchema","modelCols","sourceCol","referencedTable","referencedCol","relModel","candidateCols","existsStructurally","colMatch","refTableMatch","refColMatch","dbFks","through","rightKey","leftMatch","rightMatch","leftOk","rightOk","refCol","leftRelation","rightRelation","relatedPkName","DeleteNode","FromNode","InsertNode","records","returning","disableReturning","OnDuplicateNode","UpdateNode","WhereNode","chainsWith","isNegated","operator","WhereGroupNode","WhereJsonNode","WhereSubqueryNode","SQLiteStream","Readable","db","events","pending","ended","hasError","wroteFlag","wroteValue","mockPassThrough","isTransactional","rows","inputModel","lastID","selectQuery","finalResult","insertPromises","preparedColumns","preparedValues","preparedModel","DATETIME_REGEX","DATE_ONLY_REGEX","convertDateStringToDateForOracle","convertOracleLobToValue","lob","chunk","chunks","processOracleRow","processedRow","execSql","mysqlDriver","mysqlResult","withRetry","pgResult","sqliteResult","mssqlPool","mssqlRequest","mssqlParamIdx","mssqlQuery","mssqlResult","ORACLE_OUT_FORMAT_OBJECT","oracledbConnection","isInTransaction","oracleParams","oracledbResult","normalizedRow","execSqlStreaming","pool","conn","passThrough","PassThrough","mysqlStream","tryRelease","pgPool","pgQueryStreamDriver","streamQuery","pgStream","oraclePool","ORACLE_STREAM_OUT_FORMAT_OBJECT","oracleStreamParams","oracleStream","fn","retryConfig","retries","maxRetries","delay","attempt","withPerformance","returnType","fix","start","res","elapsed","SelectNode","isRaw","SqlModelManagerUtils","getPaginationMetadata","limit","total","getCursorPaginationMetadata","coerceToNumber","HavingNode","DistinctNode","DistinctOnNode","JoinNode","left","right","on","GroupByNode","LimitNode","OffsetNode","offset","OrderByNode","direction","FooterQueryBuilder","getColumnsFn","order","JoinQueryBuilder","relationTable","referencingColumnOrPrimaryColumn","primaryColumn","primaryColumnValue","SelectQueryBuilder","sqlMethodOrColumn","columnOrAlias","maybeAlias","sqlMethod","WhereQueryBuilder","columnOrCb","operatorOrValue","QueryBuilder","actualValue","min","max","regexp","isPg","cbOrQueryBuilder","nestedBuilder","queryParams","subQueryOrCb","subQuery","whereGroupNode","JsonQueryBuilder","_QueryBuilder","replicationMode","dataSource","chunkSize","cursor","countQueryBuilder","count","lastItem","lastItemValue","queryBuilderOrCb","perPage","paginatedQuery","tableOrCb","subQueryBuilder","insertObject","rawResult","insertObjects","formatCol","sourceRows","obj","sourceColumns","sourceQuery","onCondition","insertCols","insertVals","whenMatchedClause","rawColumns","rawValues","qb","modelsQuery","countQuery","onSlaveFailure","ModelQueryBuilder","_ModelQueryBuilder","serializedModelsArray","serializedModel","ignoreBeforeUpdateHook","ignoredHooks","clonedQuery","hooksToIgnore","relationQueryBuilder","cbOrOperatorOrValue","maybeValue","actualOperator","modelQueryBuilder","queryBuilder","relatedModels","modelsToFillWithRelations","relatedModelsMap","foreignKeyValue","modelToFillWithRelation","relatedModelsByKey","relatedModelsGroupedByForeignKey","foreignKeyStr","relatedModelsList","manyToManyRelation","relatedModelsMapManyToMany","relatedPrimaryKey","casedRelatedPrimaryKey","annotations","filterValues","rn","withTableName","orderByClause","cteQb","outerSelectedColumnsHasMany","m2mLimit","m2mOffset","m2mSelectedColumns","rnM2m","withTableNameM2m","orderByClauseM2m","cteLeftForeignKey","qbM2m","innerQb","outerSelectedColumns","relatedInterpreter","outerInterpreter","m2m","jn","throughLeft","outerPk","ignoreHooks","DryModelQueryBuilder","ModelManager","insertedModel","firstModelKeys","insertedModels","primaryKeyIndex","updatedModel","retuning","returnModel","idsToFetchList","primaryKeyList","fetchedModels","insertedRow","DryQueryBuilder","getRawQueryBuilderModel","Transaction","_Transaction","isolationLevel","isNested","nestingDepth","levelQuery","savepoint","mssqlTransactionLevel","shortId","mssqlTransactionLevels","_instance","_SqlDataSource","inputAny","slave","__privateGet","connectionDetails","__privateSet","ttlOrFirstArg","restArgs","mappedKeyHandler","handlerArgsCount","isTTLProvided","hashedArgs","cachedKey","cachedValue","retrievedValue","cloned","sqlForQueryBuilder","optionsOrCb","maybeOptions","sqlTrx","sqlStatements","slaveInstance","indexes","rawNullable","withTimezone","map","isUnique","cr","grouped","lockKey","timeoutMs","lockId","lockAcquired","timeoutSeconds","lockHandle","lockReleased","hash","char","__privateAdd","completeUtcTimestamp","rollbackMigrationsConnector","rollBackUntil","tableMigrations","rollBackUntilIndex","GenerateMigrationTemplate","InitTemplates","port","importType","config","runSqlConnector","databaseType","fileDir","SeederTemplates","seederCreateConnector","javascript","seederPath","seedersFolder","extension","fileName","template","seeder_create_connector_default","runSeedersConnector","seederPaths","filesToRun","resolvedPath","stats","files","folderPath","folder","seederFilePath","seederModule","seederInstance","seeder_run_connector_default","getPackageManager","execWithPrompt","command","packageManager","rl","readline","dependenciesList","prompt","answer","execSync","installBaseDependencies","packageManagerCommand","devDependencies","sqlDatabaseTypes","driverDependency","driverInstalled","devFlag","devInstalled","allDatabaseTypes","program","Command","option","availableTypes","sqlDs","migrationMode","tsconfig","useLock","lockTimeout","rollbackUntil","force","previous"],"mappings":";+7CAEO,IAAMA,EAAN,cAA4B,KAAM,CAKvC,WAAYC,CAAAA,CAAAA,CAAgBC,EAAyBC,CAAe,CAAA,CAClE,MAAMF,CAAS,CAAA,KAAA,CAAQC,CAAI,CAC3B,CAAA,IAAA,CAAK,KAAOA,CACZ,CAAA,IAAA,CAAK,OAASD,CACd,CAAA,IAAA,CAAK,MAAQE,EACf,CACF,ECRO,IAAeC,CAAAA,CAAf,KAAsB,CAK3B,WAAA,CAAYC,CAA+D,CAAA,CACzE,IAAK,CAAA,OAAA,CAAUA,EACjB,CAEA,aAAa,aACXC,CACiB,CAAA,CACjB,MAAM,IAAIN,CAAAA,CACR,2FACA,mBACF,CACF,CACF,CCtBO,CAAA,IAAMO,EAAN,cAAkC,KAAM,CAC7C,WAAYC,CAAAA,CAAAA,CAAoB,CAC9B,KAAM,CAAA,EAAE,EACR,IAAK,CAAA,OAAA,CAAU,WAAWA,CAAU,CAAA,iEAAA,EAAoEA,CAAU,CACpH,CAAA,EAAA,CACF,ECDO,IAAMC,EAAAA,CAAN,MAAMA,EAAoBL,SAAAA,CAAO,CAMtC,WACEM,CAAAA,CAAAA,CACAL,EACA,CACA,KAAA,CAAMA,CAAqB,CAAA,CAP7B,IAAS,CAAA,IAAA,CAAO,QAQd,IAAK,CAAA,MAAA,CAASK,EAChB,CAEA,aAAa,cAAgC,CAC3C,GAAI,KAAK,WACP,CAAA,OAAO,IAAID,EAAY,CAAA,IAAA,CAAK,WAAW,CAGzC,CAAA,IAAME,EAAc,MAAM,OAAO,SAAS,CAAE,CAAA,KAAA,CAAM,IAAM,CACtD,MAAM,IAAIJ,CAAoB,CAAA,SAAS,CACzC,CAAC,CAAA,CAKD,GAHA,IAAK,CAAA,WAAA,CACFI,EAAgD,OAAWA,EAAAA,CAAAA,CAE1D,CAAC,IAAK,CAAA,WAAA,CACR,MAAM,IAAIJ,CAAAA,CAAoB,SAAS,CAAA,CAGzC,OAAO,IAAIE,GAAY,IAAK,CAAA,WAAW,CACzC,CACF,CAAA,CAhCaA,GACJ,WAAwC,CAAA,IAAA,CAD1C,IAAMG,EAANH,CAAAA,EAAAA,CCAA,IAAMI,EAAN,CAAA,MAAMA,WAAoBT,CAAO,CAMtC,YACEM,CACAL,CAAAA,CAAAA,CACA,CACA,KAAA,CAAMA,CAAqB,CAAA,CAP7B,KAAS,IAAO,CAAA,OAAA,CAQd,KAAK,MAASK,CAAAA,EAChB,CAEA,aAAa,YAAA,EAAgC,CAC3C,GAAI,IAAA,CAAK,YACP,OAAO,IAAIG,GAAY,IAAK,CAAA,WAAW,EAGzC,IAAMC,CAAAA,CAAc,MAAM,OAAO,OAAO,CAAA,CAAE,MAAM,IAAM,CACpD,MAAM,IAAIP,CAAAA,CAAoB,OAAO,CACvC,CAAC,EAKD,GAHA,IAAA,CAAK,YACFO,CAA0C,CAAA,OAAA,EAAWA,EAEpD,CAAC,IAAA,CAAK,YACR,MAAM,IAAIP,EAAoB,OAAO,CAAA,CAGvC,OAAO,IAAIM,EAAAA,CAAY,KAAK,WAAW,CACzC,CACF,CAhCaA,CAAAA,EAAAA,CACJ,YAAkC,IADpC,CAAA,IAAME,GAANF,ECAA,CAAA,IAAMG,GAAN,MAAMA,EAAAA,SAAoBZ,CAAO,CAMtC,WAAA,CACEM,CACAL,CAAAA,CAAAA,CACA,CACA,KAAA,CAAMA,CAAqB,CAP7B,CAAA,IAAA,CAAS,KAAO,OAQd,CAAA,IAAA,CAAK,OAASK,EAChB,CAEA,aAAa,YAAgC,EAAA,CAC3C,GAAI,IAAK,CAAA,WAAA,CACP,OAAO,IAAIM,EAAAA,CAAY,KAAK,WAAW,CAAA,CAGzC,IAAMC,CAAc,CAAA,aAAa,gBAAgB,CAAA,CAAE,MAAM,IAAM,CAC7D,MAAM,IAAIV,CAAAA,CAAoB,QAAQ,CACxC,CAAC,EAKD,GAHA,IAAA,CAAK,YACFU,CAA2C,CAAA,OAAA,EAAWA,EAErD,CAAC,IAAA,CAAK,WACR,CAAA,MAAM,IAAIV,CAAAA,CAAoB,QAAQ,CAGxC,CAAA,OAAO,IAAIS,EAAY,CAAA,IAAA,CAAK,WAAW,CACzC,CACF,EAhCaA,EACJ,CAAA,WAAA,CAAmC,KADrC,IAAME,EAAAA,CAANF,GCAA,IAAMG,EAAAA,CAAN,MAAMA,EAAuBf,SAAAA,CAAO,CAMzC,WACEM,CAAAA,CAAAA,CACAL,EACA,CACA,KAAA,CAAMA,CAAqB,CAP7B,CAAA,IAAA,CAAS,KAAO,UAQd,CAAA,IAAA,CAAK,OAASK,EAChB,CAEA,aAAa,YAAgC,EAAA,CAC3C,GAAI,IAAK,CAAA,cAAA,CACP,OAAO,IAAIS,EAAAA,CAAe,IAAK,CAAA,cAAc,CAG/C,CAAA,IAAMC,EAAiB,MAAM,OAAO,UAAU,CAAE,CAAA,KAAA,CAAM,IAAM,CAC1D,MAAM,IAAIb,CAAoB,CAAA,UAAU,CAC1C,CAAC,CAAA,CAMD,GAJA,IAAK,CAAA,cAAA,CACFa,EAAgD,OACjDA,EAAAA,CAAAA,CAEE,CAAC,IAAA,CAAK,cACR,CAAA,MAAM,IAAIb,CAAoB,CAAA,UAAU,EAG1C,OAAO,IAAIY,GAAe,IAAK,CAAA,cAAc,CAC/C,CACF,CAAA,CAjCaA,GACJ,cAAwC,CAAA,IAAA,CAD1C,IAAME,EAANF,CAAAA,EAAAA,CCAA,IAAMG,EAAN,CAAA,MAAMA,EAAiBlB,SAAAA,CAAO,CAMnC,WAAA,CACEM,EACAL,CACA,CAAA,CACA,MAAMA,CAAqB,CAAA,CAP7B,KAAS,IAAO,CAAA,UAAA,CAQd,KAAK,MAASK,CAAAA,EAChB,CAEA,aAAa,YAAA,EAAgC,CAC3C,GAAI,IAAA,CAAK,SACP,OAAO,IAAIY,GAAS,IAAK,CAAA,QAAQ,EAGnC,IAAMC,CAAAA,CAAW,MAAa,OAAA,IAAI,EAAE,KAAM,CAAA,IAAM,CAC9C,MAAM,IAAIhB,EAAoB,IAAI,CACpC,CAAC,CAID,CAAA,GAFA,KAAK,QAAYgB,CAAAA,CAAAA,CAAoC,OAAWA,EAAAA,CAAAA,CAE5D,CAAC,IAAA,CAAK,SACR,MAAM,IAAIhB,EAAoB,IAAI,CAAA,CAGpC,OAAO,IAAIe,EAAAA,CAAS,KAAK,QAAQ,CACnC,CACF,CA/BaA,CAAAA,EAAAA,CACJ,SAA4B,IAD9B,CAAA,IAAME,GAANF,ECAA,CAAA,IAAMG,GAAN,MAAMA,EAAAA,SAAsBrB,CAAO,CAMxC,WAAA,CACEM,EACAL,CACA,CAAA,CACA,MAAMA,CAAqB,CAAA,CAP7B,KAAS,IAAO,CAAA,QAAA,CAQd,KAAK,MAASK,CAAAA,EAChB,CAEA,aAAa,YAAA,EAAgC,CAC3C,GAAI,IAAA,CAAK,aACP,CAAA,OAAO,IAAIe,EAAAA,CAAc,KAAK,aAAa,CAAA,CAG7C,IAAMC,CAAe,CAAA,aAAa,SAAS,CAAA,CAAE,MAAM,IAAM,CACvD,MAAM,IAAInB,CAAAA,CAAoB,SAAS,CACzC,CAAC,EAKD,GAHA,IAAA,CAAK,cACFmB,CAA6C,CAAA,OAAA,EAAWA,EAEvD,CAAC,IAAA,CAAK,cACR,MAAM,IAAInB,EAAoB,SAAS,CAAA,CAGzC,OAAO,IAAIkB,EAAAA,CAAc,KAAK,aAAa,CAC7C,CACF,CAhCaA,CAAAA,EAAAA,CACJ,cAAsC,IADxC,CAAA,IAAME,EAANF,CAAAA,EAAAA,CCMA,IAAMG,EAAAA,CAAN,KAAoB,CAQzB,aAAa,UAAUlB,CAAmD,CAAA,CACxE,IAAMmB,CAAiB,CAAA,IAAA,CAAK,kBAAkBnB,CAAM,CAAA,CACpD,GAAImB,CACF,CAAA,OAAOA,EAGT,OAAQnB,CAAAA,EACN,KAAK,OAAA,CACL,KAAK,SAAA,CACH,OAAK,IAAA,CAAA,WAAA,CAAc,MAAMQ,EAAY,CAAA,YAAA,GAC9B,IAAK,CAAA,WAAA,CACd,KAAK,UACL,CAAA,KAAK,cACH,OAAK,IAAA,CAAA,QAAA,CAAW,MAAMM,EAAS,CAAA,YAAA,GACxB,IAAK,CAAA,QAAA,CACd,KAAK,QACH,CAAA,OAAA,IAAA,CAAK,YAAe,CAAA,MAAMG,EAAc,CAAA,YAAA,GACjC,IAAK,CAAA,YAAA,CACd,KAAK,OACH,CAAA,OAAA,IAAA,CAAK,cAAgB,MAAMf,EAAAA,CAAY,cAChC,CAAA,IAAA,CAAK,cACd,KAAK,OAAA,CACH,YAAK,WAAc,CAAA,MAAMG,GAAY,YAAa,EAAA,CAC3C,KAAK,WACd,CAAA,KAAK,WACH,OAAK,IAAA,CAAA,cAAA,CAAiB,MAAMM,EAAe,CAAA,YAAA,GACpC,IAAK,CAAA,cAAA,CACd,QACE,MAAM,IAAIrB,EACR,CAAmCU,gCAAAA,EAAAA,CAAM,iBACzC,kBACF,CACJ,CACF,CAEA,OAAe,iBACbA,CAAAA,CAAAA,CACe,CACf,OAAQA,GACN,KAAK,QACL,KAAK,SAAA,CACH,OAAO,IAAK,CAAA,WAAA,CACd,KAAK,UACL,CAAA,KAAK,cACH,OAAO,IAAA,CAAK,SACd,KAAK,QAAA,CACH,OAAO,IAAK,CAAA,YAAA,CACd,KAAK,OACH,CAAA,OAAO,KAAK,aACd,CAAA,KAAK,QACH,OAAO,IAAA,CAAK,YACd,KAAK,UAAA,CACH,OAAO,IAAK,CAAA,cAAA,CACd,QACE,OAAO,IACX,CACF,CACF,CAAA,CAjEakB,GACJ,WAA6B,CAAA,IAAA,CADzBA,EAEJ,CAAA,QAAA,CAA0B,IAFtBA,CAAAA,EAAAA,CAGJ,aAA8B,IAH1BA,CAAAA,EAAAA,CAIJ,YAA6B,IAJzBA,CAAAA,EAAAA,CAKJ,eAAgC,IAL5BA,CAAAA,EAAAA,CAMJ,cAA+B,IChBxC,CAGA,IAAME,EAAe,CACnB,OAAA,CAAS,QAAQ,GAAI,CAAA,OAAA,CACrB,QAAS,OAAQ,CAAA,GAAA,CAAI,QACrB,OAAS,CAAA,OAAA,CAAQ,IAAI,OACrB,CAAA,OAAA,CAAS,QAAQ,GAAI,CAAA,OAAA,CACrB,YAAa,OAAQ,CAAA,GAAA,CAAI,YACzB,WAAa,CAAA,OAAA,CAAQ,IAAI,WACzB,CAAA,OAAA,CAAS,QAAQ,GAAI,CAAA,OAAA,GAAY,MACjC,CAAA,cAAA,CAAgB,OAAQ,CAAA,GAAA,CAAI,gBAAkB,qBAE9C,CAAA,UAAA,CAAY,QAAQ,GAAI,CAAA,UAAA,CACxB,WAAY,OAAQ,CAAA,GAAA,CAAI,WACxB,cAAgB,CAAA,OAAA,CAAQ,IAAI,cAC5B,CAAA,cAAA,CAAgB,QAAQ,GAAI,CAAA,cAAA,CAC5B,eAAgB,OAAQ,CAAA,GAAA,CAAI,cAE5B,CAAA,SAAA,CAAW,OAAQ,CAAA,GAAA,CAAI,UACvB,UAAY,CAAA,OAAA,CAAQ,IAAI,UAAe,GAAA,MAAA,CAEvC,+BACE,OAAQ,CAAA,GAAA,CAAI,iCAAmC,MAAU,EAAA,KAC7D,EAEMC,EAA0B,CAAA,IAAW,CACzC,GAAI,CACWC,oBAAG,YAAa,CAAA,MAAA,CAAQ,MAAM,CAAA,CACtB,KAAM,CAAA;AAAA,CAAI,CAAA,CACvB,OAASC,CAAAA,CAAAA,EAAW,CAC1B,GAAM,CAACC,CAAKC,CAAAA,CAAK,CAAIF,CAAAA,CAAAA,CAAO,KAAM,CAAA,GAAG,EAC/BG,CAAaF,CAAAA,CAAAA,CAAI,IAAK,EAAA,CACtBG,CAAeF,CAAAA,CAAAA,CAAM,IAAK,EAAA,CAEhC,OAAQC,CAAAA,EACN,KAAK,SACHN,CAAAA,CAAAA,CAAQ,UAARA,CAAQ,CAAA,OAAA,CAAYO,CACpB,CAAA,CAAA,MACF,KAAK,SAAA,CACHP,EAAQ,OAARA,GAAAA,CAAAA,CAAQ,OAAYO,CAAAA,CAAAA,CAAAA,CACpB,MACF,KAAK,UACHP,CAAQ,CAAA,OAAA,GAARA,CAAQ,CAAA,OAAA,CAAYO,CACpB,CAAA,CAAA,MACF,KAAK,SAAA,CACHP,CAAQ,CAAA,OAAA,GAARA,CAAQ,CAAA,OAAA,CAAYO,CACpB,CAAA,CAAA,MACF,KAAK,aACHP,CAAAA,CAAAA,CAAQ,WAARA,GAAAA,CAAAA,CAAQ,WAAgBO,CAAAA,CAAAA,CAAAA,CACxB,MACF,KAAK,aAAA,CACHP,CAAQ,CAAA,WAAA,GAARA,CAAQ,CAAA,WAAA,CAAgBO,GACxB,MACF,KAAK,gBACHP,CAAAA,CAAAA,CAAQ,cAARA,GAAAA,CAAAA,CAAQ,cAAmBO,CAAAA,CAAAA,EAAgB,qBAC3C,CAAA,CAAA,MAEF,KAAK,YAAA,CACHP,CAAQ,CAAA,UAAA,GAARA,EAAQ,UAAeO,CAAAA,CAAAA,CAAAA,CACvB,MACF,KAAK,YACHP,CAAAA,CAAAA,CAAQ,aAARA,CAAQ,CAAA,UAAA,CAAeO,CACvB,CAAA,CAAA,MACF,KAAK,gBAAA,CACHP,EAAQ,cAARA,GAAAA,CAAAA,CAAQ,cAAmBO,CAAAA,CAAAA,CAAAA,CAC3B,MACF,KAAK,gBACHP,CAAAA,CAAAA,CAAQ,cAARA,GAAAA,CAAAA,CAAQ,cAAmBO,CAAAA,CAAAA,CAAAA,CAC3B,MACF,KAAK,iBACHP,CAAQ,CAAA,cAAA,GAARA,CAAQ,CAAA,cAAA,CAAmBO,CAC3B,CAAA,CAAA,MAEF,KAAK,WACHP,CAAAA,CAAAA,CAAQ,SAARA,GAAAA,CAAAA,CAAQ,SAAcO,CAAAA,CAAAA,CAAAA,CACtB,MACF,KAAK,gCAAA,CACHP,CAAQ,CAAA,8BAAA,GAARA,CAAQ,CAAA,8BAAA,CAAmCO,CAAiB,GAAA,MAAA,CAAA,CAC5D,KACJ,CACF,CAAC,EACH,CAAgB,KAAA,SACd,CACA,OAAOP,CACT,CACF,CAEaQ,CAAAA,CAAAA,CAAMP,IChEnB,CAAA,IAAMQ,EAAsB,CAAA,MAAOC,CACjB,EAAA,CAAA,MAAMZ,GAAc,SAAUY,CAAAA,CAAI,CAAG,EAAA,MAAA,CAI1CC,EAAgB,CAAA,MAC3BD,CACAE,CAAAA,CAAAA,GACyB,CACzB,IAAMC,CAAS,CAAA,MAAMJ,EAAoBC,CAAAA,CAAI,EAC7C,OAAQA,CAAAA,EACN,KAAK,SACL,CAAA,KAAK,QACH,IAAMI,CAAAA,CAAaF,CAanB,CAAA,OAToBC,CACU,CAAA,UAAA,CAAW,CACvC,IAAMC,CAAAA,CAAAA,CAAW,IACjB,CAAA,IAAA,CAAMA,CAAW,CAAA,IAAA,CACjB,IAAMA,CAAAA,CAAAA,CAAW,QACjB,CAAA,QAAA,CAAUA,CAAW,CAAA,QAAA,CACrB,QAAUA,CAAAA,CAAAA,CAAW,SACrB,GAAGA,CAAAA,EAAY,aACjB,CAAC,CAEH,CAAA,KAAK,UACL,CAAA,KAAK,aACH,CAAA,IAAMC,CAAUH,CAAAA,CAAAA,CAGVI,CAAWH,CAAAA,CAAAA,CAUjB,OATe,IAAIG,CAAAA,CAAS,IAAK,CAAA,CAC/B,IAAMD,CAAAA,CAAAA,CAAQ,IACd,CAAA,IAAA,CAAMA,CAAQ,CAAA,IAAA,CACd,IAAMA,CAAAA,CAAAA,CAAQ,QACd,CAAA,QAAA,CAAUA,EAAQ,QAClB,CAAA,QAAA,CAAUA,CAAQ,CAAA,QAAA,CAClB,GAAGA,CAAAA,EAAS,aACd,CAAC,CAAA,CAGH,KAAK,QAAA,CACH,IAAME,CAAAA,CAAeJ,EACfK,CAAcN,CAAAA,CAAAA,CAIdO,CAAWD,CAAAA,CAAAA,EAAa,QAa9B,CAAA,OAZmB,IAAID,CAAAA,CAAa,QAClCE,CAAAA,CAAAA,CACAD,CAAa,EAAA,aAAA,EAAe,IAAQ,EAAA,MAAA,CACnCE,GAAQ,CACP,GAAIA,CACF,CAAA,MAAM,IAAIlD,CAAAA,CACR,kCACA,4BACF,CAEJ,CACF,CAAA,CAEF,KAAK,OAAA,CACH,IAAMmD,CAAcR,CAAAA,CAAAA,CACdS,CAAaV,CAAAA,CAAAA,CAIb,CAAE,OAAA,CAAAW,CAAS,CAAA,GAAGC,CAAK,CAAA,CAAIF,CAAW,CAAA,aAAA,EAAiB,EAAC,CAiB1D,OAhBkB,MAAMD,CAAAA,CAAY,OAAQ,CAAA,CAC1C,MAAQC,CAAAA,CAAAA,CAAW,MAAQ,WAC3B,CAAA,IAAA,CAAMA,CAAW,CAAA,IAAA,CACjB,QAAUA,CAAAA,CAAAA,CAAW,SACrB,IAAMA,CAAAA,CAAAA,CAAW,QACjB,CAAA,QAAA,CAAUA,CAAW,CAAA,QAAA,CACrB,GAAGE,CAAAA,CACH,OAAS,CAAA,CACP,sBACEhB,CAAAA,CAAAA,CAAI,8BAAkC,EAAA,MAAA,CACxC,GAAGe,CACH,CAAA,uBAAA,CAAyB,KACzB,CAAA,0BAAA,CAA4B,KAC9B,CACF,CAAC,CAAA,CAGH,KAAK,UAAA,CACH,IAAME,CAAAA,CAAiBZ,CACjBa,CAAAA,CAAAA,CAAgBd,EAIhBe,CAAmB,CAAA,CAAA,EAAGD,CAAc,CAAA,IAAI,CAAIA,CAAAA,EAAAA,CAAAA,CAAc,QAAQ,CAAA,CAAA,CAQxE,OAPqB,MAAMD,CAAe,CAAA,UAAA,CAAW,CACnD,IAAA,CAAMC,EAAc,QACpB,CAAA,QAAA,CAAUA,CAAc,CAAA,QAAA,CACxB,aAAeC,CAAAA,CAAAA,CACf,GAAGD,CAAc,CAAA,aACnB,CAAC,CAAA,CAGH,QACE,MAAM,IAAIxD,CACR,CAAA,mCAAA,CACA,CAA6BwC,0BAAAA,EAAAA,CAAI,CACnC,CAAA,CACJ,CACF,CAAA,CC5HA,IAAMkB,EAAAA,CAAS,CACb,IAAM,CAAA,UAAA,CACN,IAAM,CAAA,UAAA,CACN,KAAO,CAAA,UAAA,CACP,MAAO,SACT,CAAA,CAEA,SAASC,EAAAA,EAAuB,CAC9B,IAAMC,EAAM,IAAI,IAAA,CACVC,CAAOC,CAAAA,CAAAA,EAAcA,CAAE,CAAA,QAAA,EAAW,CAAA,QAAA,CAAS,CAAG,CAAA,GAAG,CAEvD,CAAA,OAAO,CAAGF,EAAAA,CAAAA,CAAI,aAAa,CAAA,CAAA,EAAIC,CAAID,CAAAA,CAAAA,CAAI,QAAS,EAAA,CAAI,CAAC,CAAC,CAAA,CAAA,EAAIC,CAAID,CAAAA,CAAAA,CAAI,OAAQ,EAAC,CAAC,CAAIC,CAAAA,EAAAA,CAAAA,CAAID,CAAI,CAAA,QAAA,EAAU,CAAC,CAAIC,CAAAA,EAAAA,CAAAA,CAAID,CAAI,CAAA,UAAA,EAAY,CAAC,CAAIC,CAAAA,EAAAA,CAAAA,CAAID,EAAI,UAAW,EAAC,CAAC,CAAA,CACvJ,CAEA,SAASG,EAAiBC,CAAAA,CAAAA,CAAeC,CAAyB,CAAA,CAChE,IAAMC,CAAAA,CAAYP,EAAa,EAAA,CACzBQ,EAAaH,CAAM,CAAA,WAAA,EAEzB,CAAA,OAAIA,CAAU,GAAA,OAAA,CACL,CAAGN,EAAAA,EAAAA,CAAO,KAAK,CAAA,CAAA,EAAIS,CAAU,CAAA,EAAA,EAAKD,CAAS;AAAA,EAAKD,CAAO,CAAGP,EAAAA,EAAAA,CAAO,KAAK;AAAA,CAG3EM,CAAAA,CAAAA,GAAU,OACL,CAAGN,EAAAA,EAAAA,CAAO,IAAI,CAAIS,CAAAA,EAAAA,CAAU,KAAKD,CAAS;AAAA,EAAKD,CAAO,CAAGP,EAAAA,EAAAA,CAAO,KAAK;AAAA,CAG1EM,CAAAA,CAAAA,GAAU,OACL,CAAGN,EAAAA,EAAAA,CAAO,IAAI,CAAIS,CAAAA,EAAAA,CAAU,KAAKD,CAAS;AAAA,EAAKD,CAAO,CAAGP,EAAAA,EAAAA,CAAO,KAAK;AAAA,CAGvE,CAAA,CAAA,CAAA,EAAIS,CAAU,CAAA,EAAA,EAAKD,CAAS;AAAA,EAAKD,CAAO;AAAA,CACjD,CAEA,IAAMG,EAAN,CAAA,KAAqB,CAanB,OAAO,eAAA,CAAgBC,CAA4B,CAAA,CACjD,KAAK,cAAiBA,CAAAA,EACxB,CAEA,OAAO,KAAKJ,CAAuB,CAAA,CACjC,IAAK,CAAA,cAAA,CAAe,KAAKA,CAAO,EAClC,CAEA,OAAO,MAAMA,CAA+B,CAAA,CAC1C,GAAIA,CAAAA,YAAmB,MAAO,CAC5B,IAAA,CAAK,cAAe,CAAA,KAAA,CAAM,OAAOA,CAAO,CAAC,CACzC,CAAA,MACF,CACA,IAAA,CAAK,cAAe,CAAA,KAAA,CAAMA,CAAO,EACnC,CAEA,OAAO,IAAA,CAAKA,EAAuB,CACjC,IAAA,CAAK,cAAe,CAAA,IAAA,CAAKA,CAAO,EAClC,CACF,CAhCMG,CAAAA,EAAAA,CACG,eAA+B,CACpC,IAAA,CAAKH,CAAuB,CAAA,CAC1B,QAAQ,GAAIF,CAAAA,EAAAA,CAAiB,MAAQE,CAAAA,CAAO,CAAC,EAC/C,CAAA,CACA,KAAMA,CAAAA,CAAAA,CAAuB,CAC3B,OAAQ,CAAA,KAAA,CAAMF,EAAiB,CAAA,OAAA,CAASE,CAAO,CAAC,EAClD,CAAA,CACA,KAAKA,CAAuB,CAAA,CAC1B,OAAQ,CAAA,IAAA,CAAKF,GAAiB,MAAQE,CAAAA,CAAO,CAAC,EAChD,CACF,CAuBF,CAAA,SAASK,EAAaC,CAAAA,CAAAA,CAAuB,CAC3C,OAAOA,CAAAA,CACJ,GAAKC,CAAAA,CAAAA,EACA,OAAOA,CAAU,EAAA,QAAA,CACZ,IAAK,CAAA,SAAA,CAAUA,CAAK,CAGzB,CAAA,OAAOA,CAAU,EAAA,QAAA,CACZ,IAAIA,CAAK,CAAA,CAAA,CAAA,CAGd,OAAOA,CAAAA,EAAU,SACZA,CAGL,CAAA,OAAOA,CAAU,EAAA,SAAA,CACZA,EAAQ,MAAS,CAAA,OAAA,CAGnBA,CACR,CAAA,CACA,KAAK,IAAI,CACd,CAEO,SAASC,EAAIC,CAAeC,CAAAA,CAAAA,CAAeJ,CAAgB,CAAA,CAChE,GAAI,CAACI,CAAAA,CACH,OAGFD,CAAAA,CAAQE,uBAAUF,CAAO,CAAA,CACvB,MAAQ,CAAA,CACN,QAAS,UACT,CAAA,MAAA,CAAQ,UACR,CAAA,MAAA,CAAQ,WACR,OAAS,CAAA,UAAA,CACT,KAAO,CAAA,SAAA,CACP,OAAS,CAAA,UAAA,CACT,QAAU,CAAA,UAAA,CACV,WAAY,UACZ,CAAA,OAAA,CAAS,UACX,CACF,CAAC,CAED,CAAA,IAAMG,CAAa,CAAA,CAAA,EAAGH,CAAK,CAAKJ,EAAAA,EAAAA,EAAAA,CAAaC,CAAU,EAAA,EAAE,CAAC,CAAA,CAAA,CAAA,CAC1DH,EAAe,CAAA,cAAA,CAAe,KAAKS,CAAU,EAC/C,CAEO,SAASA,GACdZ,CACAzB,CAAAA,CAAAA,CACAmC,CAAgB,CAAA,KAAA,CAChB,CACKA,CAILP,EAAAA,EAAAA,CAAe,cAAe5B,CAAAA,CAAI,CAAEyB,CAAAA,CAAO,EAC7C,CAEA,IAAOa,CAAQV,CAAAA,EAAAA,CCpIf,IAAMW,EAAAA,CAAN,KAAyB,CACvB,iBAAA,CACEC,CACA/B,CAAAA,CAAAA,CACAgC,EACU,CACV,OAAQD,CAAQ,EACd,KAAK,OACL,CAAA,KAAK,SAEH,CAAA,OADaC,EAAO,CAAC,CAAA,CACT,GAAKC,CAAAA,CAAAA,EAAaA,EAAI,CAAajC,UAAAA,EAAAA,CAAQ,CAAE,CAAA,CAAC,EAC5D,KAAK,aAAA,CACL,KAAK,UAAA,CACH,OAAOgC,CAAAA,CAAO,IAAK,CAAA,GAAA,CAAKC,GAAaA,CAAI,CAAA,UAAU,CACrD,CAAA,KAAK,QACH,OAAOD,CAAAA,CAAO,SAAU,CAAA,GAAA,CAAKC,GAAaA,CAAI,CAAA,UAAU,CAC1D,CAAA,KAAK,WACH,OAAQD,CAAAA,CAAAA,CAAO,IAAQ,EAAA,IACpB,GAAKC,CAAAA,CAAAA,EACA,KAAM,CAAA,OAAA,CAAQA,CAAG,CAAUA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAC7BA,GAAK,UACb,CAAA,CACA,MACEC,CAAAA,CAAAA,EACC,OAAOA,CAAS,EAAA,QAAA,EAAYA,CAAK,CAAA,MAAA,CAAS,CAC9C,CACJ,CAAA,QACE,MAAM,IAAI,MAAM,CAA8BH,2BAAAA,EAAAA,CAAM,CAAE,CAAA,CAC1D,CACF,CAEA,oBAAA,CAAqBA,CAA2B/B,CAAAA,CAAAA,CAA0B,CACxE,OAAQ+B,CAAAA,EACN,KAAK,QACL,KAAK,SAAA,CACH,OAAO,CAAA,iBAAA,EAAoB/B,CAAQ,CACrC,CAAA,CAAA,CAAA,KAAK,aACL,CAAA,KAAK,WACH,OAAO,CAAA;AAAA;AAAA,uBAAA,EAEUA,CAAQ,CAAA;AAAA;AAAA,gCAG3B,CAAA,CAAA,KAAK,QACH,OAAO,CAAA;AAAA;AAAA,uBAAA,EAEUA,CAAQ,CAAA;AAAA,gCAE3B,CAAA,CAAA,KAAK,UACH,CAAA,OAAO,oCACT,CAAA,QACE,MAAM,IAAI,KAAA,CAAM,CAA8B+B,2BAAAA,EAAAA,CAAM,CAAE,CAAA,CAC1D,CACF,CAEA,qBAAA,CAAsBA,CAA2BI,CAAAA,CAAAA,CAA0B,CACzE,GAAI,CAACA,CAAO,CAAA,MAAA,CACV,OAAO,WAAA,CAGT,OAAQJ,CAAAA,EACN,KAAK,OAAA,CACL,KAAK,SAAA,CACL,KAAK,aAAA,CACL,KAAK,UACH,CAAA,OAAO,CAAwBI,qBAAAA,EAAAA,CAAAA,CAAO,IAAK,CAAA,IAAI,CAAC,CAClD,SAAA,CAAA,CAAA,KAAK,OACH,CAAA,OAAOA,CACJ,CAAA,GAAA,CAAKC,GAAU,CAAyBA,sBAAAA,EAAAA,CAAK,CAAI,EAAA,CAAA,CAAA,CACjD,IAAK,CAAA;AAAA,CAAI,CAAA,CACd,KAAK,UAAA,CAGH,OACED,CAAAA,CACG,GAAKC,CAAAA,CAAAA,EAAU,CAAeA,YAAAA,EAAAA,CAAK,CAA6B,2BAAA,CAAA,CAAA,CAChE,IAAK,CAAA,CAAA;AAAA,CAAK,EAAI,GAErB,CAAA,QACE,MAAM,IAAI,MAAM,CAA8BL,2BAAAA,EAAAA,CAAM,CAAE,CAAA,CAC1D,CACF,CAEA,sBAAA,CAAuBM,EAAc,KAAe,CAAA,CAClD,OAAIA,CACK,CAAA,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAcF,CAAA,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAYT,CAEA,uBAAwBA,CAAAA,CAAAA,CAAc,MAAOD,CAAuB,CAAA,CAClE,OAAIC,CACK,CAAA,CAAA;;AAAA;AAAA;AAAA;AAAA,OAAA,EAKJD,CAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAcH,CAAA,CAAA;;AAAA;AAAA;AAAA;AAAA,OAAA,EAKFA,CAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAYZ,CAEA,sBAAuBC,CAAAA,CAAAA,CAAc,MAAOD,CAAuB,CAAA,CACjE,OAAIC,CACK,CAAA,CAAA;;AAAA;AAAA;AAAA;AAAA,OAAA,EAKJD,CAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAcH,CAAA,CAAA;;AAAA;AAAA;AAAA;AAAA,OAAA,EAKFA,CAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAYZ,CAEA,+BAAA,EAA0C,CACxC,OAAO,0BACT,CAEA,2BAAsC,EAAA,CACpC,OAAO,kRAOT,CAEA,wBAAA,EAAmC,CACjC,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAMT,CAEA,4BAAuC,EAAA,CAErC,OAAO,CAAA;AAAA;AAAA;AAAA,qCAAA,EADK,IAAI,IAAA,EAAO,CAAA,WAAA,EAIe,CAAA;AAAA,EAExC,CAAA,CAEA,2BAAsC,EAAA,CACpC,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOT,CAAA,CAEA,4BAAuC,EAAA,CACrC,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAKT,CACF,CAEOE,CAAAA,CAAAA,CAAQ,IAAIR,EAAAA,CC9OnB,eAAOS,EACLC,CAAAA,CAAAA,CACAC,CAAsB,CAAA,IAAA,CACtBC,EACA,CACA,IAAMX,EAASS,CAAI,CAAA,SAAA,GACbG,CAAaH,CAAAA,CAAAA,CAAI,QAElBT,CAAAA,CAAAA,GACHF,EAAO,KAAM,CAAA,8CAA8C,EAC3D,OAAQ,CAAA,IAAA,CAAK,CAAC,CAGXc,CAAAA,CAAAA,CAAAA,GACHd,CAAO,CAAA,KAAA,CAAM,kDAAkD,CAC/D,CAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAGhBA,EAAO,IAAK,CAAA,yCAAA,CAA4CE,CAAM,CAAA,CAE9D,IAAIa,CAA0B,CAAA,IAAA,CACxBC,CAAuBH,CAAAA,CAAAA,EAAiBX,IAAW,UAEzD,CAAA,GAAI,CACF,GAAIA,IAAW,QAAU,CAAA,CACvB,MAAMS,CAAI,CAAA,eAAA,GAEV,MAAMzD,mBAAAA,CAAG,EAAG4D,CAAAA,CAAAA,CAAsB,CAAE,SAAW,CAAA,CAAA,CAAA,CAAM,MAAO,CAAK,CAAA,CAAC,EAClEd,CAAO,CAAA,IAAA,CAAK,sCAAsC,CAAA,CAClD,MAAM9C,mBAAG,CAAA,SAAA,CAAU4D,EAAsB,EAAE,CAAA,CAC3Cd,EAAO,IAAK,CAAA,wCAAwC,CAEpD,CAAA,IAAMiB,EAAUN,CAAI,CAAA,oBAAA,EACpBA,CAAAA,CAAAA,CAAI,QAAU,MAAMhD,EAAAA,CAAcgD,CAAI,CAAA,SAAA,GAAaM,CAAO,CAAA,CAE1DjB,EAAO,IAAK,CAAA,iCAAiC,EAC7C,MACF,CAEA,IAAMkB,CAAAA,CAAYT,EAAmB,oBACnCP,CAAAA,CAAAA,CACAY,CACF,CAEMR,CAAAA,CAAAA,CAAmB,MAAMK,CAAI,CAAA,QAAA,CAASO,CAAS,CAAA,CAC/CC,EAAeV,CAAmB,CAAA,iBAAA,CACtCP,EACAY,CACAR,CAAAA,CACF,EAEA,GAAI,CAACa,CAAa,CAAA,MAAA,CAAQ,CACxBnB,CAAO,CAAA,IAAA,CAAK,mBAAmB,CAC/B,CAAA,MACF,CAEA,IAAMoB,CAAAA,CAAwBX,CAAmB,CAAA,qBAAA,CAC/CP,EACAiB,CACF,CAAA,CASA,GARIH,CACFD,GAAAA,CAAAA,CAAM,MAAMJ,CAAI,CAAA,gBAAA,EAChBA,CAAAA,CAAAA,CAAMI,EAAI,GAERb,CAAAA,CAAAA,CAAAA,CAAAA,GAAW,SAAWA,CAAW,GAAA,SAAA,GACnC,MAAMS,CAAI,CAAA,QAAA,CAAS,6BAA6B,CAAA,CAG9CT,IAAW,OAAS,CAAA,CAOtB,IAAMmB,CANW,CAAA,CAAA,MAAMV,EAAI,QAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAKxC,CAAA,CAAA,EAC8B,SAC/B,CAAA,IAAA,IAAWW,CAAMD,IAAAA,CAAAA,CACf,MAAMV,CAAI,CAAA,QAAA,CACR,CAAgBW,aAAAA,EAAAA,CAAAA,CAAG,UAAU,CAAA,mBAAA,EAAsBA,EAAG,eAAe,CAAA,EAAA,CACvE,EAEJ,CAEA,GAAIpB,CAAAA,GAAW,UAAY,CAAA,CACzB,IAAMqB,CAAAA,CAAW,MAAMZ,CAAAA,CAAI,QAAc,CAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAIxC,CAGD,CAAA,IAAA,IAAWW,CAAMC,IAAAA,CAAAA,CAAS,IAAQ,EAAA,EAChC,CAAA,MAAMZ,CAAI,CAAA,QAAA,CACR,CAAgBW,aAAAA,EAAAA,CAAAA,CAAG,UAAU,CAAA,mBAAA,EAAsBA,CAAG,CAAA,eAAe,CACvE,CAAA,CAAA,CAAA,CAIF,IAAWf,IAAAA,CAAAA,IAASY,CAClB,CAAA,MAAMR,CAAI,CAAA,QAAA,CAAS,CAAeJ,YAAAA,EAAAA,CAAK,CAA6B,2BAAA,CAAA,EAExE,MACE,MAAMI,CAAAA,CAAI,QAASS,CAAAA,CAAqB,CAGtClB,CAAAA,CAAAA,CAAAA,GAAW,OAAWA,EAAAA,CAAAA,GAAW,SACnC,GAAA,MAAMS,CAAI,CAAA,QAAA,CAAS,6BAA6B,CAAA,CAG9CK,CACF,EAAA,MAAMD,CAAK,EAAA,MAAA,EAGbf,CAAAA,CAAAA,CAAO,IAAK,CAAA,iCAAiC,EAC/C,CAAA,MAAS3E,CAAY,CAAA,CACnB,MAAI2F,CAAAA,EACF,MAAMD,CAAAA,EAAK,QAAS,EAAA,CAGtBf,EAAO,KAAM3E,CAAAA,CAAK,CACZA,CAAAA,CACR,CAAE,OAAA,CACIuF,CACF,EAAA,MAAMD,CAAI,CAAA,eAAA,GAEd,CACF,CChIA,IAAMa,EAA2B,CAAA,IAAc,CAC7C,IAAMC,CAAgBjE,CAAAA,CAAAA,CAAI,cACpBkE,CAAAA,CAAAA,CAAcC,mBAAK,CAAA,OAAA,CAAQ,OAAQ,CAAA,GAAA,GAAOF,CAAa,CAAA,CAC7D,OAAKvE,mBAAAA,CAAG,UAAWwE,CAAAA,CAAW,CAC5BxE,EAAAA,mBAAAA,CAAG,SAAUwE,CAAAA,CAAAA,CAAa,CAAE,SAAA,CAAW,IAAK,CAAC,CAGxCA,CAAAA,CACT,EAEOE,EAAQ,CAAA,CACbvB,CACAG,CAAAA,CAAAA,CAAc,KACdqB,CAAAA,CAAAA,CAAqC,OACrCtB,CAAAA,CAAAA,CAAgB,OACb,GAAA,CACH,IAAMuB,CAAAA,CAAsBN,EAAyB,EAAA,CAC/CpC,CAAY,CAAA,IAAI,MAAO,CAAA,OAAA,EACvB2C,CAAAA,CAAAA,CAAqBvB,CAEvB,CAAA,CAAA,EAAGpB,CAAS,CAAA,CAAA,EAAIiB,CAAI,CAAA,GAAA,CAAA,CADpB,CAAGjB,EAAAA,CAAS,CAAIiB,CAAAA,EAAAA,CAAI,CAElB2B,GAAAA,CAAAA,CAAAA,CAAAA,CAAoBL,mBAAK,CAAA,IAAA,CAAKG,CAAqBC,CAAAA,CAAiB,CAEtEE,CAAAA,CAAAA,CACJ,OAAQJ,CAAAA,EACN,KAAK,OACHI,CAAAA,CAAAA,CAAoBxB,CAAmB,CAAA,sBAAA,CAAuBD,CAAID,CAAAA,CAAK,EACvE,MACF,KAAK,QACH0B,CAAAA,CAAAA,CAAoBxB,CAAmB,CAAA,uBAAA,CAAwBD,CAAID,CAAAA,CAAK,CACxE,CAAA,MACF,QACE0B,CAAAA,CAAoBxB,CAAmB,CAAA,sBAAA,CAAuBD,CAAE,CAAA,CAChE,KACJ,CAEAtD,mBAAG,CAAA,aAAA,CAAc8E,CAAmBC,CAAAA,CAAiB,CACrDjC,CAAAA,CAAAA,CAAO,IAAK,CAAA,CAAA,mCAAA,EAAsCgC,CAAiB,CAAA,EAAA,CAAI,CACvE,CAAA,OAAA,CAAQ,IAAK,CAAA,CAAC,EAChB,CC7CA,CCGA,eAAsBE,EAAAA,CACpBC,CACAC,CAAAA,CAAAA,CACY,CACZ,GAAM,CAAE,aAAA,CAAAC,CAAc,CAAA,CAAI,MAAM,OAAO,gBAAgB,CAAE,CAAA,KAAA,CAAM,IAAM,CACnE,MAAM,IAAI5G,CAAoB,CAAA,gBAAgB,CAChD,CAAC,CAEK6G,CAAAA,CAAAA,CAAWX,mBAAK,CAAA,UAAA,CAAWQ,CAAK,CAAA,CAClCA,EACAR,mBAAK,CAAA,OAAA,CAAQ,OAAQ,CAAA,GAAA,EAAOQ,CAAAA,CAAK,CAE/B,CAAA,CAAE,GAAAI,CAAAA,CAAI,CAAI,CAAA,MAAMF,CAAc,CAAA,CAClC,QAAAC,CAAAA,CAAAA,CACA,OAAQ,KACR,CAAA,qBAAA,CAAuB,KACvB,CAAA,cAAA,CAAgB,CACd,SAAA,CAAW,IACX,CAAA,SAAA,CAAW,IACb,CAAA,CACA,QAAUF,CAAAA,CAAAA,EAAgB,iBAC1B,CAAA,QAAA,CAAU,CACR,SAAA,CACA,SACA,CAAA,IAAA,CACA,QACA,CAAA,SAAA,CACA,gBACA,CAAA,SAAA,CACA,eACA,CAAA,eAAA,CACA,OACA,CAAA,WACF,CACF,CAAC,CAED,CAAA,OAAOG,CACT,CDpBA,IAAMC,EAAsB,CAAA,MAAOC,CAAkBL,CAAAA,CAAAA,GAA0B,CAE7E,GADaK,CAAS,CAAA,QAAA,CAAS,KAAK,CAAA,CAElC,OAAM,MAAA,OAAO,YAAY,CAAA,CAAE,KAAM,CAAA,IAAM,CACrC,MAAM,IAAIvH,CAAAA,CACR,iUACA,CAAA,4BACF,CACF,CAAC,CAED,CAAA,MAAa,OAAA,SAAS,CAAE,CAAA,KAAA,CAAM,IAAM,CAClC,MAAM,IAAIA,CAAAA,CACR,2TACA,CAAA,4BACF,CACF,CAAC,CAED,CAAA,MAAa,OAAA,gBAAgB,CAAE,CAAA,KAAA,CAAM,IAAM,CACzC,MAAM,IAAIA,CACR,CAAA,yUAAA,CACA,4BACF,CACF,CAAC,CAAA,CAEMgH,EAAkBO,CAAAA,CAAAA,CAAUL,CAAY,CAAA,CAGjD,GAAI,CAEF,OAAO,OADSM,iBAAcD,CAAAA,CAAQ,EAAE,IAE1C,CAAA,CAAA,KAAgB,CACd,IAAME,CAAUC,CAAAA,sBAAAA,CAAc,yPAAe,CAC7C,CAAA,GAAI,CACF,IAAMC,CAASF,CAAAA,CAAAA,CAAQF,CAAQ,CAAA,CAC/B,OAAO,CACL,OAAA,CAASI,CAAO,CAAA,OAAA,EAAWA,CAC3B,CAAA,GAAGA,CACL,CACF,CAAuB,KAAA,CACrB,MAAM,IAAI3H,CACR,CAAA,CAAA,qEAAA,EAAwEuH,CAAQ,CAAA,uCAAA,CAAA,CAChF,4BACF,CACF,CACF,CACF,CAAA,CAEA,eAAsBK,EAAAA,CACpB5C,CACA6C,CAAAA,CAAAA,CAC+B,CAC/B,OAAQ7C,CAAQ,EACd,KAAK,SAAA,CACL,KAAK,OAAA,CACH,IAAM8C,CAAAA,CAAkBD,CACxB,CAAA,OAAA,MAAMC,CAAgB,CAAA,KAAA,CACpBvC,CAAmB,CAAA,2BAAA,EACrB,CAAA,CAAA,CACe,MAAMuC,CAAAA,CAAgB,KACnCvC,CAAAA,CAAAA,CAAmB,+BAAgC,EACrD,GACc,CAAC,CAAA,CAEjB,KAAK,UAAA,CACL,KAAK,aAAA,CACH,IAAMwC,CAAAA,CAAeF,CACrB,CAAA,OAAA,MAAME,CAAa,CAAA,KAAA,CAAMxC,CAAmB,CAAA,wBAAA,EAA0B,CAAA,CAAA,CACrD,MAAMwC,CAAa,CAAA,KAAA,CAClCxC,CAAmB,CAAA,+BAAA,EACrB,CAAA,EACgB,IAElB,CAAA,KAAK,QACH,CAAA,OAAA,MAAMyC,EACJzC,CAAAA,CAAAA,CAAmB,4BAA6B,EAAA,CAChD,EAAC,CACDsC,CACF,CAGG,CAAA,MAAMG,EACLzC,CAAAA,CAAAA,CAAmB,+BAAgC,EAAA,CACnD,EAAC,CACDsC,CACF,CAAA,EAAM,EAAC,CAGX,KAAK,OAAA,CACH,IAAMI,CAAAA,CAAkBJ,CACxB,CAAA,OAAA,MAAMI,CACH,CAAA,OAAA,EACA,CAAA,KAAA,CAAM1C,CAAmB,CAAA,2BAAA,EAA6B,CAAA,CAAA,CACrC,MAAM0C,CAAAA,CACvB,OAAQ,EAAA,CACR,KAAM1C,CAAAA,CAAAA,CAAmB,iCAAiC,CAAA,EAC1C,SAErB,CAAA,KAAK,UAEH,CAAA,IAAM2C,CAAmB,CAAA,MADNL,CACuB,CAAA,aAAA,EAC1C,CAAA,GAAI,CACF,GAAI,CACF,MAAMK,EAAiB,OACrB3C,CAAAA,CAAAA,CAAmB,4BAA6B,EAClD,EACF,CAAA,MAASrC,CAAU,CAAA,CACjB,GAAIA,CAAAA,CAAI,QAAa,GAAA,GAAA,CACnB,MAAMA,CAEV,CAMA,OAAA,CAAA,CAJqB,MAAMgF,CAAiB,CAAA,OAAA,CAC1C,4BACF,CAAA,EAEqB,IAAQ,EAAA,EAAI,EAAA,GAAA,CAAKhD,CAAc,GAAA,CAClD,EAAIA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CACT,IAAMA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CACX,SAAWA,CAAAA,CAAAA,CAAI,CAAC,CAClB,CAAE,CAAA,CACJ,CAAE,OAAA,CACA,MAAMgD,CAAAA,CAAiB,KAAM,GAC/B,CAEF,QACE,MAAM,IAAIlI,CAAAA,CACR,6DACA,CAAA,mBACF,CACJ,CACF,CAEA,eAAsBmI,EACpBnD,CAAAA,CAAAA,CACAuB,CACAW,CAAAA,CAAAA,CACsB,CACtB,IAAMkB,CAAiBC,CAAAA,EAAAA,CAAmB9B,CAAa,CAAA,CACjD+B,CAA0B,CAAA,EAEhC,CAAA,IAAA,IAAWC,CAAiBH,IAAAA,CAAAA,CAAgB,CAC1C,IAAMI,CAAkB,CAAA,MAAMC,EAC5BF,CAAAA,CAAAA,CACAhC,CACAW,CAAAA,CACF,EAEMwB,CAAuB,CAAA,IAAIF,CAAgBxD,CAAAA,CAAAA,EAAU1C,CAAI,CAAA,OAAO,CACtEoG,CAAAA,CAAAA,CAAU,aAAgBH,CAAAA,CAAAA,CAC1BD,CAAW,CAAA,IAAA,CAAKI,CAAS,EAC3B,CAEA,OAAOJ,CACT,CAgBA,eAAeK,EAAAA,CACbC,CACA1B,CAAAA,CAAAA,CACuD,CACvD,IAAMsB,CAAkB,CAAA,MAAMlB,EAAoBsB,CAAAA,CAAAA,CAAY1B,CAAY,CAAA,CAC1E,GAAI,CAACsB,EAAgB,OACnB,CAAA,MAAM,IAAIxI,CAAAA,CACR,qFACA,CAAA,4BACF,CAGF,CAAA,OAAOwI,CAAgB,CAAA,OACzB,CAEA,eAAeC,EACbF,CAAAA,CAAAA,CACAM,CAA8BvG,CAAAA,CAAAA,CAAI,gBAAkB,qBACpD4E,CAAAA,CAAAA,CACuD,CACvD2B,CAAAA,CAAsBC,OAAKD,CAAAA,CAAAA,CAAqBN,CAAa,CAAA,CAC7D,IAAMhC,CAAAA,CAAgBE,mBAAK,CAAA,OAAA,CAAQ,OAAQ,CAAA,GAAA,EAAOoC,CAAAA,CAAmB,EAC/DL,CAAkB,CAAA,MAAMG,EAC5BpC,CAAAA,CAAAA,CACAW,CACF,CAAA,CAEA,GAAI,CAACsB,CACH,CAAA,MAAM,IAAIxI,CAAAA,CACR,iFACEuI,CAAAA,CAAAA,CACF,4BACF,CAAA,CAGF,OAAOC,CACT,CAEA,SAASH,EAAmBU,CAAAA,CAAAA,CAAuC,CACjE,IAAMC,CAAuB,CAAA,OAAA,CAAQ,GAAI,EAAA,CACnCzC,CAAgBE,CAAAA,mBAAAA,CAAK,OACzBsC,CAAAA,CAAAA,EAAsBzG,EAAI,cAAkB,EAAA,qBAC9C,CAEM2G,CAAAA,CAAAA,CAA0BxC,mBAAK,CAAA,OAAA,CACnCuC,CACAzC,CAAAA,CACF,CAEA,CAAA,GAAI,CACF,IAAM2C,CAAiBlH,CAAAA,mBAAAA,CACpB,WAAYiH,CAAAA,CAAuB,EACnC,MAAQE,CAAAA,CAAAA,EAAS,CAChB,IAAMC,CAAM3C,CAAAA,mBAAAA,CAAK,OAAQ0C,CAAAA,CAAI,CACvBE,CAAAA,CAAAA,CAAe5C,mBAAK,CAAA,IAAA,CAAKwC,CAAyBE,CAAAA,CAAI,CAE5D,CAAA,OADenH,oBAAG,QAASqH,CAAAA,CAAY,CAAE,CAAA,MAAA,EACvBD,GAAAA,CAAAA,GAAQ,KAASA,EAAAA,CAAAA,GAAQ,KAC7C,CAAA,CAAC,CAEH,CAAA,GAAIF,CAAe,CAAA,MAAA,CACjB,OAAOA,CAAAA,CAGT,MAAM,IAAIlJ,CACR,CAAA,gFAAA,CACEiJ,CACF,CAAA,4BACF,CACF,CAAA,KAAgB,CACd,MAAM,IAAIjJ,CAAAA,CACR,gFACEiJ,CAAAA,CAAAA,CACF,4BACF,CACF,CACF,CAEA,eAAsBjB,EACpBtD,CAAAA,CAAAA,CACAH,CACA+E,CAAAA,CAAAA,CACc,CACd,OAAO,IAAI,OAAA,CAAa,CAACC,CAAAA,CAASC,CAAW,GAAA,CAC3CF,CAAiB,CAAA,GAAA,CAAO5E,EAAOH,CAAQ,CAAA,CAACrB,CAAKuG,CAAAA,CAAAA,GAAY,CACnDvG,CAAAA,EACFsG,CAAOtG,CAAAA,CAAG,CAEZqG,CAAAA,CAAAA,CAAQE,CAAO,EACjB,CAAC,EACH,CAAC,CACH,CE9QA,eAAOC,EAAAA,CACLjE,CACAkE,CAAAA,CAAAA,CACApD,CACAW,CAAAA,CAAAA,CACAvB,CACA,CAAA,CACA,IAAMX,CAAAA,CAASS,CAAI,CAAA,SAAA,EACbK,CAAAA,CAAAA,CACJH,CAAiBX,EAAAA,CAAAA,GAAW,OAAWA,EAAAA,CAAAA,GAAW,UAChDa,CAAAA,CAAAA,CAA0B,IAC9Bf,CAAAA,CAAAA,CAAO,IAAK,CAAA,wCAAA,CAA2CE,CAAM,CAAA,CAE7D,GAAI,CACF,IAAM4E,CAAAA,CAAuC,MAAMhC,EAAAA,CACjD5C,EACAS,CAAI,CAAA,OAAA,EACN,CAAA,CAOMoE,CAN0B,CAAA,CAAA,MAAM1B,EACpCnD,CAAAA,CAAAA,CACAuB,CACAW,CAAAA,CACF,CAEqC,EAAA,MAAA,CAClCwB,CACC,EAAA,CAACkB,CACE,CAAA,GAAA,CAAKvE,CAAUA,EAAAA,CAAAA,CAAM,IAAI,CAAA,CACzB,QAASqD,CAAAA,CAAAA,CAAU,aAAa,CACvC,CAEA,CAAA,GAAI,CAACmB,CAAAA,CAAkB,MAAQ,CAAA,CAC7B/E,CAAO,CAAA,IAAA,CAAK,wBAAwB,CACpC,CAAA,MACF,CAEA,GAAI6E,CAAU,CAAA,CACZ,IAAMG,CAAAA,CAAgBD,CAAkB,CAAA,SAAA,CACrCnB,CAAcA,EAAAA,CAAAA,CAAU,aAAkBiB,GAAAA,CAC7C,CAEA,CAAA,GAAIG,CAAkB,GAAA,CAAA,CAAA,CAAI,CACxB,OAAA,CAAQ,KAAM,CAAA,CAAA,UAAA,EAAaH,CAAQ,CAAA,WAAA,CAAa,CAChD,CAAA,MACF,CAEA,IAAMI,CAAqBF,CAAAA,CAAAA,CAAkB,KAAM,CAAA,CAAA,CAAGC,EAAgB,CAAC,CAAA,CAEnEhE,CACFD,GAAAA,CAAAA,CAAM,MAAMJ,CAAAA,CAAI,gBAAiB,EAAA,CACjCA,CAAMI,CAAAA,CAAAA,CAAI,GAIZ,CAAA,CAAA,MADiB,IAAImE,EAAAA,CAASvE,CAAG,CAAA,CAClB,aAAasE,CAAkB,CAAA,CAE1CjE,CACF,EAAA,MAAMD,CAAK,EAAA,MAAA,EAGbf,CAAAA,CAAAA,CAAO,IAAK,CAAA,6BAA6B,CACzC,CAAA,MACF,CAEA,IAAMmF,CAAW,CAAA,IAAID,GAASvE,CAAG,CAAA,CAC7BK,CACFD,GAAAA,CAAAA,CAAM,MAAMJ,CAAAA,CAAI,gBAAiB,EAAA,CACjCA,CAAMI,CAAAA,CAAAA,CAAI,GAGZ,CAAA,CAAA,MAAMoE,CAAS,CAAA,YAAA,CAAaJ,CAAiB,CAAA,CAEzC/D,CACF,EAAA,MAAMD,CAAK,EAAA,MAAA,GAEf,CAAA,MAAS1F,CAAY,CAAA,CACnB,MAAI2F,CAAAA,EACF,MAAMD,CAAAA,EAAK,QAAS,EAAA,CAGhB1F,CACR,CAEA2E,EAAO,IAAK,CAAA,6BAA6B,EAC3C,CCiSO,IAAMoF,EAAAA,CAAuD,CAClE,MAAA,CAAQ,QACR,CAAA,OAAA,CAAS,QACT,CAAA,IAAA,CAAM,QACN,CAAA,IAAA,CAAM,UACN,CAAA,QAAA,CAAU,WACV,UAAY,CAAA,UAAA,CACZ,QAAU,CAAA,UAAA,CACV,OAAS,CAAA,QAAA,CACT,GAAK,CAAA,QAAA,CACL,QAAU,CAAA,QAAA,CACV,MAAQ,CAAA,QAAA,CACR,OAAS,CAAA,QAAA,CACT,SAAW,CAAA,QAAA,CACX,MAAO,OACP,CAAA,MAAA,CAAQ,OACR,CAAA,OAAA,CAAS,OACT,CAAA,OAAA,CAAS,OACT,CAAA,IAAA,CAAM,OACN,CAAA,OAAA,CAAS,SACT,CAAA,IAAA,CAAM,SACN,CAAA,IAAA,CAAM,MACN,CAAA,QAAA,CAAU,UACV,CAAA,SAAA,CAAW,UACX,CAAA,IAAA,CAAM,QACN,CAAA,IAAA,CAAM,QACN,CAAA,IAAA,CAAM,OACN,CAAA,KAAA,CAAO,OACP,CAAA,IAAA,CAAM,QACN,CAAA,IAAA,CAAM,QACN,CAAA,MAAA,CAAQ,SACR,IAAM,CAAA,QAAA,CACN,IAAM,CAAA,QACR,CCvYA,CAAA,IAAIC,EAA4C,CAAA,IAAA,CAEhD,SAASC,EAAAA,CACP1F,CACA2F,CAAAA,CAAAA,CACAC,CACM,CAAA,CACN,GAAI,CAACD,GAAU,OAAOA,CAAAA,EAAW,QAAU,CAAA,OAE3C,IAAME,CAAAA,CAAYF,CAClB,CAAA,GAAI,CAACE,CAAAA,CAAU,OAAS,CAAA,OAExB,IAAMC,CAAAA,CAAUF,CAAM,CAAA,UAAA,GAEtB,IAAW,GAAA,CAACpI,CAAKuI,CAAAA,CAAW,CAAK,GAAA,MAAA,CAAO,OAAQF,CAAAA,CAAAA,CAAU,OAAO,CAAA,CAAG,CAClE,IAAMpI,CAAQsI,CAAAA,CAAAA,CAAY,KAC1B,CAAA,GAA2BtI,CAAU,EAAA,IAAA,EAAQA,CAAU,GAAA,EAAA,CAAI,SAE3D,IAAMuI,CAASF,CAAAA,CAAAA,CAAQ,IACpBG,CAAAA,CAAAA,EAAMA,CAAE,CAAA,UAAA,GAAezI,CAAOyI,EAAAA,CAAAA,CAAE,YAAiBzI,GAAAA,CACpD,EACA,GAAI,CAACwI,CAAQ,CAAA,SAEb,IAAME,CAAAA,CAAa,OAAOF,CAAAA,CAAO,IAAS,EAAA,QAAA,CAAWA,CAAO,CAAA,IAAA,CAAO,QAC7DG,CAAAA,CAAAA,CAAeX,EAA6BU,CAAAA,CAAU,CAAK,EAAA,QAAA,CAEjE,GAAIC,CAAAA,GAAiB,QAAYA,EAAAA,CAAAA,GAAiB,UAAY,CAAA,CAC5DnG,CAAM,CAAA,SAAA,CAAUxC,CAAK,CAAA,CAAA,CAAA,EAAIC,CAAK,CAAA,CAAA,CAAG,CACjC,CAAA,QACF,CAEA,GAAI0I,CAAAA,GAAiB,SAAW,CAAA,CAC9BnG,CAAM,CAAA,KAAA,CAAMxC,CAAKC,CAAAA,CAAAA,GAAU,MAAUA,EAAAA,CAAAA,GAAU,IAAI,CAAA,CACnD,QACF,CAEA,GAAI0I,CAAAA,GAAiB,MAAUA,EAAAA,CAAAA,GAAiB,UAAY,CAAA,CAC1D,GAAI,OAAO1I,CAAU,EAAA,QAAA,EAAYA,CAAU,GAAA,IAAA,CAAM,CAC/C,IAAM2I,CAAa3I,CAAAA,CAAAA,CACf2I,CAAW,CAAA,IAAA,EACbpG,EAAM,KAAMxC,CAAAA,CAAAA,CAAK,IAAM4I,CAAAA,CAAAA,CAAW,IAAI,CAAA,CAEpCA,CAAW,CAAA,EAAA,EACbpG,CAAM,CAAA,KAAA,CAAMxC,CAAK,CAAA,IAAA,CAAM4I,CAAW,CAAA,EAAE,CAEtC,CAAA,QACF,CACApG,CAAM,CAAA,KAAA,CAAMxC,CAAKC,CAAAA,CAAe,CAChC,CAAA,QACF,CAEAuC,CAAAA,CAAM,KAAMxC,CAAAA,CAAAA,CAAKC,CAAkC,EACrD,CACF,CAEA,SAAS4I,EAAAA,CACPC,EACAV,CACyB,CAAA,CACzB,IAAM/F,CAAAA,CAAkC,EAAC,CACnCiG,CAAUF,CAAAA,CAAAA,CAAM,UAAW,EAAA,CAEjC,IAAWI,IAAAA,CAAAA,IAAUF,CAAS,CAAA,CAC5B,IAAMrI,CAAAA,CAAQ6I,CAAON,CAAAA,CAAAA,CAAO,UAAiC,CAAA,CAC7DnG,CAAOmG,CAAAA,CAAAA,CAAO,UAAU,CAAA,CAAIvI,EAC9B,CAEA,OAAOoC,CACT,CAKA,eAAe0G,EAA8B,EAAA,CAC3C,IAAMC,CAAU,CAAA,MAAa,OAAA,SAAS,CAAE,CAAA,KAAA,CAAM,IAAM,CAClD,MAAM,IAAI3K,CAAoB,CAAA,SAAS,CACzC,CAAC,CAEK,CAAA,CACJ,YAAc4K,CAAAA,CAAAA,CACd,UAAYC,CAAAA,CAAAA,CACZ,YAAcC,CAAAA,CAChB,CAAIH,CAAAA,CAAAA,CAEJ,OAAO,cAA+BC,CAAkB,CAItD,WAAYb,CAAAA,CAAAA,CAAiB,CAC3B,KAAA,CAAMA,CAAK,CACX,CAAA,IAAA,CAAK,MAASA,CAAAA,CAAAA,CACd,IAAK,CAAA,GAAA,CAAMH,GACb,CAEA,OAAO,YAAA,CAAamB,CAA+B,CAAA,CACjD,GAAI,OAAOA,CAAgB,EAAA,UAAA,CAAY,OAAO,MAAA,CAC9C,IAAMC,CAAAA,CAAWD,CACjB,CAAA,OACEC,CAAS,CAAA,SAAA,GAAc,MACvB,EAAA,OAAOA,CAAS,CAAA,KAAA,EAAU,QAC1B,EAAA,OAAOA,CAAS,CAAA,UAAA,EAAe,UAEnC,CAEA,YAAA,EAAuB,CACrB,OAAO,IAAK,CAAA,GAAA,CAAI,QAAY,EAAA,UAC9B,CAEA,YAAA,EAAuB,CACrB,OAAO,IAAK,CAAA,GAAA,CAAI,SAAU,EAC5B,CAEA,EAAa,EAAA,CACX,OAAO,IAAA,CAAK,MAAO,CAAA,KACrB,CAEA,UAAA,EAA6B,CAE3B,OADgB,IAAK,CAAA,MAAA,CAAO,UAAW,EAAA,CACxB,GAAKb,CAAAA,CAAAA,EAAW,CAC7B,IAAME,CAAAA,CACJ,OAAOF,CAAAA,CAAO,IAAS,EAAA,QAAA,CAAWA,CAAO,CAAA,IAAA,CAAO,QAC5Cc,CAAAA,CAAAA,CACJtB,EAA6BU,CAAAA,CAAU,CAAK,EAAA,QAAA,CAE9C,OAAO,IAAIS,CAAkB,CAAA,CAC3B,IAAMX,CAAAA,CAAAA,CAAO,UACb,CAAA,IAAA,CAAMc,CACN,CAAA,IAAA,CAAMd,CAAO,CAAA,SAAA,CACb,UAAY,CAAA,IACd,CAAC,CACH,CAAC,CACH,CAEA,QAASjE,CAAAA,CAAAA,CAAmC,CAE1C,IAAMiE,CADU,CAAA,IAAA,CAAK,MAAO,CAAA,UAAA,EACL,CAAA,IAAA,CACpBC,CAAMA,EAAAA,CAAAA,CAAE,UAAelE,GAAAA,CAAAA,EAAQkE,CAAE,CAAA,YAAA,GAAiBlE,CACrD,CAAA,CAEA,GAAI,CAACiE,CAAQ,CAAA,OAAO,IAEpB,CAAA,IAAME,CACJ,CAAA,OAAOF,CAAO,CAAA,IAAA,EAAS,QAAWA,CAAAA,CAAAA,CAAO,IAAO,CAAA,QAAA,CAC5Cc,EAActB,EAA6BU,CAAAA,CAAU,CAAK,EAAA,QAAA,CAEhE,OAAO,IAAIS,CAAkB,CAAA,CAC3B,IAAMX,CAAAA,CAAAA,CAAO,UACb,CAAA,IAAA,CAAMc,CACN,CAAA,IAAA,CAAMd,CAAO,CAAA,SAAA,CACb,UAAY,CAAA,IACd,CAAC,CACH,CAEA,MAAM,KAAML,CAAAA,CAAAA,CAAiC,CAC3C,IAAM3F,CAAQ,CAAA,IAAA,CAAK,MAAO,CAAA,KAAA,CAAM,CAAE,UAAA,CAAY,KAAK,GAAI,CAAC,CACxD,CAAA,OAAA0F,EAAY1F,CAAAA,CAAAA,CAAO2F,CAAQ,CAAA,IAAA,CAAK,MAAM,CAAA,CAC/B3F,CAAM,CAAA,QAAA,EACf,CAEA,MAAM,IAAA,CACJ2F,EACAhH,CAII,CAAA,EACmB,CAAA,CACvB,IAAMqB,CAAAA,CAAQ,IAAK,CAAA,MAAA,CAAO,KAAM,CAAA,CAAE,UAAY,CAAA,IAAA,CAAK,GAAI,CAAC,CACxD,CAAA,OAAA0F,GAAY1F,CAAO2F,CAAAA,CAAAA,CAAQ,IAAK,CAAA,MAAM,CAElChH,CAAAA,CAAAA,CAAQ,KACVqB,EAAAA,CAAAA,CAAM,KAAMrB,CAAAA,CAAAA,CAAQ,KAAK,CAAA,CAEvBA,CAAQ,CAAA,MAAA,EACVqB,CAAM,CAAA,MAAA,CAAOrB,CAAQ,CAAA,MAAM,CAEzBA,CAAAA,CAAAA,CAAQ,IAAM,EAAA,MAAA,EAChBqB,CAAM,CAAA,OAAA,CAAQrB,CAAQ,CAAA,IAAA,CAAK,MAAQA,CAAAA,CAAAA,CAAQ,IAAK,CAAA,SAAA,EAAa,KAAK,CAAA,CAAA,CAGpD,MAAMqB,CAAM,CAAA,IAAA,EACb,EAAA,GAAA,CACZsG,CACC,EAAA,IAAII,CACFL,CAAAA,EAAAA,CAAeC,CAAiB,CAAA,IAAA,CAAK,MAAM,CAAA,CAC3C,IACF,CACJ,CACF,CAEA,MAAM,OAAQS,CAAAA,CAAAA,CAAiD,CAE7D,GAAI,CADe,IAAA,CAAK,MAAO,CAAA,UAAA,CACd,OAAO,IAAA,CAExB,IAAMT,CAAAA,CAAS,MAAM,IAAA,CAAK,MAAO,CAAA,mBAAA,CAAoBS,EAAc,CACjE,UAAA,CAAY,IAAK,CAAA,GACnB,CAAC,CAAA,CAED,OAAKT,CAAAA,CAEE,IAAII,CAAAA,CACTL,EAAeC,CAAAA,CAAAA,CAAiB,IAAK,CAAA,MAAM,CAC3C,CAAA,IACF,CALoB,CAAA,IAMtB,CAEA,MAAM,QAASU,CAAAA,CAAAA,CAAiD,CAC9D,IAAMC,CAAa,CAAA,IAAA,CAAK,MAAO,CAAA,UAAA,CAC/B,OAAKA,CAAAA,CAAAA,CAEW,MAAM,IAAA,CAAK,OACxB,KAAM,CAAA,CAAE,UAAY,CAAA,IAAA,CAAK,GAAI,CAAC,CAC9B,CAAA,OAAA,CAAQA,CAAYD,CAAAA,CAAG,CACvB,CAAA,IAAA,EAEY,EAAA,GAAA,CACZV,CACC,EAAA,IAAII,EACFL,EAAeC,CAAAA,CAAAA,CAAiB,IAAK,CAAA,MAAM,CAC3C,CAAA,IACF,CACJ,CAAA,CAbwB,EAc1B,CAEA,MAAM,MAAOzG,CAAAA,CAAAA,CAAsD,CACjE,IAAMyG,EAAS,MAAM,IAAA,CAAK,MAAO,CAAA,MAAA,CAAOzG,CAAQ,CAAA,CAC9C,UAAY,CAAA,IAAA,CAAK,GACnB,CAAC,CACD,CAAA,OAAOwG,EAAeC,CAAAA,CAAAA,CAAiB,IAAK,CAAA,MAAM,CACpD,CAEA,MAAM,MAAA,CACJS,CACAlH,CAAAA,CAAAA,CACqB,CAErB,GAAI,CADe,IAAA,CAAK,MAAO,CAAA,UAAA,CAE7B,MAAM,IAAI,KAAM,CAAA,0BAA0B,EAG5C,IAAMqH,CAAAA,CAAiB,MAAM,IAAA,CAAK,MAAO,CAAA,mBAAA,CACvCH,CACA,CAAA,CACE,UAAY,CAAA,IAAA,CAAK,GACnB,CACF,CAEA,CAAA,GAAI,CAACG,CAAAA,CACH,MAAM,IAAI,KAAM,CAAA,kBAAkB,CAGpC,CAAA,IAAMC,CAAgB,CAAA,MAAM,IAAK,CAAA,MAAA,CAAO,YACtCD,CAAAA,CAAAA,CACArH,CACA,CAAA,CAAE,UAAY,CAAA,IAAA,CAAK,GAAI,CACzB,CAAA,CAEA,OAAOwG,EAAAA,CAAec,CAAwB,CAAA,IAAA,CAAK,MAAM,CAC3D,CAEA,MAAM,MAAOJ,CAAAA,CAAAA,CAAoC,CAE/C,GAAI,CADe,IAAA,CAAK,MAAO,CAAA,UAAA,CAE7B,MAAM,IAAI,KAAM,CAAA,0BAA0B,CAG5C,CAAA,IAAMT,CAAS,CAAA,MAAM,IAAK,CAAA,MAAA,CAAO,mBAAoBS,CAAAA,CAAAA,CAAc,CACjE,UAAA,CAAY,KAAK,GACnB,CAAC,CAEGT,CAAAA,CAAAA,EACF,MAAM,IAAA,CAAK,MAAO,CAAA,YAAA,CAAaA,CAAQ,CAAA,CACrC,UAAY,CAAA,IAAA,CAAK,GACnB,CAAC,EAEL,CACF,CACF,CAKA,eAAec,EAA8B,EAAA,CAC3C,IAAMZ,CAAAA,CAAU,MAAM,OAAO,SAAS,CAAA,CAAE,KAAM,CAAA,IAAM,CAClD,MAAM,IAAI3K,CAAAA,CAAoB,SAAS,CACzC,CAAC,CAEK,CAAA,CAAE,YAAcwL,CAAAA,CAAkB,CAAIb,CAAAA,CAAAA,CAE5C,OAAO,cAA+Ba,CAAkB,CACtD,OAAO,YAAA,CAAaC,CAA6B,CAAA,CAE/C,OAAO,MACT,CAEA,SAAA,EAA4B,CAC1B,OAAO,EACT,CACF,CACF,CAKA,eAAsBC,EAAyC,EAAA,CAC7D,IAAMC,CAAAA,CAAU,MAAa,OAAA,SAAS,CAAE,CAAA,KAAA,CAAM,IAAM,CAClD,MAAM,IAAI3L,CAAoB,CAAA,SAAS,CACzC,CAAC,CAEK4L,CAAAA,CAAAA,CAAmB,MAAMlB,EAAAA,GACzBmB,CAAmB,CAAA,MAAMN,EAA4B,EAAA,CAE3DI,CAAQ,CAAA,OAAA,CAAQ,eAAgB,CAAA,CAC9B,QAAUE,CAAAA,CAAAA,CACV,QAAUD,CAAAA,CACZ,CAAC,EACH,CAKA,eAAsBE,GACpBC,CACAjJ,CAAAA,CAAAA,CAC0B,CAE1B8G,EAAAA,CAAsBmC,CAEtB,CAAA,IAAMJ,CAAU,CAAA,MAAa,OAAA,SAAS,CAAE,CAAA,KAAA,CAAM,IAAM,CAClD,MAAM,IAAI3L,CAAoB,CAAA,SAAS,CACzC,CAAC,CAGD,CAAA,MAAM0L,EAAwB,EAAA,CAE9B,IAAMM,CAAAA,CACJlJ,CAAQ,CAAA,SAAA,EAAc,MAAO,CAAA,MAAA,CAAOiJ,CAAc,CAAA,MAAM,EAE1D,GAAI,CAACC,CAAO,CAAA,MAAA,CACV,MAAM,IAAI,KACR,CAAA,kHACF,CAIF,CAAA,IAAMC,CAAYD,CAAAA,CAAAA,CAAO,GAAKjC,CAAAA,CAAAA,EAAU,CACtC,IAAMmC,EAAepJ,CAAQ,CAAA,eAAA,GAAkBiH,CAAM,CAAA,KAAK,CAAK,EAAA,EAC/D,CAAA,OAAO,CACL,QAAA,CAAUA,CACV,CAAA,OAAA,CAASmC,CACX,CACF,CAAC,CAAA,CAEKC,EAAwC,CAC5C,QAAA,CAAUrJ,CAAQ,CAAA,QAAA,EAAY,QAC9B,CAAA,SAAA,CAAAmJ,CACF,CAAA,CAcA,GAZInJ,CAAAA,CAAQ,QACVqJ,GAAAA,CAAAA,CAAa,QAAWrJ,CAAAA,CAAAA,CAAQ,QAE9BA,CAAAA,CAAAA,CAAAA,CAAQ,MAAQ,EAAA,QAAA,GAClBqJ,CAAa,CAAA,MAAA,CAASrJ,CAAQ,CAAA,MAAA,CAAA,CAE5BA,CAAQ,CAAA,MAAA,GACVqJ,CAAa,CAAA,MAAA,CAASrJ,CAAQ,CAAA,MAAA,CAAA,CAE5BA,CAAQ,CAAA,QAAA,GACVqJ,CAAa,CAAA,QAAA,CAAWrJ,EAAQ,QAE9BA,CAAAA,CAAAA,CAAAA,CAAQ,KAAO,CAAA,CACjB,IAAMsJ,CAAAA,CAAsC,EAAC,CAC7C,IAAW,GAAA,CAACzK,CAAK0K,CAAAA,CAAI,CAAK,GAAA,MAAA,CAAO,OAAQvJ,CAAAA,CAAAA,CAAQ,KAAK,CAAA,CAChDuJ,CAAK,CAAA,SAAA,GACPD,CAAWzK,CAAAA,CAAG,CAAI0K,CAAAA,CAAAA,CAAAA,CAGlB,MAAO,CAAA,IAAA,CAAKD,CAAU,CAAA,CAAE,MAAS,CAAA,CAAA,GACnCD,CAAa,CAAA,KAAA,CAAQC,GAEzB,CAIA,OAAO,CAAE,KAAA,CAFK,IAAIT,CAAAA,CAAQ,OAAQQ,CAAAA,CAAY,CAE/B,CACjB,CAMA,eAAsBG,EACpBP,CAAAA,CAAAA,CACAjJ,CACoC,CAAA,CACpC,GAAM,CAAE,KAAAyJ,CAAAA,CAAM,CAAI,CAAA,MAAMT,EAAkBC,CAAAA,CAAAA,CAAejJ,CAAO,CAAA,CAG5D0J,CACJ,CAAA,GAAI,CAEFA,CAAAA,CAAiB,MAAM,OAAO,kBAAkB,EAClD,CAAA,KAAQ,CACN,MAAM,IAAIxM,CAAAA,CAAoB,kBAAkB,CAClD,CAEA,IAAMyM,CAASD,CAAAA,CAAAA,CAAe,WAAYD,CAAAA,CAAK,CAE/C,CAAA,OAAO,CAAE,KAAAA,CAAAA,CAAAA,CAAO,MAAAE,CAAAA,CAAO,CACzB,CC/aA,IAAMC,EAAAA,CAAgB,IAAI,GAAA,CAEbC,EAAN,CAAA,KAA8C,CACnD,MAAM,GAAchL,CAAAA,CAAAA,CAAyB,CAC3C,OAAO+K,EAAAA,CAAc,GAAI/K,CAAAA,CAAG,CAC9B,CAEA,MAAM,GAAA,CAAaA,CAAaiL,CAAAA,CAAAA,CAASC,CAA6B,CAAA,CACpEH,EAAc,CAAA,GAAA,CAAI/K,CAAKiL,CAAAA,CAAI,CACvBC,CAAAA,CAAAA,EACF,UAAW,CAAA,IAAM,CACfH,EAAAA,CAAc,MAAO/K,CAAAA,CAAG,EAC1B,CAAA,CAAGkL,CAAG,EAEV,CAEA,MAAM,UAAWlL,CAAAA,CAAAA,CAA4B,CAC3C+K,EAAc,CAAA,MAAA,CAAO/K,CAAG,EAC1B,CAEA,MAAM,aAAcA,CAAAA,CAAAA,CAA4B,CAC9C,IAAMmL,CAAOJ,CAAAA,EAAAA,CAAc,IAAK,EAAA,CAChC,IAAWK,IAAAA,CAAAA,IAAYD,EACjBC,CAAS,CAAA,UAAA,CAAWpL,CAAG,CAAA,EACzB+K,EAAc,CAAA,MAAA,CAAOK,CAAQ,EAGnC,CACF,CAAA,CClBO,IAAeC,EAAAA,CAAf,KAA0B,CAUrB,WAAY7K,CAAAA,CAAAA,CAAyB,CAE7C,OADA,IAAA,CAAK,IAAOA,CAAAA,CAAAA,EAAO,IAASJ,EAAAA,CAAAA,CAAI,OACxB,CAAA,IAAA,CAAK,IAAM,EACjB,KAAK,OAAA,CACH,IAAK,CAAA,iBAAA,CAAkBI,CAA6B,CAAA,CACpD,MACF,KAAK,aACH,CAAA,IAAA,CAAK,uBAAwBA,CAAAA,CAAmC,CAChE,CAAA,MACF,KAAK,UAAA,CACH,IAAK,CAAA,oBAAA,CAAqBA,CAAmC,CAAA,CAC7D,MACF,KAAK,UACL,KAAK,OAAA,CACH,IAAK,CAAA,iBAAA,CAAkBA,CAAgC,CAAA,CACvD,MACF,KAAK,QACH,CAAA,IAAA,CAAK,kBAAmBA,CAAAA,CAA8B,CACtD,CAAA,MACF,KAAK,OAAA,CACH,KAAK,iBAAkBA,CAAAA,CAA6B,CACpD,CAAA,MACF,KAAK,UAAA,CACH,IAAK,CAAA,oBAAA,CAAqBA,CAA6B,CAAA,CACvD,MACF,QACE,MAAM,IAAI1C,CACR,CAAA,CAAA,uBAAA,EAA0B,KAAK,IAAI,CAAA;AAAA,gFAAA,CAAA,CAEnC,CAA6B,0BAAA,EAAA,IAAA,CAAK,IAAI,CAAA,CACxC,CACJ,CACF,CAEU,uBAAA,CAAwB0C,CAAoC,CAAA,CACpE,IAAK,CAAA,IAAA,CAAQA,GAAO,IAAQJ,EAAAA,CAAAA,CAAI,OAChC,CAAA,IAAA,CAAK,IAAO,CAAA,CAAEI,CAAO,EAAA,IAAA,EAAmB,CAAEJ,CAAAA,CAAI,OAC9C,CAAA,IAAA,CAAK,QAAYI,CAAAA,CAAAA,EAAO,QAAYJ,EAAAA,CAAAA,CAAI,QACxC,IAAK,CAAA,QAAA,CAAYI,CAAO,EAAA,QAAA,EAAYJ,CAAI,CAAA,WAAA,CACxC,IAAK,CAAA,QAAA,CAAYI,CAAO,EAAA,QAAA,EAAYJ,CAAI,CAAA,WAAA,CACxC,IAAK,CAAA,IAAA,CAAOI,CAAO,EAAA,IAAA,EAAQJ,EAAI,OAAW,EAAA,KAAA,CAErC,IAAK,CAAA,IAAA,GACR,IAAK,CAAA,IAAA,CAAO,KAEhB,EAAA,CAEU,qBAAqBI,CAAoC,CAAA,CACjE,IAAK,CAAA,IAAA,CAAQA,CAAO,EAAA,IAAA,EAAQJ,CAAI,CAAA,OAAA,CAChC,KAAK,IAAO,CAAA,CAAEI,CAAO,EAAA,IAAA,EAAmB,CAAEJ,CAAAA,CAAI,OAC9C,CAAA,IAAA,CAAK,QAAYI,CAAAA,CAAAA,EAAO,QAAYJ,EAAAA,CAAAA,CAAI,OACxC,CAAA,IAAA,CAAK,QAAYI,CAAAA,CAAAA,EAAO,UAAYJ,CAAI,CAAA,WAAA,CACxC,IAAK,CAAA,QAAA,CAAYI,CAAO,EAAA,QAAA,EAAYJ,CAAI,CAAA,WAAA,CACxC,IAAK,CAAA,IAAA,CAAOI,CAAO,EAAA,IAAA,EAAQJ,CAAI,CAAA,OAAA,EAAW,KAErC,CAAA,IAAA,CAAK,OACR,IAAK,CAAA,IAAA,CAAO,IAEhB,EAAA,CAEU,iBAAkBI,CAAAA,CAAAA,CAAiC,CAC3D,IAAA,CAAK,IAAQA,CAAAA,CAAAA,EAAO,IAAQJ,EAAAA,CAAAA,CAAI,OAChC,CAAA,IAAA,CAAK,IAAO,CAAA,CAAEI,GAAO,IAAmB,EAAA,CAAEJ,CAAI,CAAA,OAAA,CAC9C,IAAK,CAAA,QAAA,CAAYI,CAAO,EAAA,QAAA,EAAYJ,EAAI,OACxC,CAAA,IAAA,CAAK,QAAYI,CAAAA,CAAAA,EAAO,QAAYJ,EAAAA,CAAAA,CAAI,WACxC,CAAA,IAAA,CAAK,SAAYI,CAAO,EAAA,QAAA,EAAYJ,CAAI,CAAA,WAAA,CACxC,IAAK,CAAA,IAAA,CAAOI,CAAO,EAAA,IAAA,EAAQJ,CAAI,CAAA,OAAA,EAAW,KAErC,CAAA,IAAA,CAAK,IACR,GAAA,IAAA,CAAK,IAAO,CAAA,IAAA,EAEhB,CAEU,kBAAmBI,CAAAA,CAAAA,CAA+B,CAC1D,IAAA,CAAK,QAAWA,CAAAA,CAAAA,EAAO,QAAYJ,EAAAA,CAAAA,CAAI,WAAe,EAAA,UAAA,CACtD,IAAK,CAAA,IAAA,CAAOI,CAAO,EAAA,IAAA,EAAQJ,CAAI,CAAA,OAAA,EAAW,MAC5C,CAEU,iBAAA,CAAkBI,CAA8B,CAAA,CACxD,IAAK,CAAA,GAAA,CAAMA,CAAO,EAAA,GAAA,EAAQJ,CAAI,CAAA,SAAA,CAC9B,IAAK,CAAA,IAAA,CAAOI,CAAO,EAAA,IAAA,EAAQJ,CAAI,CAAA,UAAA,EAAc,MAC/C,CAEU,iBAAA,CAAkBI,CAA8B,CAAA,CACxD,IAAK,CAAA,IAAA,CAAQA,CAAO,EAAA,IAAA,EAAQJ,EAAI,OAChC,CAAA,IAAA,CAAK,IAAO,CAAA,CAAEI,CAAO,EAAA,IAAA,EAAmB,CAAEJ,CAAAA,CAAI,QAC9C,IAAK,CAAA,QAAA,CAAYI,CAAO,EAAA,QAAA,EAAYJ,CAAI,CAAA,OAAA,CACxC,IAAK,CAAA,QAAA,CAAYI,CAAO,EAAA,QAAA,EAAYJ,CAAI,CAAA,WAAA,CACxC,IAAK,CAAA,QAAA,CAAYI,CAAO,EAAA,QAAA,EAAYJ,EAAI,WACxC,CAAA,IAAA,CAAK,IAAOI,CAAAA,CAAAA,EAAO,IAAQJ,EAAAA,CAAAA,CAAI,OAAW,EAAA,KAAA,CAErC,IAAK,CAAA,IAAA,GACR,IAAK,CAAA,IAAA,CAAO,IAEhB,EAAA,CAEU,oBAAqBI,CAAAA,CAAAA,CAA8B,CAC3D,IAAK,CAAA,IAAA,CAAQA,CAAO,EAAA,IAAA,EAAQJ,CAAI,CAAA,OAAA,CAChC,IAAK,CAAA,IAAA,CAAO,CAAEI,CAAAA,EAAO,IAAmB,EAAA,CAAEJ,CAAI,CAAA,OAAA,CAC9C,IAAK,CAAA,QAAA,CAAYI,GAAO,QAAYJ,EAAAA,CAAAA,CAAI,OACxC,CAAA,IAAA,CAAK,QAAYI,CAAAA,CAAAA,EAAO,QAAYJ,EAAAA,CAAAA,CAAI,YACxC,IAAK,CAAA,QAAA,CAAYI,CAAO,EAAA,QAAA,EAAYJ,CAAI,CAAA,WAAA,CACxC,IAAK,CAAA,IAAA,CAAOI,GAAO,IAAQJ,EAAAA,CAAAA,CAAI,OAAW,EAAA,KAAA,CAErC,IAAK,CAAA,IAAA,GACR,IAAK,CAAA,IAAA,CAAO,IAEhB,EAAA,CACF,CC1HA,CAAA,IAAMkL,EAAoB9C,CAAAA,CAAAA,EAAiD,CACzE,GAAM,CAAE,QAAA+C,CAAAA,CAAAA,CAAU,GAAGnK,CAAK,CAAIoH,CAAAA,CAAAA,CAAO,OAAW,EAAA,EAC1CgD,CAAAA,CAAAA,CAAqC,CACzC,GAAGpK,CACH,CAAA,IAAA,CAAMoH,CAAO,CAAA,OAAA,EAAS,MAAQ,QAC9B,CAAA,WAAA,CACEA,CAAO,CAAA,OAAA,EAAS,WAAe,EAAA,CAAA,UAAA,EAAaA,CAAO,CAAA,UAAU,CACjE,CAAA,CAAA,CAGA,OAAIA,CAAAA,CAAO,OAAS,EAAA,IAAA,CACX,CACL,GAAGgD,EACH,IAAMhD,CAAAA,CAAAA,CAAO,OAAQ,CAAA,IACvB,CAIE,CAAA,KAAA,CAAM,OAAQA,CAAAA,CAAAA,CAAO,IAAI,CACpB,CAAA,CACL,GAAGgD,CAAAA,CACH,IAAM,CAAA,QAAA,CACN,IAAMhD,CAAAA,CAAAA,CAAO,IACf,CAKAA,CAAAA,CAAAA,CAAO,IAAS,GAAA,MAAA,EAChBA,CAAO,CAAA,IAAA,GAAS,UAChBA,EAAAA,CAAAA,CAAO,IAAS,GAAA,WAAA,EAChBA,CAAO,CAAA,IAAA,GAAS,MAET,CAAA,CACL,GAAGgD,CAAAA,CACH,KAAM,QACN,CAAA,MAAA,CAAQ,WACV,CAAA,CAIEhD,CAAO,CAAA,IAAA,GAAS,SACX,CAAA,CACL,GAAGgD,CAAAA,CACH,IAAM,CAAA,SACR,CAKAhD,CAAAA,CAAAA,CAAO,IAAS,GAAA,SAAA,EAChBA,EAAO,IAAS,GAAA,SAAA,EAChBA,CAAO,CAAA,IAAA,GAAS,UAChBA,EAAAA,CAAAA,CAAO,IAAS,GAAA,WAAA,EAChBA,CAAO,CAAA,IAAA,GAAS,WAET,CAAA,CACL,GAAGgD,CAAAA,CACH,IAAM,CAAA,SAAA,CACN,OAAQ,OACV,CAAA,CAIEhD,CAAO,CAAA,IAAA,GAAS,YAAgBA,EAAAA,CAAAA,CAAO,IAAS,GAAA,cAAA,CAC3C,CACL,GAAGgD,CAAAA,CACH,IAAM,CAAA,SAAA,CACN,MAAQ,CAAA,OACV,CAIEhD,CAAAA,CAAAA,CAAO,OAAS,OAAWA,EAAAA,CAAAA,CAAO,IAAS,GAAA,MAAA,CACtC,CACL,GAAGgD,CACH,CAAA,IAAA,CAAM,QACN,CAAA,MAAA,CAAQ,OACV,CAAA,CAGEhD,CAAO,CAAA,IAAA,GAAS,QACX,CAAA,CACL,GAAGgD,CACH,CAAA,IAAA,CAAM,QACN,CAAA,MAAA,CAAQ,QACV,CAAA,CAGEhD,CAAO,CAAA,IAAA,GAAS,SAAaA,EAAAA,CAAAA,CAAO,IAAS,GAAA,SAAA,CAExC,CACL,GAAGgD,CACH,CAAA,IAAA,CAAM,QACR,CAIEhD,CAAAA,CAAAA,CAAO,IAAS,GAAA,MAAA,EAAUA,CAAO,CAAA,IAAA,GAAS,OACrC,CAAA,CACL,GAAGgD,CAAAA,CACH,IAAM,CAAA,QACR,CAIEhD,CAAAA,CAAAA,CAAO,IAAS,GAAA,MAAA,CACX,CACL,GAAGgD,CAAAA,CACH,IAAM,CAAA,QAAA,CACN,MAAQ,CAAA,MACV,CAGEhD,CAAAA,CAAAA,CAAO,OAAS,MACX,CAAA,CACL,GAAGgD,CAAAA,CACH,IAAM,CAAA,QAAA,CACN,MAAQ,CAAA,MACV,EAKAhD,CAAO,CAAA,IAAA,GAAS,QAChBA,EAAAA,CAAAA,CAAO,IAAS,GAAA,MAAA,EAChBA,CAAO,CAAA,IAAA,GAAS,SAChBA,EAAAA,CAAAA,CAAO,IAAS,GAAA,MAAA,EAChBA,CAAO,CAAA,IAAA,GAAS,UAChBA,EAAAA,CAAAA,CAAO,OAAS,YAChBA,EAAAA,CAAAA,CAAO,IAAS,GAAA,UAAA,CAET,CACL,GAAGgD,CACH,CAAA,IAAA,CAAM,QACR,CAAA,CAKAhD,CAAO,CAAA,IAAA,GAAS,MAChBA,EAAAA,CAAAA,CAAO,IAAS,GAAA,QAAA,EAChBA,EAAO,IAAS,GAAA,WAAA,EAChBA,CAAO,CAAA,IAAA,GAAS,UAChBA,EAAAA,CAAAA,CAAO,IAAS,GAAA,YAAA,EAChBA,CAAO,CAAA,IAAA,GAAS,UAET,CAAA,CACL,GAAGgD,CAAAA,CACH,IAAM,CAAA,QAAA,CACN,OAAQ,QACV,CAAA,CAIEhD,CAAO,CAAA,IAAA,GAAS,MACX,CAAA,CACL,GAAGgD,CAAAA,CACH,KAAM,SACN,CAAA,MAAA,CAAQ,OACV,CAAA,CAIKA,CACT,CAAA,CAKMC,EAAoBjD,CAAAA,CAAAA,EACjBA,EAAO,OAAS,EAAA,QAAA,EAAY,KAM/BkD,CAAAA,EAAAA,CACJtD,CAC6C,EAAA,CAC7C,IAAME,CAAAA,CAAUF,CAAM,CAAA,UAAA,EAChBuD,CAAAA,CAAAA,CAAuD,EAAC,CAE9D,IAAWnD,IAAAA,CAAAA,IAAUF,EACfE,CAAO,CAAA,MAAA,GAIXmD,CAAWnD,CAAAA,CAAAA,CAAO,UAAU,CAAA,CAAI8C,EAAiB9C,CAAAA,CAAM,CAGzD,CAAA,CAAA,OAAOmD,CACT,CAAA,CAKMC,EAAqBxD,CAAAA,CAAAA,EAAkC,CAC3D,IAAME,EAAUF,CAAM,CAAA,UAAA,EAChBmD,CAAAA,CAAAA,CAAqB,EAAC,CAE5B,IAAW/C,IAAAA,CAAAA,IAAUF,CACfmD,CAAAA,EAAAA,CAAiBjD,CAAM,CAAA,EACzB+C,CAAS,CAAA,IAAA,CAAK/C,CAAO,CAAA,UAAU,EAInC,OAAO+C,CAAAA,EAAY,EACrB,CAKMM,CAAAA,EAAAA,CAAuBzD,CAA0C,EAAA,CACrE,IAAMuD,CAAaD,CAAAA,EAAAA,CAAyBtD,CAAK,CAAA,CAC3CmD,CAAWK,CAAAA,EAAAA,CAAkBxD,CAAK,CAAA,CAExC,OAAO,CACL,IAAA,CAAM,QACN,CAAA,UAAA,CAAAuD,CACA,CAAA,QAAA,CAAUJ,CAAS,CAAA,MAAA,CAASA,CAAW,CAAA,EACzC,CACF,CAyBO,CAAA,IAAMO,EACXzB,CAAAA,CAAAA,EAEOA,EAAO,GAAKjC,CAAAA,CAAAA,GAAW,CAC5B,GAAGyD,EAAoBzD,CAAAA,CAAgC,CACvD,CAAA,SAAA,CAAWA,CAAM,CAAA,IAAA,CACjB,GAAKA,CAAAA,CAAAA,CAAM,IACb,CAAA,CAAE,CCtQJ,CAQO,IAAM2D,EAAa,CAAA,CAAC9L,CAAe+L,CAAAA,CAAAA,GAA0B,CAClE,IAAMC,CAAeC,CAAAA,mBAAAA,CAAO,UAAW,CAAA,QAAQ,CAEzCC,CAAAA,CAAAA,CAAoClM,CAE1C,CAAA,OAAAgM,CAAa,CAAA,MAAA,CAAOE,CAAW,CAAA,CACxBF,CAAa,CAAA,MAAA,CAAO,KAAK,CAClC,CAAA,CCJO,IAAMG,EAAAA,CACXC,GAC0D,CAC1D,OAAQA,CAAS,EACf,KAAK,OAAA,CACH,OAAO,OAAA,CAET,KAAK,SAAA,CACH,OAAO,SAAA,CAET,KAAK,UAAA,CACL,KAAK,aAAA,CACH,OAAO,YAET,CAAA,KAAK,QACH,CAAA,OAAO,QAET,CAAA,KAAK,OACH,CAAA,OAAO,aAET,CAAA,KAAK,UACH,CAAA,OAAO,OAET,CAAA,QACE,OAAO,KACX,CACF,CAEMC,CAAAA,EAAAA,CAAehK,CAAuB,EAAA,CAC1C,GAAIA,CAAAA,EAAU,IACZ,CAAA,OAAO,MACF,CAAA,GAAIA,CAAiB,YAAA,IAAA,CAC1B,OAAO,CAAA,CAAA,EAAIA,CAAM,CAAA,WAAA,EAAa,CAGhC,CAAA,CAAA,CAAA,IAAMhC,CAAO,CAAA,OAAOgC,CACpB,CAAA,OAAIhC,CAAS,GAAA,SAAA,CACJgC,EAAQ,MAAS,CAAA,OAAA,CACfhC,CAAS,GAAA,QAAA,EAAY,MAAO,CAAA,QAAA,CAASgC,CAAK,CAAA,EAE1ChC,IAAS,QADX,CAAA,MAAA,CAAOgC,CAAK,CAAA,CAGVhC,CAAS,GAAA,QAAA,CAEX,CADSgC,CAAAA,EAAAA,CAAAA,CAAM,OAAQ,CAAA,IAAA,CAAM,IAAI,CACtB,CAIlB,CAAA,CAAA,CAAA,KAAA,CAAM,OAAQA,CAAAA,CAAK,GAClBhC,CAAS,GAAA,QAAA,EAAY,MAAO,CAAA,IAAA,CAAKgC,CAAK,CAAA,CAAE,MAAS,CAAA,CAAA,CAI3C,CAFM,CAAA,EAAA,IAAA,CAAK,SAAUA,CAAAA,CAAK,CACZ,CAAA,OAAA,CAAQ,IAAM,CAAA,IAAI,CACrB,CAGb,CAAA,CAAA,CAAA,MAAA,CAAOA,CAAK,CACrB,CAKaiK,CAAAA,EAAAA,CAAsB,CAAC/J,CAAAA,CAAeH,CAA0B,GAAA,CAC3E,IAAIU,CAAAA,CAASP,CAGb,CAAA,IAAA,IAASgK,CAAI,CAAA,CAAA,CAAGA,EAAInK,CAAO,CAAA,MAAA,EACpBU,CAAO,CAAA,QAAA,CAAS,GAAG,CAAA,CADSyJ,CAIjCzJ,EAAAA,CAAAA,CAAAA,CAASA,EAAO,OAAQ,CAAA,IAAA,CAAMuJ,EAAYjK,CAAAA,CAAAA,CAAOmK,CAAC,CAAC,CAAC,CAAA,CAItD,QAASA,CAAI,CAAA,CAAA,CAAGA,CAAInK,CAAAA,CAAAA,CAAO,MAAQmK,CAAAA,CAAAA,EAAAA,CAAK,CACtC,IAAMC,CAAgB,CAAA,IAAI,MAAO,CAAA,CAAA,GAAA,EAAMD,CAAI,CAAA,CAAC,CAAW,OAAA,CAAA,CAAA,GAAG,EAC1DzJ,CAASA,CAAAA,CAAAA,CAAO,OAAQ0J,CAAAA,CAAAA,CAAeH,EAAYjK,CAAAA,CAAAA,CAAOmK,CAAC,CAAC,CAAC,EAC/D,CAGA,IAAA,IAASA,CAAI,CAAA,CAAA,CAAGA,CAAInK,CAAAA,CAAAA,CAAO,OAAQmK,CAAK,EAAA,CAAA,CACtC,IAAME,CAAAA,CAAmB,IAAI,MAAA,CAAO,CAAMF,GAAAA,EAAAA,CAAAA,CAAI,CAAC,CAAA,OAAA,CAAA,CAAW,GAAG,CAAA,CAC7DzJ,CAASA,CAAAA,CAAAA,CAAO,OAAQ2J,CAAAA,CAAAA,CAAkBJ,GAAYjK,CAAOmK,CAAAA,CAAC,CAAC,CAAC,EAClE,CAGA,IAASA,IAAAA,CAAAA,CAAI,EAAGA,CAAInK,CAAAA,CAAAA,CAAO,MAAQmK,CAAAA,CAAAA,EAAAA,CAAK,CACtC,IAAMG,CAAoB,CAAA,IAAI,OAAO,CAAIH,CAAAA,EAAAA,CAAAA,CAAI,CAAC,CAAA,OAAA,CAAA,CAAW,GAAG,CAAA,CAC5DzJ,CAASA,CAAAA,CAAAA,CAAO,OAAQ4J,CAAAA,CAAAA,CAAmBL,EAAYjK,CAAAA,CAAAA,CAAOmK,CAAC,CAAC,CAAC,EACnE,CAEA,OAAOzJ,CACT,CAEa6J,CAAAA,EAAAA,CAAsB,CACjCP,CAAAA,CACApO,CAEKA,GAAAA,CAAAA,CAIDoO,CAAY,GAAA,OAAA,EAAWA,CAAY,GAAA,SAAA,CAC9BpO,CAAM,CAAA,IAAA,GAAS,kBAAsBA,EAAAA,CAAAA,CAAM,QAAU,IAG1DoO,CAAAA,CAAAA,GAAY,UAAcA,EAAAA,CAAAA,GAAY,aACjCpO,CAAAA,CAAAA,CAAM,IAAS,GAAA,OAAA,CAGpBoO,CAAY,GAAA,QAAA,CACP,gBAAiB,CAAA,IAAA,CAAK,MAAOpO,CAAAA,CAAAA,CAAM,OAAW,EAAA,EAAE,CAAC,CAGtDoO,CAAAA,CAAAA,GAAY,OACPpO,CAAAA,CAAAA,CAAM,MAAW,GAAA,GAAA,CAGtBoO,CAAY,GAAA,UAAA,CACPpO,EAAM,QAAa,GAAA,GAAA,CAGrB,KAvBE,CAAA,KAAA,CA0BE4O,EAAc,CAAA,CAACtJ,CAAoBf,CAAAA,CAAAA,GAA0B,CACxE,IAAMM,CAAAA,CAASS,CAAI,CAAA,SAAA,EACfuJ,CAAAA,CAAAA,CACJ,GAAI,CACFA,CAAiBC,CAAAA,mBAAAA,CAAOvK,CAAO,CAAA,CAC7B,GAAGe,CAAAA,CAAI,YAAa,CAAA,kBAAA,CACpB,SAAU6I,EAActJ,CAAAA,CAA2B,CACrD,CAAC,EACH,CAAA,KAAY,CAEV,GAAI,CACFgK,CAAAA,CAAiBC,mBAAOvK,CAAAA,CAAAA,CAAO,CAC7B,GAAGe,CAAI,CAAA,YAAA,CAAa,kBACtB,CAAC,EACH,CAAY,KAAA,CAEVuJ,CAAiBtK,CAAAA,EACnB,CACF,CAEA,OAAOsK,CACT,CCtJA,CAAA,IAAME,EAAN,CAAA,KAAuD,CAErD,KAAA,CAAMC,EAAiB,CACrB,IAAMC,CAASD,CAAAA,CAAAA,CACTE,CAAM,CAAA,IAAIC,CAAU,CAAA,IAAA,CAAK,MAAO,OAA4B,CAAA,CAC9D,CAAE,GAAA,CAAA7J,CAAI,CAAA,CAAI4J,CAAI,CAAA,KAAA,CAAM,CAACD,CAAO,CAAA,MAAM,CAAC,CAAA,CAEjCG,CAAqBH,CAAAA,CAAAA,CAAe,iBAC1C,CAAA,GAAIG,CAAqBA,EAAAA,CAAAA,CAAkB,MAAQ,CAAA,CACjD,IAAMC,CAAAA,CAA4B,EAAC,CAEnC,QAAWC,CAAcF,IAAAA,CAAAA,CAAmB,CAC1C,GAAM,CAAE,GAAA,CAAKG,CAAc,CAAA,CAAIL,CAAI,CAAA,KAAA,CAAM,CAACI,CAAU,CAAC,CAAA,CACrDD,CAAgB,CAAA,IAAA,CAAKE,CAAa,EACpC,CAEIF,CAAgB,CAAA,MAAA,GAClB/J,CAAO,EAAA,CAAA,CAAA,EAAI+J,CAAgB,CAAA,IAAA,CAAK,GAAG,CAAC,CAExC,CAAA,EAAA,CAEA,OAAO,CAAE,GAAK,CAAA,CAAA,IAAA,EAAO/J,CAAG,CAAI,CAAA,CAAA,QAAA,CAAU,EAAG,CAC3C,CACF,CACOkK,CAAAA,EAAAA,CAAQ,IAAIT,ECxBnB,CAAA,IAAMU,EAAN,CAAA,KAA2D,CAEzD,KAAA,CAAMT,CAAiB,CAAA,CACrB,IAAMC,CAASD,CAAAA,CAAAA,CACTE,CAAM,CAAA,IAAIC,CAAU,CAAA,IAAA,CAAK,KAAO,CAAA,OAA4B,CAC5D,CAAA,CAAE,GAAA7J,CAAAA,CAAI,CAAI4J,CAAAA,CAAAA,CAAI,KAAM,CAAA,CAACD,EAAO,UAAU,CAAC,CAC7C,CAAA,OAAO,CAAE,GAAA,CAAK,CAAO3J,IAAAA,EAAAA,CAAG,CAAI,CAAA,CAAA,QAAA,CAAU,EAAG,CAC3C,CACF,CACOoK,CAAAA,EAAAA,CAAQ,IAAID,ECXnB,CAAA,IAAME,EAAN,CAAA,KAA2D,CAEzD,KAAA,CAAMX,CAAiB,CAAA,CAGrB,OAAO,CAAE,GAAK,CAAA,CAAA,iBAAA,EAFHA,CACK,CAAA,OAAA,CAAQ,GAAKxE,CAAAA,CAAAA,EAAM,IAAIA,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,IAAA,CAAK,IAAI,CAChB,CAAK,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC1D,CACF,CAAA,CACOoF,EAAQ,CAAA,IAAID,ECNnB,CAAA,IAAME,GAAN,KAA6D,CAE3D,KAAMb,CAAAA,CAAAA,CAAiB,CACrB,IAAMc,CAAId,CAAAA,CAAAA,CACJE,CAAM,CAAA,IAAIC,CAAU,CAAA,IAAA,CAAK,KAAO,CAAA,OAA4B,CAC5D,CAAA,CAAE,IAAA7J,CAAI,CAAA,CAAI4J,CAAI,CAAA,KAAA,CAAM,CAACY,CAAAA,CAAE,OAAO,CAAC,CAC/B,CAAA,EAAG,GAAGC,CAAU,CAAA,CAAIzK,CAAI,CAAA,IAAA,GAAO,KAAM,CAAA,KAAK,CAC1C0K,CAAAA,CAAAA,CAAUD,CAAW,CAAA,IAAA,CAAK,GAAG,CAAA,CAE/BE,CAAa,CAAA,EAAA,CACbH,CAAE,CAAA,OAAA,CAAQ,QAAa,GAAA,MAAA,GACzBG,CAAaH,CAAAA,CAAAA,CAAE,QAAQ,QAAW,CAAA,OAAA,CAAU,WAG9C,CAAA,CAAA,IAAII,CAAY,CAAA,CAAA,cAAA,EAAiBJ,CAAE,CAAA,MAAM,KAAKE,CAAO,CAAA,EAAGC,CAAU,CAAA,CAAA,CAMlE,GAJIH,CAAAA,CAAE,OAAQ,CAAA,WAAA,GACZI,EAAY,CAAsBJ,mBAAAA,EAAAA,CAAAA,CAAE,MAAM,CAAA,EAAA,EAAKI,CAAS,CAAA,CAAA,CAAA,CAGtDJ,CAAE,CAAA,OAAA,CAAQ,OAAY,GAAA,MAAA,EAAa,CAACA,CAAAA,CAAE,OAAQ,CAAA,WAAA,CAAa,CAC7D,IAAIK,EAAeL,CAAE,CAAA,OAAA,CAAQ,OACzBK,CAAAA,CAAAA,GAAiB,IACnBA,CAAAA,CAAAA,CAAe,MACN,CAAA,OAAOA,CAAiB,EAAA,QAAA,GAC7BA,CAAiB,GAAA,MAAA,CACnBA,CAAe,CAAA,MAAA,CACNA,CAAiB,GAAA,MAAA,EAAUA,IAAiB,OACrDA,CAAAA,CAAAA,CAAeA,CAAiB,GAAA,MAAA,CAAS,GAAM,CAAA,GAAA,CAE/CA,CAAe,CAAA,CAAA,CAAA,EAAIA,CAAY,CAAA,CAAA,CAAA,CAAA,CAGnCD,CAAa,EAAA,CAAA,oBAAA,EAAuBJ,CAAE,CAAA,MAAM,CAAYK,SAAAA,EAAAA,CAAY,SAASL,CAAE,CAAA,MAAM,CACvF,CAAA,EAAA,CAEA,OAAIA,CAAAA,CAAE,OAAQ,CAAA,MAAA,GAAW,QACnBA,CAAE,CAAA,OAAA,CAAQ,MACZI,GAAAA,CAAAA,EAAa,CAAuBJ,oBAAAA,EAAAA,CAAAA,CAAE,MAAM,CAAA,UAAA,EAAaA,EAAE,MAAM,CAAA,EAAA,CAAA,CAAA,CAI9D,CAAE,GAAA,CAAKI,CAAW,CAAA,QAAA,CAAU,EAAG,CACxC,CACF,CACOE,CAAAA,EAAAA,CAAQ,IAAIP,EAAAA,CCpDZ,IAAeQ,CAAAA,CAAf,KAAyB,CAoC9B,WAAA,CAAYC,CAAiBC,CAAAA,CAAAA,CAAsB,KAAO,CAAA,CA3B1D,IAAyB,CAAA,cAAA,CAAA,CAAA,CAKzB,IAAsB,CAAA,UAAA,CAAA,KAAA,CAuBpB,IAAK,CAAA,OAAA,CAAUD,CACf,CAAA,IAAA,CAAK,UAAaC,CAAAA,EACpB,CACF,CCtCO,CAAA,IAAMC,EAAN,CAAA,cAA8BH,CAAU,CAO7C,WAAYI,CAAAA,CAAAA,CAAiB,CAC3B,KAAA,CAAM,WAAW,CAAA,CANnB,IAAa,CAAA,UAAA,CAAA,GAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,KAAA,CAChC,YAAS,aACT,CAAA,IAAA,CAAA,IAAA,CAAO,cAIL,CAAA,IAAA,CAAK,OAAUA,CAAAA,EACjB,CACF,CAAA,CCNA,SAASC,EAAQC,CAAAA,CAAAA,CAAU,CACzB,OAAI,OAAOA,CAAAA,EAAQ,QAAY,EAAA,CAACA,EACvBA,CAGFA,CAAAA,CAAAA,CACJ,OAAQ,CAAA,iBAAA,CAAmB,OAAO,CAAA,CAClC,OAAQ,CAAA,sBAAA,CAAwB,OAAO,CAAA,CACvC,WAAY,EACjB,CAEA,SAASC,EAAQD,CAAAA,CAAAA,CAAU,CACzB,OAAI,OAAOA,CAAQ,EAAA,QAAA,EAAY,CAACA,CAAAA,CACvBA,CAGFA,CAAAA,CAAAA,CAAI,OAAQ,CAAA,cAAA,CAAiBE,CAClCA,EAAAA,CAAAA,CAAM,WAAY,EAAA,CAAE,OAAQ,CAAA,GAAA,CAAK,EAAE,CAAE,CAAA,OAAA,CAAQ,GAAK,CAAA,EAAE,CACtD,CACF,CAEO,SAASC,CAAY9O,CAAAA,CAAAA,CAAY+O,CAAoB,CAAA,CAC1D,OAAIA,CAAAA,GAAO,UACF/O,CAAAA,CAAAA,CAGL+O,IAAO,OACFL,CAAAA,EAAAA,CAAQ1O,CAAK,CAAA,CAGlB+O,CAAO,GAAA,OAAA,CACFH,EAAQ5O,CAAAA,CAAK,EAGlB+O,CAAc,YAAA,MAAA,CACT/O,CAAM,CAAA,OAAA,CAAQ+O,CAAKC,CAAAA,CAAAA,EAAcA,CAAE,CAAA,CAAC,EAAE,WAAY,EAAC,CAGrDD,CAAAA,CAAAA,CAAG/O,CAAK,CACjB,CCxCAiP,mBAAAA,CAAM,MAAOC,CAAAA,mBAAG,CAChBD,CAAAA,mBAAAA,CAAM,MAAOE,CAAAA,mBAAQ,CACrBF,CAAAA,mBAAAA,CAAM,MAAOG,CAAAA,mBAAiB,EAKvB,IAAMC,EAAAA,CAAU,CACrBC,CAAAA,CACAxC,CAAqB,CAAA,KAAA,CACrBqC,CAAqB,CAAA,KAAA,GACV,CACX,GAAI,EAAEG,CAAAA,YAAgB,IAAS,CAAA,EAAA,KAAA,CAAMA,CAAK,CAAA,OAAA,EAAS,CACjD,CAAA,MAAM,IAAI,KAAA,CAAM,uBAAuB,CAAA,CAGzC,IAAMC,CAAAA,CAAIN,oBAAMK,CAAI,CAAA,CAEpB,GAAIH,CAAAA,GAAa,OAAS,CAAA,CACxB,IAAMK,CAAAA,CAAYD,EAAE,KAAM,EAAA,CAC1B,OAAQzC,CAAAA,EACN,KAAK,KACH,CAAA,OAAO0C,CAAU,CAAA,MAAA,CAAO,qBAAqB,CAAA,CAC/C,KAAK,WAAA,CACH,OAAOA,CAAAA,CAAU,OAAO,YAAY,CAAA,CACtC,KAAK,WAAA,CACH,OAAOA,CAAAA,CAAU,MAAO,CAAA,UAAU,CACpC,CAAA,QACE,OAAOA,CAAAA,CAAU,IAAK,EAAA,CAAE,QAAS,EACrC,CACF,CAEA,IAAMC,CAAUF,CAAAA,CAAAA,CAAE,GAAI,EAAA,CACtB,OAAQzC,CAAAA,EACN,KAAK,KACH,CAAA,OAAO2C,CAAQ,CAAA,MAAA,CAAO,qBAAqB,CAAA,CAC7C,KAAK,WACH,CAAA,OAAOA,CAAQ,CAAA,MAAA,CAAO,YAAY,CAAA,CACpC,KAAK,WAAA,CACH,OAAOA,CAAQ,CAAA,MAAA,CAAO,UAAU,CAAA,CAClC,QACE,OAAOA,CAAQ,CAAA,IAAA,GAAO,QAAS,EACnC,CACF,CAAA,CAEaC,EAAY,CAAA,CACvB1P,CACA8M,CAAAA,CAAAA,CACAqC,CAAqB,CAAA,KAAA,GACL,CAChB,GAAInP,CAAU,GAAA,IAAA,CACZ,OAAO,IAAA,CAGT,GAAIA,CAAiB,YAAA,IAAA,CAAM,CACzB,GAAI,KAAMA,CAAAA,CAAAA,CAAM,OAAQ,EAAC,CACvB,CAAA,MAAM,IAAInC,CAAAA,CAAc,sBAAwB,CAAA,qBAAqB,CAEvE,CAAA,OAAOmC,CACT,CAEA,GAAI,CACF,IAAM2P,CAAS7C,CAAAA,CAAAA,CAASmC,mBAAMjP,CAAAA,CAAAA,CAAO8M,CAAM,CAAA,CAAImC,mBAAMjP,CAAAA,CAAK,CAC1D,CAAA,GAAI,CAAC2P,CAAAA,CAAO,SACV,CAAA,MAAM,IAAI9R,CAAAA,CAAc,sBAAwB,CAAA,qBAAqB,CAGvE,CAAA,OAAOsR,IAAa,KAAQQ,CAAAA,CAAAA,CAAO,GAAI,EAAA,CAAE,MAAO,EAAA,CAAIA,CAAO,CAAA,KAAA,GAAQ,MAAO,EAC5E,CAAS3R,MAAAA,CAAAA,CAAO,CACd,MAAM,IAAIH,CAAAA,CACR,sBACA,CAAA,sBAAA,CACAG,CACF,CACF,CACF,CAAA,CAEa4R,EAAqB,CAAA,CAACN,EAAa,IAAI,IAAA,GAC3CL,mBAAMK,CAAAA,CAAI,CAAE,CAAA,GAAA,EAAM,CAAA,MAAA,CAAO,qBAAqB,CAAA,CChFhD,IAAMO,EAAAA,CAAmB,CAAC9P,CAAAA,CAAaC,CAA0B,GAAA,CACtE,GAAI,CACF,IAAM8P,CAAAA,CAAY7D,mBAAO,CAAA,UAAA,CAAW,QAAQ,CAAA,CAAE,MAAOlM,CAAAA,CAAG,EAAE,MAAO,EAAA,CAC3DgQ,CAAK9D,CAAAA,mBAAAA,CAAO,WAAY,CAAA,EAAE,CAC1B+D,CAAAA,CAAAA,CAAS/D,oBAAO,cAAe,CAAA,aAAA,CAAe6D,CAAWC,CAAAA,CAAE,CAC7DE,CAAAA,CAAAA,CAAYD,CAAO,CAAA,MAAA,CAAOhQ,EAAO,MAAQ,CAAA,KAAK,CAClD,CAAA,OAAAiQ,CAAaD,EAAAA,CAAAA,CAAO,KAAM,CAAA,KAAK,CACxB,CAAA,CAAA,EAAGD,CAAG,CAAA,QAAA,CAAS,KAAK,CAAC,CAAIE,CAAAA,EAAAA,CAAS,EAC3C,CAASjS,MAAAA,CAAAA,CAAO,CACd,MAAM,IAAIH,CAAAA,CACR,8BACA,CAAA,iCAAA,CACAG,CAAiB,YAAA,KAAA,CAAQA,CAAQ,CAAA,MACnC,CACF,CACF,CAEakS,CAAAA,EAAAA,CAAmB,CAACnQ,CAAaC,CAAAA,CAAAA,GAA0B,CACtE,GAAI,CACF,IAAM8P,CAAY7D,CAAAA,mBAAAA,CAAO,UAAW,CAAA,QAAQ,CAAE,CAAA,MAAA,CAAOlM,CAAG,CAAA,CAAE,MAAO,EAAA,CAE3DoQ,EAAc,MAAOnQ,CAAAA,CAAK,CAAE,CAAA,IAAA,EAC5B,CAAA,CAACoQ,CAAOH,CAAAA,CAAS,EAAIE,CAAY,CAAA,KAAA,CAAM,GAAG,CAAA,CAChD,GAAI,CAACC,CAAS,EAAA,CAACH,EACb,MAAM,IAAI,KACR,CAAA,CAAA,4DAAA,EAA+DE,CAAY,CAAA,SAAA,CAAU,CAAG,CAAA,EAAE,CAAC,CAAA,IAAA,CAC7F,CAGF,CAAA,IAAME,CAAeD,CAAAA,CAAAA,CAAM,WAAY,EAAA,CACjCE,EAAsBL,CAAU,CAAA,WAAA,EAChCM,CAAAA,CAAAA,CAAWtE,mBAAO,CAAA,gBAAA,CACtB,aACA6D,CAAAA,CAAAA,CACA,MAAO,CAAA,IAAA,CAAKO,CAAc,CAAA,KAAK,CACjC,CAAA,CACIG,CAAYD,CAAAA,CAAAA,CAAS,OAAOD,CAAqB,CAAA,KAAA,CAAO,MAAM,CAAA,CAClE,OAAAE,CAAAA,EAAaD,CAAS,CAAA,KAAA,CAAM,MAAM,CAAA,CAC3BC,CACT,CAAA,MAASxS,CAAO,CAAA,CACd,MAAM,IAAIH,EACR,8BACA,CAAA,iCAAA,CACAG,CAAiB,YAAA,KAAA,CAAQA,CAAQ,CAAA,MACnC,CACF,CACF,EAIayS,EAAoB,CAAA,CAACC,CAAmB1Q,CAAAA,CAAAA,GAA0B,CAC7E,GAAI,CAEF,IAAM2Q,EAAe1E,mBAAO,CAAA,WAAA,CAAY,EAAE,CAAA,CACpC8D,CAAK9D,CAAAA,mBAAAA,CAAO,WAAY,CAAA,EAAE,CAG1B+D,CAAAA,CAAAA,CAAS/D,mBAAO,CAAA,cAAA,CAAe,aAAe0E,CAAAA,CAAAA,CAAcZ,CAAE,CAAA,CAChEa,EAAgBZ,CAAO,CAAA,MAAA,CAAOhQ,CAAO,CAAA,MAAA,CAAQ,KAAK,CAAA,CACtD4Q,CAAiBZ,EAAAA,CAAAA,CAAO,KAAM,CAAA,KAAK,CAGnC,CAAA,IAAMa,CAAeC,CAAAA,gBAAAA,CAAcJ,CAAWC,CAAAA,CAAY,EAG1D,OAAO,CAAA,EAAGZ,CAAG,CAAA,QAAA,CAAS,KAAK,CAAC,CAAIc,CAAAA,EAAAA,CAAAA,CAAa,QAAS,CAAA,KAAK,CAAC,CAAA,CAAA,EAAID,CAAa,CAAA,CAC/E,CAAS5S,MAAAA,CAAAA,CAAO,CACd,MAAM,IAAIH,CACR,CAAA,+BAAA,CACA,kCACAG,CAAAA,CAAAA,YAAiB,KAAQA,CAAAA,CAAAA,CAAQ,MACnC,CACF,CACF,CAEa+S,CAAAA,EAAAA,CAAoB,CAC/BC,CAAAA,CACAhR,CACW,GAAA,CACX,GAAI,CAEF,IAAMmQ,CAAc,CAAA,MAAA,CAAOnQ,CAAK,CAAA,CAAE,IAAK,EAAA,CACjC,CAACoQ,CAAAA,CAAOa,CAAiBL,CAAAA,CAAa,CAAIT,CAAAA,CAAAA,CAAY,KAAM,CAAA,GAAG,EACrE,GAAI,CAACC,CAAS,EAAA,CAACa,CAAmB,EAAA,CAACL,CACjC,CAAA,MAAM,IAAI,KAAA,CACR,CAAmET,gEAAAA,EAAAA,CAAAA,CAAY,SAAU,CAAA,CAAA,CAAG,EAAE,CAAC,MACjG,CAGF,CAAA,IAAMQ,CAAeO,CAAAA,iBAAAA,CACnBF,CACA,CAAA,MAAA,CAAO,IAAKC,CAAAA,CAAAA,CAAiB,KAAK,CACpC,CAEMV,CAAAA,CAAAA,CAAWtE,mBAAO,CAAA,gBAAA,CACtB,aACA0E,CAAAA,CAAAA,CACA,OAAO,IAAKP,CAAAA,CAAAA,CAAO,KAAK,CAC1B,CAEII,CAAAA,CAAAA,CAAYD,CAAS,CAAA,MAAA,CAAOK,EAAe,KAAO,CAAA,MAAM,CAC5D,CAAA,OAAAJ,CAAaD,EAAAA,CAAAA,CAAS,KAAM,CAAA,MAAM,EAE3BC,CACT,CAAA,MAASxS,CAAO,CAAA,CACd,MAAM,IAAIH,CACR,CAAA,+BAAA,CACA,kCACAG,CAAAA,CAAAA,YAAiB,KAAQA,CAAAA,CAAAA,CAAQ,MACnC,CACF,CACF,CAAA,CC5GO,IAAMmT,CAAN,CAAA,KAAc,CAGnB,OAAO,cACLC,CAAAA,CAAAA,CACAC,CACAC,CAAAA,CAAAA,CACAC,CACM,CAAA,CACN,GACG,CAAA,OAAOD,CAAW,EAAA,QAAA,EAAYA,CAAW,GAAA,IAAA,GAC1C,OAAOA,CAAW,EAAA,UAAA,CAElB,MAAM,IAAI,SAAU,CAAA,sCAAsC,CAG5D,CAAA,IAAIE,CAAY,CAAA,IAAA,CAAK,KAAM,CAAA,GAAA,CAAIF,CAAM,CAAA,CAChCE,CACHA,GAAAA,CAAAA,CAAY,IAAI,GAChB,CAAA,IAAA,CAAK,KAAM,CAAA,GAAA,CAAIF,CAAQE,CAAAA,CAAS,CAGlC,CAAA,CAAA,IAAIC,EAAUD,CAAU,CAAA,GAAA,CAAID,CAAW,CAAA,CAClCE,CACHA,GAAAA,CAAAA,CAAU,IAAI,GAAA,CACdD,EAAU,GAAID,CAAAA,CAAAA,CAAaE,CAAO,CAAA,CAAA,CAGpCA,CAAQ,CAAA,GAAA,CAAIL,CAAaC,CAAAA,CAAa,EACxC,CAEA,OAAO,WAAA,CACLD,CACAE,CAAAA,CAAAA,CACAC,CACe,CAAA,CACf,IACG,OAAOD,CAAAA,EAAW,QAAYA,EAAAA,CAAAA,GAAW,IAC1C,GAAA,OAAOA,CAAW,EAAA,UAAA,CAElB,MAAM,IAAI,SAAU,CAAA,sCAAsC,CAG5D,CAAA,IAAII,CAAyBJ,CAAAA,CAAAA,CAC7B,KAAOI,CAAS,EAAA,CACd,IAAMF,CAAAA,CAAY,IAAK,CAAA,KAAA,CAAM,GAAIE,CAAAA,CAAO,CACxC,CAAA,GAAIF,CAAW,CAAA,CACb,IAAMC,CAAAA,CAAUD,CAAU,CAAA,GAAA,CAAID,CAAW,CACzC,CAAA,GAAIE,CAAWA,EAAAA,CAAAA,CAAQ,GAAIL,CAAAA,CAAW,CACpC,CAAA,OAAOK,EAAQ,GAAIL,CAAAA,CAAW,CAElC,CAEAM,CAAU,CAAA,MAAA,CAAO,cAAeA,CAAAA,CAAO,EACzC,CAGF,CACF,CA1DaP,CAAAA,CAAAA,CACI,KAAwC,CAAA,IAAI,OCR7D,CAEA,IAAMQ,EAAW,CAAA,kCAAA,CACXC,EAAeD,CAAAA,EAAAA,CAAS,OACxBE,EAAW,CAAA,EAAA,CACXC,EAAa,CAAA,EAAA,CAKbC,EAAa,CAAA,CAACtQ,CAAauQ,CAAAA,CAAAA,GAA2B,CAC1D,IAAIrD,CAAAA,CAAM,EACV,CAAA,IAAA,IAASpC,CAAI,CAAA,CAAA,CAAGA,CAAIyF,CAAAA,CAAAA,CAAQzF,IAAK,CAC/B,IAAMrH,CAAMzD,CAAAA,CAAAA,CAAMmQ,EAClBjD,CAAAA,CAAAA,CAAMgD,EAAS,CAAA,MAAA,CAAOzM,CAAG,CAAA,CAAIyJ,CAC7BlN,CAAAA,CAAAA,CAAAA,CAAOA,CAAMyD,CAAAA,CAAAA,EAAO0M,GACtB,CACA,OAAOjD,CACT,CAAA,CAKMsD,EAAgBD,CAAAA,CAAAA,EAA2B,CAC/C,IAAME,CAAQC,CAAAA,cAAAA,CAAYH,CAAM,CAC5BrD,CAAAA,CAAAA,CAAM,EACV,CAAA,IAAA,IAASpC,CAAI,CAAA,CAAA,CAAGA,CAAIyF,CAAAA,CAAAA,CAAQzF,IAAK,CAC/B,IAAM6F,CAAaF,CAAAA,CAAAA,CAAM3F,CAAC,CAAA,CAC1BoC,CAAOgD,EAAAA,EAAAA,CAAS,MAAOS,CAAAA,CAAAA,CAAaR,EAAY,EAClD,CACA,OAAOjD,CACT,CAAA,CAKa0D,GAAe,IAAc,CACxC,IAAM5Q,CAAAA,CAAM,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,GAAA,EAAQ,CAAA,GAAI,CAClC6Q,CAAAA,CAAAA,CAAOP,EAAWtQ,CAAAA,CAAAA,CAAKoQ,EAAQ,CAAA,CAC/BU,EAASN,EAAaH,CAAAA,EAAU,CACtC,CAAA,OAAOQ,CAAOC,CAAAA,CAChB,CCxBO,CAAA,SAASC,EAAsBC,CAAAA,CAAAA,CAA4B,CAChE,OAAOA,CAAW,CAAA,OAAA,CAAQ,cAAgB,CAAA,EAAE,CAC9C,CAEO,SAASC,EACdnK,CAAAA,CAAAA,CACAoK,CACAC,CAAAA,CAAAA,CACQ,CACR,GAAI,CAACrK,CAAO,CAAA,QAAA,CAAS,GAAG,CAAA,CAAG,CACzB,IAAMsK,CAAWL,CAAAA,EAAAA,CAAsBjK,CAAM,CAC7C,CAAA,OAAO,CAAGoK,EAAAA,CAAS,CAAIE,CAAAA,EAAAA,CAAQ,CACjC,CAAA,CAEA,GAAI,CAAC3P,CAAO4P,CAAAA,CAAG,CAAIvK,CAAAA,CAAAA,CAAO,KAAM,CAAA,GAAG,EAInC,OAHArF,CAAAA,CAAQsP,EAAsBtP,CAAAA,CAAK,CACnC4P,CAAAA,CAAAA,CAAMN,EAAsBM,CAAAA,CAAG,CAE3B5P,CAAAA,CAAAA,GAAU0P,CACLrK,CAAAA,CAAAA,CAGLuK,CAAQ,GAAA,GAAA,CACH,CAAGH,EAAAA,CAAS,KAGd,CAAGA,EAAAA,CAAS,CAAIG,CAAAA,EAAAA,CAAG,CAC5B,CAAA,CAEO,SAASC,CAAAA,CAAexK,CAAiC,CAAA,CAC9D,OAAO,OAAOA,CAAW,EAAA,UAAA,CAAaA,CAAO,EAAA,CAAIA,CACnD,CAEO,IAAMyK,CAAgB,CAAA,CAACC,CAAUC,CAAAA,CAAAA,CAAO,IAAI,OAAA,GAAmB,CACpE,GAAID,CAAAA,GAAQ,IAAQ,EAAA,OAAOA,CAAQ,EAAA,QAAA,CACjC,OAAOA,CAAAA,CAGT,GAAIC,CAAK,CAAA,GAAA,CAAID,CAAG,CAAA,CACd,OAAOC,CAAAA,CAAK,GAAID,CAAAA,CAAG,CAGrB,CAAA,GAAI,KAAM,CAAA,OAAA,CAAQA,CAAG,CAAA,CAAG,CACtB,IAAME,EAAa,EAAC,CACpBD,CAAK,CAAA,GAAA,CAAID,CAAKE,CAAAA,CAAG,CACjB,CAAA,IAAA,IAAS5G,CAAI,CAAA,CAAA,CAAGA,CAAI0G,CAAAA,CAAAA,CAAI,MAAQ1G,CAAAA,CAAAA,EAAAA,CAC9B4G,CAAI5G,CAAAA,CAAC,EAAIyG,CAAcC,CAAAA,CAAAA,CAAI1G,CAAC,CAAA,CAAG2G,CAAI,CAAA,CAErC,OAAOC,CACT,CAEA,IAAMC,CAAW,CAAA,MAAA,CAAO,MAAO,CAAA,MAAA,CAAO,cAAeH,CAAAA,CAAG,GAAK,EAAE,CAC/DC,CAAAA,CAAAA,CAAK,GAAID,CAAAA,CAAAA,CAAKG,CAAG,CAAA,CAEjB,QAAWrT,CAAO,IAAA,MAAA,CAAO,mBAAoBkT,CAAAA,CAAG,CAAG,CAAA,CACjD,IAAMI,CAAAA,CAAKJ,EAAYlT,CAAG,CAAA,CAC1B,GAAI,OAAOsT,CAAM,EAAA,UAAA,CAAY,CAC3BD,CAAAA,CAAIrT,CAAG,CAAA,CAAIsT,CACX,CAAA,QACF,CAEAD,CAAAA,CAAIrT,CAAG,CAAA,CAAIiT,EAAcK,CAAGH,CAAAA,CAAI,EAClC,CAEA,OAAOE,CACT,CC5EO,CAAA,IAAeE,EAAf,CAAA,KAAsB,EAa7B,CAbsBA,EAMb,CAAA,mBAAA,CAAsC,OANzBA,CAAAA,EAAAA,CAYb,uBAAyC,OCd3C,CAAA,IAAMC,EAAqC,CAAA,MAGhDpL,CACAqL,CAAAA,CAAAA,CACAC,CACAC,CAAAA,CAAAA,CACAC,CAAiC,CAAA,EACjCC,CAAAA,CAAAA,CAAkC,EAAC,CACnCC,CAAiC,CAAA,KAAA,GAClB,CACf,IAAMC,CAAAA,CACJ,IAAKN,CAAAA,CACDO,CAAmB,CAAA,IAAI,GAC3BN,CAAAA,CAAAA,CACG,OAAQlL,CAAWA,EAAAA,CAAAA,CAAO,MAAM,CAAA,CAChC,GAAKA,CAAAA,CAAAA,EAAWA,CAAO,CAAA,UAAU,CACtC,CAEMyL,CAAAA,CAAAA,CAAqB,IAAI,GAAA,CAC7BP,CAAa,CAAA,GAAA,CAAKQ,CAAgB,EAAA,CAACA,CAAY,CAAA,YAAA,CAAcA,CAAW,CAAC,CAC3E,CAAA,CAEMC,CAA0BP,CAAAA,CAAAA,CAAqB,OACjD,IAAI,GAAA,CAAYA,CAAoB,CAAA,CACpC,IA6CJ,CAAA,GA3CA,MAAM,OAAA,CAAQ,GACZ,CAAA,MAAA,CAAO,IAAKxL,CAAAA,CAAK,CAAE,CAAA,GAAA,CAAI,MAAOpI,CAAAA,EAAQ,CACpC,IAAMoU,CAAAA,CAAgBhM,CAAMpI,CAAAA,CAAG,CACzBqU,CAAAA,CAAAA,CACJJ,CAAmB,CAAA,GAAA,CAAIjU,CAAG,CAAA,EAAG,UAC7B+O,EAAAA,CAAAA,CAAY/O,CAAKyT,CAAAA,CAAAA,CAAY,mBAAmB,CAAA,CAElD,GAAIY,CAAa,GAAA,cAAA,EAAkB,CAACP,CAAAA,CAAuB,CACzDQ,EAAAA,CACElM,CACApI,CAAAA,CAAAA,CACA+T,EACAN,CACAI,CAAAA,CACF,CACA,CAAA,MACF,CAEA,GACE,CAACF,CAAAA,CAAgB,IAAIU,CAAQ,CAAA,EAC7BL,CAAiB,CAAA,GAAA,CAAIK,CAAQ,CAAA,EAC5BF,CAA2B,EAAA,CAACA,CAAwB,CAAA,GAAA,CAAIE,CAAQ,CAAA,CAEjE,OAIF,GAAID,CAAkB,GAAA,IAAA,CAAM,CAC1BL,CAAWM,CAAAA,CAAQ,CAAI,CAAA,IAAA,CACvB,MACF,CAEA,IAAMH,CAAAA,CAAcP,CAAgB,CAAA,GAAA,CAAIU,CAAQ,CAAA,CAChD,GAAIH,CAAAA,EAAeA,CAAY,CAAA,SAAA,CAAW,CACxCH,CAAWM,CAAAA,CAAQ,CAAI,CAAA,MAAMH,CAAY,CAAA,SAAA,CAAUE,CAAa,CAAA,CAChE,MACF,CAEAL,CAAWM,CAAAA,CAAQ,CAAID,CAAAA,EACzB,CAAC,CACH,EAGID,CACF,CAAA,IAAA,IAAW3L,CAAU2L,IAAAA,CAAAA,CACb3L,CAAUuL,IAAAA,CAAAA,GACdA,CAAWvL,CAAAA,CAAM,EAAI,IAK3B,CAAA,CAAA,OAAOuL,CACT,CAAA,CAEaO,EAAqB,CAAA,CAChClM,CACApI,CAAAA,CAAAA,CACA+T,EACAN,CACAI,CAAAA,CAAAA,CAAkC,EAAC,GAChC,CACH,IAAMU,CAAkBnM,CAAAA,CAAAA,CAAMpI,CAAG,CAAA,CACjC,GAAI,CAACuU,CAAmB,EAAA,CAAC,MAAO,CAAA,IAAA,CAAKA,CAAe,CAAE,CAAA,MAAA,CACpD,OAGF,IAAMC,CACJX,CAAAA,CAAAA,CAAsB,MAAS,CAAA,CAAA,CAC3B,IAAI,GAAA,CAAYA,CAAqB,CAAA,CACrC,IAEN,CAAA,GAAI,CAACW,CAAAA,CACH,OAGF,IAAMC,CAAAA,CAAoC,EAAC,CAC3C,IAAWC,IAAAA,CAAAA,IAAU,MAAO,CAAA,IAAA,CAAKH,CAAe,CAAA,CAC1CC,CAAyB,CAAA,GAAA,CAAIE,CAAM,CAAA,GACrCD,CAAa1F,CAAAA,CAAAA,CAAY2F,EAAQjB,CAAY,CAAA,mBAAmB,CAAC,CAAA,CAC/Dc,CAAgBG,CAAAA,CAAM,CAIxB,CAAA,CAAA,MAAA,CAAO,KAAKD,CAAY,CAAA,CAAE,MAAS,CAAA,CAAA,GACrCV,CAAW/T,CAAAA,CAAG,CAAIyU,CAAAA,CAAAA,EAEtB,EAKaE,EAAiB,CAAA,MAC5BtK,CACAoJ,CAAAA,CAAAA,CACAG,CAAiC,CAAA,EACjCC,CAAAA,CAAAA,CAAkC,EAAC,CACnCC,CAAiC,CAAA,KAAA,GACL,CAC5B,GAAI,CAACzJ,CAAAA,CAAO,OACV,OAAO,IAAA,CAGT,IAAMqJ,CAAAA,CAAeD,CAAY,CAAA,UAAA,EAC3BE,CAAAA,CAAAA,CAAkB,IAAI,GAAA,CAC1BD,CAAa,CAAA,GAAA,CAAKQ,CAAgB,EAAA,CAACA,CAAY,CAAA,UAAA,CAAYA,CAAW,CAAC,CACzE,CAGMU,CAAAA,CAAAA,CAAqC,EAAC,CAC5C,IAAWC,IAAAA,CAAAA,IAAkBjB,CAAsB,CAAA,CAEjD,GAAIiB,CAAAA,CAAe,WAAY,EAAA,CAAE,QAAS,CAAA,IAAI,EAC5C,SAGF,IAAIC,CAAkBD,CAAAA,CAAAA,CAMtB,GAJIC,CAAAA,CAAgB,QAAS,CAAA,GAAG,IAC9BA,CAAkBA,CAAAA,CAAAA,CAAgB,KAAM,CAAA,GAAG,CAAE,CAAA,GAAA,EAG3CA,CAAAA,CAAAA,CAAAA,GAAoB,IACtB,SAGF,IAAMC,CACJpB,CAAAA,CAAAA,CAAgB,GAAImB,CAAAA,CAAe,CAAG,EAAA,UAAA,EACtC/F,CAAY+F,CAAAA,CAAAA,CAAiBrB,CAAY,CAAA,mBAAmB,CAC9DmB,CAAAA,CAAAA,CAAyB,IAAKG,CAAAA,CAAU,EAC1C,CACAnB,CAAAA,CAAuBgB,CAEvB,CAAA,IAAMI,CAAmB,CAAA,MAAM,OAAQ,CAAA,GAAA,CACrC3K,CAAO,CAAA,GAAA,CAAI,MAAOjC,CAAAA,EACQ,MAAMoL,EAAAA,CAC5BpL,CACAqL,CAAAA,CAAAA,CACAC,EACAC,CACAC,CAAAA,CAAAA,CACAC,CACAC,CAAAA,CACF,CAGD,CACH,CAEA,CAAA,OAAOkB,CAAiB,CAAA,MAAA,GAAW,CAAIA,CAAAA,CAAAA,CAAiB,CAAC,CAAA,CAAIA,CAC/D,CAAA,CClLO,IAAMC,EAA8C,CAAA,CACzD,UACA,CAAA,aACF,CCLA,CAIO,SAASC,EAAiB3D,CAAAA,CAAAA,CAA8B,CAC7D,IAAM4D,CAAY5D,CAAAA,CAAAA,CAAO,IACnB6D,CAAAA,CAAAA,CAAgBrG,EAAYoG,CAAW,CAAA,OAAO,CACpD,CAAA,OAAOE,mBAAOD,CAAAA,CAAa,CAC7B,CAEO,SAASE,EAAAA,EAA2C,CACzD,OAAO,EACT,CCgDO,IAAeC,GAAf,MAAeA,EAAAA,SAAchC,EAAO,CAsBzC,WAAW,KAAA,EAAgB,CACzB,IAAMiC,CAAa,CAAA,MAAA,CAAO,wBAAyB,CAAA,IAAA,CAAM,OAAO,CAAA,CAChE,OAAIA,CAAAA,EAAc,UAAWA,CACpBA,CAAAA,CAAAA,CAAW,KAGbN,CAAAA,EAAAA,CAAiB,IAAI,CAC9B,CAKA,WAAW,KAAMjV,CAAAA,CAAAA,CAAe,CAC9B,MAAA,CAAO,cAAe,CAAA,IAAA,CAAM,OAAS,CAAA,CACnC,MAAAA,CACA,CAAA,QAAA,CAAU,IACV,CAAA,UAAA,CAAY,IACZ,CAAA,YAAA,CAAc,IAChB,CAAC,EACH,CAKA,WAAW,UAAiC,EAAA,CAC1C,OAAOwV,EAAAA,CAAc,IAAI,CAC3B,CAEA,WAAc,EAAA,CACZ,KAAM,GACR,CAKA,aAAa,GAEXtU,CAAAA,CAAAA,CAAkC,EAAC,CACD,CAGlC,OAAQ,MAFY,IAAA,CACa,oBAAwBA,CAAAA,CAAO,EACrC,IAAK,CAAA,CAC9B,WAAaA,CAAAA,CAAAA,CAAQ,WAAc,CAAA,CAAC,YAAc,CAAA,aAAa,CAAI,CAAA,EACrE,CAAC,CACH,CAKA,OAAO,KAAA,CAELA,EACsB,CAGtB,OAFoB,IACa,CAAA,oBAAA,CAAwBA,CAAO,CAAA,CAC5C,KAAM,EAC5B,CAMA,OAAO,QAELA,CAAAA,CAAAA,CAC8C,CAG9C,OAFoB,IACa,CAAA,oBAAA,CAAwBA,CAAO,CAC5C,CAAA,QAAA,EACtB,CAMA,aAAa,KAAA,CAEXA,CACuC,CAAA,CAGvC,OAFoB,IACa,CAAA,oBAAA,CAAwBA,CAAO,CAAA,CAC5C,KAAM,EAAA,CAAE,GAAI,CAAA,CAC9B,YAAaA,CAAS,EAAA,WAAA,CAAc,CAAC,YAAA,CAAc,aAAa,CAAA,CAAI,EACtE,CAAC,CACH,CAKA,aAAa,IAMXuU,CAAAA,CAAAA,CACAvU,CACoC,CAAA,CAGpC,OAAQ,MAFY,IAAA,CACa,oBAAwBA,CAAAA,CAAO,CACrC,CAAA,IAAA,CACzBuU,CACF,CACF,CAKA,aAAa,aAMXC,CAAAA,CAAAA,CAMAxU,CACkC,CAAA,CAGlC,OAAQ,MAFY,KACa,oBAAwBA,CAAAA,CAAO,CACrC,CAAA,aAAA,CACzBwU,CACF,CACF,CAKA,aAAa,OAMXA,CAAAA,CAAAA,CAEAxU,CACyC,CAAA,CAGzC,OAAQ,MAFY,IACa,CAAA,oBAAA,CAAwBA,CAAO,CACrC,CAAA,OAAA,CACzBwU,CACF,CACF,CAKA,aAAa,MAMXnN,CAAAA,CAAAA,CACAvI,EACAkB,CAAkC,CAAA,EACE,CAAA,CAGpC,OAAQ,MAFY,IACa,CAAA,oBAAA,CAAwBA,CAAO,CACrC,CAAA,IAAA,CAAK,CAC9B,WAAA,CAAaA,CAAQ,CAAA,WAAA,CAAc,CAAC,YAAA,CAAc,aAAa,CAAA,CAAI,EAAC,CACpE,KAAO,CAAA,CACL,CAACqH,CAA4B,EAAGvI,CAClC,CACF,CAAC,CACH,CAKA,aAAa,SAMXuI,CAAAA,CAAAA,CACAvI,CACAkB,CAAAA,CAAAA,CAAkC,EAAC,CACM,CAGzC,OAAQ,MAFY,IAAA,CACa,qBAAwBA,CAAO,CAAA,CACrC,OAAQ,CAAA,CACjC,WAAaA,CAAAA,CAAAA,CAAQ,WAAc,CAAA,CAAC,YAAc,CAAA,aAAa,CAAI,CAAA,EACnE,CAAA,KAAA,CAAO,CACL,CAACqH,CAAiB,EAAGvI,CACvB,CACF,CAAC,CACH,CAKA,aAAa,mBAAA,CAMXA,EACAkB,CAAuD,CAAA,EACd,CAAA,CAGzC,OAAQ,MAFY,IACa,CAAA,oBAAA,CAAwBA,CAAO,CACrC,CAAA,mBAAA,CAAoBlB,CAAK,CAKtD,CAKA,aAAa,OAEXmI,CAAAA,CAAAA,CACAjH,CAAuD,CAAA,EAChB,CAAA,CACvC,IAAMsS,CAAAA,CAAc,IACdmC,CAAAA,CAAAA,CAAenC,EAAY,oBAAwBtS,CAAAA,CAAO,CAC1DsI,CAAAA,CAAAA,CAAagK,CAAY,CAAA,UAAA,CACzBoC,CAAkBzN,CAAAA,CAAAA,CAAMqB,CAAU,CAAA,CAClCqM,CAAiB,CAAA,MAAMF,CAAa,CAAA,mBAAA,CACxCC,CACF,CAAA,CACA,OAAKC,CACI,EAAA,IAIX,CAUA,aAAa,MAEXC,CAAAA,CAAAA,CACA5U,CAAqD,CAAA,EACrB,CAAA,CAGhC,OAFoB,IAAA,CACa,oBAAwBA,CAAAA,CAAO,CAC5C,CAAA,MAAA,CAAO4U,EAAgB,CACzC,WAAA,CAAa5U,CAAQ,CAAA,WAAA,CACrB,SAAWA,CAAAA,CAAAA,CAAQ,SACrB,CAAC,CACH,CAWA,aAAa,UAEX6U,CAAAA,CAAAA,CACA7U,CAAqD,CAAA,EACnB,CAAA,CAClC,OAAK6U,CAAW,CAAA,MAAA,CAII,IACa,CAAA,oBAAA,CAAwB7U,CAAO,CAAA,CAC5C,UAAW6U,CAAAA,CAAAA,CAAmB,CAChD,WAAA,CAAa7U,CAAQ,CAAA,WAAA,CACrB,SAAWA,CAAAA,CAAAA,CAAQ,SACrB,CAAC,EARQ,EASX,CAcA,aAAa,IAEX8U,CAAAA,CAAAA,CACAC,CACAC,CAAAA,CAAAA,CACAC,CAIAjV,CAAAA,CAAAA,CAAwE,EAAC,CAC1D,CAKf,GAJK,KAAM,CAAA,OAAA,CAAQgV,CAAW,CAC5BA,GAAAA,CAAAA,CAAc,CAACA,CAAW,CAGxB,CAAA,CAAA,CAACA,CAAY,CAAA,MAAA,CACf,OAGF,IAAM1C,CAAc,CAAA,IAAA,CAEd4C,CADiBC,CAAAA,EAAAA,CAAa7C,CAAW,CAAA,CACZ,KAChC8C,CAAMA,EAAAA,CAAAA,CAAE,UAAeN,GAAAA,CAC1B,CAEA,CAAA,GAAI,CAACI,CAAAA,CACH,MAAM,IAAIvY,CAAAA,CACR,CAAG2V,EAAAA,CAAAA,CAAY,IAAI,CAAA,MAAA,CAAA,CACnB,oBACF,CAAA,CAGF,GAAI4C,CAAY,CAAA,IAAA,GAAS,YACvB,CAAA,MAAM,IAAIvY,CAAAA,CACR,CAAG2V,EAAAA,CAAAA,CAAY,IAAI,CAAA,MAAA,CAAA,CACnB,2BACF,CAAA,CAGF,IAAM+C,CAAAA,CAAsBzH,CAC1BsH,CAAAA,CAAAA,CAAY,eACZlV,CAAQ,CAAA,cAAA,EAAkBsS,CAAY,CAAA,sBACxC,CAEMgD,CAAAA,CAAAA,CAAuB1H,CAC3BsH,CAAAA,CAAAA,CAAY,eACZlV,CAAAA,CAAAA,CAAQ,cAAkBsS,EAAAA,CAAAA,CAAY,sBACxC,CAAA,CAEMiD,CAA0BP,CAAAA,CAAAA,CAAY,IAAI,CAACQ,CAAAA,CAAYC,CAAW,IAAA,CACtE,CAACJ,CAAmB,EAAGN,CAAAA,CAAUzC,CAAY,CAAA,UAAqB,CAClE,CAAA,CAACgD,CAAoB,EACnBE,CAAWN,CAAAA,CAAAA,CAAY,MAAM,UAAqB,CAAA,CACpD,GAAID,CAAAA,CAAsBA,CAAoBO,CAAAA,CAAAA,CAAYC,CAAK,CAAA,CAAI,EACrE,CAAA,CAAE,CAEF,CAAA,MAAMC,CAAqBtB,SAAAA,EAAM,CAI/B,WAAW,OAAQ,CACjB,OAAOc,CAAY,CAAA,YACrB,CACF,CAPMQ,CACG,CAAA,sBAAA,CAAyC,UAD5CA,CAAAA,CAAAA,CAEG,mBAAsC,CAAA,UAAA,CAY/C,MAJEA,CAAAA,CAAa,oBACX1V,CAAAA,CACF,EAEwB,UAAWuV,CAAAA,CAAuB,EAC9D,CAQA,aAAa,YAAA,CAEXI,CACAC,CAAAA,CAAAA,CACA5V,CAAuD,CAAA,EACvB,CAAA,CAChC,GAAI,CACF,IAAMsS,CAAAA,CAAc,KACdmC,CAAenC,CAAAA,CAAAA,CAAY,oBAAwBtS,CAAAA,CAAO,CAChE,CAAA,OAAA4V,CACEtD,EAAAA,CAAAA,CAAY,YAAaqD,CAAAA,CAAAA,CAAkBC,CAA2B,CAAA,CACnD,MAAMnB,CAAAA,CAAa,YAAakB,CAAAA,CAAgB,CAEvE,CAAS7Y,MAAAA,CAAAA,CAAO,CACd,MACEA,CAAiBH,YAAAA,CAAAA,EACjBG,CAAM,CAAA,OAAA,GAAY,2BAEZ,IAAIH,CAAAA,CACR,CAAG,EAAA,IAAA,CAAK,IAAI,CAAA,cAAA,CAAA,CACZ,0BACF,CAAA,CAGIG,CACR,CACF,CAKA,aAAa,aAAA,CAEX+Y,CACAC,CAAAA,CAAAA,CACA9V,CAEI,CAAA,EAQJ,CAAA,CACKA,CAAQ,CAAA,YAAA,GACXA,CAAQ,CAAA,YAAA,CAAe,KAIzB,CAAA,CAAA,IAAMyU,EADc,IACa,CAAA,oBAAA,CAAwBzU,CAAO,CAAA,CAC1D+V,CAAa,CAAA,MAAMtB,CAAa,CAAA,OAAA,CAAQ,CAC5C,KAAA,CAAOoB,CACT,CAAC,CAED,CAAA,GAAIE,CACF,CAAA,OAAI/V,EAAQ,YACH,CAAA,CACL,KAAO,CAAA,KAAA,CACP,KAAO+V,CAAAA,CACT,CAGKA,CAAAA,CAAAA,CAGT,IAAMC,CAAAA,CAAY,MAAMvB,CAAAA,CAAa,MAAOqB,CAAAA,CAAe,CAC3D,CAAA,OAAI9V,EAAQ,YACH,CAAA,CACL,KAAO,CAAA,IAAA,CACP,KAAOgW,CAAAA,CACT,CAGKA,CAAAA,CACT,CAKA,aAAa,MAAA,CAEXH,CACA/L,CAAAA,CAAAA,CACA9J,CAAqD,CAAA,CACnD,gBAAkB,CAAA,IACpB,EACgC,CAChC,IAAMsS,CAAc,CAAA,IAAA,CACdmC,CAAenC,CAAAA,CAAAA,CAAY,oBAAwBtS,CAAAA,CAAO,CAI1D+V,CAAAA,CAAAA,CAHoB,MAAO,CAAA,IAAA,CAAKF,CAAc,CAAA,CAAE,MAAS,CAAA,CAAA,CAK3D,MAAMpB,CAAa,CAAA,OAAA,CAAQ,CACzB,WAAA,CAAazU,CAAQ,CAAA,WAAA,CAAc,CAAC,YAAA,CAAc,aAAa,CAAA,CAAI,EAAC,CACpE,KAAO6V,CAAAA,CACT,CAAC,CAAA,CAJD,KAMJ,OAAIE,CAAAA,EACDjM,CAAWwI,CAAAA,CAAAA,CAAY,UAAqB,CAAA,CAC3CyD,CAAUzD,CAAAA,CAAAA,CAAY,UAA4C,CAAA,CAEhEtS,CAAQ,CAAA,gBAAA,CACF,MAAMyU,CAAAA,CAAa,YAAa3K,CAAAA,CAAAA,CAAW,CACjD,SAAW9J,CAAAA,CAAAA,CAAQ,SACrB,CAAC,CAGI+V,CAAAA,CAAAA,EAGD,MAAMtB,CAAAA,CAAa,OAAO3K,CAAW,CAAA,CAC3C,WAAa9J,CAAAA,CAAAA,CAAQ,WACrB,CAAA,SAAA,CAAWA,CAAQ,CAAA,SAAA,EAAc,CAAC,GAAG,CACvC,CAAC,CACH,CAMA,aAAa,UAEXiW,CAAAA,CAAAA,CACAnM,CACA9J,CAAAA,CAAAA,CAAqD,CACnD,gBAAA,CAAkB,IACpB,CAAA,CACkC,CAClC,GAAI,CAAC8J,CAAK,CAAA,MAAA,CACR,OAAO,EAGT,CAAA,IAAMwI,CAAc,CAAA,IAAA,CACdmC,CAAenC,CAAAA,CAAAA,CAAY,oBAAwBtS,CAAAA,CAAO,CAEhE,CAAA,GACE,CAAC8J,CAAAA,CAAK,MAAOnC,CAAW,EAAA,CACtB,IAAMuO,CAAAA,CAAa,IAAI,GAAA,CAAI,MAAO,CAAA,IAAA,CAAKvO,CAAM,CAAC,CAC9C,CAAA,OAAOsO,CAAgB,CAAA,KAAA,CAAOrE,CAAQsE,EAAAA,CAAAA,CAAW,IAAItE,CAAa,CAAC,CACrE,CAAC,CAED,CAAA,MAAM,IAAIjV,CAAAA,CACR,oBACA,sCACF,CAAA,CAGF,IAAMwZ,CAAAA,CAAkB,MAAO,CAAA,IAAA,CAAKrM,CAAK,CAAA,CAAC,CAAC,CACrCsM,CAAAA,CAAAA,CAAe,MAAM3B,CAAAA,CAAa,UACtCwB,CAAAA,CAAAA,CACAE,CACArM,CAAAA,CAAAA,CACA,CACE,WAAA,CAAa9J,CAAQ,CAAA,WAAA,CACrB,SAAWA,CAAAA,CAAAA,CAAQ,SACnB,CAAA,gBAAA,CAAkBA,EAAQ,gBAAoB,EAAA,IAChD,CACF,CAAA,CAEM2B,CAAS2Q,CAAAA,CAAAA,CAAY,WAAY,CAAA,SAAA,EACvC,CAAA,GAAIwB,EAAuB,CAAA,QAAA,CAASnS,CAAM,CAAA,CACxC,OAAQ,MAAM6R,GACZ4C,CACA9D,CAAAA,CAAAA,CACAtS,CAAQ,CAAA,SACV,CAGF,CAAA,IAAMqW,CAAc5B,CAAAA,CAAAA,CAAa,KAAM,EAAA,CACnCzU,CAAQ,CAAA,SAAA,EAAW,MACrBqW,EAAAA,CAAAA,CAAY,MAAO,CAAA,GAAGrW,EAAQ,SAAS,CAAA,CAGzC,IAAMsW,CAAAA,CAAc,IAAI,GAAA,CACxB,OAAAL,CAAAA,CAAgB,QAAS5O,CAAW,EAAA,CAClCyC,CAAK,CAAA,OAAA,CAASnC,CAAW,EAAA,CACvB2O,CAAY,CAAA,GAAA,CAAIjP,EAAkB,CAChC,GAAIiP,CAAY,CAAA,GAAA,CAAIjP,CAAgB,CAAA,EAAK,EAAC,CAC1CM,CAAON,CAAAA,CAAmD,CAC5D,CAAC,EACH,CAAC,EACH,CAAC,EAEDgP,CAAY,CAAA,KAAA,CAAOhV,CAAU,EAAA,CAC3B4U,CAAgB,CAAA,OAAA,CAAS5O,CAAW,EAAA,CAClChG,CAAM,CAAA,SAAA,CAAUgG,CAAQiP,CAAAA,CAAAA,CAAY,GAAIjP,CAAAA,CAAgB,CAAK,EAAA,EAAE,EACjE,CAAC,EACH,CAAC,CAEMgP,CAAAA,CAAAA,CAAY,IAAK,CAAA,CACtB,WAAarW,CAAAA,CAAAA,CAAQ,WAAc,CAAA,CAAC,YAAc,CAAA,aAAa,CAAI,CAAA,EACrE,CAAC,CACH,CAKA,aAAa,YAEX2V,CAAAA,CAAAA,CACA3V,CACe,CAAA,CAGf,OAFoB,IACa,CAAA,oBAAA,CAAwBA,CAAO,CAAA,CAC5C,YAAa2V,CAAAA,CAAgB,CACnD,CAQA,aAAa,UAEXA,CAAAA,CAAAA,CACAY,CAIAvW,CAAAA,CAAAA,CACgC,CAChC,IAAMsS,CAAc,CAAA,IAAA,CACd,CACJ,MAAA,CAAAjL,CAASiL,CAAAA,CAAAA,CAAY,gBACrB,CAAA,KAAA,CAAAxT,CAAQwT,CAAAA,CAAAA,CAAY,eACtB,CAAIiE,CAAAA,CAAAA,EAAqB,EAAC,CAS1B,OAPAZ,CAAAA,CAAiBtO,CAAiB,CAAA,CAAIvI,CAKtC,CAAA,MAJqBwT,CAAY,CAAA,oBAAA,CAAwB,CACvD,GAAA,CAAKtS,CAAS,EAAA,GAAA,CACd,WAAYA,CAAS,EAAA,UACvB,CAAC,CAAA,CACkB,YAAa2V,CAAAA,CAAgB,CAE5C,CAAA,OAAO7W,CAAU,EAAA,QAAA,EACnB6W,CAAiBtO,CAAAA,CAAiB,CAAI,CAAA,IAAI,IAAKvI,CAAAA,CAAK,EAC7C6W,CAGTA,GAAAA,CAAAA,CAAiBtO,CAAiB,CAAA,CAAIvI,CAC/B6W,CAAAA,CAAAA,CACT,CAKA,aAAa,SAEX3V,CAAkC,CAAA,EACnB,CAAA,CAGf,OAFoB,IAAA,CACa,oBAAwBA,CAAAA,CAAO,EAC5C,KAAM,EAAA,CAAE,QAAS,EACvC,CAKA,aAAa,YAA2C,EAAA,CACtD,IAAMsS,CAAAA,CAAc,IACpB,CAAA,OAAAA,CAAY,CAAA,mBAAA,EACLA,CAAAA,CAAAA,CAAY,YAAY,YAAaA,CAAAA,CAAAA,CAAY,KAAK,CAC/D,CAKA,aAAa,YAA0C,EAAA,CACrD,IAAMA,CAAAA,CAAc,IACpB,CAAA,OAAAA,CAAY,CAAA,mBAAA,EACLA,CAAAA,CAAAA,CAAY,YAAY,YAAaA,CAAAA,CAAAA,CAAY,KAAK,CAC/D,CAKA,aAAa,cAA2C,EAAA,CACtD,IAAMA,CAAAA,CAAc,IACpB,CAAA,OAAAA,CAAY,CAAA,mBAAA,EACLA,CAAAA,CAAAA,CAAY,YAAY,cAAeA,CAAAA,CAAAA,CAAY,KAAK,CACjE,CAKA,OAAO,YACLkE,CAAAA,CAAAA,CACA1M,EACM,CACN,IAAA,IAAWjL,CAAOiL,IAAAA,CAAAA,CAChB,MAAO,CAAA,MAAA,CAAO0M,CAAa,CAAA,CAAE,CAAC3X,CAAG,EAAGiL,CAAKjL,CAAAA,CAAG,CAAE,CAAC,EAEnD,CAsEA,OAAO,UAAA,EAA2B,CAChC,OAAO4X,EAAgB,CAAA,IAAI,CAC7B,CAKA,OAAO,YAAmC,EAAA,CACxC,OAAOC,EAAAA,CAAqB,IAAI,CAClC,CAKA,OAAO,UAA0B,EAAA,CAC/B,OAAOC,EAAAA,CAAW,IAAI,CACxB,CAEA,OAAO,YAA2B,CAChC,OAAOC,EAAW,CAAA,IAAI,CACxB,CAQA,OAAO,MAAA,CAAOhD,CAAuBiD,CAAAA,GAAAA,CAAAA,CAAuC,CAC1ExP,CAAAA,CAAO,GAAGwP,CAAI,CAAE,CAAA,IAAA,CAAK,UAAWjD,CAAU,EAC5C,CAMA,OAAO,MAAOA,CAAAA,CAAAA,CAAAA,GAAuBiD,CAAuC,CAAA,CAC1EC,GAAO,GAAGD,CAAI,CAAE,CAAA,IAAA,CAAK,SAAWjD,CAAAA,CAAU,EAC5C,CAMA,OAAO,OACLA,CAAAA,CAAAA,CAAAA,GACGiD,CACG,CAAA,CACNE,EAAQ,CAAA,GAAGF,CAAI,CAAA,CAAE,IAAK,CAAA,SAAA,CAAWjD,CAAU,EAC7C,CAMA,OAAO,SACLA,CAAAA,CAAAA,CAAAA,GACGiD,EACG,CACNG,EAAAA,CAAU,GAAGH,CAAI,CAAE,CAAA,IAAA,CAAK,SAAWjD,CAAAA,CAAU,EAC/C,CAMA,OAAO,UAAA,CACLA,CACGiD,CAAAA,GAAAA,CAAAA,CACG,CACNI,EAAAA,CAAW,GAAGJ,CAAI,CAAA,CAAE,IAAK,CAAA,SAAA,CAAWjD,CAAU,EAChD,CAOA,OAAe,mBAA4B,EAAA,CACzC,IAAMxR,CAAAA,CAAM8U,EAAc,CAAA,QAAA,CAC1B,GAAI,CAAC9U,EACH,MAAM,IAAIzF,CACR,CAAA,yFAAA,CACA,4BACF,CAAA,CAGF,IAAK,CAAA,WAAA,CAAcyF,EACrB,CAKA,OAAe,oBAEbpC,CAAAA,CAAAA,CACiB,CACjB,IAAIyU,CAEJ,CAAA,GAAIzU,GAAS,UACXyU,CAAAA,CAAAA,CAAezU,CAAQ,CAAA,UAAA,CAAW,eAChC,CAAA,IACF,CACSA,CAAAA,KAAAA,GAAAA,CAAAA,EAAS,GAClByU,CAAAA,CAAAA,CAAezU,CAAQ,CAAA,GAAA,CAAI,GAAI,CAAA,eAAA,CAC7B,IACF,CAAA,CAAA,KACK,CACL,IAAMsS,CAAAA,CAAc,IACpBA,CAAAA,CAAAA,CAAY,mBAAoB,EAAA,CAChCmC,CAAenC,CAAAA,CAAAA,CAAY,WAAY,CAAA,eAAA,CAAmBA,CAAW,EACvE,CAEA,OAAItS,CAAS,EAAA,eAAA,EACXyU,EAAa,kBAAmBzU,CAAAA,CAAAA,CAAQ,eAAe,CAAA,CAGlDyU,CACT,CAOA,UAEE3K,CAAAA,CAAAA,CACM,CACW,IAAA,CACY,WAEjB,CAAA,YAAA,CAAa,IAAsBA,CAAAA,CAAoB,EACrE,CAMA,MAAM,IACJ9J,CAAAA,CAAAA,CAAuD,EAAC,CACxD,CACA,IAAMmX,CAAW,CAAA,IAAA,CACX7E,EAAc6E,CAAS,CAAA,WAAA,CAEvB7O,CAAagK,CAAAA,CAAAA,CAAY,UAC/B,CAAA,GAAI,CAAChK,CAAAA,CACH,MAAM,IAAI3L,CAAAA,CACR2V,CAAY,CAAA,IAAA,CAAO,QACnB,CAAA,0BACF,CAGF,CAAA,IAAMoC,CACJyC,CAAAA,CAAAA,CAAS7O,CAAmC,CAAA,CAExCuN,CAAiBnB,CAAAA,CAAAA,CAClB,CACC,CAACpM,CAAU,EAAGoM,CAChB,CACA,CAAA,EAEE0C,CAAAA,CAAAA,CAAUD,CACVvV,CAAAA,CAAAA,CAAS,MAAM0Q,CAAAA,CAAY,MAC/BuD,CAAAA,CAAAA,CACAuB,CACA,CAAA,CACE,gBAAkB,CAAA,IAAA,CAClB,GAAGpX,CACL,CACF,CAEA,CAAA,OAAAsS,CAAY,CAAA,YAAA,CAAa,IAAsB1Q,CAAAA,CAAsB,CAC9D,CAAA,IACT,CAMA,MAAM,MACJwV,CAAAA,CAAAA,CACApX,CAAuD,CAAA,GACvD,CACA,IAAMmX,CAAW,CAAA,IAAA,CACX7E,CAAc6E,CAAAA,CAAAA,CAAS,WAGvB7O,CAAAA,CAAAA,CAAagK,EAAY,UAC/B,CAAA,GAAI,CAAChK,CAAAA,CACH,MAAM,IAAI3L,CACR2V,CAAAA,CAAAA,CAAY,KAAO,QACnB,CAAA,0BACF,CAMF,CAAA,GAAI,CAFF6E,CAAAA,CAAS7O,CAAmC,CAAA,CAG5C,MAAM,IAAI3L,CACR2V,CAAAA,CAAAA,CAAY,IAAO,CAAA,UAAA,CACnB,gCACF,CAAA,CAGF,MAAMA,CAAY,CAAA,YAAA,CAAa6E,CAA0BC,CAAAA,CAAAA,CAASpX,CAAO,EAC3E,CAMA,MAAM,UAEJuW,CAAAA,CAAAA,CAIAvW,CACA,CAAA,CACA,IAAMmX,CAAAA,CAAW,IACX7E,CAAAA,CAAAA,CAAc6E,EAAS,WAGvB7O,CAAAA,CAAAA,CAAagK,CAAY,CAAA,UAAA,CAC/B,GAAI,CAAChK,CACH,CAAA,MAAM,IAAI3L,CAAAA,CACR2V,CAAY,CAAA,IAAA,CAAO,cACnB,CAAA,0BACF,CAMF,CAAA,GAAI,CAFF6E,CAAS7O,CAAAA,CAAmC,CAG5C,CAAA,MAAM,IAAI3L,CAAAA,CACR2V,CAAY,CAAA,IAAA,CAAO,eACnB,gCACF,CAAA,CAGF,MAAMA,CAAAA,CAAY,UAChB6E,CAAAA,CAAAA,CACAZ,CAIAvW,CAAAA,CACF,EACF,CAMA,MAAM,MACJA,CAAAA,CAAAA,CAAuD,EAAC,CACxD,CACA,IAAMmX,CAAW,CAAA,IAAA,CACX7E,CAAc6E,CAAAA,CAAAA,CAAS,WAGvB7O,CAAAA,CAAAA,CAAagK,CAAY,CAAA,UAAA,CAC/B,GAAI,CAAChK,CAAAA,CACH,MAAM,IAAI3L,CACR2V,CAAAA,CAAAA,CAAY,IAAO,CAAA,UAAA,CACnB,0BACF,CAAA,CAMF,GAAI,CAFF6E,CAAS7O,CAAAA,CAAmC,CAG5C,CAAA,MAAM,IAAI3L,CACR2V,CAAAA,CAAAA,CAAY,IAAO,CAAA,UAAA,CACnB,gCACF,CAAA,CAGF,MAAMA,CAAAA,CAAY,YAAa,CAAA,IAAA,CAAsBtS,CAAO,EAC9D,CAMA,MAAM,OACJA,CAAAA,CAAAA,CACA,CACA,IAAMmX,CAAAA,CAAW,IACX7E,CAAAA,CAAAA,CAAc6E,CAAS,CAAA,WAAA,CAGvB7O,CAAagK,CAAAA,CAAAA,CAAY,WAC/B,GAAI,CAAChK,CACH,CAAA,MAAM,IAAI3L,CAAAA,CACR2V,CAAY,CAAA,IAAA,CAAO,YACnB,0BACF,CAAA,CAMF,GAAI,CAFF6E,CAAS7O,CAAAA,CAAmC,CAG5C,CAAA,MAAM,IAAI3L,CAAAA,CACR2V,CAAY,CAAA,IAAA,CAAO,WACnB,CAAA,gCACF,CAGF,CAAA,IAAM+E,EAAY,MAAM/E,CAAAA,CAAY,OAAQ,CAAA,IAAA,CAAsBtS,CAAO,CAAA,CACzE,OAAAsS,CAAAA,CAAY,YAAa,CAAA,IAAA,CAAsB+E,CAAyB,CAAA,CACjE,IACT,CACF,CA3jCsBjD,CAAAA,EAAAA,CAMb,iBAAmB,WANNA,CAAAA,EAAAA,CAYb,eAAoC1F,CAAAA,EAAAA,EAZtC,CAAA,IAAe4I,EAAflD,CAAAA,EAAAA,CC1CA,IAAemD,EAAAA,CAAf,KAAwB,CAOnB,WAAYtQ,CAAAA,CAAAA,CAAqB2M,CAAoB,CAAA,CAL/D,WAAsB0D,EACtB,CAAA,IAAA,CAAA,UAAA,CAAqB,EAErB,CAAA,IAAA,CAAA,YAAA,CAAuB,EAGrB,CAAA,IAAA,CAAK,KAAQrQ,CAAAA,CAAAA,CACb,KAAK,UAAa2M,CAAAA,CAAAA,CAClB,IAAK,CAAA,YAAA,CAAe,IAAK,CAAA,KAAA,CAAM,MACjC,CACF,EC3BO,IAAM4D,EAAAA,CAAN,cAAwBD,EAAS,CAItC,WAAA,CACEE,CACA7D,CAAAA,CAAAA,CACA8D,CACA,CAAA,CACA,KAAMD,CAAAA,CAAAA,CAAc7D,CAAU,CAAA,CAC9B,IAAK,CAAA,UAAA,CAAa8D,EAClB,IAAK,CAAA,IAAA,CAAO,YACd,CACF,CCbO,CAAA,IAAMC,EAAN,CAAA,cAAsBJ,EAAS,CAIpC,WAAA,CACEE,CACA7D,CAAAA,CAAAA,CACA8D,CACA,CAAA,CACA,KAAMD,CAAAA,CAAAA,CAAc7D,CAAU,CARhC,CAAA,IAAA,CAAA,IAAA,CAAqB,SASnB,CAAA,IAAA,CAAK,UAAa8D,CAAAA,CAAAA,CAClB,IAAK,CAAA,IAAA,CAAO,UACd,CACF,CCbO,CAAA,IAAME,EAAN,CAAA,cAAqBL,EAAS,CAInC,YACEE,CACA7D,CAAAA,CAAAA,CACA8D,CACA,CAAA,CACA,KAAMD,CAAAA,CAAAA,CAAc7D,CAAU,CAAA,CAC9B,KAAK,UAAa8D,CAAAA,CAAAA,CAClB,IAAK,CAAA,IAAA,CAAO,SACd,CACF,CCbO,CAAA,IAAMG,GAAN,cAAyBN,EAAS,CAuBvC,WAAA,CACEtQ,CACA2M,CAAAA,CAAAA,CACA9J,CAMA,CAAA,CACA,KAAM7C,CAAAA,CAAAA,CAAO2M,CAAU,CAAA,CAhCzB,IAAO,CAAA,IAAA,CAAA,YAAA,CAiCL,IAAK,CAAA,YAAA,CAAe9J,EAAK,YACzB,CAAA,IAAA,CAAK,YAAe7C,CAAAA,CAAAA,CAAM,KAC1B,CAAA,IAAA,CAAK,YAAe6C,CAAAA,CAAAA,CAAK,YACzB,CAAA,IAAA,CAAK,cAAiBA,CAAAA,CAAAA,CAAK,cAC3B,CAAA,IAAA,CAAK,eAAkBA,CAAAA,CAAAA,CAAK,gBAC9B,CACF,CAAA,CCzCO,IAAMgO,EAAsB,CAAA,MAAA,CAAO,SAAS,CAAA,CACtCC,EAA2B,CAAA,MAAA,CAAO,YAAY,CAAA,CAC9CC,EAAwB,CAAA,MAAA,CAAO,WAAW,CAC1CC,CAAAA,EAAAA,CAAqB,MAAO,CAAA,SAAS,CACrCC,CAAAA,EAAAA,CAAsB,MAAO,CAAA,SAAS,EAEtCC,EAAwBnW,CAAAA,CAAAA,EAC5B,CAAGoW,EAAAA,mBAAAA,CAAU,QAASpW,CAAAA,CAAK,CAAC,CAAA,GAAA,CAAA,CAGxBqW,GAAsB,CAACrW,CAAAA,CAAeqF,CAC1C,GAAA,CAAA,IAAA,EAAOrF,CAAK,CAAA,CAAA,EAAIqF,CAAM,CAAA,CAAA,CAGlBiR,EAAiC,CAAA,CAC5CtW,CACAqF,CAAAA,CAAAA,GAEO,CAAMrF,GAAAA,EAAAA,CAAK,CAAIqF,CAAAA,EAAAA,CAAM,GAGjBkR,CAA6B,CAAA,CACxCvW,CACAwW,CAAAA,CAAAA,CACAC,CAEO,GAAA,CAAA,GAAA,EAAMzW,CAAK,CAAA,CAAA,EAAIwW,CAAU,CAAA,EAAGC,CAAc,CAAA,CAAA,CAAA,EAAIA,CAAW,CAAA,CAAA,CAAK,EAAE,CAAA,CAAA,CAG5DC,GAAqC,CAChD1W,CAAAA,CACAqF,CAEO,GAAA,CAAA,GAAA,EAAMrF,CAAK,CAAA,CAAA,EAAIqF,CAAM,CAAA,CAAA,CCkIvB,SAASA,CAAAA,CACdrH,CAAyB,CAAA,CACvB,UAAY,CAAA,KACd,CACmB,CAAA,CACnB,IAAM2Y,CAAe3Y,CAAAA,CAAAA,EAAS,UAAc,EAAA,KAAA,CAC5C,OAAO,CAACoQ,CAAgBC,CAAAA,CAAAA,GAAiC,CACvD,IAAMuI,CAAAA,CAAcxI,CAAO,CAAA,WAAA,CAC3B,GAAIuI,CAAAA,CAAc,CAEhB,GADmB1I,EAAQ,WAAY8H,CAAAA,EAAAA,CAA0B3H,CAAM,CAAA,CAErE,MAAM,IAAIzT,CACR,CAAA,wBAAA,CACA,mCACF,CAAA,CAEFsT,CAAQ,CAAA,cAAA,CAAe8H,EAA0B1H,CAAAA,CAAAA,CAAaD,CAAM,EACtE,CACA,IAAMyI,CAAAA,CACJ7Y,CAAQ,CAAA,YAAA,EACR4N,CAAYyC,CAAAA,CAAAA,CAAuBuI,CAAY,CAAA,sBAAsB,CACjEvR,CAAAA,CAAAA,CAAqB,CACzB,UAAA,CAAYgJ,CACZ,CAAA,SAAA,CAAWrQ,CAAQ,CAAA,SAAA,CACnB,QAASA,CAAQ,CAAA,OAAA,CACjB,MAAQA,CAAAA,CAAAA,CAAQ,MAChB,CAAA,SAAA,CAAW2Y,CACX,CAAA,wBAAA,CACE3Y,CAAQ,CAAA,wBAAA,EACR0Y,EACEE,CAAAA,CAAAA,CAAY,KACZvI,CAAAA,CACF,CACF,CAAA,UAAA,CAAYrQ,EAAQ,UACpB,CAAA,YAAA,CAAA6Y,CACA,CAAA,OAAA,CAAS7Y,CAAQ,CAAA,OAAA,CACjB,IAAMA,CAAAA,CAAAA,CAAQ,KACd,MAASA,CAAAA,CAAAA,EAA4C,MACrD,CAAA,SAAA,CAAYA,CAA+C,EAAA,SAAA,CAC3D,KAAQA,CAAAA,CAAAA,EAAuD,MAC/D,YAAeA,CAAAA,CAAAA,EACX,YACJ,CAAA,WAAA,CAAa,CACX,QAAA,CAAUA,CAAQ,CAAA,QAAA,CAClB,OAASA,CAAAA,CAAAA,CAAQ,OACnB,CACF,CACM8Y,CAAAA,CAAAA,CACJ7I,CAAQ,CAAA,WAAA,CAA0B6H,GAAqB1H,CAAM,CAAA,EAAK,EAAC,CACrE0I,CAAgB,CAAA,IAAA,CAAKzR,CAAM,CAAA,CAC3B4I,CAAQ,CAAA,cAAA,CAAe6H,EAAqBgB,CAAAA,CAAAA,CAAiB1I,CAAM,EACrE,CACF,CAEA/I,EAAO,OAAU0R,CAAAA,EAAAA,CACjB1R,CAAO,CAAA,IAAA,CAAO2R,EACd3R,CAAAA,CAAAA,CAAO,OAAU4R,CAAAA,EAAAA,CACjB5R,CAAO,CAAA,IAAA,CAAO6R,EACd7R,CAAAA,CAAAA,CAAO,IAAO8R,CAAAA,EAAAA,CACd9R,CAAO,CAAA,IAAA,CAAO+R,GACd/R,CAAO,CAAA,OAAA,CAAUgS,EACjBhS,CAAAA,CAAAA,CAAO,KAAQiS,CAAAA,EAAAA,CACfjS,CAAO,CAAA,SAAA,CAAYkS,GACnBlS,CAAO,CAAA,YAAA,CAAemS,EACtBnS,CAAAA,CAAAA,CAAO,UAAa,CAAA,CAClB,SAAAoS,CAAAA,EAAAA,CACA,WAAAC,EACF,CAAA,CAEA,SAASX,EAAAA,CACP/Y,CAA6C,CAAA,EAC1B,CAAA,CACnB,OAAOqH,CAAAA,CAAO,CACZ,GAAIrH,CACJ,CAAA,UAAA,CAAY,IACd,CAAC,CACH,CAEA,SAASsZ,EACPtZ,CAAAA,CAAAA,CAA4C,EAAC,CAC1B,CACnB,OAAOqH,CAAO,CAAA,CACZ,IAAM,CAAA,OAAA,CACN,GAAIrH,CAAAA,CACJ,SAAYlB,CAAAA,CAAAA,EAAU,CACpB,GAAIA,CAAAA,GAAU,MAId,CAAA,OAAIA,CAAU,GAAA,IAAA,CACL,IAGL,CAAA,OAAOA,CAAU,EAAA,QAAA,CACZA,CAGL,CAAA,OAAOA,CAAU,EAAA,QAAA,CACZ,CAACA,CAAAA,CAGH,OAAO,UAAWA,CAAAA,CAAK,CAChC,CACF,CAAC,CACH,CAOA,SAASua,GACPrZ,CAA4C,CAAA,EACzB,CAAA,CACnB,OAAOqH,CAAAA,CAAO,CACZ,IAAA,CAAM,UACN,GAAIrH,CAAAA,CACJ,SAAYlB,CAAAA,CAAAA,EAAU,CACpB,GAAIA,CAAU,GAAA,MAAA,CAId,OAAIA,CAAAA,GAAU,IACL,CAAA,IAAA,CAGL,OAAOA,CAAAA,EAAU,QACZA,CAAAA,CAAAA,CAGL,OAAOA,CAAU,EAAA,QAAA,CACZ,CAACA,CAAAA,CAGH,MAAO,CAAA,QAAA,CAASA,CAAK,CAC9B,CACF,CAAC,CACH,CASA,SAASya,EAAAA,CACPvZ,CAAwE,CAAA,GACrD,CACnB,OAAOqH,CAAO,CAAA,CACZ,IAAM,CAAA,WAAA,CACN,GAAIrH,CAAAA,CACJ,UAAY,CAAA,IAAA,CACZ,QAAU,CAAA,KAAA,CACV,SAAYlB,CAAAA,CAAAA,EAAU,CACpB,GAAIA,IAAU,MAId,CAAA,OAAIA,CAAU,GAAA,IAAA,CACL,IAGL,CAAA,OAAOA,CAAU,EAAA,QAAA,CACZA,EAIA,MAAO,CAAA,QAAA,CAASA,CAAK,CAIhC,CACF,CAAC,CACH,CASA,SAAS0a,EACPxZ,CAAAA,CAAAA,CAAwE,EAAC,CACtD,CACnB,OAAOqH,CAAO,CAAA,CACZ,IAAM,CAAA,cAAA,CACN,GAAIrH,CAAAA,CACJ,UAAY,CAAA,IAAA,CACZ,QAAU,CAAA,KAAA,CACV,UAAYlB,CAAU,EAAA,CACpB,GAAIA,CAAAA,GAAU,MAId,CAAA,OAAIA,CAAU,GAAA,IAAA,CACL,IAGL,CAAA,OAAOA,CAAU,EAAA,QAAA,CACZA,CAGF,CAAA,MAAA,CAAO,QAASA,CAAAA,CAAK,CAC9B,CACF,CAAC,CACH,CAOA,SAASqa,EAAAA,CACPnZ,CAA0C,CAAA,EACvB,CAAA,CACnB,OAAOqH,CAAAA,CAAO,CACZ,IAAA,CAAM,MACN,CAAA,GAAIrH,EACJ,OAAUlB,CAAAA,CAAAA,EACHA,CACIiM,EAAAA,mBAAAA,CAAO,UAAW,EAK/B,CAAC,CACH,CAOA,SAASqO,EAAAA,CACPpZ,CAA0C,CAAA,EACvB,CAAA,CACnB,OAAOqH,CAAAA,CAAO,CACZ,IAAM,CAAA,MAAA,CACN,GAAIrH,CAAAA,CACJ,OAAUlB,CAAAA,CAAAA,EACHA,CACIqS,EAAAA,EAAAA,EAKb,CAAC,CACH,CAOA,SAASsI,EAAAA,CACPzZ,CACmB,CAAA,CACnB,OAAOqH,CAAO,CAAA,CACZ,GAAIrH,CAAAA,CACJ,OAAUlB,CAAAA,CAAAA,EACHA,CAIE6P,EAAAA,EAAAA,CAAiB3O,CAAQ,CAAA,GAAA,CAAKlB,CAAK,CAAA,CAE5C,SAAYA,CAAAA,CAAAA,EACLA,CAIEkQ,EAAAA,EAAAA,CAAiBhP,EAAQ,GAAKlB,CAAAA,CAAK,CAE9C,CAAC,CACH,CAOA,SAAS4a,EAAAA,CACP1Z,CACmB,CAAA,CACnB,OAAOqH,CAAAA,CAAO,CACZ,GAAIrH,CACJ,CAAA,OAAA,CAAUlB,GACHA,CAIEyQ,EAAAA,EAAAA,CAAkBvP,CAAQ,CAAA,SAAA,CAAWlB,CAAK,CAAA,CAEnD,SAAYA,CAAAA,CAAAA,EACLA,GAIE+Q,EAAkB7P,CAAAA,CAAAA,CAAQ,UAAYlB,CAAAA,CAAK,CAEtD,CAAC,CACH,CAOA,SAASma,EACPjZ,CAAAA,CAAAA,CAAwD,EAAC,CACtC,CACnB,OAAOqH,CAAO,CAAA,CACZ,IAAM,CAAA,SAAA,CACN,GAAIrH,CAAAA,CACJ,SAAYlB,CAAAA,CAAAA,EAAU,CAAQA,CAAAA,CAAAA,CAC9B,QAAUA,CAAU,EAAA,CAAA,CAAQA,CAC9B,CAAC,CACH,CAcA,SAASka,EAAAA,CACPhZ,CAA4D,CAAA,EACzC,CAAA,CACnB,GAAM,CACJ,MAAA4L,CAAAA,CAAAA,CAAS,MACT,QAAAqC,CAAAA,CAAAA,CAAW,KACX,CAAA,UAAA,CAAA0L,CAAa,CAAA,KAAA,CACb,UAAAC,CAAAA,CAAAA,CAAa,KACb,CAAA,GAAG3Z,CACL,CAAA,CAAID,CAEJ,CAAA,OAAOqH,CAAO,CAAA,CACZ,KAAM,UACN,CAAA,GAAIpH,CACJ,CAAA,UAAA,CAAA0Z,CACA,CAAA,OAAA,CAAU7a,CACHA,EAAAA,CAAAA,CAQD6a,EACKxL,EAAQ,CAAA,IAAI,IAAQvC,CAAAA,CAAAA,CAAQqC,CAAQ,CAAA,CAGzC,OAAOnP,CAAAA,EAAU,SACZA,CAGFqP,CAAAA,EAAAA,CAAQrP,CAAO8M,CAAAA,CAAAA,CAAQqC,CAAQ,CAAA,CAfhC2L,CACKzL,CAAAA,EAAAA,CAAQ,IAAI,IAAA,CAAQvC,CAAQqC,CAAAA,CAAQ,CAGtC,CAAA,IAAA,CAaX,SAAYnP,CAAAA,CAAAA,EAA0D,CACpE,GAAIA,CAAAA,GAAU,MAId,CAAA,OAAIA,CAAU,GAAA,IAAA,CACL,IAGF0P,CAAAA,EAAAA,CAAU1P,CAAO8M,CAAAA,CAAAA,CAAQqC,CAAQ,CAC1C,CACF,CAAC,CACH,CAQA,SAASiL,EACPlZ,CAAAA,CAAAA,CAAwD,EAAC,CACtC,CACnB,OAAOqH,CAAO,CAAA,CACZ,IAAM,CAAA,OAAA,CACN,GAAIrH,CAAAA,CACJ,SAAYlB,CAAAA,CAAAA,EACN,OAAOA,CAAAA,EAAU,SACZ,IAAK,CAAA,KAAA,CAAMA,CAAK,CAAA,CAGlBA,CAET,CAAA,OAAA,CAAUA,CACF,EAAA,OAAOA,GAAU,QACd,CAAA,IAAA,CAAK,SAAUA,CAAAA,CAAK,CAGtBA,CAAAA,CAEX,CAAC,CACH,CAEO,SAAS2X,EAAAA,CAAgBrG,CAAoC,CAAA,CAClE,GAAI,CACF,OAAOH,CAAAA,CAAQ,WAAY6H,CAAAA,EAAAA,CAAqB1H,CAAO,CAAA,SAAS,CAAK,EAAA,EACvE,CAAA,KAAY,CACV,OAAO,EACT,CACF,CA2BO,SAAS4G,EACd/P,CAAAA,CAAAA,CACAyQ,CACA1X,CAAAA,CAAAA,CACmB,CACnB,OAAO,CAACoQ,CAAAA,CAAgBC,CAAiC,GAAA,CACvD,IAAMwJ,CAAqB,CAAA,IACzB1B,EAAqBlR,CAAAA,CAAAA,EAAQ,CAAA,KAAe,CACxC6S,CAAAA,CAAAA,CAAyB,IAAM,CACnC,IAAMC,CAAAA,CAAe3J,CAAO,CAAA,WAAA,CAA6B,KACnD4J,CAAAA,CAAAA,CAAWtC,GAAcmC,CAAmB,EAAA,CAClD,OAAOtB,CAAAA,CACLwB,CACAC,CAAAA,CAAAA,CACA/S,CAAM,EAAA,CAAE,KACV,CACF,CAAA,CAEM6N,CAA6B,CAAA,CACjC,IACA,CAAA,WAAA,CAAA,UAAA,CAAYzE,CACZ,CAAA,KAAA,CAAApJ,EACA,UAAYyQ,CAAAA,CAAAA,CAAa,MAAOA,CAAAA,CAAU,CAAImC,CAAAA,CAAAA,CAC9C,cAAgB7Z,CAAAA,CAAAA,EAAS,cAAkB8Z,EAAAA,CAAAA,CAC3C,QAAU9Z,CAAAA,CAAAA,EAAS,QACnB,CAAA,QAAA,CAAUA,CAAS,EAAA,QACrB,EAEMia,CACJhK,CAAAA,CAAAA,CAAQ,WAAgC+H,CAAAA,EAAAA,CAAuB5H,CAAM,CAAA,EACrE,EAAC,CACH6J,CAAU,CAAA,IAAA,CAAKnF,CAAQ,CAAA,CACvB7E,CAAQ,CAAA,cAAA,CAAe+H,EAAuBiC,CAAAA,CAAAA,CAAW7J,CAAM,EACjE,CACF,CAeO,SAAS0G,EACd7P,CAAAA,CAAAA,CACAyQ,CACmB,CAAA,CACnB,OAAO,CAACtH,CAAgBC,CAAAA,CAAAA,GAAiC,CACvD,IAAMwJ,CAAqB,CAAA,IACzB1B,GAAsB/H,CAAO,CAAA,WAAA,CAA6B,KAAK,CAAA,CAE3D0E,CAA6B,CAAA,CACjC,IACA,CAAA,QAAA,CAAA,UAAA,CAAYzE,EACZ,KAAApJ,CAAAA,CAAAA,CACA,cAAgB,CAAA,MAAA,CAChB,UAAYyQ,CAAAA,CAAAA,CAAa,MAAOA,CAAAA,CAAU,EAAImC,CAChD,CAAA,CAEMI,CACJhK,CAAAA,CAAAA,CAAQ,WAAgC+H,CAAAA,EAAAA,CAAuB5H,CAAM,CAAA,EACrE,EAAC,CACH6J,CAAU,CAAA,IAAA,CAAKnF,CAAQ,CAAA,CACvB7E,CAAQ,CAAA,cAAA,CAAe+H,GAAuBiC,CAAW7J,CAAAA,CAAM,EACjE,CACF,CAeO,SAAS2G,EACd9P,CAAAA,CAAAA,CACAyQ,CACmB,CAAA,CACnB,OAAO,CAACtH,CAAgBC,CAAAA,CAAAA,GAAiC,CACvD,IAAMwJ,EAAqB,IACzB1B,EAAAA,CAAsB/H,CAAO,CAAA,WAAA,CAA6B,KAAK,CAAA,CAE3D0E,CAA6B,CAAA,CACjC,IACA,CAAA,SAAA,CAAA,UAAA,CAAYzE,CACZ,CAAA,KAAA,CAAApJ,CACA,CAAA,cAAA,CAAgB,MAChB,CAAA,UAAA,CAAYyQ,EAAa,MAAOA,CAAAA,CAAU,CAAImC,CAAAA,CAChD,CAEMI,CAAAA,CAAAA,CACJhK,CAAQ,CAAA,WAAA,CAAgC+H,GAAuB5H,CAAM,CAAA,EACrE,EAAC,CACH6J,CAAU,CAAA,IAAA,CAAKnF,CAAQ,CAAA,CACvB7E,EAAQ,cAAe+H,CAAAA,EAAAA,CAAuBiC,CAAW7J,CAAAA,CAAM,EACjE,CACF,CA4BO,SAAS6G,EACdhQ,CAAAA,CAAAA,CACAiT,CACAC,CAAAA,CAAAA,CACAna,CACmB,CAAA,CACnB,OAAO,CAACoQ,EAAgBC,CAAiC,GAAA,CACvD,GAAM,CAAE,cAAA+J,CAAAA,CAAAA,CAAgB,eAAAC,CAAAA,CAAgB,CAAIF,CAAAA,CAAAA,EAAoB,EAAC,CAC3DG,CAAmB,CAAA,OAAOJ,CAAiB,EAAA,QAAA,CAC3CK,EACJ,OAAOL,CAAAA,EAAiB,QACpBA,CAAAA,CAAAA,CACA,IAAMA,CAAAA,EAAe,CAAA,KAAA,CAErBM,CAAgBpK,CAAAA,CAAAA,CAAO,WAA6B,CAAA,KAAA,CACpDqK,CAAyB,CAAA,IAAMtC,EAAqBqC,CAAAA,CAAY,EAChEE,CAA0B,CAAA,IAAMvC,EAAqBlR,CAAAA,CAAAA,EAAQ,CAAA,KAAK,CAClE6S,CAAAA,CAAAA,CAAyB,IAC7BvB,CACE1G,CAAAA,CAAAA,CAAe0I,CAAiB,CAAA,CAChCH,CAAiB,CAAA,MAAA,CAAOA,CAAc,CAAA,CAAIK,GAC5C,CAAA,CAEI3F,CAA6B,CAAA,CACjC,IACA,CAAA,YAAA,CAAA,UAAA,CAAYzE,CACZ,CAAA,KAAA,CAAApJ,CACA,CAAA,cAAA,CAAgBjH,CAAS,EAAA,cAAA,EAAkB8Z,CAC3C,CAAA,UAAA,CAAYM,CACR,CAAA,MAAA,CAAOA,CAAc,CACrBK,CAAAA,CAAAA,CACJ,QAAUza,CAAAA,CAAAA,EAAS,QACnB,CAAA,QAAA,CAAUA,CAAS,EAAA,QAAA,CACnB,iBAAmB,CAAA,CACjB,YAAcwa,CAAAA,CAAAA,CACd,YAAcD,CAAAA,CAAAA,CACd,cAAgBH,CAAAA,CAAAA,CACZ,OAAOA,CAAc,CAAA,CACrBK,CACJ,CAAA,eAAA,CAAiBJ,CACb,CAAA,MAAA,CAAOA,CAAe,CAAA,CACtBK,CACJ,CAAA,gBAAA,CAAAJ,CACF,CACF,CAEML,CAAAA,CAAAA,CACJhK,CAAQ,CAAA,WAAA,CAAgC+H,GAAuB5H,CAAM,CAAA,EACrE,EAAC,CACH6J,CAAU,CAAA,IAAA,CAAKnF,CAAQ,CAAA,CACvB7E,EAAQ,cAAe+H,CAAAA,EAAAA,CAAuBiC,CAAW7J,CAAAA,CAAM,EACjE,CACF,CAEO,SAASsG,GAAqBtG,CAA0C,CAAA,CAC7E,OAAOH,CAAAA,CAAQ,WAAY+H,CAAAA,EAAAA,CAAuB5H,CAAO,CAAA,SAAS,CAAK,EAAA,EACzE,CAKO,SAAS+E,EAAAA,CAAa/E,CAAkC,CAAA,CAM7D,QAJEH,CAAQ,CAAA,WAAA,CACN+H,EACA5H,CAAAA,CAAAA,CAAO,SACT,CAAA,EAAK,EAAC,EACS,GAAK0E,CAAAA,CAAAA,EAA+B,CACnD,GAAM,CAAE,IAAA,CAAA3V,CAAM,CAAA,KAAA,CAAA8H,EAAO,UAAA2M,CAAAA,CAAAA,CAAY,UAAA8D,CAAAA,CAAW,CAAI5C,CAAAA,CAAAA,CAE1C6F,CAAqB9I,CAAAA,CAAAA,CAAe6F,CAAU,CAAA,CAE9CkD,CAAkB3T,CAAAA,CAAAA,EACxB,CAAA,OAAQ9H,CAAM,EACZ,iBACE,OAAO,IAAIqY,EAAUoD,CAAAA,CAAAA,CAAiBhH,CAAY+G,CAAAA,CAAkB,CACtE,CAAA,KAAA,QAAA,CACE,OAAO,IAAI/C,EAAAA,CAAOgD,CAAiBhH,CAAAA,CAAAA,CAAY+G,CAAkB,CAAA,CACnE,KACE,SAAA,CAAA,OAAO,IAAIhD,EAAQiD,CAAAA,CAAAA,CAAiBhH,CAAY+G,CAAAA,CAAkB,CACpE,CAAA,KAAA,YAAA,CACE,GAAI,CAAC7F,CAAS,CAAA,iBAAA,CACZ,MAAM,IAAInY,CACR,CAAA,8BAAA,CACA,iDACF,CAAA,CAGF,IAAM8a,CAAexQ,CAAAA,CAAAA,EACrB,CAAA,OAAO,IAAI4Q,EAAAA,CAAWJ,CAAc7D,CAAAA,CAAAA,CAAY,CAC9C,YAAA,CAAckB,CAAS,CAAA,iBAAA,CAAkB,YACzC,CAAA,YAAA,CAAcjD,CAAeiD,CAAAA,CAAAA,CAAS,kBAAkB,YAAY,CAAA,CACpE,cAAgBjD,CAAAA,CAAAA,CACdiD,CAAS,CAAA,iBAAA,CAAkB,cAC7B,CAAA,CACA,eAAiBjD,CAAAA,CAAAA,CACfiD,CAAS,CAAA,iBAAA,CAAkB,eAC7B,CACF,CAAC,CAAA,CACH,QACE,MAAM,IAAInY,CACR,CAAA,8BAAA,CACA,CAAyBwC,sBAAAA,EAAAA,CAAI,CAC/B,CAAA,CACJ,CACF,CAAC,CACH,CAKO,SAASmV,EAAclE,CAAAA,CAAAA,CAA0C,CACtE,OAAOH,EAAQ,WACb8H,CAAAA,EAAAA,CACA3H,CAAO,CAAA,SACT,CACF,CAEO,SAASuG,EAAAA,CAAWvG,CAAmC,CAAA,CAC5D,OAAOH,CAAAA,CAAQ,WAAYgI,CAAAA,EAAAA,CAAoB7H,CAAO,CAAA,SAAS,GAAK,EACtE,CAEO,SAASwG,EAAWxG,CAAAA,CAAAA,CAAoC,CAC7D,OAAOH,CAAQ,CAAA,WAAA,CAAYiI,EAAqB9H,CAAAA,CAAAA,CAAO,SAAS,CAAA,EAAK,EACvE,CC31BO,IAAMyK,CAAAA,CAAN,KAAuB,CAG5B,WAA6B5T,CAAAA,CAAAA,CAAqB,CAArB,IAAA,CAAA,KAAA,CAAAA,CAC3B,CAAA,IAAMsL,CAAekE,CAAAA,EAAAA,CAAgBxP,CAAK,CAAA,CAC1C,IAAK,CAAA,eAAA,CAAkB,IAAI,GACzBsL,CAAAA,CAAAA,CAAa,GAAKQ,CAAAA,CAAAA,EAAgB,CAACA,CAAAA,CAAY,UAAYA,CAAAA,CAAW,CAAC,CACzE,EACF,CAEA,kBAAA,CAAmBpR,CAA2B0F,CAAAA,CAAAA,CAAwB,CACpE,GAAIA,IAAW,GACb,CAAA,OAAO,GAIT,CAAA,GADiBA,CAAO,CAAA,QAAA,CAAS,GAAG,CAAA,CACtB,CACZ,GAAM,CAACrF,CAAAA,CAAO8Y,CAAW,CAAA,CAAIzT,CAAO,CAAA,KAAA,CAAM,GAAG,CAE7C,CAAA,GAAIyT,CAAgB,GAAA,GAAA,CAClB,OAAQnZ,CAAAA,EACN,KAAK,OACL,CAAA,KAAK,SACH,CAAA,OAAO,CAAKK,EAAAA,EAAAA,CAAK,CACnB,IAAA,CAAA,CAAA,KAAK,WACL,KAAK,aAAA,CACL,KAAK,QAAA,CACL,KAAK,UAAA,CACH,OAAO,CAAA,CAAA,EAAIA,CAAK,CAAA,GAAA,CAAA,CAClB,KAAK,OAAA,CACH,OAAO,CAAA,CAAA,EAAIA,CAAK,CAAA,GAAA,CAAA,CAClB,QACE,MAAM,IAAI,KAAM,CAAA,CAAA,2BAAA,EAA8BL,CAAM,CAAA,CAAE,CAC1D,CAGF,IAAMoZ,CACJ,CAAA,IAAA,CAAK,eAAgB,CAAA,GAAA,CAAID,CAAW,CAAA,EAAG,YACvClN,EAAAA,CAAAA,CAAYkN,EAAa,IAAK,CAAA,KAAA,CAAM,sBAAsB,CAAA,CAE5D,OAAQnZ,CAAAA,EACN,KAAK,OACL,CAAA,KAAK,SACH,CAAA,OAAO,CAAKK,EAAAA,EAAAA,CAAK,CAAQ+Y,KAAAA,EAAAA,CAAW,KACtC,KAAK,UAAA,CACL,KAAK,aAAA,CACL,KAAK,QAAA,CACL,KAAK,UAAA,CACH,OAAO,CAAA,CAAA,EAAI/Y,CAAK,CAAA,GAAA,EAAM+Y,CAAW,CAAA,CAAA,CAAA,CACnC,KAAK,OAAA,CACH,OAAO,CAAI/Y,CAAAA,EAAAA,CAAK,CAAM+Y,GAAAA,EAAAA,CAAW,CACnC,CAAA,CAAA,CAAA,QACE,MAAM,IAAI,KAAM,CAAA,CAAA,2BAAA,EAA8BpZ,CAAM,CAAA,CAAE,CAC1D,CACF,CAEA,IAAMoZ,EACJ,IAAK,CAAA,eAAA,CAAgB,GAAI1T,CAAAA,CAAM,CAAG,EAAA,YAAA,EAClCuG,CAAYvG,CAAAA,CAAAA,CAAQ,KAAK,KAAM,CAAA,sBAAsB,CAEvD,CAAA,OAAQ1F,CAAQ,EACd,KAAK,OAAA,CACL,KAAK,SACH,CAAA,OAAO,CAAKoZ,EAAAA,EAAAA,CAAW,CACzB,EAAA,CAAA,CAAA,KAAK,UACL,CAAA,KAAK,aACL,CAAA,KAAK,QACL,CAAA,KAAK,UACH,CAAA,OAAO,CAAIA,CAAAA,EAAAA,CAAW,IACxB,KAAK,OAAA,CACH,OAAO,CAAA,CAAA,EAAIA,CAAW,CAAA,CAAA,CAAA,CACxB,QACE,MAAM,IAAI,KAAA,CAAM,CAA8BpZ,2BAAAA,EAAAA,CAAM,CAAE,CAAA,CAC1D,CACF,CAKA,kBAAkBA,CAA2BK,CAAAA,CAAAA,CAAuB,CAElEA,CAAAA,CAAQA,CAAM,CAAA,OAAA,CAAQ,MAAQ,CAAA,GAAG,CAAE,CAAA,IAAA,EACnC,CAAA,IAAIgZ,CAAQ,CAAA,EAAA,CAKZ,OAJIhZ,CAAAA,CAAM,aAAc,CAAA,QAAA,CAAS,MAAM,CAAA,GACrC,CAACA,CAAAA,CAAOgZ,CAAK,CAAA,CAAIhZ,EAAM,KAAM,CAAA,MAAM,CAG7BL,CAAAA,CAAAA,CAAAA,EACN,KAAK,OACL,CAAA,KAAK,UACH,OAAO,CAAA,EAAA,EAAKK,CAAK,CAAA,EAAA,EAAKgZ,CAAQ,CAAA,CAAA,MAAA,EAASA,CAAK,CAAA,EAAA,CAAA,CAAO,EAAE,CAAA,CAAA,CACvD,KAAK,UAAA,CACL,KAAK,aAAA,CACL,KAAK,QAAA,CACL,KAAK,UACH,CAAA,OAAO,CAAIhZ,CAAAA,EAAAA,CAAK,CAAIgZ,CAAAA,EAAAA,CAAAA,CAAQ,CAAQA,KAAAA,EAAAA,CAAK,CAAM,CAAA,CAAA,CAAA,EAAE,CACnD,CAAA,CAAA,KAAK,OACH,CAAA,OAAO,CAAIhZ,CAAAA,EAAAA,CAAK,IAAIgZ,CAAQ,CAAA,CAAA,KAAA,EAAQA,CAAK,CAAA,CAAA,CAAA,CAAM,EAAE,CAAA,CAAA,CACnD,QACE,OAAO,CAAGhZ,EAAAA,CAAK,CAAGgZ,EAAAA,CAAAA,CAAQ,CAAOA,IAAAA,EAAAA,CAAK,CAAK,CAAA,CAAA,EAAE,EACjD,CACF,CAEA,MAAM,cAAA,CACJ7T,CACA8T,CAAAA,CAAAA,CACA3X,CAA4B,CAAA,QAAA,CACmB,CAC/C,GAAI,CAAC6D,CAAQ,CAAA,MAAA,CACX,OAAO,CAAE,OAAAA,CAAAA,CAAAA,CAAS,OAAA8T,CAAO,CAAA,CAG3B,IAAMC,CAAAA,CAA4B,EAAC,CAC7BC,CAAwB,CAAA,EAE9B,CAAA,IAAA,IAAS9P,CAAI,CAAA,CAAA,CAAGA,CAAIlE,CAAAA,CAAAA,CAAQ,MAAQkE,CAAAA,CAAAA,EAAAA,CAAK,CACvC,IAAMhE,CAAAA,CAASF,CAAQkE,CAAAA,CAAC,CAClBvM,CAAAA,CAAAA,CAAQmc,CAAO5P,CAAAA,CAAC,CAElBhE,CAAAA,CAAAA,GAAW,GAAOA,EAAAA,CAAAA,GAAW,cAIjC6T,GAAAA,CAAAA,CAAgB,IAAK7T,CAAAA,CAAM,EAC3B8T,CAAe,CAAA,IAAA,CAAKrc,CAAK,CAAA,EAC3B,CAEA,MAAM,OAAQ,CAAA,GAAA,CACZoc,CAAgB,CAAA,GAAA,CAAI,MAAOE,CAAAA,CAAG/P,CAAM,GAAA,CAClC,IAAMhE,CAAAA,CAAS6T,EAAgB7P,CAAC,CAAA,CAC1BvM,CAAQqc,CAAAA,CAAAA,CAAe9P,CAAC,CAAA,CAExB0H,CAAc,CAAA,IAAA,CAAK,gBAAgB,GAAI1L,CAAAA,CAAM,CAE/CgU,CAAAA,CAAAA,CAAgBvc,CAChBiU,CAAAA,CAAAA,GACEzP,CAAS,GAAA,QAAA,EAAYyP,EAAY,OACnCsI,CAAAA,CAAAA,CAAgB,MAAMtI,CAAAA,CAAY,OAAQjU,CAAAA,CAAK,CACtCwE,CAAAA,CAAAA,GAAS,QAClB+X,GAAAA,CAAAA,CAAiB,MAAMtI,CAAAA,CAAY,OAAUjU,GAAAA,CAAK,CAAMA,EAAAA,CAAAA,CAAAA,CAAAA,CAI5Dqc,EAAe9P,CAAC,CAAA,CAAIgQ,EACtB,CAAC,CACH,CAAA,CAEA,IAAWhU,IAAAA,CAAAA,IAAU,IAAK,CAAA,eAAA,CAAgB,IAAK,EAAA,CAC7C,GAAI,CAAC6T,CAAgB,CAAA,QAAA,CAAS7T,CAAM,CAAG,CAAA,CACrC,IAAM0L,CAAAA,CAAc,IAAK,CAAA,eAAA,CAAgB,GAAI1L,CAAAA,CAAM,CAKnD,CAAA,GAJI,CAAC0L,CAAAA,EAKHzP,CAAS,GAAA,QAAA,EACT+D,CAAY,GAAA,IAAA,CAAK,MAAuB,UACxC,EAAA,CAAC0L,CAAY,CAAA,OAAA,CAEb,SAGEzP,CAAAA,CAAAA,GAAS,QAAYyP,EAAAA,CAAAA,CAAY,cACnCmI,CAAgB,CAAA,IAAA,CAAK7T,CAAM,CAAA,CAC3B8T,CAAe,CAAA,IAAA,CAAKpI,CAAY,CAAA,OAAA,GAAU,MAAS,CAAK,EAAA,MAAS,CAErE,EAAA,CAGF,OAAO,CAAE,OAASmI,CAAAA,CAAAA,CAAiB,MAAQC,CAAAA,CAAe,CAC5D,CAKA,yBACExZ,CAAAA,CAAAA,CACA2Z,CACQ,CAAA,CACR,GAAI,OAAOA,CAAAA,CAAS,KAAU,EAAA,QAAA,CAC5B,OAAO,IAAA,CAAK,iBAAkB3Z,CAAAA,CAAAA,CAAQ2Z,CAAS,CAAA,KAAK,CAGtD,CAAA,IAAMC,CAAY,CAAA,IAAItP,CAAU,CAAA,IAAA,CAAK,MAAOtK,CAAM,CAAA,CAClD,OAAI,KAAA,CAAM,OAAQ2Z,CAAAA,CAAAA,CAAS,KAAK,CAAA,CACvB,CAAIC,CAAAA,EAAAA,CAAAA,CAAU,KAAMD,CAAAA,CAAAA,CAAS,KAAK,CAAA,CAAE,GAAG,CAAA,CAAA,CAAA,CAGzC,IAAIC,CAAU,CAAA,KAAA,CAAM,CAACD,CAAAA,CAAS,KAAkB,CAAC,CAAE,CAAA,GAAG,GAC/D,CACF,CAAA,CC9LA,IAAME,EAAAA,CAAN,KAAwD,CAGtD,KAAM1P,CAAAA,CAAAA,CAA+D,CACnE,IAAM2P,CAAAA,CAAS3P,CAET4P,CAAAA,CAAAA,CADQ,IAAIb,CAAAA,CAAiB,IAAK,CAAA,KAAK,CACrB,CAAA,iBAAA,CAAkB,OAASY,CAAAA,CAAAA,CAAO,KAAK,CAAA,CAE/D,GAAI,CAACA,EAAO,QAAY,EAAA,CAACA,CAAO,CAAA,QAAA,CAAS,MACvC,CAAA,OAAO,CAAE,GAAA,CAAK,EAAI,CAAA,QAAA,CAAU,EAAG,CAIjC,CAAA,GACEA,CAAO,CAAA,QAAA,CAAS,SAAW,CAC3BA,EAAAA,CAAAA,CAAO,QAAS,CAAA,CAAC,CAAanO,WAAAA,EAAAA,CAC9B,CACA,IAAMqO,CAAaF,CAAAA,CAAAA,CAAO,QAAS,CAAA,CAAC,CACpC,CAAA,OAAO,CACL,GAAA,CAAK,mBAAmBA,CAAO,CAAA,KAAK,CAAOE,IAAAA,EAAAA,CAAAA,CAAW,OAAO,CAAA,CAAA,CAAA,CAC7D,QAAU,CAAA,EACZ,CACF,CAEA,IAAMJ,CAAAA,CAAY,IAAItP,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,OAA4B,CAClE2P,CAAAA,CAAAA,CAAkB,EAAC,CACnBC,CAAkB,CAAA,EAExB,CAAA,IAAA,IAAWC,CAASL,IAAAA,CAAAA,CAAO,QAAU,CAAA,CACnC,GAAM,CAAE,GAAArZ,CAAAA,CAAAA,CAAK,SAAU2Z,CAAc,CAAA,CAAIR,CAAU,CAAA,KAAA,CAAM,CAACO,CAAK,CAAC,CAAA,CAChEF,CAAM,CAAA,IAAA,CAAKxZ,CAAI,CAAA,IAAA,EAAM,CAAA,CACrByZ,CAAS,CAAA,IAAA,CAAK,GAAGE,CAAa,EAChC,CAEA,IAAMC,CAAOJ,CAAAA,CAAAA,CAAM,IAAK,CAAA,IAAI,CAE5B,CAAA,OAAO,CAAE,GAAA,CADQ,CAAGF,EAAAA,CAAS,CAAIM,CAAAA,EAAAA,CAAI,GACb,QAAAH,CAAAA,CAAS,CACnC,CACF,CAEOI,CAAAA,EAAAA,CAAQ,IAAIT,EAAAA,CC5CnB,IAAMU,EAAN,CAAA,KAAwD,CAEtD,KAAA,CAAMpQ,CAAiB,CAAA,CAErB,OAAO,CAAE,IAAK,CADJA,aAAAA,EAAAA,CAAAA,CACsB,MAAM,CAAA,CAAA,CAAA,CAAK,QAAU,CAAA,EAAG,CAC1D,CACF,CAAA,CACOqQ,EAAQ,CAAA,IAAID,ECPnB,CAAA,IAAME,EAAN,CAAA,KAA4D,CAE1D,KAAMtQ,CAAAA,CAAAA,CAAiB,CAErB,OAAO,CAAE,GAAA,CAAK,CADAA,iBAAAA,EAAAA,CAAAA,CAC0B,cAAc,CAAA,CAAA,CAAA,CAAK,QAAU,CAAA,EAAG,CAC1E,CACF,CAAA,CACOuQ,GAAQ,IAAID,EAAAA,CCPnB,IAAME,EAAAA,CAAN,KAAyD,CAEvD,KAAMxQ,CAAAA,CAAAA,CAAiB,CAErB,OAAO,CAAE,GAAA,CAAK,CADJA,mBAAAA,EAAAA,CAAAA,CAC4B,MAAM,CAAA,CAAA,CAAI,SAAU,EAAG,CAC/D,CACF,CACOyQ,CAAAA,EAAAA,CAAQ,IAAID,EAAAA,CCNnB,IAAME,EAAN,CAAA,KAAyD,CAEvD,KAAA,CAAM1Q,CAAiB,CAAA,CACrB,IAAMrL,CAAAA,CAAIqL,EACV,OAAArK,CAAAA,CAAO,IACL,CAAA,2GAEF,CACO,CAAA,CAAE,GAAK,CAAA,CAAA,cAAA,EAAiBhB,CAAE,CAAA,MAAM,CAAU,MAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAChE,CACF,EACOgc,EAAQ,CAAA,IAAID,ECZnB,CAAA,IAAME,EAAN,CAAA,KAA4D,CAE1D,KAAA,CAAM5Q,CAAiB,CAAA,CAGrB,OAAO,CAAE,GAAK,CAAA,CAAA,iBAAA,EADS,CADZA,GAAAA,EAAAA,CAAAA,CACqB,KAAK,CACW,CAAA,CAAA,CAAA,CAAA,CAAK,QAAU,CAAA,EAAG,CACpE,CACF,CAAA,CACO6Q,EAAQ,CAAA,IAAID,ECRnB,CAAA,IAAME,EAAN,CAAA,KAA0D,CAExD,KAAA,CAAM9Q,EAAiB,CACrB,IAAMsJ,CAAItJ,CAAAA,CAAAA,CAEV,OAAO,CACL,GAAK,CAAA,CAAA,WAAA,EAFO,KAAK,KAAO,EAAA,KAAA,EAAS,EAET,CAAA,CAAA,EAAIsJ,CAAE,CAAA,OAAO,CAAOA,IAAAA,EAAAA,CAAAA,CAAE,OAAO,CACrD,WAAA,CAAA,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CACOyH,CAAAA,EAAAA,CAAQ,IAAID,EAAAA,CCXnB,IAAME,EAAAA,CAAN,KAAyD,CAEvD,KAAMhR,CAAAA,CAAAA,CAAiB,CAErB,OAAO,CAAE,GAAK,CAAA,CAAA,CAAA,EADHA,CACU,CAAA,OAAO,CAAK,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAChD,CACF,CACOiR,CAAAA,EAAAA,CAAQ,IAAID,EAAAA,CCVZ,IAAME,CAAN,CAAA,cAAsB7P,CAAU,CASrC,WAAYrO,CAAAA,CAAAA,CAAe,CACzB,KAAA,CAAM,KAAO,CAAA,IAAI,CARnB,CAAA,IAAA,CAAA,6BAAA,CAAgC,IAChC,CAAA,IAAA,CAAA,UAAA,CAAa,GACb,CAAA,IAAA,CAAA,cAAA,CAAiB,EACjB,IAAa,CAAA,UAAA,CAAA,IAAA,CACb,IAAS,CAAA,MAAA,CAAA,KAAA,CACT,IAAO,CAAA,IAAA,CAAA,KAAA,CAIL,IAAK,CAAA,QAAA,CAAWA,EAClB,CACF,CAAA,CCTA,IAAMme,EAAAA,CAAN,KAAwD,CAEtD,KAAMnR,CAAAA,CAAAA,CAAiB,CACrB,IAAMrL,CAAAA,CAAIqL,CACNiG,CAAAA,CAAAA,CAEJ,OAAItR,CAAAA,CAAE,YAAwBuc,YAAAA,CAAAA,CAC5BjL,CAAMtR,CAAAA,CAAAA,CAAE,YAAa,CAAA,QAAA,CACZA,CAAE,CAAA,YAAA,GAAiB,MAAUA,EAAAA,CAAAA,CAAE,eAAiB,IACzDsR,CAAAA,CAAAA,CAAM,MACGtR,CAAAA,CAAAA,CAAE,YAAiB,GAAA,MAAA,CAC5BsR,CAAM,CAAA,GAAA,CACGtR,CAAE,CAAA,YAAA,GAAiB,OAC5BsR,CAAAA,CAAAA,CAAM,GAEN,CAAA,OAAOtR,CAAE,CAAA,YAAA,EAAiB,UAC1BA,CAAE,CAAA,YAAA,GAAiB,MACnBA,EAAAA,CAAAA,CAAE,YAAiB,GAAA,GAAA,EACnBA,CAAE,CAAA,YAAA,GAAiB,GAEnBsR,CAAAA,CAAAA,CAAM,CAAItR,CAAAA,EAAAA,CAAAA,CAAE,YAAY,CAAA,CAAA,CAAA,CAExBsR,CAAM,CAAA,MAAA,CAAOtR,EAAE,YAAY,CAAA,CAGtB,CACL,GAAA,CAAK,CAAqBA,kBAAAA,EAAAA,CAAAA,CAAE,MAAM,CAAA,SAAA,EAAYsR,CAAG,CAAStR,MAAAA,EAAAA,CAAAA,CAAE,MAAM,CAAA,CAAA,CAAA,CAClE,QAAU,CAAA,EACZ,CACF,CACF,CACOyc,CAAAA,EAAAA,CAAQ,IAAID,EAAAA,CC/BnB,IAAME,EAAAA,CAAN,KAAwD,CAEtD,KAAMrR,CAAAA,CAAAA,CAAiB,CACrB,IAAMrL,CAAIqL,CAAAA,CAAAA,CACV,OAAArK,CAAAA,CAAO,KACL,2GAEF,CAAA,CACO,CAAE,GAAA,CAAK,CAAiBhB,cAAAA,EAAAA,CAAAA,CAAE,MAAM,CAAA,UAAA,CAAA,CAAc,SAAU,EAAG,CACpE,CACF,CACO2c,CAAAA,EAAAA,CAAQ,IAAID,EAAAA,CCTnB,IAAME,EAAN,CAAA,KAAwD,CAGtD,KAAA,CAAMvR,CAA+D,CAAA,CACnE,IAAMwR,CAAAA,CAAUxR,CAChB,CAAA,GAAIwR,CAAQ,CAAA,UAAA,CACV,OAAO,CAAE,GAAKA,CAAAA,CAAAA,CAAQ,OAAkB,QAAU,CAAA,EAAG,CAAA,CAIvD,IAAM1J,CAAAA,CADQ,IAAIiH,CAAAA,CAAiB,KAAK,KAAK,CAAA,CACpB,kBACvB,CAAA,OAAA,CACAhJ,CAAeyL,CAAAA,CAAAA,CAAQ,MAAM,CAC/B,EAEMC,CAAKD,CAAAA,CAAAA,CAAQ,QAAS,CAAA,WAAA,EAE5B,CAAA,GAAIC,CAAO,GAAA,MAAA,CAAQ,CACjB,IAAMC,CAAMF,CAAAA,CAAAA,CAAQ,MAAU,EAAA,CAAA,CAC9B,OAAO,CAAE,IAAK,CAAG1J,EAAAA,CAAU,CAAS4J,MAAAA,EAAAA,CAAG,CAAK,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC3D,CAEA,GAAID,CAAAA,GAAO,SAAW,CAAA,CACpB,IAAMC,CAAAA,CAAMF,EAAQ,MAAU,EAAA,GAAA,CAC9B,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG1J,CAAU,CAAA,SAAA,EAAY4J,CAAG,CAAA,CAAA,CAAA,CAAK,QAAU,CAAA,EAAG,CAC9D,CAEA,GACED,IAAO,MACPA,EAAAA,CAAAA,GAAO,UACPA,EAAAA,CAAAA,GAAO,YACPA,EAAAA,CAAAA,GAAO,UAEP,CAAA,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,aAAA,CAAA,CAAiB,QAAU,CAAA,EAAG,CAAA,CAG3D,GAAI2J,CAAO,GAAA,MAAA,CACT,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,iBAAA,CAAA,CAAqB,QAAU,CAAA,EAAG,CAAA,CAG/D,GAAI2J,CAAAA,GAAO,MACT,CAAA,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,YAAA,CAAA,CAAgB,QAAU,CAAA,EAAG,CAAA,CAG1D,GAAI2J,CAAAA,GAAO,QACT,CAAA,OAAID,CAAQ,CAAA,aAAA,CACH,CAAE,GAAA,CAAK,GAAG1J,CAAU,CAAA,qBAAA,CAAA,CAAyB,QAAU,CAAA,EAAG,CAAA,CAE5D,CAAE,GAAA,CAAK,CAAGA,EAAAA,CAAU,CAAW,OAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAGrD,CAAA,GAAI2J,IAAO,SACT,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAY,QAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAAA,CAGtD,GAAI2J,CAAAA,GAAO,UACT,CAAA,OAAO,CAAE,GAAA,CAAK,GAAG3J,CAAU,CAAA,SAAA,CAAA,CAAa,QAAU,CAAA,EAAG,CAAA,CAGvD,GAAI2J,CAAAA,GAAO,WACT,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAQ,IAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAAA,CAGlD,GAAI2J,CAAAA,GAAO,OAAWA,EAAAA,CAAAA,GAAO,MAC3B,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAS,KAAA,CAAA,CAAA,QAAA,CAAU,EAAG,EAGnD,GAAI2J,CAAAA,GAAO,QACT,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAU,MAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAGpD,CAAA,GAAI2J,CAAO,GAAA,SAAA,EAAaA,IAAO,SAAW,CAAA,CACxC,IAAME,CAAAA,CAAYH,CAAQ,CAAA,SAAA,EAAa,EACjCI,CAAAA,CAAAA,CAAQJ,EAAQ,KAAS,EAAA,CAAA,CAC/B,OAAO,CACL,GAAK,CAAA,CAAA,EAAG1J,CAAU,CAAA,SAAA,EAAY6J,CAAS,CAAKC,EAAAA,EAAAA,CAAK,CACjD,CAAA,CAAA,CAAA,QAAA,CAAU,EACZ,CACF,CAEA,GAAIH,CAAAA,GAAO,MACT,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,QAAS,QAAU,CAAA,EAAG,CAAA,CAGnD,GAAI2J,CAAAA,GAAO,MACT,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAa,SAAA,CAAA,CAAA,QAAA,CAAU,EAAG,EAGvD,GAAI2J,CAAAA,GAAO,MAAQ,CAAA,CACjB,IAAMI,CAAAA,CACJ,OAAOL,CAAAA,CAAQ,SAAc,EAAA,QAAA,CAAW,CAAIA,CAAAA,EAAAA,CAAAA,CAAQ,SAAS,CAAA,CAAA,CAAA,CAAM,EACrE,CAAA,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG1J,CAAU,CAAA,KAAA,EAAQ+J,CAAC,CAAA,CAAA,CAAI,QAAU,CAAA,EAAG,CACvD,CAEA,GAAIJ,CAAAA,GAAO,UAAcA,EAAAA,CAAAA,GAAO,WAAa,CAAA,CAC3C,IAAMI,CACJ,CAAA,OAAOL,CAAQ,CAAA,SAAA,EAAc,QAAW,CAAA,CAAA,CAAA,EAAIA,CAAQ,CAAA,SAAS,CAAM,CAAA,CAAA,CAAA,EAAA,CACrE,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG1J,CAAU,CAAA,UAAA,EAAa+J,CAAC,CAAI,CAAA,CAAA,QAAA,CAAU,EAAG,CAC5D,CAEA,GAAIJ,CAAAA,GAAO,SAAaA,EAAAA,CAAAA,GAAO,MAC7B,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,OAAQ,QAAU,CAAA,EAAG,CAAA,CAGlD,GACE2J,CAAAA,GAAO,OACPA,EAAAA,CAAAA,GAAO,QACPA,EAAAA,CAAAA,GAAO,WACPA,EAAAA,CAAAA,GAAO,MACPA,EAAAA,CAAAA,GAAO,UACPA,EAAAA,CAAAA,GAAO,cACPA,CAAO,GAAA,UAAA,CAEP,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,eAAA,CAAA,CAAmB,SAAU,EAAG,CAG7D,CAAA,GAAI2J,CAAO,GAAA,MAAA,EAAUA,CAAO,GAAA,OAAA,CAC1B,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAkB,cAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAG5D,CAAA,GAAI2J,CAAO,GAAA,MAAA,CAAQ,CACjB,GAAID,CAAQ,CAAA,UAAA,EAAcA,EAAQ,UAAW,CAAA,MAAA,CAAS,CAAG,CAAA,CACvD,IAAMrC,CAAAA,CAASqC,CAAQ,CAAA,UAAA,CAAW,GAAKnL,CAAAA,CAAAA,EAAM,CAAIA,CAAAA,EAAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,IAAK,CAAA,IAAI,EAChE,OAAO,CACL,GAAK,CAAA,CAAA,EAAGyB,CAAU,CAAA,qBAAA,EAAwBA,CAAU,CAAA,KAAA,EAAQqH,CAAM,CAAA,EAAA,CAAA,CAClE,QAAU,CAAA,EACZ,CACF,CACA,OAAO,CAAE,GAAK,CAAA,CAAA,EAAGrH,CAAU,CAAA,aAAA,CAAA,CAAiB,QAAU,CAAA,EAAG,CAC3D,CAEA,OAAI2J,CAAAA,GAAO,SAAaA,EAAAA,CAAAA,GAAO,KACzBD,CAAAA,CAAAA,CAAQ,aACH,CAAA,CAAE,IAAK,CAAG1J,EAAAA,CAAU,CAAsB,kBAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAEzD,CAAA,CAAE,GAAK,CAAA,CAAA,EAAGA,CAAU,CAAA,IAAA,CAAA,CAAQ,QAAU,CAAA,EAAG,CAAA,CAG9C2J,IAAO,UACF,CAAA,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,SAAA,CAAA,CAAa,QAAU,CAAA,EAAG,CAAA,CAGnD2J,CAAO,GAAA,OAAA,CACF,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,YAAa,QAAU,CAAA,EAAG,CAAA,CAGnD2J,CAAO,GAAA,YAAA,CACF,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAa,SAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAGnD2J,CAAAA,CAAAA,GAAO,UACF,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAa,SAAA,CAAA,CAAA,QAAA,CAAU,EAAG,EAGnD2J,CAAO,GAAA,YAAA,CACF,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAa,SAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAAA,CAGhD,CACL,GAAA,CAAK,CAAGA,EAAAA,CAAU,CAAI2J,CAAAA,EAAAA,CAAE,CAAGD,EAAAA,CAAAA,CAAQ,MAAS,CAAA,CAAA,CAAA,EAAIA,CAAQ,CAAA,MAAM,CAAM,CAAA,CAAA,CAAA,EAAE,GACtE,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEOM,EAAQ,CAAA,IAAIP,ECzKnB,CAAA,IAAMQ,EAAN,CAAA,KAA6D,CAE3D,KAAA,CAAMC,CAAkB,CAAA,CACtB,OAAO,CAAE,GAAA,CAAK,EAAI,CAAA,QAAA,CAAU,EAAG,CACjC,CACF,CACOC,CAAAA,EAAAA,CAAQ,IAAIF,EAAAA,CCDnB,IAAMG,EAAAA,CAAN,KAAwD,CAGtD,MAAMlS,CAA+D,CAAA,CACnE,IAAMmS,CAAAA,CAAQnS,CACRoS,CAAAA,CAAAA,CAAQ,IAAIrD,CAAAA,CAAiB,KAAK,KAAK,CAAA,CAE7C,GAAIoD,CAAAA,CAAM,cAAmB,GAAA,aAAA,CAAe,CAC1C,GAAIA,EAAM,OAAWA,EAAAA,CAAAA,CAAM,OAAQ,CAAA,MAAA,CAAQ,CACzC,IAAME,CAAYF,CAAAA,CAAAA,CAAM,cACpB,CAAA,CAAA,YAAA,EAAeA,CAAM,CAAA,cAAc,CACnC,EAAA,CAAA,CAAA,EAAA,CACEG,CAAQH,CAAAA,CAAAA,CAAAA,CAAM,SAAW,EAAC,EAC7B,GAAK3W,CAAAA,CAAAA,EAAM4W,CAAM,CAAA,kBAAA,CAAmB,OAASrM,CAAAA,CAAAA,CAAevK,CAAC,CAAC,CAAC,CAAA,CAC/D,IAAK,CAAA,IAAI,CACZ,CAAA,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG6W,CAAS,CAAA,aAAA,EAAgBC,CAAI,CAAA,CAAA,CAAA,CAAK,QAAU,CAAA,EAAG,CAClE,CACA,OAAO,CAAE,GAAA,CAAK,aAAe,CAAA,QAAA,CAAU,EAAG,CAC5C,CAEA,GAAIH,CAAM,CAAA,cAAA,GAAmB,QAAU,CAAA,CACrC,GAAIA,CAAM,CAAA,OAAA,EAAWA,CAAM,CAAA,OAAA,CAAQ,MAAS,CAAA,CAAA,CAAG,CAC7C,IAAMI,EAAUJ,CAAM,CAAA,OAAA,EAAW,EAAC,CAC5BK,CAAaL,CAAAA,CAAAA,CAAM,cACrB,CAAA,CAAA,YAAA,EAAeA,CAAM,CAAA,cAAc,CACnC,EAAA,CAAA,CAAA,EAAA,CACEG,CAAOC,CAAAA,CAAAA,CACV,GAAK/W,CAAAA,CAAAA,EAAM4W,EAAM,kBAAmB,CAAA,OAAA,CAASrM,CAAevK,CAAAA,CAAC,CAAC,CAAC,CAC/D,CAAA,IAAA,CAAK,IAAI,CAAA,CACZ,OAAK2W,CAAAA,CAAM,cAGJ,CAAA,CAAE,GAAK,CAAA,CAAA,EAAGK,CAAU,CAAWF,QAAAA,EAAAA,CAAI,CAAK,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAFnD,CAAA,CAAE,GAAK,CAAA,QAAA,CAAU,QAAU,CAAA,EAAG,CAGzC,CACA,OAAO,CAAE,GAAK,CAAA,QAAA,CAAU,QAAU,CAAA,EAAG,CACvC,CAEA,GAAIH,EAAM,cAAmB,GAAA,UAAA,CAC3B,OAAO,CAAE,GAAK,CAAA,UAAA,CAAY,QAAU,CAAA,EAAG,CAGzC,CAAA,GAAIA,CAAM,CAAA,cAAA,GAAmB,MAC3B,CAAA,OAAO,CAAE,GAAA,CAAK,MAAQ,CAAA,QAAA,CAAU,EAAG,CAGrC,CAAA,GAAIA,CAAM,CAAA,cAAA,GAAmB,UAAW,CACtC,GAAIA,CAAM,CAAA,YAAA,GAAiB,MAAW,CAAA,CACpC,IAAMlM,CAAAA,CAAMkM,CAAM,CAAA,YAAA,CAClB,OAAIlM,CAAAA,YAAeiL,CACV,CAAA,CAAE,GAAK,CAAA,CAAA,QAAA,EAAWjL,EAAI,QAAQ,CAAA,CAAA,CAAI,QAAU,CAAA,EAAG,CAAA,CAEpDA,CAAQ,GAAA,MAAA,EAAUA,CAAQ,GAAA,IAAA,CACrB,CAAE,GAAA,CAAK,cAAgB,CAAA,QAAA,CAAU,EAAG,EAEzCA,CAAQ,GAAA,MAAA,CACH,CAAE,GAAA,CAAK,WAAa,CAAA,QAAA,CAAU,EAAG,EAEtCA,CAAQ,GAAA,OAAA,CACH,CAAE,GAAA,CAAK,WAAa,CAAA,QAAA,CAAU,EAAG,EAEtC,OAAOA,CAAAA,EAAQ,QACV,CAAA,CAAE,GAAK,CAAA,CAAA,SAAA,EAAYA,CAAG,CAAA,CAAA,CAAA,CAAK,QAAU,CAAA,EAAG,CAAA,CAE1C,CAAE,GAAA,CAAK,CAAWA,QAAAA,EAAAA,CAAG,GAAI,QAAU,CAAA,EAAG,CAC/C,CACA,OAAO,CAAE,GAAA,CAAK,cAAgB,CAAA,QAAA,CAAU,EAAG,CAC7C,CAEA,GAAIkM,CAAAA,CAAM,iBAAmB,aAAe,CAAA,CAC1C,GAAI,CAACA,CAAM,CAAA,OAAA,EAAW,CAACA,CAAAA,CAAM,OAAQ,CAAA,MAAA,CACnC,OAAO,CAAE,GAAK,CAAA,EAAA,CAAI,QAAU,CAAA,EAAG,CAEjC,CAAA,IAAMG,CAAOH,CAAAA,CAAAA,CAAM,OAChB,CAAA,GAAA,CAAK3W,CAAM4W,EAAAA,CAAAA,CAAM,mBAAmB,OAASrM,CAAAA,CAAAA,CAAevK,CAAC,CAAC,CAAC,CAAA,CAC/D,IAAK,CAAA,IAAI,EACZ,GAAI,CAAC2W,CAAM,CAAA,UAAA,CACT,OAAO,CAAE,GAAK,CAAA,EAAA,CAAI,QAAU,CAAA,EAAG,CAAA,CAEjC,IAAMM,CAAAA,CAAWL,CAAM,CAAA,iBAAA,CAAkB,QAASD,CAAM,CAAA,UAAA,CAAW,KAAK,CAAA,CAClEO,CAAUP,CAAAA,CAAAA,CAAM,UAAW,CAAA,OAAA,CAC9B,GAAK3W,CAAAA,CAAAA,EAAM4W,CAAM,CAAA,kBAAA,CAAmB,OAASrM,CAAAA,CAAAA,CAAevK,CAAC,CAAC,CAAC,CAC/D,CAAA,IAAA,CAAK,IAAI,CAAA,CAIRlF,CAAM,CAAA,CAAA,EAHQ6b,CAAM,CAAA,cAAA,CACpB,CAAeA,YAAAA,EAAAA,CAAAA,CAAM,cAAc,CAAA,EAAA,CAAA,CACnC,EACkB,CAAA,aAAA,EAAgBG,CAAI,CAAA,aAAA,EAAgBG,CAAQ,CAAIC,CAAAA,EAAAA,CAAO,CAC7E,CAAA,CAAA,CAAA,OAAIP,CAAM,CAAA,QAAA,GACR7b,CAAO,EAAA,CAAA,WAAA,EAAc6b,EAAM,QAAQ,CAAA,CAAA,CAAA,CAEjCA,CAAM,CAAA,QAAA,GACR7b,CAAO,EAAA,CAAA,WAAA,EAAc6b,CAAM,CAAA,QAAQ,IAE9B,CAAE,GAAA,CAAA7b,CAAK,CAAA,QAAA,CAAU,EAAG,CAC7B,CAEA,OAAO,CAAE,GAAK,CAAA,EAAA,CAAI,QAAU,CAAA,EAAG,CACjC,CACF,CAEOqc,CAAAA,EAAAA,CAAQ,IAAIT,EAAAA,CCpGnB,IAAMU,EAAAA,CAAN,KAAyD,CAGvD,KAAM5S,CAAAA,CAAAA,CAA+D,CACnE,IAAM6S,CAAS7S,CAAAA,CAAAA,CAGT4P,CADQ,CAAA,IAAIb,EAAiB,IAAK,CAAA,KAAK,CACrB,CAAA,iBAAA,CAAkB,OAAS8D,CAAAA,CAAAA,CAAO,KAAK,CAAA,CAE/D,GAAI,CAACA,CAAO,CAAA,QAAA,EAAY,CAACA,CAAAA,CAAO,QAAS,CAAA,MAAA,CACvC,OAAO,CAAE,GAAA,CAAK,CAAGjD,EAAAA,CAAS,CAAO,GAAA,CAAA,CAAA,QAAA,CAAU,EAAG,EAGhD,IAAMH,CAAAA,CAAY,IAAItP,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,OAA4B,CAAA,CAElE2P,EAAkB,EAAC,CACnBC,CAAkB,CAAA,EAExB,CAAA,IAAA,IAAWC,CAAS6C,IAAAA,CAAAA,CAAO,QAAU,CAAA,CACnC,GAAM,CAAE,GAAAvc,CAAAA,CAAAA,CAAK,QAAU2Z,CAAAA,CAAc,EAAIR,CAAU,CAAA,KAAA,CAAM,CAACO,CAAK,CAAC,CAAA,CAEhE,GAAIA,CAAAA,CAAM,MAAW,GAAA,YAAA,CAAc,CACjC,IAAM8C,CAAOhD,CAAAA,CAAAA,CAAM,GAAI,EAAA,EAAK,GACtBiD,CAAsBzc,CAAAA,CAAAA,CAE5B,GACE,WAAA,CAAY,IAAKyc,CAAAA,CAAmB,CACpC,EAAA,OAAA,CAAQ,IAAKA,CAAAA,CAAmB,CAChC,EAAA,UAAA,CAAW,IAAKA,CAAAA,CAAmB,CACnC,CAAA,CACA,IAAIC,CAAW,CAAA,CAAA,EAAGF,CAAI,CAAA,CAAA,EAAIC,CAAmB,CAAA,CAAA,CAAG,IAAK,EAAA,CACrDC,EAAWA,CAAS,CAAA,OAAA,CAClB,mDACA,CAAA,aACF,CACAlD,CAAAA,CAAAA,CAAM,IAAKkD,CAAAA,CAAQ,EACnBjD,CAAS,CAAA,IAAA,CAAK,GAAGE,CAAa,CAC9B,CAAA,QACF,CAEAH,CAAAA,CAAM,IAAKgD,CAAAA,CAAI,CACfhD,CAAAA,CAAAA,CAAM,IAAKiD,CAAAA,CAAmB,CAC9BhD,CAAAA,CAAAA,CAAS,KAAK,GAAGE,CAAa,CAC9B,CAAA,QACF,CAEAH,CAAAA,CAAM,IAAKxZ,CAAAA,CAAG,EACdyZ,CAAS,CAAA,IAAA,CAAK,GAAGE,CAAa,EAChC,CAEA,IAAW3P,IAAAA,CAAAA,IAAcuS,EAAO,gBAAkB,CAAA,CAChD,GAAM,CAAE,GAAAvc,CAAAA,CAAAA,CAAK,QAAU2c,CAAAA,CAAmB,CAAIxD,CAAAA,CAAAA,CAAU,KAAM,CAAA,CAC5DnP,CACF,CAAC,CAEDwP,CAAAA,CAAAA,CAAM,KAAKxZ,CAAG,CAAA,CACdyZ,CAAS,CAAA,IAAA,CAAK,GAAGkD,CAAkB,EACrC,CAEA,IAAMC,CAAapD,CAAAA,CAAAA,CAAM,IAAK,CAAA,IAAI,CAElC,CAAA,OAAO,CAAE,GAAA,CADQ,GAAGF,CAAS,CAAA,EAAA,EAAKsD,CAAU,CAAA,CAAA,CAAA,CACpB,QAAAnD,CAAAA,CAAS,CACnC,CACF,CAEOoD,CAAAA,EAAAA,CAAQ,IAAIP,EAAAA,CCjEnB,IAAMQ,EAAAA,CAAN,KAAoD,CAGlD,MAAMpT,CAA+D,CAAA,CACnE,IAAMqT,CAAAA,CAAarT,CAEnB,CAAA,OACEqT,CAAW,CAAA,UAAA,EACX,OAAOA,CAAAA,CAAW,QAAS,CAAA,KAAA,EAAU,QAE9B,CAAA,CACL,GAAKA,CAAAA,CAAAA,CAAW,SAAS,KACzB,CAAA,QAAA,CAAU,EACZ,CAOK,CAAA,CACL,GALqB,CAAA,IAAItE,CACzB,CAAA,IAAA,CAAK,KACP,CAAA,CAAE,yBAA0B,CAAA,OAAA,CAASsE,CAAW,CAAA,QAAoB,EAIlE,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEOC,EAAQ,CAAA,IAAIF,GC9BnB,IAAMG,EAAAA,CAAN,KAAsD,CAGpD,KAAMvB,CAAAA,CAAAA,CAAgE,CACpE,OAAO,CACL,GAAK,CAAA,EAAA,CACL,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEOwB,EAAQ,CAAA,IAAID,ECVnB,CAAA,IAAME,EAAN,CAAA,KAAwD,CAGtD,KAAA,CAAMzB,EAAgE,CACpE,OAAArc,CAAO,CAAA,IAAA,CACL,kEACF,CAAA,CAEO,CACL,GAAA,CAAK,EACL,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CAEO+d,CAAAA,EAAAA,CAAQ,IAAID,ECfnB,CAAA,IAAME,EAAN,CAAA,KAAuD,CAErD,KAAA,CAAM3T,CAAiB,CAAA,CACrB,IAAMyR,CAAAA,CAAKzR,CAEL4T,CAAAA,CAAAA,CADQ,IAAI7E,CAAAA,CAAiB,IAAK,CAAA,KAAK,EACtB,iBAAkB,CAAA,OAAA,CAAS0C,CAAG,CAAA,KAAK,CAE1D,CAAA,OAAO,CAAE,GAAA,CAAK,GADCA,CAAG,CAAA,QAAA,CAAW,YAAe,CAAA,EACrB,CAAGmC,EAAAA,CAAQ,CAAI,CAAA,CAAA,QAAA,CAAU,EAAG,CACrD,CACF,CAAA,CACOC,EAAQ,CAAA,IAAIF,ECXnB,CAAA,IAAMG,EAAN,CAAA,KAA6D,CAE3D,KAAA,CAAM9T,CAAiB,CAAA,CAErB,OAAO,CACL,IAAK,CAFKA,iDAAAA,EAAAA,CAAAA,CAEmD,aAAa,CAAA,CAAA,CAAA,CAC1E,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CACO+T,EAAQ,CAAA,IAAID,ECPnB,CAAA,IAAME,EAAN,CAAA,KAAkD,CAGhD,KAAMhU,CAAAA,CAAAA,CAA+D,CACnE,IAAMwP,CAAWxP,CAAAA,CAAAA,CAEjB,GAAI,OAAOwP,CAAS,CAAA,KAAA,EAAU,QAAU,CAAA,CACtC,IAAMyE,CAAAA,CAAmB,IAAIlF,CAAAA,CAAiB,KAAK,KAAK,CAAA,CAExD,OAAIS,CAAAA,CAAS,KAASA,EAAAA,CAAAA,CAAS,KAAM,CAAA,MAAA,CAAS,EAMrC,CACL,GAAA,CAAK,CANUyE,EAAAA,CAAAA,CAAiB,iBAChC,CAAA,OAAA,CACAzE,CAAS,CAAA,KACX,CAGkB,CAAQA,KAAAA,EAAAA,CAAAA,CAAS,KAAK,CAAA,CAAA,CAAA,CACtC,QAAU,CAAA,EACZ,CAAA,CAQK,CAAE,GAAA,CALQyE,CAAiB,CAAA,iBAAA,CAChC,OACAzE,CAAAA,CAAAA,CAAS,KACX,CAAA,CAEwB,SAAU,EAAG,CACvC,CAEA,IAAM0E,CAAAA,CAAgB,KAAM,CAAA,OAAA,CAAQ1E,CAAS,CAAA,KAAK,CAC9CA,CAAAA,CAAAA,CAAS,KACT,CAAA,CAACA,CAAS,CAAA,KAAK,EAGb1Z,CADY,CAAA,IAAIqK,CAAU,CAAA,IAAA,CAAK,KAAO,CAAA,OAA4B,CAC/C,CAAA,KAAA,CAAM+T,CAAa,CAAA,CAEtCC,CACJ3E,CAAAA,CAAAA,CAAS,KAASA,EAAAA,CAAAA,CAAS,KAAM,CAAA,MAAA,CAAS,QAAQA,CAAS,CAAA,KAAK,CAAM,CAAA,CAAA,CAAA,EAAA,CAExE,OAAO,CACL,GAAK,CAAA,CAAA,CAAA,EAAI1Z,EAAO,GAAG,CAAA,CAAA,EAAIqe,CAAQ,CAAA,CAAA,CAC/B,QAAUre,CAAAA,CAAAA,CAAO,QACnB,CACF,CACF,CAEOse,CAAAA,EAAAA,CAAQ,IAAIJ,EAAAA,CC/CnB,IAAMK,EAAAA,CAAN,KAAqD,CAGnD,KAAMrU,CAAAA,CAAAA,CAA+D,CACnE,IAAMsU,CAActU,CAAAA,CAAAA,CACpB,OAAIsU,CAAAA,CAAY,WACP,CACL,GAAA,CAAKA,CAAY,CAAA,MAAA,CACjB,QAAU,CAAA,EACZ,CAAA,CAQK,CACL,GAAA,CANgB,IAAIvF,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CACjD,QACAuF,CAAY,CAAA,MACd,CAIE,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CAEOC,CAAAA,EAAAA,CAAQ,IAAIF,EAAAA,CCxBnB,IAAMG,EAAAA,CAAN,KAAoD,CAGlD,MAAMxU,CAA+D,CAAA,CACnE,IAAMyU,CAAAA,CAAazU,CACnB,CAAA,GAAIyU,CAAW,CAAA,UAAA,CACb,OAAO,CACL,GAAA,CAAKA,CAAW,CAAA,MAAA,CAChB,QAAUA,CAAAA,CAAAA,CAAW,KACvB,CAAA,CAGF,IAAMC,CAAMD,CAAAA,CAAAA,CAAW,cACnBne,CAAAA,CAAAA,CAAM,EACNyZ,CAAAA,CAAAA,CAAkB,EAAC,CAUvB,GAPE,EAAE0E,CAAW,CAAA,KAAA,YAAiBpT,CAC9B,CAAA,EAAA,CAAC,KAAM,CAAA,OAAA,CAAQoT,EAAW,KAAK,CAAA,GAE/Bne,CAAM,CAAA,CAAA,EAAG,IAAIyY,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CAAmB,OAAS0F,CAAAA,CAAAA,CAAW,MAAM,CAAC,CAAIA,CAAAA,EAAAA,CAAAA,CAAW,QAAQ,CAAKC,EAAAA,EAAAA,CAAG,CACvH3E,CAAAA,CAAAA,CAAAA,CAAW,CAAC0E,CAAAA,CAAW,KAAK,CAAA,CAAA,CAG1B,KAAM,CAAA,OAAA,CAAQA,CAAW,CAAA,KAAK,CAAG,CAAA,CACnC,IAAME,CAAAA,CAAeF,EAAW,KAC7B,CAAA,GAAA,CAAI,CAACnF,CAAAA,CAAG/P,CAAM,GAAA,CAAA,CAAA,EAAImV,CAAMnV,CAAAA,CAAC,EAAE,CAC3B,CAAA,IAAA,CAAK,IAAI,CAAA,CAEZjJ,CAAM,CAAA,CAAA,EAAG,IAAIyY,CAAAA,CAAiB,KAAK,KAAK,CAAA,CAAE,kBAAmB,CAAA,OAAA,CAAS0F,CAAW,CAAA,MAAM,CAAC,CAAA,CAAA,EAAIA,CAAW,CAAA,QAAQ,CAAKE,EAAAA,EAAAA,CAAY,CAChI5E,CAAAA,CAAAA,CAAAA,CAAAA,CAAW0E,CAAW,CAAA,MACxB,CAEA,OAAIA,CAAAA,CAAW,SACbne,GAAAA,CAAAA,CAAM,CAAQA,KAAAA,EAAAA,CAAG,CAGZ,CAAA,CAAA,CAAA,CAAA,CAAE,GAAKA,CAAAA,CAAAA,CAAI,IAAK,EAAA,CAAG,QAAAyZ,CAAAA,CAAS,CACrC,CACF,EAEO6E,EAAQ,CAAA,IAAIJ,EC1CnB,CAAA,IAAMK,EAAN,CAAA,KAAyD,CAEvD,KAAA,CAAM7U,CAAiB,CAAA,CACrB,IAAM8U,CAAAA,CAAK9U,CAEL4T,CAAAA,CAAAA,CADQ,IAAI7E,CAAAA,CAAiB,KAAK,KAAK,CAAA,CACtB,iBAAkB,CAAA,OAAA,CAAS+F,CAAG,CAAA,KAAK,CACpDxC,CAAAA,CAAAA,CAAOwC,EAAG,OAAQ,CAAA,GAAA,CAAKtZ,CAAM,EAAA,CAAA,CAAA,EAAIA,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,IAAA,CAAK,IAAI,CAEtD,CAAA,OAAO,CACL,GAAA,CAAK,CAFQsZ,EAAAA,CAAAA,CAAG,MAAS,CAAA,SAAA,CAAY,EAEvB,CAAA,CAAA,EAAIA,CAAG,CAAA,SAAS,CAAQlB,KAAAA,EAAAA,CAAQ,CAAKtB,EAAAA,EAAAA,CAAI,IACvD,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CACOyC,EAAQ,CAAA,IAAIF,ECfnB,CAAA,IAAMG,EAAN,CAAA,KAAuD,CAErD,KAAA,CAAMhV,CAAiB,CAAA,CACrB,IAAMiV,CAAKjV,CAAAA,CAAAA,CACX,OAAO,CACL,GAAK,CAAA,CAAA,CAAA,EAAIiV,CAAG,CAAA,SAAS,CAASA,MAAAA,EAAAA,CAAAA,CAAG,KAAK,CAAA,CAAA,CAAA,CACtC,QAAU,CAAA,EACZ,CACF,CACF,CACOC,CAAAA,EAAAA,CAAQ,IAAIF,EAAAA,CCPnB,IAAMG,EAAAA,CAAN,KAAoD,CAGlD,MAAMnV,CAA+D,CAAA,CACnE,IAAMoV,CAAAA,CAAapV,CACnB,CAAA,GAAIoV,CAAW,CAAA,UAAA,CACb,OAAO,CACL,GAAA,CAAKA,CAAW,CAAA,QAAA,CAAS,KACzB,CAAA,QAAA,CAAU,EACZ,CAGF,CAAA,IAAMnB,CAAmB,CAAA,IAAIlF,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAClDsG,EAAiBpB,CAAiB,CAAA,yBAAA,CACtC,OACAmB,CAAAA,CAAAA,CAAW,QACb,CAAA,CAEA,GAAI,CAACA,CAAW,CAAA,OAAA,CAAQ,MACtB,CAAA,OAAO,CACL,GAAA,CAAKC,CACL,CAAA,QAAA,CAAU,EACZ,CAAA,CAGF,IAAMC,CAAAA,CAAcF,CAAW,CAAA,OAAA,CAAQ,CAAC,CAAA,CAClC/Z,CAAU,CAAA,MAAA,CAAO,IAAKia,CAAAA,CAAW,CAAE,CAAA,MAAA,CACtCviB,CAAQuiB,EAAAA,CAAAA,CAAYviB,CAAG,CAAM,GAAA,MAChC,CACA,CAAA,GAAI,CAACsI,CAAAA,CAAQ,MACX,CAAA,OAAO,CACL,GAAKga,CAAAA,CAAAA,CACL,QAAU,CAAA,EACZ,CAAA,CAGF,IAAME,CAAAA,CAAmBla,EACtB,GAAKE,CAAAA,CAAAA,EAAW0Y,CAAiB,CAAA,kBAAA,CAAmB,OAAS1Y,CAAAA,CAAM,CAAC,CAAA,CACpE,IAAK,CAAA,IAAI,CAENia,CAAAA,CAAAA,CAAmB,EAAC,CACpBC,CAA0B,CAAA,GAC5BC,CAAaN,CAAAA,CAAAA,CAAW,cAE5B,CAAA,IAAA,IAAWvZ,CAAUuZ,IAAAA,CAAAA,CAAW,OAAS,CAAA,CACvC,IAAMO,CAAAA,CAAeta,CAAQ,CAAA,GAAA,CAAKE,CAAWM,EAAAA,CAAAA,CAAON,CAAM,CAAC,EAErDoZ,CAAyB,CAAA,EAC/B,CAAA,IAAA,IAAW3hB,CAAS2iB,IAAAA,CAAAA,CACd3iB,CAAiBke,YAAAA,CAAAA,CACnByD,CAAa,CAAA,IAAA,CAAK3hB,CAAM,CAAA,QAAQ,CAEhCwiB,EAAAA,CAAAA,CAAU,IAAKxiB,CAAAA,CAAK,EACpB2hB,CAAa,CAAA,IAAA,CAAK,CAAIe,CAAAA,EAAAA,CAAAA,EAAY,CAAE,CAAA,CAAA,CAAA,CAIxCD,CAAc,CAAA,IAAA,CAAK,IAAId,CAAa,CAAA,IAAA,CAAK,IAAI,CAAC,CAAG,CAAA,CAAA,EACnD,CAEA,IAAIre,EAAM,CAAG+e,EAAAA,CAAc,CAAKE,EAAAA,EAAAA,CAAgB,CAAYE,SAAAA,EAAAA,CAAAA,CAAc,IAAK,CAAA,IAAI,CAAC,CAAA,CAAA,CAEpF,GAAI,CAACL,CAAW,CAAA,gBAAA,CACd,GAAIA,CAAAA,CAAW,WAAaA,CAAW,CAAA,SAAA,CAAU,MAAQ,CAAA,CACvD,IAAMQ,CAAAA,CAAgBR,CAAW,CAAA,SAAA,CAC9B,GACE7Z,CAAAA,CAAAA,EACC,CAAY0Y,SAAAA,EAAAA,CAAAA,CAAiB,kBAAmB,CAAA,OAAA,CAAS1Y,CAAM,CAAC,EACpE,CACC,CAAA,IAAA,CAAK,IAAI,CAAA,CACZjF,CAAMA,CAAAA,CAAAA,CAAI,OAAQ,CAAA,UAAA,CAAY,CAAYsf,SAAAA,EAAAA,CAAa,CAAS,OAAA,CAAA,EAClE,CAAO,KAAA,CACL,IAAMC,CAAAA,CAAa,KAAK,gBAAiBxa,CAAAA,CAAAA,CAAS4Y,CAAgB,CAAA,CAClE3d,CAAMA,CAAAA,CAAAA,CAAI,OAAQ,CAAA,UAAA,CAAY,YAAYuf,CAAU,CAAA,OAAA,CAAS,EAC/D,CAGF,OAAO,CACL,GAAAvf,CAAAA,CAAAA,CACA,SAAUkf,CACZ,CACF,CAEQ,gBAAA,CACNM,CACA7B,CAAAA,CAAAA,CACQ,CACR,IAAM8B,CAAgB,CAAA,CAAC,GAAGD,CAAe,CAEnCtZ,CAAAA,CAAAA,CAAa,IAAK,CAAA,KAAA,CAAM,WAC9B,OAAIA,CAAAA,EAAc,CAACsZ,CAAAA,CAAgB,QAAStZ,CAAAA,CAAU,CACpDuZ,EAAAA,CAAAA,CAAc,IAAKvZ,CAAAA,CAAU,CAGxBuZ,CAAAA,CAAAA,CACJ,GACExa,CAAAA,CAAAA,EACC,CAAY0Y,SAAAA,EAAAA,CAAAA,CAAiB,mBAAmB,OAAS1Y,CAAAA,CAAM,CAAC,CAAA,CACpE,CACC,CAAA,IAAA,CAAK,IAAI,CACd,CACF,CAAA,CAEOya,EAAQ,CAAA,IAAIb,ECxGnB,CAAA,IAAMc,EAAN,CAAA,KAAkD,CAGhD,KAAMjW,CAAAA,CAAAA,CAA+D,CACnE,IAAMkW,CAAWlW,CAAAA,CAAAA,CACjB,GAAIkW,CAAAA,CAAS,WACX,OAAO,CACL,GAAKA,CAAAA,CAAAA,CAAS,KACd,CAAA,QAAA,CAAU,EACZ,EAGF,IAAM9D,CAAAA,CAAQ,IAAIrD,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAEzCoH,CAAAA,CAAAA,CAAgBD,CAAS,CAAA,IAAA,CACxBC,CAAc,CAAA,QAAA,CAAS,GAAG,CAAA,GAC7BA,CAAgB,CAAA,CAAA,EAAGD,EAAS,KAAK,CAAA,CAAA,EAAIC,CAAa,CAAA,CAAA,CAAA,CAGpD,IAAIC,CAAAA,CAAiBF,CAAS,CAAA,KAAA,CACzBE,CAAe,CAAA,QAAA,CAAS,GAAG,CAAA,GAC9BA,CAAiB,CAAA,CAAA,EAAG,IAAK,CAAA,KAAA,CAAM,KAAK,CAAIA,CAAAA,EAAAA,CAAc,CAGxD,CAAA,CAAA,CAAA,IAAMC,CAAUjE,CAAAA,CAAAA,CAAM,kBAAmB,CAAA,OAAA,CAAS+D,CAAa,CAAA,CACzDG,CAAWlE,CAAAA,CAAAA,CAAM,kBAAmB,CAAA,OAAA,CAASgE,CAAc,CAAA,CAIjE,OAAO,CAAE,GAAA,CADG,CAFKhE,EAAAA,CAAAA,CAAM,iBAAkB,CAAA,OAAA,CAAS8D,CAAS,CAAA,KAAK,CAEzC,CAAOG,IAAAA,EAAAA,CAAO,CAAIH,CAAAA,EAAAA,CAAAA,CAAS,EAAI,EAAA,QAAQ,CAAII,CAAAA,EAAAA,CAAQ,GAC5D,QAAU,CAAA,EAAG,CAC7B,CACF,CAAA,CAEOC,EAAQ,CAAA,IAAIN,EClCnB,CAAA,IAAMO,EAAN,CAAA,KAAmD,CAGjD,KAAA,CAAMxW,CAA+D,CAAA,CACnE,IAAMyW,CAAYzW,CAAAA,CAAAA,CAGlB,OAAO,CACL,GAAK,CAAA,CAAA,YAAA,EAHKyW,CAAU,CAAA,cAGG,CACvB,UAAA,CAAA,CAAA,QAAA,CAAU,CAACA,CAAAA,CAAU,KAAK,CAC5B,CACF,CACF,EAEOC,EAAQ,CAAA,IAAIF,ECHnB,CAAA,IAAMG,EAAN,CAAA,KAAkD,CAGhD,KAAA,CAAM3E,CAAoD,CAAA,CAGxD,OAAO,CACL,GAAK,CAAA,EAAA,CACL,QAAU,CAAA,EACZ,CACF,CACF,CAEO4E,CAAAA,EAAAA,CAAQ,IAAID,EAAAA,CCxBnB,IAAME,EAAAA,CAAN,KAAoD,CAGlD,KAAA,CAAM7W,CAA+D,CAAA,CACnE,IAAM8W,CAAAA,CAAa9W,CAGnB,CAAA,OAAO,CACL,GAAK,CAAA,CAAA,QAAA,EAHK8W,CAAW,CAAA,cAGF,CACnB,KAAA,CAAA,CAAA,QAAA,CAAU,CAACA,CAAAA,CAAW,MAAM,CAC9B,CACF,CACF,CAEOC,CAAAA,EAAAA,CAAQ,IAAIF,EAAAA,CCbnB,IAAMG,EAAN,CAAA,KAAyD,CAGvD,KAAA,CAAMhX,CAA+D,CAAA,CACnE,IAAMiX,CAAAA,CAAkBjX,CAExB,CAAA,OAAIiX,CAAgB,CAAA,UAAA,CACX,CACL,GAAA,CAAKA,CAAgB,CAAA,KAAA,CACrB,SAAU,EACZ,CAGFthB,EAAAA,CAAAA,CAAO,IACL,CAAA,+KAGF,CAEO,CAAA,CACL,GAAK,CAAA,EAAA,CACL,QAAU,CAAA,EACZ,CAAA,CACF,CACF,CAAA,CAEOuhB,GAAQ,IAAIF,EAAAA,CC1BnB,IAAMG,EAAAA,CAAN,KAAqD,CAGnD,KAAMnX,CAAAA,CAAAA,CAA+D,CACnE,IAAMoX,CAAAA,CAAcpX,CACpB,CAAA,GAAIoX,CAAY,CAAA,UAAA,CACd,OAAO,CACL,IAAKA,CAAY,CAAA,MAAA,CACjB,QAAU,CAAA,EACZ,CAAA,CAGF,IAAMC,CAAAA,CAAY,IAAItI,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CACjD,OACAqI,CAAAA,CAAAA,CAAY,MACd,CACME,CAAAA,CAAAA,CAAeF,CAAY,CAAA,SAAA,CAAU,WAAY,EAAA,CAEvD,OAAO,CACL,IAAK,CAAGC,EAAAA,CAAS,CAAIC,CAAAA,EAAAA,CAAY,CACjC,CAAA,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CAAA,CAEOC,EAAQ,CAAA,IAAIJ,EC3BnB,CAAA,IAAMK,EAAN,CAAA,KAAiD,CAG/C,KAAA,CAAMxX,CAAmD,CAAA,CAEvD,OAAO,CACL,GAFcA,CAAAA,CAAAA,CAED,SACb,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEOyX,EAAQ,CAAA,IAAID,GCXnB,IAAME,EAAAA,CAAN,KAA4D,CAG1D,KAAM1F,CAAAA,CAAAA,CAAgE,CAgBpE,OAAO,CAAE,GAbG,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uCAFCA,EAAAA,CAAAA,CACM,KAauB,CAC5B,EAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC7B,CACF,CAEO2F,CAAAA,EAAAA,CAAQ,IAAID,ECvBnB,CAAA,IAAME,GAAN,KAAuD,CAGrD,MAAM5F,CAAgE,CAAA,CAapE,OAAO,CAAE,GAVG,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAAA,EAFCA,EACM,KAQe,CAAA;AAAA;AAAA,gBAAA,CAAA,CAGpB,SAAU,EAAG,CAC7B,CACF,CAAA,CAEO6F,GAAQ,IAAID,EAAAA,CCpBnB,IAAME,EAAAA,CAAN,KAA4D,CAG1D,KAAA,CAAM9F,EAAgE,CAYpE,OAAO,CAAE,GATG,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAA,EAFCA,EACM,KAQO,CAAA;AAAA,6BAAA,CAAA,CAEZ,SAAU,EAAG,CAC7B,CACF,CAAA,CAEO+F,GAAQ,IAAID,EAAAA,CCnBnB,IAAME,EAAAA,CAAN,KAAuD,CAGrD,KAAA,CAAMhG,EAAgE,CAcpE,OAAO,CAAE,GAXG,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,EAFCA,EACM,KAUM,CAAA;AAAA,2BAAA,CAAA,CAEX,QAAU,CAAA,EAAG,CAC7B,CACF,CAAA,CAEOiG,EAAQ,CAAA,IAAID,ECnBnB,CAAA,IAAME,EAAN,CAAA,KAAoD,CAGlD,KAAA,CAAMlY,CAA+D,CAAA,CACnE,IAAMmY,CAAAA,CAAanY,CACnB,CAAA,GAAImY,CAAW,CAAA,UAAA,CACb,OAAO,CACL,GAAKA,CAAAA,CAAAA,CAAW,MAChB,CAAA,QAAA,CAAU,EACZ,CAAA,CAGF,IAAMC,CAAAA,CAAe,IAAK,CAAA,YAAA,CACxBD,CAAW,CAAA,MAAA,CACXA,CAAW,CAAA,WACb,CACMhE,CAAAA,CAAAA,CAAW,IAAK,CAAA,WAAA,CAAYgE,CAAW,CAAA,KAAK,CAElD,CAAA,OAAO,CACL,GAAA,CAAK,CAAGC,EAAAA,CAAAA,CAAa,GAAG,CAAA,EAAGjE,CAAQ,CAAA,CAAA,CACnC,QAAUiE,CAAAA,CAAAA,CAAa,QACzB,CACF,CAEQ,YAAA,CACN7c,EACA8c,CAC8C,CAAA,CAC9C,GAAI,OAAO9c,CAAW,EAAA,QAAA,CAAU,CAC9B,IAAMuK,CAAM,CAAA,IAAIiJ,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBAC3C,CAAA,OAAA,CACAxT,CACF,CAAA,CAEIjF,CAAMwP,CAAAA,CAAAA,CACV,OAAIuS,CAAAA,GACF/hB,CAAM,CAAA,CAAA,EAAG+hB,CAAY,CAAA,WAAA,EAAa,CAAA,CAAA,EAAIvS,CAAG,CAAA,CAAA,CAAA,CAAA,CAGpC,CACL,GAAA,CAAAxP,EACA,QAAU,CAAA,EACZ,CACF,CAEA,GAAI,KAAM,CAAA,OAAA,CAAQiF,CAAM,CAAA,EAAKA,CAAO,CAAA,MAAA,CAAS,CAAG,CAAA,CAE9C,IAAMzF,CAAAA,CADY,IAAIqK,CAAU,CAAA,IAAA,CAAK,KAAO,CAAA,OAA4B,CAC/C,CAAA,KAAA,CAAM5E,CAAM,CAAA,CAEjCjF,CAAM,CAAA,CAAA,CAAA,EAAIR,CAAO,CAAA,GAAG,CACxB,CAAA,CAAA,CAAA,OAAIuiB,CACF/hB,GAAAA,CAAAA,CAAM,GAAG+hB,CAAY,CAAA,WAAA,EAAa,CAAA,EAAG/hB,CAAG,CAAA,CAAA,CAAA,CAGnC,CACL,GAAA,CAAAA,CACA,CAAA,QAAA,CAAUR,CAAO,CAAA,QACnB,CACF,CAEA,GAAI,CAAC,KAAM,CAAA,OAAA,CAAQyF,CAAM,CAAA,CAAG,CAE1B,IAAMzF,CADY,CAAA,IAAIqK,CAAU,CAAA,IAAA,CAAK,KAAO,CAAA,OAA4B,CAC/C,CAAA,KAAA,CAAM,CAAC5E,CAAM,CAAC,CAEnCjF,CAAAA,CAAAA,CAAM,CAAIR,CAAAA,EAAAA,CAAAA,CAAO,GAAG,CAAA,CAAA,CAAA,CACxB,OAAIuiB,CAAAA,GACF/hB,CAAM,CAAA,CAAA,EAAG+hB,CAAY,CAAA,WAAA,EAAa,CAAA,EAAG/hB,CAAG,CAAA,CAAA,CAAA,CAGnC,CACL,GAAA,CAAAA,CACA,CAAA,QAAA,CAAUR,CAAO,CAAA,QACnB,CACF,CA2BA,OAAO,CACL,GA1BuByF,CAAAA,CAAAA,CAAO,GAAKuK,CAAAA,CAAAA,EAAQ,CAC3C,GAAI,OAAOA,CAAQ,EAAA,QAAA,CAAU,CAC3B,IAAMwS,CAAY,CAAA,IAAIvJ,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBACjD,CAAA,OAAA,CACAjJ,CACF,CAAA,CAEA,OAAIuS,CAAAA,CACK,CAAGA,EAAAA,CAAAA,CAAY,WAAY,EAAC,CAAIC,CAAAA,EAAAA,CAAS,CAG3CA,CAAAA,CAAAA,CAAAA,CACT,CAKA,IAAIhiB,CAAM,CAAA,CAAA,CAAA,EAHQ,IAAI6J,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,OAA4B,CAC/C,CAAA,KAAA,CAAM,CAAC2F,CAAG,CAAC,CAAA,CAEf,GAAG,CAAA,CAAA,CAAA,CACxB,OAAIuS,CAAAA,GACF/hB,CAAM,CAAA,CAAA,EAAG+hB,CAAY,CAAA,WAAA,EAAa,CAAA,EAAG/hB,CAAG,CAGnCA,CAAAA,CAAAA,CAAAA,CACT,CAAC,CAAA,CAGuB,IAAK,CAAA,IAAI,CAC/B,CAAA,QAAA,CAAU,EACZ,CACF,CAEQ,WAAY4Y,CAAAA,CAAAA,CAAwB,CAC1C,OAAIA,GAASA,CAAM,CAAA,MAAA,CAAS,CACnB,CAAA,CAAA,KAAA,EAAQA,CAAK,CAAA,CAAA,CAAA,CAGf,EACT,CACF,CAEOqJ,CAAAA,EAAAA,CAAQ,IAAIL,EAAAA,CCnHnB,IAAMM,EAAAA,CAAN,KAAsD,CAGpD,KAAMxY,CAAAA,CAAAA,CAA+D,CACnE,IAAMyY,CAAezY,CAAAA,CAAAA,CAErB,OAAIyY,CAAAA,CAAa,UAAc,EAAA,OAAOA,CAAa,CAAA,QAAA,EAAa,QACvD,CAAA,CACL,GAAKA,CAAAA,CAAAA,CAAa,SAClB,QAAU,CAAA,EACZ,CAAA,CAOK,CACL,GAAA,CAAK,CALgB,MAAA,EAAA,IAAI1J,CACzB,CAAA,IAAA,CAAK,KACP,CAAA,CAAE,yBAA0B,CAAA,OAAA,CAAS0J,CAAa,CAAA,QAAoB,CAGxC,CAAA,CAAA,CAC5B,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEOC,EAAQ,CAAA,IAAIF,EC1BnB,CAAA,IAAMG,EAAN,CAAA,KAAmD,CAGjD,KAAA,CAAM3Y,EAA+D,CACnE,IAAM4Y,CAAY5Y,CAAAA,CAAAA,CACZ6Y,CAAS,CAAA,IAAI1Y,CAAU,CAAA,IAAA,CAAK,KAAO,CAAA,OAAO,CAC1C2Y,CAAAA,CAAAA,CAAQ,KAAM,CAAA,OAAA,CAAQF,CAAU,CAAA,KAAK,CACvCA,CAAAA,CAAAA,CAAU,KACV,CAAA,CAACA,CAAU,CAAA,KAAK,CAEd1Y,CAAAA,CAAAA,CACJ,OAAO0Y,CAAAA,CAAU,KAAU,EAAA,QAAA,CACvB,CAAE,GAAA,CAAKA,CAAU,CAAA,KAAA,CAAO,SAAU,EAAG,CACrCC,CAAAA,CAAAA,CAAO,KACLC,CAAAA,CAAAA,CAAM,MAAO,CAAA,OAAO,CACpBF,CAAAA,CAAAA,CAAU,cACZ,CAAA,CAEN,OAAO,CACL,GAAK1Y,CAAAA,CAAAA,CAAI,IACT,QAAUA,CAAAA,CAAAA,CAAI,QAChB,CACF,CACF,CAAA,CAEO6Y,EAAQ,CAAA,IAAIJ,ECtBnB,CAAA,IAAMK,EAAN,CAAA,KAAoD,CAGlD,KAAA,CAAMhZ,CAA+D,CAAA,CACnE,IAAMiZ,CAAajZ,CAAAA,CAAAA,CACnB,GAAIiZ,CAAAA,CAAW,UAAc,EAAA,OAAOA,CAAW,CAAA,QAAA,EAAa,QAC1D,CAAA,OAAO,CACL,GAAA,CAAKA,CAAW,CAAA,QAAA,CAChB,QAAUA,CAAAA,CAAAA,CAAW,MACvB,CAAA,CAGF,IAAMhF,CAAAA,CAAmB,IAAIlF,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAClDsG,CAAAA,CAAAA,CAAiBpB,CAAiB,CAAA,yBAAA,CACtC,OACAgF,CAAAA,CAAAA,CAAW,QACb,CAAA,CAEA,GAAI,CAACA,CAAAA,CAAW,OAAQ,CAAA,MAAA,EAAU,CAACA,CAAAA,CAAW,MAAO,CAAA,MAAA,CACnD,OAAO,CACL,GAAK5D,CAAAA,CAAAA,CACL,QAAU,CAAA,EACZ,CAAA,CAGF,IAAI6D,CAAAA,CAAe,CACbC,CAAAA,CAAAA,CAAuB,EAAC,CACxBC,CAAYH,CAAAA,CAAAA,CAAW,OAC1B,CAAA,GAAA,CAAI,CAAC1d,CAAAA,CAAQoO,CAAU,GAAA,CACtB,IAAM+K,CAAAA,CAAMuE,EAAW,cAAiBtP,CAAAA,CAAAA,CAAQuP,CAC1ClmB,CAAAA,CAAAA,CAAQimB,CAAW,CAAA,MAAA,CAAOtP,CAAK,CAAA,CAErC,OAAI3W,CAAAA,YAAiBke,CACnBgI,EAAAA,CAAAA,EAAAA,CACO,CAAGjF,EAAAA,CAAAA,CAAiB,kBAAmB,CAAA,OAAA,CAAS1Y,CAAM,CAAC,CAAMvI,GAAAA,EAAAA,CAAAA,CAAM,QAAQ,CAAA,CAAA,GAGpFmmB,CAAc,CAAA,IAAA,CAAKnmB,CAAK,CAAA,CACjB,CAAGihB,EAAAA,CAAAA,CAAiB,kBAAmB,CAAA,OAAA,CAAS1Y,CAAM,CAAC,OAAOmZ,CAAG,CAAA,CAAA,CAC1E,CAAC,CAAA,CACA,IAAK,CAAA,IAAI,CAEZ,CAAA,OAAO,CACL,GAAA,CAAK,CAAGW,EAAAA,CAAc,CAAQ+D,KAAAA,EAAAA,CAAS,CACvC,CAAA,CAAA,QAAA,CAAUD,CACZ,CACF,CACF,CAEOE,CAAAA,EAAAA,CAAQ,IAAIL,EAAAA,CClDnB,IAAMM,EAAAA,CAAN,KAAmD,CAGjD,KAAMtZ,CAAAA,CAAAA,CAA+D,CACnE,IAAMuZ,CAAYvZ,CAAAA,CAAAA,CAClB,GAAIuZ,CAAU,CAAA,UAAA,CACZ,OAAO,CACL,GAAKA,CAAAA,CAAAA,CAAU,MACf,CAAA,QAAA,CAAWA,CAAU,CAAA,KAAA,EAAmB,EAC1C,CAGF,CAAA,IAAMvmB,CAAQumB,CAAAA,CAAAA,CAAU,KAClB7E,CAAAA,CAAAA,CAAM6E,CAAU,CAAA,cAAA,CAEtB,GAAI,IAAA,CAAK,SAAUvmB,CAAAA,CAAK,CAAG,CAAA,CACzB,IAAMwmB,CAAAA,CAAiB,IAAK,CAAA,6BAAA,CAA8BxmB,CAAM,CAAA,QAAQ,EAKxE,OAAO,CACL,GAAK,CAAA,CAAA,EALiB,IAAI+b,CAAAA,CAC1B,IAAK,CAAA,KACP,CAAE,CAAA,kBAAA,CAAmB,OAASwK,CAAAA,CAAAA,CAAU,MAAM,CAGrB,CAAIA,CAAAA,EAAAA,CAAAA,CAAU,QAAQ,CAAA,CAAA,EAAIC,CAAc,CAAA,CAAA,CAAG,IAAK,EAAA,CACvE,QAAU,CAAA,EACZ,CACF,CAEA,GAAI,KAAM,CAAA,OAAA,CAAQxmB,CAAK,CAAA,CAAG,CACxB,IAAMymB,CAAAA,CAAkB,IAAI1K,CAAAA,CAC1B,IAAK,CAAA,KACP,CAAE,CAAA,kBAAA,CAAmB,OAASwK,CAAAA,CAAAA,CAAU,MAAM,CAAA,CAE9C,GAAIA,CAAAA,CAAU,QAAS,CAAA,WAAA,EAAkB,GAAA,SAAA,CAAW,CAClD,IAAM5E,CAAe,CAAA,CAAA,CAAA,EAAID,CAAG,CAAA,MAAA,EAASA,CAAM,CAAA,CAAC,CACxCpe,CAAAA,CAAAA,CAAAA,CAAM,CAAGmjB,EAAAA,CAAe,CAAY9E,SAAAA,EAAAA,CAAY,GAEpD,OAAI4E,CAAAA,CAAU,SACZjjB,GAAAA,CAAAA,CAAM,CAAQA,KAAAA,EAAAA,CAAG,CAGZ,CAAA,CAAA,CAAA,CAAA,CACL,GAAKA,CAAAA,CAAAA,CAAI,IAAK,EAAA,CACd,QAAUtD,CAAAA,CACZ,CACF,CAEA,IAAM2hB,CAAe3hB,CAAAA,CAAAA,CAAM,GAAI,CAAA,CAACsc,CAAG/P,CAAAA,CAAAA,GAAM,CAAImV,CAAAA,EAAAA,CAAAA,CAAMnV,CAAC,CAAA,CAAE,CAAE,CAAA,IAAA,CAAK,IAAI,CAAA,CAE7DjJ,CAAM,CAAA,CAAA,EAAGmjB,CAAe,CAAIF,CAAAA,EAAAA,CAAAA,CAAU,QAAQ,CAAA,EAAA,EAAK5E,CAAY,CAAA,CAAA,CAAA,CAEnE,OAAI4E,CAAAA,CAAU,SACZjjB,GAAAA,CAAAA,CAAM,CAAQA,KAAAA,EAAAA,CAAG,CAGZ,CAAA,CAAA,CAAA,CAAA,CACL,GAAKA,CAAAA,CAAAA,CAAI,IAAK,EAAA,CACd,QAAUtD,CAAAA,CACZ,CACF,CAEA,IAAMymB,CAAAA,CAAkB,IAAI1K,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CACvD,OACAwK,CAAAA,CAAAA,CAAU,MACZ,CAEA,CAAA,GAAIA,CAAU,CAAA,QAAA,CAAS,QAAS,CAAA,MAAM,CAAG,CAAA,CACvC,IAAIjjB,CAAAA,CAAM,CAAGmjB,EAAAA,CAAe,CAAIF,CAAAA,EAAAA,CAAAA,CAAU,QAAQ,CAAA,CAAA,CAElD,OAAIA,CAAAA,CAAU,SACZjjB,GAAAA,CAAAA,CAAM,CAAQA,KAAAA,EAAAA,CAAG,CAGZ,CAAA,CAAA,CAAA,CAAA,CACL,GAAKA,CAAAA,CAAAA,CAAI,IAAK,EAAA,CACd,QAAU,CAAA,EACZ,CACF,CAEA,GAAItD,CAAAA,GAAU,MACZ,CAAA,OAAO,CACL,GAAA,CAAK,EACL,CAAA,QAAA,CAAU,EACZ,CAGF,CAAA,IAAIsD,CAAM,CAAA,CAAA,EAAGmjB,CAAe,CAAA,CAAA,EAAIF,CAAU,CAAA,QAAQ,CAAK7E,EAAAA,EAAAA,CAAG,CAE1D,CAAA,CAAA,OAAI6E,CAAU,CAAA,SAAA,GACZjjB,CAAM,CAAA,CAAA,KAAA,EAAQA,CAAG,CAAA,CAAA,CAAA,CAAA,CAGZ,CACL,GAAA,CAAKA,CAAI,CAAA,IAAA,GACT,QAAU,CAAA,CAACtD,CAAK,CAClB,CACF,CAEQ,SAAUA,CAAAA,CAAAA,CAA8B,CAM9C,GALI,CAACA,CAAAA,EAKD,EADa,OAAOA,CAAU,EAAA,QAAA,CAAA,CAEhC,OAAO,MAGT,CAAA,IAAM0mB,CAAc,CAAA,UAAA,GAAc1mB,CAC5B2mB,CAAAA,CAAAA,CAAe3mB,CAAkB,CAAA,UAAA,GAAe,IAEtD,CAAA,OAAO0mB,CAAeC,EAAAA,CACxB,CAEQ,6BAAA,CAA8BC,CAAqB,CAAA,CAGzD,OADE,0DAA2D,CAAA,IAAA,CAAKA,CAAG,CAAA,CAK9D,IAAI7K,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CAAmB,OAAS6K,CAAAA,CAAG,CAH9DA,CAAAA,CAIX,CACF,CAAA,CAEOC,EAAQ,CAAA,IAAIP,EC7HnB,CAAA,IAAMQ,EAAN,CAAA,KAAwD,CAGtD,KAAA,CAAM9Z,CAA+D,CAAA,CACnE,IAAM+Z,CAAAA,CAAY/Z,CAClB,CAAA,GAAI,CAAC+Z,CAAAA,CAAU,OAAS,CAACA,CAAAA,CAAU,KAAM,CAAA,MAAA,CACvC,OAAO,CAAE,GAAK,CAAA,EAAA,CAAI,QAAU,CAAA,EAAG,CAAA,CAGjC,IAAMtK,CAAAA,CAAY,IAAItP,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,OAA4B,CAAA,CAElE,CAAE,GAAA,CAAA7J,CAAK,CAAA,QAAA,CAAAyZ,CAAS,CAAA,CAAIN,CAAU,CAAA,KAAA,CAClCsK,CAAU,CAAA,KAAA,CACVA,CAAU,CAAA,cAAA,CACV,IACF,CAEA,CAAA,OAAO,CACL,GAAA,CAAK,CAAIzjB,CAAAA,EAAAA,CAAG,CACZ,CAAA,CAAA,CAAA,QAAA,CAAAyZ,CACF,CACF,CACF,CAAA,CAEOiK,EAAQ,CAAA,IAAIF,ECxBnB,CAAA,IAAMG,EAAN,CAAA,KAAuD,CAGrD,KAAA,CAAMja,CAA+D,CAAA,CACnE,IAAMka,CAAAA,CAAgBla,CACtB,CAAA,GAAIka,CAAc,CAAA,UAAA,CAChB,OAAO,CACL,GAAKA,CAAAA,CAAAA,CAAc,OACnB,QAAU,CAAA,EACZ,CAAA,CAGF,IAAMxF,CAAAA,CAAMwF,CAAc,CAAA,cAAA,CACtB5jB,CAAM,CAAA,EAAA,CACNyZ,CAAkB,CAAA,EAEhBsH,CAAAA,CAAAA,CAAY,IAAItI,CAAAA,CAAiB,KAAK,KAAK,CAAA,CAAE,kBACjD,CAAA,OAAA,CACAmL,CAAc,CAAA,MAChB,CAEA,CAAA,OAAQA,CAAc,CAAA,YAAA,EACpB,KAAK,GACH5jB,CAAAA,CAAAA,CAAM,CAAG+gB,EAAAA,CAAS,OAAO3C,CAAG,CAAA,CAAA,CAC5B3E,CAAW,CAAA,CAAC,IAAK,CAAA,SAAA,CAAUmK,CAAc,CAAA,KAAK,CAAC,CAAA,CAC/C,MACF,KAAK,UACL,CAAA,KAAK,cACH5jB,CAAAA,CAAAA,CAAM,CAAcoe,WAAAA,EAAAA,CAAG,CAAK2C,EAAAA,EAAAA,CAAS,CACrCtH,KAAAA,CAAAA,CAAAA,CAAAA,CAAW,CAAC,IAAA,CAAK,SAAUmK,CAAAA,CAAAA,CAAc,KAAK,CAAC,CAC/C,CAAA,MACF,KAAK,KAAA,CACH5jB,EAAM4jB,CAAc,CAAA,MAAA,CACpBnK,CAAW,CAAA,KAAA,CAAM,OAAQmK,CAAAA,CAAAA,CAAc,KAAK,CAAA,CACxCA,CAAc,CAAA,KAAA,CACd,EAAC,CACL,KACJ,CAEA,OAAIA,CAAAA,CAAc,SAChB5jB,GAAAA,CAAAA,CAAM,CAAQA,KAAAA,EAAAA,CAAG,CAGZ,CAAA,CAAA,CAAA,CAAA,CAAE,GAAKA,CAAAA,CAAAA,CAAI,IAAK,EAAA,CAAG,QAAAyZ,CAAAA,CAAS,CACrC,CACF,CAEOoK,CAAAA,EAAAA,CAAQ,IAAIF,EC/CnB,CAAA,IAAMG,EAAN,CAAA,KAA2D,CAGzD,KAAA,CAAMpa,CAA+D,CAAA,CACnE,IAAMqa,CAAAA,CAAera,CAErB,CAAA,OAAI,IAAK,CAAA,gBAAA,CAAiBqa,CAAa,CAAA,QAAQ,CACtC,CAAA,IAAA,CAAK,oBAAqBA,CAAAA,CAAY,CAG3C,CAAA,IAAA,CAAK,eAAgBA,CAAAA,CAAAA,CAAa,QAAQ,CAAA,CACrC,IAAK,CAAA,mBAAA,CAAoBA,CAAY,CAAA,CAGvC,IAAK,CAAA,oBAAA,CAAqBA,CAAY,CAC/C,CAEQ,gBACNC,CAAAA,CAAAA,CACoB,CACpB,OAAO,OAAOA,CAAAA,EAAa,QAC7B,CAEQ,eACNA,CAAAA,CAAAA,CACyB,CACzB,OAAO,KAAM,CAAA,OAAA,CAAQA,CAAQ,CAC/B,CAEQ,oBACND,CAAAA,CAAAA,CAC8C,CAE9C,OAAO,CAAE,GAAA,CADG,CAAGA,EAAAA,CAAAA,CAAa,MAAM,CAAA,CAAA,EAAIA,CAAa,CAAA,QAAQ,CAAKA,EAAAA,EAAAA,CAAAA,CAAa,QAAQ,CACnE,CAAA,CAAA,CAAA,IAAA,EAAQ,CAAA,QAAA,CAAU,EAAG,CACzC,CAEQ,mBACNA,CAAAA,CAAAA,CAC8C,CAC9C,IAAM5K,CAAY,CAAA,IAAItP,CAAU,CAAA,IAAA,CAAK,KAAO,CAAA,OAA4B,CAClE,CAAA,CAAE,GAAKoa,CAAAA,CAAAA,CAAa,QAAUC,CAAAA,CAAiB,CAAI/K,CAAAA,CAAAA,CAAU,KACjE4K,CAAAA,CAAAA,CAAa,QACbA,CAAAA,CAAAA,CAAa,cACf,CAAA,CAGA,OAAO,CAAE,GAAA,CADG,CAAGA,EAAAA,CAAAA,CAAa,MAAM,CAAA,CAAA,EAAIA,CAAa,CAAA,QAAQ,CAAKE,EAAAA,EAAAA,CAAW,CACzD,CAAA,CAAA,CAAA,IAAA,EAAQ,CAAA,QAAA,CAAUC,CAAiB,CACvD,CAEQ,oBAAA,CACNH,CAC8C,CAAA,CAC9C,IAAM5K,CAAAA,CAAY,IAAItP,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,OAA4B,CAAA,CAClE,CAAE,GAAA,CAAKoa,CAAa,CAAA,QAAA,CAAUC,CAAiB,CAAI/K,CAAAA,CAAAA,CAAU,KACjE,CAAA,CAAC4K,CAAa,CAAA,QAAqB,CACnCA,CAAAA,CAAAA,CAAa,cACf,CAAA,CAGA,OAAO,CAAE,GADG,CAAA,CAAA,EAAGA,CAAa,CAAA,MAAM,CAAIA,CAAAA,EAAAA,CAAAA,CAAa,QAAQ,CAAA,EAAA,EAAKE,CAAW,CAAA,CAAA,CAAA,CACzD,IAAK,EAAA,CAAG,QAAUC,CAAAA,CAAiB,CACvD,CACF,CAEOC,CAAAA,EAAAA,CAAQ,IAAIL,EAAAA,CC/DnB,IAAMM,EAAN,CAAA,KAAkD,CAGhD,KAAA,CACE1a,CAC8C,CAAA,CAC9C,IAAM2a,CAAAA,CAAW3a,CACX6Y,CAAAA,CAAAA,CAAS,IAAI1Y,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,OAAO,CAAA,CAC1C2Y,EAAQ,KAAM,CAAA,OAAA,CAAQ6B,CAAS,CAAA,IAAI,CACrCA,CAAAA,CAAAA,CAAS,IACT,CAAA,CAACA,CAAS,CAAA,IAAI,CAEZza,CAAAA,CAAAA,CAAM2Y,CAAO,CAAA,KAAA,CACjBC,CAAM,CAAA,MAAA,CAAO,OAAO,CACpB6B,CAAAA,CAAAA,CAAS,cACX,CAAA,CAEA,OAAIA,CAAAA,CAAS,MAAW,GAAA,cAAA,EACtBhlB,CAAO,CAAA,IAAA,CACL,uEACF,CAAA,CAGK,CACL,GAAA,CAAK,CAAIglB,CAAAA,EAAAA,CAAAA,CAAS,KAAK,CAAA,MAAA,EAASza,CAAI,CAAA,GAAG,CACvC,CAAA,CAAA,CAAA,QAAA,CAAUA,CAAI,CAAA,QAChB,CACF,CACF,CAEO0a,CAAAA,EAAAA,CAAQ,IAAIF,EAAAA,CC9BnB,IAAMG,EAAAA,CAAN,KAAuD,CAGrD,KAAA,CAAM7a,CAAiB,CAAA,CACrB,IAAMC,CAAAA,CAASD,CACTE,CAAAA,CAAAA,CAAM,IAAIC,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,OAA4B,CAAA,CAC9D,CAAE,GAAA,CAAA7J,CAAI,CAAA,CAAI4J,CAAI,CAAA,KAAA,CAAM,CAACD,CAAAA,CAAO,MAAM,CAAC,CAEjCG,CAAAA,CAAAA,CAAqBH,CAAe,CAAA,iBAAA,CAC1C,GAAIG,CAAAA,EAAqBA,CAAkB,CAAA,MAAA,CAAS,EAAG,CACrD,IAAMC,CAA4B,CAAA,EAElC,CAAA,IAAA,IAAWC,CAAcF,IAAAA,CAAAA,CAAmB,CAC1C,GAAM,CAAE,GAAA,CAAKG,CAAc,CAAA,CAAIL,CAAI,CAAA,KAAA,CAAM,CAACI,CAAU,CAAC,CAAA,CACrDD,CAAgB,CAAA,IAAA,CAAKE,CAAa,EACpC,CAEIF,CAAAA,CAAgB,MAAS,CAAA,CAAA,GAC3B/J,CAAO,EAAA,CAAA,CAAA,EAAI+J,CAAgB,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,EAExC,CAEA,OAAO,CAAE,GAAA,CAAK,CAAc/J,WAAAA,EAAAA,CAAG,CAAI,CAAA,CAAA,QAAA,CAAU,EAAG,CAClD,CACF,CAEOkK,CAAAA,EAAAA,CAAQ,IAAIqa,EC1BnB,CAAA,IAAMC,EAAN,CAAA,KAA2D,CAEzD,KAAA,CAAM9a,CAAiB,CAAA,CACrB,IAAMC,CAAAA,CAASD,CACTE,CAAAA,CAAAA,CAAM,IAAIC,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,OAA4B,CAC5D,CAAA,CAAE,GAAA7J,CAAAA,CAAI,CAAI4J,CAAAA,CAAAA,CAAI,KAAM,CAAA,CAACD,CAAO,CAAA,UAAU,CAAC,CAAA,CAC7C,OAAO,CAAE,GAAK,CAAA,CAAA,IAAA,EAAO3J,CAAG,CAAA,CAAA,CAAI,QAAU,CAAA,EAAG,CAC3C,CACF,CAAA,CACOoK,EAAQ,CAAA,IAAIoa,ECXnB,CAAA,IAAMC,EAAN,CAAA,KAA2D,CAEzD,KAAA,CAAM/a,EAAiB,CAGrB,OAAO,CAAE,GAAA,CAAK,CAFHA,iBAAAA,EAAAA,CAAAA,CACK,OAAQ,CAAA,GAAA,CAAKxE,CAAM,EAAA,CAAA,EAAA,EAAKA,CAAC,CAAA,EAAA,CAAI,CAAE,CAAA,IAAA,CAAK,IAAI,CAClB,CAAK,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC1D,CACF,CACOoF,CAAAA,EAAAA,CAAQ,IAAIma,EAAAA,CCNnB,IAAMC,EAAAA,CAAN,KAA6D,CAE3D,KAAMhb,CAAAA,CAAAA,CAAiB,CACrB,IAAMc,CAAAA,CAAId,CACJE,CAAAA,CAAAA,CAAM,IAAIC,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,OAA4B,CAAA,CAC5D,CAAE,GAAA,CAAA7J,CAAI,CAAA,CAAI4J,CAAI,CAAA,KAAA,CAAM,CAACY,CAAAA,CAAE,OAAO,CAAC,CAC/B,CAAA,EAAG,GAAG3M,CAAI,CAAA,CAAImC,CAAI,CAAA,IAAA,EAAO,CAAA,KAAA,CAAM,KAAK,CAAA,CACpC0K,EAAU7M,CAAK,CAAA,IAAA,CAAK,GAAG,CAAA,CAGzB+M,CAAY,CAAA,CAAA,gBAAA,EAAmBJ,CAAE,CAAA,MAAM,CAAME,GAAAA,EAAAA,CAAO,CAGxD,CAAA,CAAA,GAAIF,CAAE,CAAA,OAAA,CAAQ,QAAa,GAAA,MAAA,CAAW,CACpC,IAAMma,CAAAA,CAAcna,CAAE,CAAA,OAAA,CAAQ,QAAW,CAAA,EAAA,CAAK,WAC9CI,CAAAA,CAAAA,EAAa+Z,EACf,CAEA,GAAIna,CAAAA,CAAE,OAAQ,CAAA,WAAA,CACZI,CAAa,EAAA,eAAA,CAAA,KAAA,GACJJ,EAAE,OAAQ,CAAA,OAAA,GAAY,MAAW,CAAA,CAC1C,IAAIK,CAAAA,CAAeL,CAAE,CAAA,OAAA,CAAQ,OACzBK,CAAAA,CAAAA,GAAiB,IACnBA,CAAAA,CAAAA,CAAe,MACN,CAAA,OAAOA,CAAiB,EAAA,QAAA,GAC7BA,CAAiB,GAAA,MAAA,CACnBA,CAAe,CAAA,MAAA,CACNA,CAAiB,GAAA,MAAA,EAAUA,CAAiB,GAAA,OAAA,CACrDA,CAAeA,CAAAA,CAAAA,CAAa,WAAY,EAAA,CAExCA,CAAe,CAAA,CAAA,CAAA,EAAIA,CAAY,CAAA,CAAA,CAAA,CAAA,CAGnCD,GAAa,CAAYC,SAAAA,EAAAA,CAAY,CACvC,EAAA,CAEA,OAAIL,CAAAA,CAAE,OAAQ,CAAA,MAAA,GAAW,MACnBA,EAAAA,CAAAA,CAAE,OAAQ,CAAA,MAAA,GACZI,CAAa,EAAA,SAAA,CAAA,CAMV,CAAE,GAAA,CAAKA,CAAW,CAAA,QAAA,CAAU,EAAG,CACxC,CACF,CACOE,CAAAA,EAAAA,CAAQ,IAAI4Z,EAAAA,CC9CnB,IAAME,EAAAA,CAAN,KAAwD,CAGtD,KAAMlb,CAAAA,CAAAA,CAA+D,CACnE,IAAM2P,CAAAA,CAAS3P,CAET4P,CAAAA,CAAAA,CADQ,IAAIb,CAAAA,CAAiB,IAAK,CAAA,KAAK,CACrB,CAAA,iBAAA,CAAkB,OAASY,CAAAA,CAAAA,CAAO,KAAK,CAAA,CAE/D,GAAI,CAACA,CAAO,CAAA,QAAA,EAAY,CAACA,CAAAA,CAAO,QAAS,CAAA,MAAA,CACvC,OAAO,CAAE,GAAK,CAAA,EAAA,CAAI,QAAU,CAAA,EAAG,CAAA,CAGjC,IAAMF,CAAAA,CAAY,IAAItP,CAAU,CAAA,IAAA,CAAK,KAAO,CAAA,OAA4B,CAClE2P,CAAAA,CAAAA,CAAkB,EAAC,CACnBC,CAAkB,CAAA,EAExB,CAAA,IAAA,IAAWC,CAASL,IAAAA,CAAAA,CAAO,QAAU,CAAA,CACnC,GAAM,CAAE,GAAA,CAAArZ,CAAK,CAAA,QAAA,CAAU2Z,CAAc,CAAA,CAAIR,CAAU,CAAA,KAAA,CAAM,CAACO,CAAK,CAAC,CAAA,CAEhE,GAAIA,CAAAA,CAAM,IAAS,GAAA,YAAA,CACjBF,EAAM,IAAKxZ,CAAAA,CAAG,CAEd0Z,CAAAA,KAAAA,GAAAA,CAAAA,CAAM,IAAS,GAAA,gBAAA,EACfA,CAAM,CAAA,MAAA,GAAW,YACjB,CAAA,CACA,IAAM8C,CAAAA,CAAOhD,CAAMA,CAAAA,CAAAA,CAAM,MAAS,CAAA,CAAC,CAAK,EAAA,EAAA,CAClCqL,CAAuB,CAAA,qBAAA,CAAsB,IAAKrI,CAAAA,CAAI,CACtDsI,CAAAA,CAAAA,CAAyB,yBAA0B,CAAA,IAAA,CAAK9kB,CAAG,CAAA,CACjE,GAAI6kB,CAAAA,EAAwB,CAACC,CAAAA,CAAwB,CACnD,IAAMC,CAAAA,CAAU/kB,CAAI,CAAA,OAAA,CAAQ,aAAe,CAAA,EAAE,CAAE,CAAA,SAAA,EAC/CwZ,CAAAA,CAAAA,CAAMA,CAAM,CAAA,MAAA,CAAS,CAAC,CAAA,CAAI,CAAGgD,EAAAA,CAAI,CAAIuI,CAAAA,EAAAA,CAAO,CAC9C,EAAA,CAAA,KAAO,CACL,IAAMC,CAAU,CAAA,YAAA,CAAa,IAAKhlB,CAAAA,CAAG,CAAIA,CAAAA,CAAAA,CAAM,CAAOA,IAAAA,EAAAA,CAAG,CACzDwZ,CAAAA,CAAAA,CAAAA,CAAM,KAAKwL,CAAO,EACpB,CACF,CAAA,KACEtL,CAAM,CAAA,IAAA,GAAS,aACfA,EAAAA,CAAAA,CAAM,IAAS,GAAA,cAAA,EACfA,CAAM,CAAA,IAAA,GAAS,cACfA,EAAAA,CAAAA,CAAM,IAENF,CAAAA,CAAAA,CAAM,IAAKxZ,CAAAA,CAAG,CAKhByZ,CAAAA,CAAAA,CAAS,IAAK,CAAA,GAAGE,CAAa,EAChC,CAEA,IAAMC,CAAOJ,CAAAA,CAAAA,CAAM,IAAK,CAAA,IAAI,CACtByL,CAAAA,CAAAA,CAAW5L,EAAO,QAAW,CAAA,YAAA,CAAe,EAKlD,CAAA,OAAO,CAAE,GAAA,CAJgB,qBACS,CAAA,IAAA,CAAKO,CAAI,CAAA,CACvCA,CACA,CAAA,CAAA,EAAGqL,CAAQ,CAAA,EAAG3L,CAAS,CAAA,CAAA,EAAIM,CAAI,CACX,CAAA,CAAA,QAAA,CAAAH,CAAS,CACnC,CACF,CAAA,CAEOI,EAAQ,CAAA,IAAI+K,EC9DnB,CAAA,IAAMM,EAAN,CAAA,KAAwD,CAEtD,KAAA,CAAMxb,CAAiB,CAAA,CAErB,OAAO,CAAE,GAAA,CAAK,CADJA,cAAAA,EAAAA,CAAAA,CACuB,MAAM,CAAA,EAAA,CAAA,CAAM,QAAU,CAAA,EAAG,CAC5D,CACF,CAAA,CACOqQ,EAAQ,CAAA,IAAImL,ECPnB,CAAA,IAAMC,EAAN,CAAA,KAA4D,CAE1D,KAAA,CAAMzb,CAAiB,CAAA,CAErB,OAAO,CAAE,GAAK,CAAA,CAAA,kBAAA,EADAA,CAC2B,CAAA,cAAc,CAAM,EAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC5E,CACF,CAAA,CACOuQ,EAAQ,CAAA,IAAIkL,ECPnB,CAAA,IAAMC,EAAN,CAAA,KAAyD,CAEvD,KAAA,CAAM1b,CAAiB,CAAA,CAErB,OAAO,CAAE,GAAK,CAAA,CAAA,eAAA,EADJA,CACwB,CAAA,MAAM,CAAmB,eAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC1E,CACF,CACOyQ,CAAAA,EAAAA,CAAQ,IAAIiL,EAAAA,CCRnB,IAAMC,EAAAA,CAAN,KAAyD,CAEvD,MAAM3J,CAAkB,CAAA,CAEtB,OAAO,CAAE,GAAK,CAAA,EAAA,CAAI,QAAU,CAAA,EAAG,CACjC,CACF,CAAA,CACOrB,EAAQ,CAAA,IAAIgL,ECPnB,CAAA,IAAMC,EAAN,CAAA,KAA4D,CAE1D,KAAA,CAAM5J,CAAkB,CAAA,CACtB,OAAO,CAAE,GAAK,CAAA,kBAAA,CAAoB,QAAU,CAAA,EAAG,CACjD,CACF,CAAA,CACOnB,GAAQ,IAAI+K,EAAAA,CCLnB,IAAMC,EAAAA,CAAN,KAA0D,CAExD,KAAM7b,CAAAA,CAAAA,CAAiB,CACrB,IAAMsJ,CAAItJ,CAAAA,CAAAA,CACV,OAAO,CACL,GAAK,CAAA,CAAA,gBAAA,EAAmBsJ,EAAE,OAAO,CAAA,QAAA,EAAWA,CAAE,CAAA,OAAO,CACrD,EAAA,CAAA,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CACOyH,CAAAA,EAAAA,CAAQ,IAAI8K,EAAAA,CCVnB,IAAMC,EAAAA,CAAN,KAAyD,CAEvD,KAAA,CAAM9b,CAAiB,CAAA,CAErB,OAAO,CAAE,GAAK,CAAA,CAAA,EAAA,EADHA,CACW,CAAA,OAAO,CAAM,EAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAClD,CACF,CACOiR,CAAAA,EAAAA,CAAQ,IAAI6K,EAAAA,CCNnB,IAAMC,EAAAA,CAAN,KAAwD,CAEtD,KAAM/b,CAAAA,CAAAA,CAAiB,CACrB,IAAMrL,CAAIqL,CAAAA,CAAAA,CACNiG,CAEJ,CAAA,OAAItR,EAAE,YAAwBuc,YAAAA,CAAAA,CAC5BjL,CAAMtR,CAAAA,CAAAA,CAAE,YAAa,CAAA,QAAA,CACZA,CAAE,CAAA,YAAA,GAAiB,MAC5BsR,CAAAA,CAAAA,CAAM,MACGtR,CAAAA,CAAAA,CAAE,YAAiB,GAAA,MAAA,EAAUA,CAAE,CAAA,YAAA,GAAiB,OACzDsR,CAAAA,CAAAA,CAAMtR,CAAE,CAAA,YAAA,CAAa,WAAY,EAAA,CAEjC,OAAOA,CAAAA,CAAE,YAAiB,EAAA,QAAA,EAC1BA,CAAE,CAAA,YAAA,GAAiB,MACnBA,EAAAA,CAAAA,CAAE,YAAiB,GAAA,MAAA,EACnBA,EAAE,YAAiB,GAAA,OAAA,CAEnBsR,CAAM,CAAA,CAAA,CAAA,EAAItR,CAAE,CAAA,YAAY,CAExBsR,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,MAAOtR,CAAAA,CAAAA,CAAE,YAAY,CAAA,CAGtB,CACL,GAAA,CAAK,CAAkBA,eAAAA,EAAAA,CAAAA,CAAE,MAAM,CAAA,eAAA,EAAkBsR,CAAG,CAAA,CAAA,CACpD,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CACOmL,EAAQ,CAAA,IAAI2K,EC/BnB,CAAA,IAAMC,EAAN,CAAA,KAAwD,CAEtD,KAAMhK,CAAAA,CAAAA,CAAkB,CAEtB,OAAO,CAAE,GAAA,CAAK,EAAI,CAAA,QAAA,CAAU,EAAG,CACjC,CACF,CACOV,CAAAA,EAAAA,CAAQ,IAAI0K,EAAAA,CCHnB,IAAMC,EAAN,CAAA,KAAwD,CAGtD,KAAA,CAAMjc,CAA+D,CAAA,CACnE,IAAMwR,CAAAA,CAAUxR,CAChB,CAAA,GAAIwR,CAAQ,CAAA,UAAA,CACV,OAAO,CAAE,GAAKA,CAAAA,CAAAA,CAAQ,OAAkB,QAAU,CAAA,EAAG,CAAA,CAIvD,IAAM1J,CAAAA,CADQ,IAAIiH,CAAAA,CAAiB,IAAK,CAAA,KAAK,CACpB,CAAA,kBAAA,CACvB,OACAhJ,CAAAA,CAAAA,CAAeyL,CAAQ,CAAA,MAAM,CAC/B,CAAA,CACMC,CAAKD,CAAAA,CAAAA,CAAQ,QAAS,CAAA,WAAA,EAE5B,CAAA,GAAIC,CAAO,GAAA,MAAA,CAAQ,CACjB,IAAMC,CAAMF,CAAAA,CAAAA,CAAQ,MAAU,EAAA,CAAA,CAC9B,OAAO,CAAE,GAAA,CAAK,CAAG1J,EAAAA,CAAU,CAAS4J,MAAAA,EAAAA,CAAG,CAAK,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC3D,CAAA,KAAA,GAAWD,CAAO,GAAA,SAAA,CAAW,CAC3B,IAAMC,CAAMF,CAAAA,CAAAA,CAAQ,MAAU,EAAA,GAAA,CAC9B,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG1J,CAAU,CAAA,SAAA,EAAY4J,CAAG,CAAA,CAAA,CAAA,CAAK,QAAU,CAAA,EAAG,CAC9D,MAAO,CAAID,GAAAA,CAAAA,GAAO,MAChB,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAgB,YAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CACnD,CAAA,GAAI2J,CAAO,GAAA,MAAA,CAChB,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,YAAA,CAAA,CAAgB,QAAU,CAAA,EAAG,CAAA,CACnD,GACL2J,CAAAA,GAAO,UACPA,EAAAA,CAAAA,GAAO,YACPA,EAAAA,CAAAA,GAAO,YACPA,CAAO,GAAA,MAAA,CAEP,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,CAAA,EAAI2J,CAAE,CAAA,CAAA,CAAI,QAAU,CAAA,EAAG,CAAA,CAC7C,GAAIA,CAAAA,GAAO,WAAaA,CAAO,GAAA,KAAA,CAAO,CAC3C,IAAIrS,CAAU,CAAA,KAAA,CACd,OAAIoS,CAAAA,CAAQ,aACVpS,GAAAA,CAAAA,EAAW,iBAEN,CAAA,CAAA,CAAE,GAAK,CAAA,CAAA,EAAG0I,CAAU,CAAA,CAAA,EAAI1I,CAAO,CAAI,CAAA,CAAA,QAAA,CAAU,EAAG,CACzD,CAAA,KAAO,CAAIqS,GAAAA,CAAAA,GAAO,SAChB,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAY,QAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC/C,CAAA,GAAI2J,CAAO,GAAA,UAAA,CAChB,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,SAAA,CAAA,CAAa,QAAU,CAAA,EAAG,CAAA,CAChD,GAAI2J,CAAO,GAAA,WAAA,CAChB,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,UAAA,CAAA,CAAc,QAAU,CAAA,EAAG,CAAA,CACjD,GAAI2J,CAAAA,GAAO,QAAU,CAAA,CAC1B,IAAIrS,CAAAA,CAAU,QACd,CAAA,OAAIoS,CAAQ,CAAA,aAAA,GACVpS,CAAW,EAAA,iBAAA,CAAA,CAEN,CAAE,GAAA,CAAK,CAAG0I,EAAAA,CAAU,CAAI1I,CAAAA,EAAAA,CAAO,CAAI,CAAA,CAAA,QAAA,CAAU,EAAG,CACzD,CAAO,KAAA,CAAA,GAAIqS,CAAO,GAAA,OAAA,CAChB,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,MAAA,CAAA,CAAU,QAAU,CAAA,EAAG,CAAA,CAC7C,GAAI2J,CAAAA,GAAO,QAChB,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAW,OAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC9C,CAAA,GAAI2J,CAAO,GAAA,MAAA,CAChB,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAW,OAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC9C,CAAA,GAAI2J,CAAO,GAAA,SAAA,CAAW,CAC3B,IAAME,CAAYH,CAAAA,CAAAA,CAAQ,WAAa,EACjCI,CAAAA,CAAAA,CAAQJ,CAAQ,CAAA,KAAA,EAAS,CAC/B,CAAA,OAAO,CACL,GAAA,CAAK,CAAG1J,EAAAA,CAAU,CAAY6J,SAAAA,EAAAA,CAAS,CAAKC,EAAAA,EAAAA,CAAK,CACjD,CAAA,CAAA,CAAA,QAAA,CAAU,EACZ,CACF,CAAWH,KAAAA,GAAAA,CAAAA,GAAO,SAAW,CAAA,CAC3B,IAAME,CAAAA,CAAYH,CAAQ,CAAA,SAAA,EAAa,EACjCI,CAAAA,CAAAA,CAAQJ,CAAQ,CAAA,KAAA,EAAS,CAC/B,CAAA,OAAO,CACL,GAAA,CAAK,CAAG1J,EAAAA,CAAU,CAAY6J,SAAAA,EAAAA,CAAS,CAAKC,EAAAA,EAAAA,CAAK,CACjD,CAAA,CAAA,CAAA,QAAA,CAAU,EACZ,CACF,CAAA,KAAO,CAAIH,GAAAA,CAAAA,GAAO,OAChB,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,KAAA,CAAA,CAAS,QAAU,CAAA,EAAG,CAAA,CAC5C,GAAI2J,CAAAA,GAAO,MAAQ,CAAA,CACxB,IAAMI,CAAAA,CACJ,OAAOL,CAAAA,CAAQ,SAAc,EAAA,QAAA,CAAW,CAAIA,CAAAA,EAAAA,CAAAA,CAAQ,SAAS,CAAA,CAAA,CAAA,CAAM,EACrE,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG1J,EAAAA,CAAU,CAAQ+J,KAAAA,EAAAA,CAAC,GAAG,OAAQ,EAAA,CAAG,QAAU,CAAA,EAAG,CACjE,CAAWJ,KAAAA,GAAAA,CAAAA,GAAO,UAAY,CAAA,CAC5B,IAAMI,CAAAA,CACJ,OAAOL,CAAAA,CAAQ,SAAc,EAAA,QAAA,CAAW,CAAIA,CAAAA,EAAAA,CAAAA,CAAQ,SAAS,CAAA,CAAA,CAAA,CAAM,EACrE,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG1J,EAAAA,CAAU,CAAY+J,SAAAA,EAAAA,CAAC,CAAG,CAAA,CAAA,OAAA,EAAW,CAAA,QAAA,CAAU,EAAG,CACrE,CAAWJ,KAAAA,GAAAA,CAAAA,GAAO,WAAa,CAAA,CAC7B,IAAMI,CAAAA,CACJ,OAAOL,CAAAA,CAAQ,SAAc,EAAA,QAAA,CAAW,CAAIA,CAAAA,EAAAA,CAAAA,CAAQ,SAAS,CAAA,CAAA,CAAA,CAAM,GACrE,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG1J,CAAU,CAAA,UAAA,EAAa+J,CAAC,CAAA,CAAA,CAAG,OAAQ,EAAA,CAAG,QAAU,CAAA,EAAG,CACtE,CAAO,KAAA,CAAA,GAAIJ,IAAO,MAChB,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAS,KAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC5C,CAAA,GAAI2J,CAAO,GAAA,SAAA,CAChB,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,QAAA,CAAA,CAAY,QAAU,CAAA,EAAG,CAAA,CAC/C,GAAI2J,CAAAA,GAAO,WAAa,CAAA,CAC7B,IAAMC,CAAAA,CAAMF,CAAQ,CAAA,MAAA,EAAU,IAC9B,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG1J,CAAU,CAAA,WAAA,EAAc4J,CAAG,CAAA,CAAA,CAAA,CAAK,QAAU,CAAA,EAAG,CAChE,CAAWD,KAAAA,GAAAA,CAAAA,GAAO,QAAU,CAAA,CAC1B,IAAMC,CAAAA,CAAMF,CAAQ,CAAA,MAAA,EAAU,GAC9B,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG1J,EAAAA,CAAU,CAAW4J,QAAAA,EAAAA,CAAG,CAAK,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC7D,CAAO,KAAA,CAAA,GAAID,CAAO,GAAA,OAAA,EAAWA,CAAO,GAAA,MAAA,CAClC,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,KAAA,CAAA,CAAS,QAAU,CAAA,EAAG,CAAA,CAC5C,GAAI2J,CAAAA,GAAO,MAAUA,EAAAA,CAAAA,GAAO,OACjC,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAS,KAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC5C,CAAA,GAAI2J,IAAO,MAAQ,CAAA,CACxB,GAAID,CAAAA,CAAQ,UAAcA,EAAAA,CAAAA,CAAQ,UAAW,CAAA,MAAA,CAAS,CAAG,CAAA,CACvD,IAAMrC,CAAAA,CAASqC,CAAQ,CAAA,UAAA,CAAW,GAAKnL,CAAAA,CAAAA,EAAM,IAAIA,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,IAAA,CAAK,IAAI,CAAA,CAChE,OAAO,CAAE,GAAK,CAAA,CAAA,EAAGyB,CAAU,CAAA,MAAA,EAASqH,CAAM,CAAA,CAAA,CAAA,CAAK,QAAU,CAAA,EAAG,CAC9D,CACA,OAAO,CAAE,GAAK,CAAA,CAAA,EAAGrH,CAAU,CAAA,KAAA,CAAA,CAAS,QAAU,CAAA,EAAG,CACnD,CAAO,KAAA,CAAA,GAAI2J,CAAO,GAAA,UAAA,CAChB,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,SAAA,CAAA,CAAa,QAAU,CAAA,EAAG,CAAA,CAChD,GAAI2J,CAAAA,GAAO,OAChB,CAAA,OAAO,CAAE,GAAA,CAAK,GAAG3J,CAAU,CAAA,MAAA,CAAA,CAAU,QAAU,CAAA,EAAG,CAAA,CAC7C,GAAI2J,CAAAA,GAAO,YAChB,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAe,WAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAClD,CAAA,GAAI2J,CAAO,GAAA,SAAA,CAChB,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,QAAA,CAAA,CAAY,QAAU,CAAA,EAAG,CAAA,CAC/C,GAAI2J,CAAO,GAAA,YAAA,CAChB,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,WAAA,CAAA,CAAe,QAAU,CAAA,EAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAGzD,OAAO,CACL,GAAK,CAAA,CAAA,EAAGA,CAAU,CAAA,CAAA,EAAI2J,CAAE,CAAA,CAAA,EAAID,CAAQ,CAAA,MAAA,CAAS,CAAIA,CAAAA,EAAAA,CAAAA,CAAQ,MAAM,CAAA,CAAA,CAAA,CAAM,EAAE,CAAA,CAAA,CACvE,QAAU,CAAA,EACZ,CACF,CACF,CAEOM,CAAAA,EAAAA,CAAQ,IAAImK,EAAAA,CC/HnB,IAAMC,EAAAA,CAAN,KAA6D,CAE3D,KAAMlc,CAAAA,CAAAA,CAAiB,CAErB,OAAO,CAAE,GAAA,CAAK,CADJA,QAAAA,EAAAA,CAAAA,CACiB,MAAM,CAAM,EAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CACtD,CACF,CACOiS,CAAAA,EAAAA,CAAQ,IAAIiK,EAAAA,CCHnB,IAAMC,EAAAA,CAAN,KAAwD,CAGtD,KAAMnc,CAAAA,CAAAA,CAA+D,CACnE,IAAMmS,CAAAA,CAAQnS,CACRoS,CAAAA,CAAAA,CAAQ,IAAIrD,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAE7C,CAAA,GAAIoD,CAAM,CAAA,cAAA,GAAmB,aAAe,CAAA,CAC1C,IAAMG,CAAAA,CAAAA,CAAQH,CAAM,CAAA,OAAA,EAAW,EAAC,EAC7B,GAAK3W,CAAAA,CAAAA,EAAM4W,CAAM,CAAA,kBAAA,CAAmB,OAASrM,CAAAA,CAAAA,CAAevK,CAAC,CAAC,CAAC,CAAA,CAC/D,IAAK,CAAA,IAAI,EAIZ,OAAO,CAAE,GAAK,CAAA,CAAA,EAHC2W,CAAM,CAAA,cAAA,CACjB,CAAgBA,aAAAA,EAAAA,CAAAA,CAAM,cAAc,CAAA,GAAA,CAAA,CACpC,EACmB,CAAA,aAAA,EAAgBG,CAAI,CAAA,CAAA,CAAA,CAAK,QAAU,CAAA,EAAG,CAC/D,CAEA,GAAIH,CAAM,CAAA,cAAA,GAAmB,QAAU,CAAA,CACrC,GAAIA,CAAAA,CAAM,OAAWA,EAAAA,CAAAA,CAAM,OAAQ,CAAA,MAAA,CAAS,CAAG,CAAA,CAC7C,IAAMG,CAAOH,CAAAA,CAAAA,CAAM,OAChB,CAAA,GAAA,CAAK3W,CAAM4W,EAAAA,CAAAA,CAAM,kBAAmB,CAAA,OAAA,CAASrM,CAAevK,CAAAA,CAAC,CAAC,CAAC,CAC/D,CAAA,IAAA,CAAK,IAAI,CAAA,CACN4gB,CAASjK,CAAAA,CAAAA,CAAM,cACjB,CAAA,CAAA,aAAA,EAAgBA,CAAM,CAAA,cAAc,CACpC,GAAA,CAAA,CAAA,EAAA,CAEJ,OAAKA,CAAAA,CAAM,cAGJ,CAAA,CAAE,GAAK,CAAA,CAAA,EAAGiK,CAAM,CAAA,QAAA,EAAW9J,CAAI,CAAK,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAF/C,CAAA,CAAE,GAAK,CAAA,QAAA,CAAU,QAAU,CAAA,EAAG,CAGzC,CACA,OAAO,CAAE,GAAA,CAAK,SAAU,QAAU,CAAA,EAAG,CACvC,CAEA,GAAIH,CAAM,CAAA,cAAA,GAAmB,UAC3B,CAAA,OAAO,CAAE,GAAA,CAAK,UAAY,CAAA,QAAA,CAAU,EAAG,EAGzC,GAAIA,CAAAA,CAAM,cAAmB,GAAA,MAAA,CAC3B,OAAO,CAAE,GAAK,CAAA,MAAA,CAAQ,QAAU,CAAA,EAAG,CAAA,CAGrC,GAAIA,CAAAA,CAAM,cAAmB,GAAA,SAAA,CAAW,CACtC,IAAMlM,CAAMkM,CAAAA,CAAAA,CAAM,YAClB,CAAA,OAAIlM,CAAeiL,YAAAA,CAAAA,CACV,CAAE,GAAA,CAAK,CAAWjL,QAAAA,EAAAA,CAAAA,CAAI,QAAQ,CAAA,CAAA,CAAI,QAAU,CAAA,EAAG,CAEpDA,CAAAA,CAAAA,GAAQ,MAAUA,EAAAA,CAAAA,GAAQ,IACrB,CAAA,CAAE,GAAK,CAAA,cAAA,CAAgB,QAAU,CAAA,EAAG,CAAA,CAEzCA,CAAQ,GAAA,MAAA,EAAUA,CAAQ,GAAA,OAAA,CACrB,CAAE,GAAA,CAAK,CAAWA,QAAAA,EAAAA,CAAAA,CAAI,WAAY,EAAC,CAAI,CAAA,CAAA,QAAA,CAAU,EAAG,CAEzD,CAAA,OAAOA,CAAQ,EAAA,QAAA,CACV,CAAE,GAAA,CAAK,YAAYA,CAAG,CAAA,CAAA,CAAA,CAAK,QAAU,CAAA,EAAG,CAAA,CAE1C,CAAE,GAAA,CAAK,CAAWA,QAAAA,EAAAA,CAAG,CAAI,CAAA,CAAA,QAAA,CAAU,EAAG,CAC/C,CAEA,GAAIkM,CAAAA,CAAM,cAAmB,GAAA,aAAA,CAAe,CAC1C,GAAI,CAACA,CAAAA,CAAM,UACT,CAAA,OAAO,CAAE,GAAA,CAAK,EAAI,CAAA,QAAA,CAAU,EAAG,EAEjC,IAAMG,CAAAA,CAAAA,CAAQH,CAAM,CAAA,OAAA,EAAW,EAAC,EAC7B,GAAK3W,CAAAA,CAAAA,EAAM4W,CAAM,CAAA,kBAAA,CAAmB,OAASrM,CAAAA,CAAAA,CAAevK,CAAC,CAAC,CAAC,CAAA,CAC/D,KAAK,IAAI,CAAA,CACNiX,CAAWL,CAAAA,CAAAA,CAAM,iBAAkB,CAAA,OAAA,CAASD,CAAM,CAAA,UAAA,CAAW,KAAK,CAAA,CAClEO,CAAUP,CAAAA,CAAAA,CAAM,UAAW,CAAA,OAAA,CAC9B,GAAK3W,CAAAA,CAAAA,EAAM4W,EAAM,kBAAmB,CAAA,OAAA,CAASrM,CAAevK,CAAAA,CAAC,CAAC,CAAC,CAC/D,CAAA,IAAA,CAAK,IAAI,CAAA,CAIRlF,CAAM,CAAA,CAAA,EAHK6b,CAAM,CAAA,cAAA,CACjB,CAAgBA,aAAAA,EAAAA,CAAAA,CAAM,cAAc,CAAA,GAAA,CAAA,CACpC,EACe,CAAA,aAAA,EAAgBG,CAAI,CAAA,aAAA,EAAgBG,CAAQ,CAAA,CAAA,EAAIC,CAAO,CAAA,CAAA,CAAA,CAC1E,OAAIP,CAAAA,CAAM,QACR7b,GAAAA,CAAAA,EAAO,CAAc6b,WAAAA,EAAAA,CAAAA,CAAM,QAAQ,CAEjCA,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,QACR7b,GAAAA,CAAAA,EAAO,CAAc6b,WAAAA,EAAAA,CAAAA,CAAM,QAAQ,CAAA,CAAA,CAAA,CAE9B,CAAE,GAAA,CAAA7b,CAAK,CAAA,QAAA,CAAU,EAAG,CAC7B,CAEA,OAAO,CAAE,GAAK,CAAA,EAAA,CAAI,QAAU,CAAA,EAAG,CACjC,CACF,CAAA,CAEOqc,EAAQ,CAAA,IAAIwJ,ECxFnB,CAAA,IAAME,EAAN,CAAA,KAAyD,CAGvD,KAAMrc,CAAAA,CAAAA,CAA+D,CACnE,IAAM6S,CAAS7S,CAAAA,CAAAA,CAET4P,CADQ,CAAA,IAAIb,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CACrB,iBAAkB,CAAA,OAAA,CAAS8D,CAAO,CAAA,KAAK,CAE/D,CAAA,GAAI,CAACA,CAAAA,CAAO,QAAY,EAAA,CAACA,CAAO,CAAA,QAAA,CAAS,MACvC,CAAA,OAAO,CAAE,GAAA,CAAK,CAAGjD,EAAAA,CAAS,CAAO,GAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAAA,CAGhD,IAAMH,CAAAA,CAAY,IAAItP,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,OAA4B,CAAA,CAClE2P,CAAkB,CAAA,EAClBC,CAAAA,CAAAA,CAAkB,EAAC,CAEzB,QAAWC,CAAS6C,IAAAA,CAAAA,CAAO,QAAU,CAAA,CACnC,GAAM,CAAE,GAAAvc,CAAAA,CAAAA,CAAK,QAAU2Z,CAAAA,CAAc,CAAIR,CAAAA,CAAAA,CAAU,KAAM,CAAA,CAACO,CAAK,CAAC,EAEhE,GAAIA,CAAAA,CAAM,MAAW,GAAA,YAAA,CAAc,CACjC,IAAM8C,CAAOhD,CAAAA,CAAAA,CAAM,GAAI,EAAA,EAAK,EACtBiD,CAAAA,CAAAA,CAAsBzc,CAG5B,CAAA,GACE,WAAY,CAAA,IAAA,CAAKyc,CAAmB,CAAA,EACpC,OAAQ,CAAA,IAAA,CAAKA,CAAmB,CAAA,EAChC,UAAW,CAAA,IAAA,CAAKA,CAAmB,CAAA,CACnC,CACA,IAAIC,CAAW,CAAA,CAAA,EAAGF,CAAI,CAAA,CAAA,EAAIC,CAAmB,CAAG,CAAA,CAAA,IAAA,EAChDC,CAAAA,CAAAA,CAAWA,CAAS,CAAA,OAAA,CAClB,gDACA,CAAA,aACF,CACAlD,CAAAA,CAAAA,CAAM,IAAKkD,CAAAA,CAAQ,CACnBjD,CAAAA,CAAAA,CAAS,IAAK,CAAA,GAAGE,CAAa,CAAA,CAC9B,QACF,CAEAH,CAAM,CAAA,IAAA,CAAKgD,CAAI,CAAA,CACfhD,CAAM,CAAA,IAAA,CAAKiD,CAAmB,CAAA,CAC9BhD,CAAS,CAAA,IAAA,CAAK,GAAGE,CAAa,EAC9B,QACF,CAEAH,CAAM,CAAA,IAAA,CAAKxZ,CAAG,CAAA,CACdyZ,CAAS,CAAA,IAAA,CAAK,GAAGE,CAAa,EAChC,CAEA,IAAW3P,IAAAA,CAAAA,IAAcuS,CAAO,CAAA,gBAAA,CAAkB,CAChD,GAAM,CAAE,GAAA,CAAAvc,CAAK,CAAA,QAAA,CAAU2c,CAAmB,CAAA,CAAIxD,CAAU,CAAA,KAAA,CAAM,CAC5DnP,CACF,CAAC,CAAA,CAEDwP,CAAM,CAAA,IAAA,CAAKxZ,CAAG,CACdyZ,CAAAA,CAAAA,CAAS,IAAK,CAAA,GAAGkD,CAAkB,EACrC,CAEA,IAAMC,CAAapD,CAAAA,CAAAA,CAAM,IAAK,CAAA,IAAI,CAGlC,CAAA,OAAO,CAAE,GAAA,CADQ,GADG+C,CAAO,CAAA,WAAA,CAAc,gBAAmB,CAAA,EAC7B,CAAGjD,EAAAA,CAAS,CAAKsD,EAAAA,EAAAA,CAAU,CAClC,CAAA,CAAA,CAAA,QAAA,CAAAnD,CAAS,CACnC,CACF,CAAA,CAEOoD,EAAQ,CAAA,IAAIkJ,GCjEnB,IAAMC,EAAAA,CAAN,KAAoD,CAGlD,KAAMtc,CAAAA,CAAAA,CAA+D,CACnE,IAAMqT,CAAarT,CAAAA,CAAAA,CAEnB,OACEqT,CAAAA,CAAW,UACX,EAAA,OAAOA,CAAW,CAAA,QAAA,CAAS,KAAU,EAAA,QAAA,CAE9B,CACL,GAAA,CAAKA,CAAW,CAAA,QAAA,CAAS,KACzB,CAAA,QAAA,CAAU,EACZ,CAOK,CAAA,CACL,GALqB,CAAA,IAAItE,CACzB,CAAA,IAAA,CAAK,KACP,CAAE,CAAA,yBAAA,CAA0B,OAASsE,CAAAA,CAAAA,CAAW,QAAoB,CAAA,CAIlE,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEOC,EAAQ,CAAA,IAAIgJ,EC9BnB,CAAA,IAAMC,EAAN,CAAA,KAAsD,CAGpD,KAAA,CAAMvK,CAAgE,CAAA,CACpE,OAAO,CACL,GAAK,CAAA,UAAA,CACL,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEOwB,GAAQ,IAAI+I,EAAAA,CCVnB,IAAMA,EAAAA,CAAN,KAAsD,CAGpD,KAAMvK,CAAAA,CAAAA,CAAgE,CACpE,OAAArc,CAAO,CAAA,IAAA,CAAK,oCAAoC,CAAA,CACzC,CACL,GAAA,CAAK,EACL,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CAEO+d,CAAAA,EAAAA,CAAQ,IAAI6I,EAAAA,CCZnB,IAAMC,EAAAA,CAAN,KAAuD,CAErD,KAAMxc,CAAAA,CAAAA,CAAiB,CACrB,IAAMyR,CAAAA,CAAKzR,CAEL4T,CAAAA,CAAAA,CADQ,IAAI7E,CAAAA,CAAiB,IAAK,CAAA,KAAK,CACtB,CAAA,iBAAA,CAAkB,OAAS0C,CAAAA,CAAAA,CAAG,KAAK,CAAA,CAE1D,OAAO,CAAE,IAAK,CADCA,EAAAA,CAAAA,CAAG,QAAW,CAAA,YAAA,CAAe,EACrB,CAAA,EAAGmC,CAAQ,CAAA,CAAA,CAAI,QAAU,CAAA,EAAG,CACrD,CACF,CAAA,CACOC,EAAQ,CAAA,IAAI2I,GCXnB,IAAMC,EAAAA,CAAN,KAA6D,CAE3D,KAAMzc,CAAAA,CAAAA,CAAiB,CAErB,OAAO,CACL,GAAA,CAAK,CAFKA,iDAAAA,EAAAA,CAAAA,CAEmD,aAAa,CAAA,CAAA,CAAA,CAC1E,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CACO+T,EAAQ,CAAA,IAAI0I,ECPnB,CAAA,IAAMC,EAAN,CAAA,KAAkD,CAGhD,KAAA,CAAM1c,CAA+D,CAAA,CACnE,IAAMwP,CAAAA,CAAWxP,EAEjB,GAAI,OAAOwP,CAAS,CAAA,KAAA,EAAU,QAAU,CAAA,CACtC,IAAMyE,CAAAA,CAAmB,IAAIlF,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAExD,CAAA,OAAIS,CAAS,CAAA,KAAA,EAASA,CAAS,CAAA,KAAA,CAAM,MAAS,CAAA,CAAA,CAMrC,CACL,GAAA,CAAK,CANUyE,EAAAA,CAAAA,CAAiB,iBAChC,CAAA,OAAA,CACAzE,CAAS,CAAA,KACX,CAGkB,CAAA,MAAA,EAASA,CAAS,CAAA,KAAK,KACvC,QAAU,CAAA,EACZ,CAAA,CAQK,CAAE,GAAA,CALQyE,CAAiB,CAAA,iBAAA,CAChC,OACAzE,CAAAA,CAAAA,CAAS,KACX,CAAA,CAEwB,QAAU,CAAA,EAAG,CACvC,CAEA,IAAM0E,CAAgB,CAAA,KAAA,CAAM,OAAQ1E,CAAAA,CAAAA,CAAS,KAAK,CAAA,CAC9CA,CAAS,CAAA,KAAA,CACT,CAACA,CAAAA,CAAS,KAAK,CAAA,CAGb1Z,CADY,CAAA,IAAIqK,EAAU,IAAK,CAAA,KAAA,CAAO,OAA4B,CAAA,CAC/C,KAAM+T,CAAAA,CAAa,CAEtCC,CAAAA,CAAAA,CACJ3E,CAAS,CAAA,KAAA,EAASA,CAAS,CAAA,KAAA,CAAM,MAC7B,CAAA,CAAA,MAAA,EAASA,CAAS,CAAA,KAAK,KACvB,EAEN,CAAA,OAAO,CACL,GAAA,CAAK,CAAI1Z,CAAAA,EAAAA,CAAAA,CAAO,GAAG,CAAA,CAAA,EAAIqe,CAAQ,CAAA,CAAA,CAC/B,QAAUre,CAAAA,CAAAA,CAAO,QACnB,CACF,CACF,CAAA,CAEOse,GAAQ,IAAIsI,EAAAA,CCjDnB,IAAMC,EAAAA,CAAN,KAAqD,CAGnD,KAAM3c,CAAAA,CAAAA,CAA+D,CACnE,IAAMsU,CAActU,CAAAA,CAAAA,CACpB,OAAIsU,CAAAA,CAAY,UACP,CAAA,CACL,GAAKA,CAAAA,CAAAA,CAAY,MACjB,CAAA,QAAA,CAAU,EACZ,CAQK,CAAA,CACL,GANgB,CAAA,IAAIvF,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBACjD,CAAA,OAAA,CACAuF,EAAY,MACd,CAAA,CAIE,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEOC,EAAQ,CAAA,IAAIoI,ECxBnB,CAAA,IAAMC,EAAN,CAAA,KAAoD,CAGlD,KAAA,CAAM5c,CAA+D,CAAA,CACnE,IAAMyU,CAAAA,CAAazU,CACnB,CAAA,GAAIyU,CAAW,CAAA,UAAA,CACb,OAAO,CACL,GAAKA,CAAAA,CAAAA,CAAW,MAChB,CAAA,QAAA,CAAUA,CAAW,CAAA,KACvB,EAGF,IAAMC,CAAAA,CAAMD,CAAW,CAAA,cAAA,CACnBne,CAAM,CAAA,EAAA,CACNyZ,CAAkB,CAAA,EAUtB,CAAA,GAPE,EAAE0E,CAAAA,CAAW,KAAiBpT,YAAAA,CAAAA,CAAAA,EAC9B,CAAC,KAAA,CAAM,OAAQoT,CAAAA,CAAAA,CAAW,KAAK,CAAA,GAE/Bne,CAAM,CAAA,CAAA,EAAG,IAAIyY,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CAAmB,OAAS0F,CAAAA,CAAAA,CAAW,MAAM,CAAC,IAAIA,CAAW,CAAA,QAAQ,CAAKC,EAAAA,EAAAA,CAAG,CACvH3E,CAAAA,CAAAA,CAAAA,CAAW,CAAC0E,CAAAA,CAAW,KAAK,CAAA,CAAA,CAG1B,KAAM,CAAA,OAAA,CAAQA,CAAW,CAAA,KAAK,CAAG,CAAA,CACnC,IAAME,CAAeF,CAAAA,CAAAA,CAAW,KAC7B,CAAA,GAAA,CAAI,CAACnF,CAAAA,CAAG/P,CAAM,GAAA,CAAA,CAAA,EAAImV,CAAMnV,CAAAA,CAAC,CAAE,CAAA,CAAA,CAC3B,IAAK,CAAA,IAAI,CAEZjJ,CAAAA,CAAAA,CAAM,GAAG,IAAIyY,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CAAmB,OAAS0F,CAAAA,CAAAA,CAAW,MAAM,CAAC,CAAIA,CAAAA,EAAAA,CAAAA,CAAW,QAAQ,CAAA,EAAA,EAAKE,CAAY,CAAA,CAAA,CAAA,CAChI5E,CAAW0E,CAAAA,CAAAA,CAAW,MACxB,CAEA,OAAIA,CAAAA,CAAW,SACbne,GAAAA,CAAAA,CAAM,CAAQA,KAAAA,EAAAA,CAAG,CAGZ,CAAA,CAAA,CAAA,CAAA,CAAE,GAAKA,CAAAA,CAAAA,CAAI,IAAK,EAAA,CAAG,SAAAyZ,CAAS,CACrC,CACF,CAAA,CAEO6E,EAAQ,CAAA,IAAIgI,EC1CnB,CAAA,IAAMC,EAAN,CAAA,KAAyD,CAEvD,KAAA,CAAM7c,CAAiB,CAAA,CACrB,IAAM8U,CAAAA,CAAK9U,CAEL4T,CAAAA,CAAAA,CADQ,IAAI7E,CAAAA,CAAiB,IAAK,CAAA,KAAK,CACtB,CAAA,iBAAA,CAAkB,OAAS+F,CAAAA,CAAAA,CAAG,KAAK,CAAA,CACpDxC,CAAOwC,CAAAA,CAAAA,CAAG,OAAQ,CAAA,GAAA,CAAKtZ,GAAM,CAAKA,EAAAA,EAAAA,CAAC,CAAI,EAAA,CAAA,CAAA,CAAE,IAAK,CAAA,IAAI,CAExD,CAAA,OAAO,CACL,GAAA,CAAK,CAFQsZ,EAAAA,CAAAA,CAAG,MAAS,CAAA,SAAA,CAAY,EAEvB,CAAA,EAAA,EAAKA,CAAG,CAAA,SAAS,CAASlB,MAAAA,EAAAA,CAAQ,CAAKtB,EAAAA,EAAAA,CAAI,CACzD,CAAA,CAAA,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CACOyC,CAAAA,EAAAA,CAAQ,IAAI8H,EAAAA,CCfnB,IAAMC,EAAN,CAAA,KAAuD,CAErD,KAAA,CAAM9c,CAAiB,CAAA,CACrB,IAAMiV,CAAAA,CAAKjV,CACX,CAAA,GAAI,CAACiV,CAAAA,CAAG,KACN,CAAA,MAAM,IAAI,KAAA,CAAM,sCAAsC,CAExD,CAAA,OAAO,CACL,GAAA,CAAK,CAAKA,EAAAA,EAAAA,CAAAA,CAAG,SAAS,CAAA,QAAA,EAAWA,CAAG,CAAA,KAAK,CACzC,EAAA,CAAA,CAAA,QAAA,CAAU,EACZ,CACF,CACF,EACOC,EAAQ,CAAA,IAAI4H,ECVnB,CAAA,IAAMC,EAAN,CAAA,KAAoD,CAGlD,KAAA,CAAM/c,CAA+D,CAAA,CACnE,IAAMoV,CAAAA,CAAapV,CAEnB,CAAA,GAAIoV,CAAW,CAAA,UAAA,CACb,OAAO,CACL,GAAKA,CAAAA,CAAAA,CAAW,QAAS,CAAA,KAAA,CACzB,QAAU,CAAA,EACZ,CAAA,CAGF,IAAMnB,CAAAA,CAAmB,IAAIlF,CAAAA,CAAiB,IAAK,CAAA,KAAK,EAClDsG,CAAiBpB,CAAAA,CAAAA,CAAiB,yBACtC,CAAA,OAAA,CACAmB,CAAW,CAAA,QACb,CAEA,CAAA,GAAI,CAACA,CAAAA,CAAW,OAAQ,CAAA,MAAA,CACtB,OAAO,CACL,GAAKC,CAAAA,CAAAA,CACL,QAAU,CAAA,EACZ,CAAA,CAGF,IAAMC,CAAAA,CAAcF,CAAW,CAAA,OAAA,CAAQ,CAAC,CAAA,CAClC/Z,CAAU,CAAA,MAAA,CAAO,IAAKia,CAAAA,CAAW,CACvC,CAAA,GAAI,CAACja,CAAQ,CAAA,MAAA,CACX,OAAO,CACL,GAAKga,CAAAA,CAAAA,CACL,QAAU,CAAA,EACZ,CAAA,CAGF,IAAME,CAAAA,CAAmBla,CACtB,CAAA,GAAA,CAAKE,CAAW0Y,EAAAA,CAAAA,CAAiB,kBAAmB,CAAA,OAAA,CAAS1Y,CAAM,CAAC,CACpE,CAAA,IAAA,CAAK,IAAI,CAAA,CAENia,CAAmB,CAAA,EACnBC,CAAAA,CAAAA,CAA0B,EAAC,CAEjC,IAAW5Z,IAAAA,CAAAA,IAAUuZ,EAAW,OAAS,CAAA,CACvC,IAAMO,CAAAA,CAAeta,CAAQ,CAAA,GAAA,CAAKE,CAAWM,EAAAA,CAAAA,CAAON,CAAM,CAAC,CAErDoZ,CAAAA,CAAAA,CAAyB,EAAC,CAChC,IAAW3hB,IAAAA,CAAAA,IAAS2iB,EACd3iB,CAAiBke,YAAAA,CAAAA,CACnByD,CAAa,CAAA,IAAA,CAAK3hB,CAAM,CAAA,QAAQ,CAEhCwiB,EAAAA,CAAAA,CAAU,IAAKxiB,CAAAA,CAAK,CACpB2hB,CAAAA,CAAAA,CAAa,IAAK,CAAA,GAAG,CAIzBc,CAAAA,CAAAA,CAAAA,CAAc,KAAK,CAAId,CAAAA,EAAAA,CAAAA,CAAa,IAAK,CAAA,IAAI,CAAC,CAAA,CAAA,CAAG,EACnD,CAGA,OAAO,CACL,GAFU,CAAA,CAAA,EAAGU,CAAc,CAAA,EAAA,EAAKE,CAAgB,CAAA,SAAA,EAAYE,CAAc,CAAA,IAAA,CAAK,IAAI,CAAC,CAGpF,CAAA,CAAA,QAAA,CAAUD,CACZ,CACF,CACF,CAAA,CAEOQ,EAAQ,CAAA,IAAI+G,ECnEnB,CAAA,IAAMC,EAAN,CAAA,KAAkD,CAGhD,KAAMhd,CAAAA,CAAAA,CAA+D,CACnE,IAAMkW,CAAWlW,CAAAA,CAAAA,CACjB,GAAIkW,CAAAA,CAAS,UACX,CAAA,OAAO,CACL,GAAA,CAAKA,CAAS,CAAA,KAAA,CACd,QAAU,CAAA,EACZ,CAAA,CAGF,IAAM9D,CAAAA,CAAQ,IAAIrD,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAEzCoH,CAAAA,CAAAA,CAAgBD,CAAS,CAAA,IAAA,CACxBC,CAAc,CAAA,QAAA,CAAS,GAAG,CAAA,GAC7BA,EAAgB,CAAGD,EAAAA,CAAAA,CAAS,KAAK,CAAA,CAAA,EAAIC,CAAa,CAAA,CAAA,CAAA,CAGpD,IAAIC,CAAAA,CAAiBF,CAAS,CAAA,KAAA,CACzBE,CAAe,CAAA,QAAA,CAAS,GAAG,CAAA,GAC9BA,CAAiB,CAAA,CAAA,EAAG,IAAK,CAAA,KAAA,CAAM,KAAK,CAAA,CAAA,EAAIA,CAAc,CAAA,CAAA,CAAA,CAGxD,IAAMC,CAAAA,CAAUjE,CAAM,CAAA,kBAAA,CAAmB,OAAS+D,CAAAA,CAAa,CACzDG,CAAAA,CAAAA,CAAWlE,CAAM,CAAA,kBAAA,CAAmB,QAASgE,CAAc,CAAA,CAIjE,OAAO,CAAE,GADG,CAAA,CAAA,EAFKhE,CAAM,CAAA,iBAAA,CAAkB,OAAS8D,CAAAA,CAAAA,CAAS,KAAK,CAEzC,CAAOG,IAAAA,EAAAA,CAAO,CAAIH,CAAAA,EAAAA,CAAAA,CAAS,IAAI,QAAQ,CAAA,CAAA,EAAII,CAAQ,CAAA,CAAA,CAC5D,QAAU,CAAA,EAAG,CAC7B,CACF,CAAA,CAEOC,EAAQ,CAAA,IAAIyG,EClCnB,CAAA,IAAMC,EAAN,CAAA,KAAmD,CAGjD,KAAMjd,CAAAA,CAAAA,CAA+D,CAGnE,OAAO,CACL,GAAA,CAAK,GACL,CAAA,QAAA,CAAU,CAJMA,CAAAA,CAIK,KAAK,CAC5B,CACF,CACF,CAEO0W,CAAAA,EAAAA,CAAQ,IAAIuG,EAAAA,CCdnB,IAAMC,EAAAA,CAAwC,CAC5C,UAAA,CAAY,YACZ,CAAA,SAAA,CAAW,oBACb,CAAA,CAEaC,EAAN,CAAA,KAAkD,CAGvD,KAAA,CAAMnd,CAAmD,CAAA,CACvD,IAAMod,CAAWpd,CAAAA,CAAAA,CACb1J,CAAM4mB,CAAAA,EAAAA,CAAcE,CAAS,CAAA,QAAQ,CAAK,EAAA,YAAA,CAC9C,OAAIA,CAAAA,CAAS,UACX9mB,GAAAA,CAAAA,EAAO,cAGF,CAAA,CAAA,CACL,GAAAA,CAAAA,CAAAA,CACA,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEOsgB,EAAQ,CAAA,IAAIuG,ECrBnB,CAAA,IAAME,EAAN,CAAA,KAAoD,CAGlD,KAAA,CAAMrd,CAA+D,CAAA,CAGnE,OAAO,CACL,GAAA,CAAK,GACL,CAAA,QAAA,CAAU,CAJOA,CAAAA,CAIK,MAAM,CAC9B,CACF,CACF,CAEO+W,CAAAA,EAAAA,CAAQ,IAAIsG,EAAAA,CCZnB,IAAMC,EAAAA,CAAN,KAAyD,CAGvD,KAAMtd,CAAAA,CAAAA,CAA+D,CACnE,IAAMiX,CAAkBjX,CAAAA,CAAAA,CAExB,GAAIiX,CAAAA,CAAgB,UAClB,CAAA,OAAO,CACL,GAAA,CAAKA,CAAgB,CAAA,KAAA,CACrB,SAAU,EACZ,CAGF,CAAA,IAAMhD,CAAmB,CAAA,IAAIlF,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAExD,GAAIkI,CAAAA,CAAgB,IAAS,GAAA,QAAA,CAAU,CACrC,IAAMsG,EAActG,CAAgB,CAAA,eAAA,GAAkB,CAAC,CAAA,EACrD,IACIuG,CAAAA,CAAAA,CAAsBvJ,CAAiB,CAAA,kBAAA,CAC3C,OACA,CAAA,CAAA,EAAGgD,CAAgB,CAAA,KAAK,CAAIsG,CAAAA,EAAAA,CAAU,CACxC,CAAA,CAAA,CACA,OAAO,CACL,GAAA,CAAK,CAAkCC,+BAAAA,EAAAA,CAAmB,CAAMA,GAAAA,EAAAA,CAAmB,CACnF,CAAA,CAAA,QAAA,CAAU,EACZ,CACF,CASA,OAAO,CACL,GAAK,CAAA,CAAA,+BAAA,EARkBvG,CAAgB,CAAA,eAAA,CACtC,GACE1b,CAAAA,CAAAA,EACC,CAAG0Y,EAAAA,CAAAA,CAAiB,kBAAmB,CAAA,OAAA,CAAS1Y,CAAM,CAAC,CAAU0Y,OAAAA,EAAAA,CAAAA,CAAiB,kBAAmB,CAAA,OAAA,CAAS1Y,CAAM,CAAC,EACzH,CACC,CAAA,IAAA,CAAK,IAAI,CAG6C,CACvD,CAAA,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CAEO2b,CAAAA,EAAAA,CAAQ,IAAIoG,EAAAA,CC1CnB,IAAMG,EAAAA,CAAN,KAAqD,CAGnD,KAAMzd,CAAAA,CAAAA,CAA+D,CACnE,IAAMoX,CAAcpX,CAAAA,CAAAA,CACpB,GAAIoX,CAAAA,CAAY,UACd,CAAA,OAAO,CACL,GAAA,CAAKA,CAAY,CAAA,MAAA,CACjB,SAAU,EACZ,CAEF,CAAA,IAAMC,CAAY,CAAA,IAAItI,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBACjD,CAAA,OAAA,CACAqI,CAAY,CAAA,MACd,CACME,CAAAA,CAAAA,CAAeF,CAAY,CAAA,SAAA,CAAU,WAAY,EAAA,CAEvD,OAAO,CACL,GAAK,CAAA,CAAA,EAAGC,CAAS,CAAA,CAAA,EAAIC,CAAY,CAAA,CAAA,CACjC,QAAU,CAAA,EACZ,CACF,CACF,CAEOC,CAAAA,EAAAA,CAAQ,IAAIkG,EAAAA,CC1BnB,IAAMC,EAAAA,CAAN,KAAiD,CAG/C,KAAM1d,CAAAA,CAAAA,CAAmD,CAEvD,OAAO,CACL,GAAA,CAFcA,CAED,CAAA,QAAA,CACb,SAAU,EACZ,CACF,CACF,CAEOyX,CAAAA,EAAAA,CAAQ,IAAIiG,EAAAA,CCXnB,IAAMC,EAAAA,CAAN,KAA4D,CAG1D,KAAM3L,CAAAA,CAAAA,CAAgE,CAepE,OAAO,CAAE,GAZG,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0DAAA,EAFCA,EACM,KAW0C,CAAA;AAAA,4CAAA,CAAA,CAE/C,SAAU,EAAG,CAC7B,CACF,CAAA,CAEO2F,GAAQ,IAAIgG,EAAAA,CCtBnB,IAAMC,EAAAA,CAAN,KAAuD,CAGrD,KAAA,CAAM5L,EAAgE,CAIpE,OAAO,CAAE,GADG,CAAA,CAAA,kBAAA,EAFCA,CACM,CAAA,KACmB,KACxB,QAAU,CAAA,EAAG,CAC7B,CACF,EAEO6F,EAAQ,CAAA,IAAI+F,GCXnB,IAAMC,EAAAA,CAAN,KAA4D,CAG1D,KAAA,CAAM7L,EAAgE,CASpE,OAAO,CAAE,GANG,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA,0DAAA,EAFCA,EACM,KAK0C,CAAA;AAAA,+BAAA,CAAA,CAE/C,QAAU,CAAA,EAAG,CAC7B,CACF,CAAA,CAEO+F,EAAQ,CAAA,IAAI8F,EChBnB,CAAA,IAAMC,EAAN,CAAA,KAAuD,CAGrD,KAAA,CAAM9L,CAAgE,CAAA,CAcpE,OAAO,CAAE,GAVP,CAAA,CAAA,2TAAA,EAHWA,CACM,CAAA,KAUyC,CAE9C,2BAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC7B,CACF,CAEOiG,CAAAA,EAAAA,CAAQ,IAAI6F,EAAAA,CCnBnB,IAAMC,EAAAA,CAAN,KAAoD,CAGlD,KAAM/d,CAAAA,CAAAA,CAA+D,CACnE,IAAMmY,CAAanY,CAAAA,CAAAA,CACnB,GAAImY,CAAAA,CAAW,UACb,CAAA,OAAO,CACL,GAAA,CAAKA,CAAW,CAAA,MAAA,CAChB,QAAU,CAAA,EACZ,CAAA,CAGF,IAAMC,CAAAA,CAAe,IAAK,CAAA,YAAA,CACxBD,CAAW,CAAA,MAAA,CACXA,CAAW,CAAA,WACb,CACMhE,CAAAA,CAAAA,CAAW,IAAK,CAAA,WAAA,CAAYgE,CAAW,CAAA,KAAK,CAClD,CAAA,OAAO,CACL,GAAA,CAAK,CAAGC,EAAAA,CAAAA,CAAa,GAAG,CAAA,EAAGjE,CAAQ,CAAA,CAAA,CACnC,QAAUiE,CAAAA,CAAAA,CAAa,QACzB,CACF,CAEQ,YAAA,CACN7c,CACA8c,CAAAA,CAAAA,CAC8C,CAC9C,GAAI,OAAO9c,CAAAA,EAAW,QAAU,CAAA,CAC9B,IAAMuK,CAAAA,CAAM,IAAIiJ,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CAC3C,OACAxT,CAAAA,CACF,CACIjF,CAAAA,CAAAA,CAAMwP,CACV,CAAA,OAAIuS,CACF/hB,GAAAA,CAAAA,CAAM,CAAG+hB,EAAAA,CAAAA,CAAY,WAAY,EAAC,CAAIvS,CAAAA,EAAAA,CAAG,CAEpC,CAAA,CAAA,CAAA,CAAA,CACL,GAAAxP,CAAAA,CAAAA,CACA,QAAU,CAAA,EACZ,CACF,CAEA,GAAI,KAAM,CAAA,OAAA,CAAQiF,CAAM,CAAA,EAAKA,CAAO,CAAA,MAAA,CAAS,CAAG,CAAA,CAE9C,IAAMzF,CAAAA,CADY,IAAIqK,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,OAA4B,CAAA,CAC/C,KAAM5E,CAAAA,CAAM,CACjCjF,CAAAA,CAAAA,CAAM,CAAIR,CAAAA,EAAAA,CAAAA,CAAO,GAAG,CAAA,CAAA,CAAA,CACxB,OAAIuiB,CAAAA,GACF/hB,CAAM,CAAA,CAAA,EAAG+hB,CAAY,CAAA,WAAA,EAAa,CAAA,EAAG/hB,CAAG,CAAA,CAAA,CAAA,CAEnC,CACL,GAAA,CAAAA,CACA,CAAA,QAAA,CAAUR,CAAO,CAAA,QACnB,CACF,CAEA,GAAI,CAAC,KAAM,CAAA,OAAA,CAAQyF,CAAM,CAAA,CAAG,CAE1B,IAAMzF,CADY,CAAA,IAAIqK,CAAU,CAAA,IAAA,CAAK,KAAO,CAAA,OAA4B,CAC/C,CAAA,KAAA,CAAM,CAAC5E,CAAM,CAAC,CAAA,CACnCjF,CAAM,CAAA,CAAA,CAAA,EAAIR,CAAO,CAAA,GAAG,CACxB,CAAA,CAAA,CAAA,OAAIuiB,CACF/hB,GAAAA,CAAAA,CAAM,CAAG+hB,EAAAA,CAAAA,CAAY,WAAY,EAAC,CAAG/hB,EAAAA,CAAG,CAEnC,CAAA,CAAA,CAAA,CACL,GAAAA,CAAAA,CAAAA,CACA,QAAUR,CAAAA,CAAAA,CAAO,QACnB,CACF,CAuBA,OAAO,CACL,GAAA,CAtBuByF,CAAO,CAAA,GAAA,CAAKuK,CAAQ,EAAA,CAC3C,GAAI,OAAOA,CAAQ,EAAA,QAAA,CAAU,CAC3B,IAAMwS,CAAY,CAAA,IAAIvJ,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBACjD,CAAA,OAAA,CACAjJ,CACF,CAAA,CACA,OAAIuS,CAAAA,CACK,CAAGA,EAAAA,CAAAA,CAAY,WAAY,EAAC,CAAIC,CAAAA,EAAAA,CAAS,CAE3CA,CAAAA,CAAAA,CAAAA,CACT,CAIA,IAAIhiB,CAAM,CAAA,CAAA,CAAA,EAFQ,IAAI6J,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,OAA4B,CAAA,CAC/C,MAAM,CAAC2F,CAAG,CAAC,CAAA,CACf,GAAG,CAAA,CAAA,CAAA,CACxB,OAAIuS,CAAAA,GACF/hB,CAAM,CAAA,CAAA,EAAG+hB,CAAY,CAAA,WAAA,EAAa,CAAA,EAAG/hB,CAAG,CAAA,CAAA,CAAA,CAEnCA,CACT,CAAC,CAGuB,CAAA,IAAA,CAAK,IAAI,CAAA,CAC/B,QAAU,CAAA,EACZ,CACF,CAEQ,WAAA,CAAY4Y,CAAwB,CAAA,CAC1C,OAAIA,CAAAA,EAASA,CAAM,CAAA,MAAA,CACV,CAASA,MAAAA,EAAAA,CAAK,CAEhB,EAAA,CAAA,CAAA,EACT,CACF,CAAA,CAEOqJ,EAAQ,CAAA,IAAIwF,ECvGnB,CAAA,IAAMC,EAAN,CAAA,KAAsD,CAGpD,KAAA,CAAMhe,CAA+D,CAAA,CACnE,IAAMyY,CAAAA,CAAezY,CAErB,CAAA,OAAIyY,CAAa,CAAA,UAAA,EAAc,OAAOA,CAAAA,CAAa,QAAa,EAAA,QAAA,CACvD,CACL,GAAA,CAAKA,CAAa,CAAA,QAAA,CAClB,QAAU,CAAA,EACZ,CAAA,CAOK,CACL,GAAA,CALqB,IAAI1J,CAAAA,CACzB,IAAK,CAAA,KACP,CAAE,CAAA,yBAAA,CAA0B,OAAS0J,CAAAA,CAAAA,CAAa,QAAoB,CAAA,CAIpE,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEOC,EAAQ,CAAA,IAAIsF,EC1BnB,CAAA,IAAMC,EAAN,CAAA,KAAmD,CAGjD,KAAA,CAAMje,CAA+D,CAAA,CACnE,IAAM4Y,CAAAA,CAAY5Y,CACZ6Y,CAAAA,CAAAA,CAAS,IAAI1Y,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,OAAO,CAAA,CAC1C2Y,CAAQ,CAAA,KAAA,CAAM,OAAQF,CAAAA,CAAAA,CAAU,KAAK,CAAA,CACvCA,CAAU,CAAA,KAAA,CACV,CAACA,CAAAA,CAAU,KAAK,CAAA,CAEd1Y,CACJ,CAAA,OAAO0Y,CAAU,CAAA,KAAA,EAAU,QACvB,CAAA,CAAE,GAAKA,CAAAA,CAAAA,CAAU,KAAO,CAAA,QAAA,CAAU,EAAG,CACrCC,CAAAA,CAAAA,CAAO,KACLC,CAAAA,CAAAA,CAAM,MAAO,CAAA,OAAO,CACpBF,CAAAA,CAAAA,CAAU,cACZ,CAAA,CAEN,OAAO,CACL,GAAK1Y,CAAAA,CAAAA,CAAI,GACT,CAAA,QAAA,CAAUA,CAAI,CAAA,QAChB,CACF,CACF,CAEO6Y,CAAAA,EAAAA,CAAQ,IAAIkF,EAAAA,CCtBnB,IAAMC,EAAAA,CAAN,KAAoD,CAGlD,KAAMle,CAAAA,CAAAA,CAA+D,CACnE,IAAMiZ,CAAajZ,CAAAA,CAAAA,CACnB,GAAIiZ,CAAAA,CAAW,UAAc,EAAA,OAAOA,CAAW,CAAA,QAAA,EAAa,QAC1D,CAAA,OAAO,CACL,GAAA,CAAKA,CAAW,CAAA,QAAA,CAChB,QAAUA,CAAAA,CAAAA,CAAW,MACvB,CAAA,CAGF,IAAMhF,CAAAA,CAAmB,IAAIlF,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAClDsG,CAAAA,CAAAA,CAAiBpB,CAAiB,CAAA,yBAAA,CACtC,OACAgF,CAAAA,CAAAA,CAAW,QACb,CAAA,CAEA,GAAI,CAACA,CAAW,CAAA,OAAA,CAAQ,MAAU,EAAA,CAACA,CAAW,CAAA,MAAA,CAAO,MACnD,CAAA,OAAO,CACL,GAAA,CAAK5D,CACL,CAAA,QAAA,CAAU,EACZ,CAGF,CAAA,IAAM8D,CAAuB,CAAA,EACvBC,CAAAA,CAAAA,CAAYH,CAAW,CAAA,OAAA,CAC1B,GAAI,CAAA,CAAC1d,CAAQoO,CAAAA,CAAAA,GAAU,CACtB,IAAM3W,CAAQimB,CAAAA,CAAAA,CAAW,MAAOtP,CAAAA,CAAK,CACrC,CAAA,OAAI3W,CAAiBke,YAAAA,CAAAA,CACZ,CAAG+C,EAAAA,CAAAA,CAAiB,kBAAmB,CAAA,OAAA,CAAS1Y,CAAM,CAAC,CAAMvI,GAAAA,EAAAA,CAAAA,CAAM,QAAQ,CAAA,CAAA,EAGpFmmB,CAAc,CAAA,IAAA,CAAKnmB,CAAK,CAAA,CACjB,CAAGihB,EAAAA,CAAAA,CAAiB,kBAAmB,CAAA,OAAA,CAAS1Y,CAAM,CAAC,CAChE,IAAA,CAAA,CAAA,CAAC,CACA,CAAA,IAAA,CAAK,IAAI,CAEZ,CAAA,OAAO,CACL,GAAA,CAAK,CAAG8Z,EAAAA,CAAc,CAAQ+D,KAAAA,EAAAA,CAAS,CACvC,CAAA,CAAA,QAAA,CAAUD,CACZ,CACF,CACF,CAAA,CAEOE,EAAQ,CAAA,IAAI6E,EC9CnB,CAAA,IAAMC,EAAN,CAAA,KAAmD,CAGjD,KAAA,CAAMne,CAA+D,CAAA,CACnE,IAAMuZ,CAAAA,CAAYvZ,CAClB,CAAA,GAAIuZ,CAAU,CAAA,UAAA,CACZ,OAAO,CACL,GAAKA,CAAAA,CAAAA,CAAU,MACf,CAAA,QAAA,CAAWA,CAAU,CAAA,KAAA,EAAmB,EAC1C,CAGF,CAAA,IAAIjjB,CAAM,CAAA,EAAA,CACNyZ,CAAkB,CAAA,EAEtB,CAAA,GAAI,IAAK,CAAA,SAAA,CAAUwJ,CAAU,CAAA,KAAK,CAAG,CAAA,CACnC,IAAMC,CAAAA,CAAiB,IAAK,CAAA,6BAAA,CAC1BD,CAAU,CAAA,KAAA,CAAM,QAClB,CAAA,CACAjjB,CAAM,CAAA,CAAA,EAAG,IAAIyY,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CAAmB,OAASwK,CAAAA,CAAAA,CAAU,MAAM,CAAC,CAAIA,CAAAA,EAAAA,CAAAA,CAAU,QAAQ,CAAA,CAAA,EAAIC,CAAc,CAAA,CAAA,CAC/HzJ,CAAW,CAAA,GACb,CAAA,KAAA,GAAW,KAAM,CAAA,OAAA,CAAQwJ,CAAU,CAAA,KAAK,CACtC,CAAA,GAAIA,CAAU,CAAA,QAAA,CAAS,WAAY,EAAA,GAAM,SAEvCjjB,CAAAA,CAAAA,CAAM,CAAG,EAAA,IAAIyY,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBAAmB,CAAA,OAAA,CAASwK,CAAU,CAAA,MAAM,CAAC,CAAA,gBAAA,CAAA,CACvFxJ,CAAWwJ,CAAAA,CAAAA,CAAU,KAChB,CAAA,KAAA,CACL,IAAM5E,CAAAA,CAAe4E,CAAU,CAAA,KAAA,CAAM,GAAKjK,CAAAA,CAAAA,EAAM,GAAG,CAAA,CAAE,IAAK,CAAA,IAAI,CAC9DhZ,CAAAA,CAAAA,CAAM,CAAG,EAAA,IAAIyY,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBAAmB,CAAA,OAAA,CAASwK,CAAU,CAAA,MAAM,CAAC,CAAA,CAAA,EAAIA,CAAU,CAAA,QAAQ,CAAK5E,EAAAA,EAAAA,CAAY,CAC9H5E,CAAAA,CAAAA,CAAAA,CAAAA,CAAWwJ,CAAU,CAAA,MACvB,CAEIA,KAAAA,GAAAA,CAAAA,CAAU,QAAS,CAAA,QAAA,CAAS,MAAM,CAAA,CACpCjjB,CAAM,CAAA,CAAA,EAAG,IAAIyY,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CAAmB,OAASwK,CAAAA,CAAAA,CAAU,MAAM,CAAC,CAAIA,CAAAA,EAAAA,CAAAA,CAAU,QAAQ,CAAA,CAAA,CAC7GxJ,CAAW,CAAA,EACN,CAAA,KAAA,CAAA,GAAIwJ,CAAU,CAAA,KAAA,GAAU,MAC7B,CAAA,OAAO,CAAE,GAAA,CAAK,EAAI,CAAA,QAAA,CAAU,EAAG,CAE/BjjB,CAAAA,CAAAA,CAAM,CAAG,EAAA,IAAIyY,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBAAmB,CAAA,OAAA,CAASwK,CAAU,CAAA,MAAM,CAAC,CAAA,CAAA,EAAIA,CAAU,CAAA,QAAQ,CAC7GxJ,EAAAA,CAAAA,CAAAA,CAAAA,CAAW,CAACwJ,CAAAA,CAAU,KAAK,EAAA,CAI/B,OAAIA,CAAAA,CAAU,SACZjjB,GAAAA,CAAAA,CAAM,CAAQA,KAAAA,EAAAA,CAAG,CAGZ,CAAA,CAAA,CAAA,CAAA,CAAE,GAAKA,CAAAA,CAAAA,CAAI,IAAK,EAAA,CAAG,QAAAyZ,CAAAA,CAAS,CACrC,CAEQ,SAAU/c,CAAAA,CAAAA,CAA8B,CAC9C,OACEA,CACA,EAAA,OAAOA,CAAU,EAAA,QAAA,EACjB,UAAcA,GAAAA,CAAAA,EACdA,CAAM,CAAA,UAAA,GAAe,IAEzB,CAEQ,6BAA8B4mB,CAAAA,CAAAA,CAAqB,CAGzD,OADE,0DAA2D,CAAA,IAAA,CAAKA,CAAG,CAAA,CAI9D,IAAI7K,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CAAmB,OAAS6K,CAAAA,CAAG,CAF9DA,CAAAA,CAGX,CACF,CAAA,CAEOC,EAAQ,CAAA,IAAIsE,ECtEnB,CAAA,IAAMC,GAAN,KAAwD,CAGtD,KAAMpe,CAAAA,CAAAA,CAA+D,CACnE,IAAM+Z,CAAY/Z,CAAAA,CAAAA,CAClB,GAAI,CAAC+Z,CAAU,CAAA,KAAA,EAASA,CAAU,CAAA,KAAA,CAAM,MAAW,GAAA,CAAA,CACjD,OAAO,CAAE,GAAK,CAAA,EAAA,CAAI,QAAU,CAAA,EAAG,CAAA,CAGjC,IAAMtK,CAAAA,CAAY,IAAItP,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,OAA4B,CAAA,CAClE,CAAE,GAAA,CAAA7J,CAAK,CAAA,QAAA,CAAAyZ,CAAS,CAAA,CAAIN,CAAU,CAAA,KAAA,CAClCsK,CAAU,CAAA,KAAA,CACVA,CAAU,CAAA,cAAA,CACV,IACF,CAAA,CAEA,OAAO,CACL,GAAK,CAAA,CAAA,CAAA,EAAIzjB,CAAG,CAAA,CAAA,CAAA,CACZ,QAAAyZ,CAAAA,CACF,CACF,CACF,CAEOiK,CAAAA,EAAAA,CAAQ,IAAIoE,EAAAA,CCvBnB,IAAMC,EAAAA,CAAN,KAAuD,CAGrD,KAAMre,CAAAA,CAAAA,CAA+D,CACnE,IAAMka,CAAgBla,CAAAA,CAAAA,CACtB,GAAIka,CAAAA,CAAc,UAChB,CAAA,OAAO,CACL,GAAA,CAAKA,CAAc,CAAA,MAAA,CACnB,QAAU,CAAA,EACZ,CAAA,CAGF,IAAI5jB,CAAAA,CAAM,EACNyZ,CAAAA,CAAAA,CAAkB,EAAC,CAEjBsH,CAAY,CAAA,IAAItI,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBACjD,CAAA,OAAA,CACAmL,CAAc,CAAA,MAChB,CAEA,CAAA,OAAQA,CAAc,CAAA,YAAA,EACpB,KAAK,GACH5jB,CAAAA,CAAAA,CAAM,CAAG+gB,EAAAA,CAAS,CAClBtH,kBAAAA,CAAAA,CAAAA,CAAAA,CAAW,CAAC,IAAA,CAAK,SAAUmK,CAAAA,CAAAA,CAAc,KAAK,CAAC,CAC/C,CAAA,MACF,KAAK,UAAA,CACH5jB,CAAM,CAAA,CAAA,cAAA,EAAiB+gB,CAAS,CAAA,IAAA,CAAA,CAChCtH,CAAW,CAAA,CAAC,IAAK,CAAA,SAAA,CAAUmK,EAAc,KAAK,CAAC,CAC/C,CAAA,MACF,KAAK,cAAA,CACH5jB,CAAM,CAAA,CAAA,cAAA,EAAiB+gB,CAAS,CAAA,IAAA,CAAA,CAChCtH,CAAW,CAAA,CAAC,IAAK,CAAA,SAAA,CAAUmK,CAAc,CAAA,KAAK,CAAC,CAAA,CAC/C,MACF,KAAK,KACH5jB,CAAAA,CAAAA,CAAM4jB,CAAc,CAAA,MAAA,CACpBnK,CAAW,CAAA,KAAA,CAAM,OAAQmK,CAAAA,CAAAA,CAAc,KAAK,CAAA,CACxCA,CAAc,CAAA,KAAA,CACd,EAAC,CACL,KACJ,CAEA,OAAIA,CAAAA,CAAc,SAChB5jB,GAAAA,CAAAA,CAAM,CAAQA,KAAAA,EAAAA,CAAG,CAGZ,CAAA,CAAA,CAAA,CAAA,CAAE,GAAKA,CAAAA,CAAAA,CAAI,IAAK,EAAA,CAAG,QAAAyZ,CAAAA,CAAS,CACrC,CACF,CAEOoK,CAAAA,EAAAA,CAAQ,IAAIkE,EAAAA,CCjDnB,IAAMC,EAAAA,CAAN,KAA2D,CAGzD,KAAMte,CAAAA,CAAAA,CAA+D,CACnE,IAAMqa,CAAera,CAAAA,CAAAA,CAErB,OAAI,IAAA,CAAK,gBAAiBqa,CAAAA,CAAAA,CAAa,QAAQ,CAAA,CACtC,IAAK,CAAA,oBAAA,CAAqBA,CAAY,CAAA,CAG3C,IAAK,CAAA,eAAA,CAAgBA,CAAa,CAAA,QAAQ,CACrC,CAAA,IAAA,CAAK,mBAAoBA,CAAAA,CAAY,CAGvC,CAAA,IAAA,CAAK,oBAAqBA,CAAAA,CAAY,CAC/C,CAEQ,gBACNC,CAAAA,CAAAA,CACoB,CACpB,OAAO,OAAOA,CAAAA,EAAa,QAC7B,CAEQ,eACNA,CAAAA,CAAAA,CACyB,CACzB,OAAO,KAAM,CAAA,OAAA,CAAQA,CAAQ,CAC/B,CAEQ,oBAAA,CACND,CAC8C,CAAA,CAE9C,OAAO,CAAE,GADG,CAAA,CAAA,EAAGA,CAAa,CAAA,MAAM,CAAIA,CAAAA,EAAAA,CAAAA,CAAa,QAAQ,CAAA,EAAA,EAAKA,CAAa,CAAA,QAAQ,CACnE,CAAA,CAAA,CAAA,IAAA,EAAQ,CAAA,QAAA,CAAU,EAAG,CACzC,CAEQ,mBAAA,CACNA,CAC8C,CAAA,CAC9C,IAAM5K,CAAAA,CAAY,IAAItP,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,OAA4B,CAAA,CAClE,CAAE,GAAA,CAAKoa,CAAa,CAAA,QAAA,CAAUC,CAAiB,CAAA,CAAI/K,CAAU,CAAA,KAAA,CACjE4K,CAAa,CAAA,QAAA,CACbA,CAAa,CAAA,cACf,CAGA,CAAA,OAAO,CAAE,GAAA,CADG,CAAGA,EAAAA,CAAAA,CAAa,MAAM,CAAA,CAAA,EAAIA,CAAa,CAAA,QAAQ,CAAKE,EAAAA,EAAAA,CAAW,CACzD,CAAA,CAAA,CAAA,IAAA,EAAQ,CAAA,QAAA,CAAUC,CAAiB,CACvD,CAEQ,oBAAA,CACNH,CAC8C,CAAA,CAC9C,IAAM5K,CAAAA,CAAY,IAAItP,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,OAA4B,CAAA,CAClE,CAAE,GAAA,CAAKoa,CAAa,CAAA,QAAA,CAAUC,CAAiB,CAAA,CAAI/K,CAAU,CAAA,KAAA,CACjE,CAAC4K,CAAAA,CAAa,QAAqB,CAAA,CACnCA,CAAa,CAAA,cACf,CAGA,CAAA,OAAO,CAAE,GAAA,CADG,CAAGA,EAAAA,CAAAA,CAAa,MAAM,CAAA,CAAA,EAAIA,CAAa,CAAA,QAAQ,CAAKE,EAAAA,EAAAA,CAAW,CACzD,CAAA,CAAA,CAAA,IAAA,EAAQ,CAAA,QAAA,CAAUC,CAAiB,CACvD,CACF,CAAA,CAEOC,EAAQ,CAAA,IAAI6D,EChEnB,CAAA,IAAMC,EAAN,CAAA,KAAkD,CAGhD,KAAA,CACEve,CAC8C,CAAA,CAC9C,IAAM2a,CAAAA,CAAW3a,CACX6Y,CAAAA,CAAAA,CAAS,IAAI1Y,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,OAAO,CAAA,CAC1C2Y,CAAQ,CAAA,KAAA,CAAM,OAAQ6B,CAAAA,CAAAA,CAAS,IAAI,CAAA,CACrCA,CAAS,CAAA,IAAA,CACT,CAACA,CAAAA,CAAS,IAAI,CAAA,CAEZza,CAAM2Y,CAAAA,CAAAA,CAAO,KACjBC,CAAAA,CAAAA,CAAM,MAAO,CAAA,OAAO,CACpB6B,CAAAA,CAAAA,CAAS,cACX,CAAA,CAEA,OAAO,CACL,GAAK,CAAA,CAAA,EAAGA,CAAS,CAAA,KAAK,CAAQza,KAAAA,EAAAA,CAAAA,CAAI,GAAG,CAAA,CAAA,CAAA,CACrC,QAAUA,CAAAA,CAAAA,CAAI,QAChB,CACF,CACF,CAAA,CAEO0a,EAAQ,CAAA,IAAI2D,ECvBnB,CAAA,IAAMC,EAAN,CAAA,KAAwD,CAEtD,KAAA,CAAMxe,CAAiB,CAAA,CACrB,IAAMC,CAAAA,CAASD,CACTE,CAAAA,CAAAA,CAAM,IAAIC,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,UAA+B,CAAA,CACjE,CAAE,GAAA,CAAA7J,CAAI,CAAA,CAAI4J,CAAI,CAAA,KAAA,CAAM,CAACD,CAAAA,CAAO,MAAM,CAAC,CAEjCG,CAAAA,CAAAA,CAAqBH,CAAe,CAAA,iBAAA,CAC1C,GAAIG,CAAAA,EAAqBA,CAAkB,CAAA,MAAA,CAAQ,CACjD,IAAMC,CAA4B,CAAA,EAElC,CAAA,IAAA,IAAWC,CAAcF,IAAAA,CAAAA,CAAmB,CAC1C,GAAM,CAAE,GAAA,CAAKG,CAAc,CAAA,CAAIL,CAAI,CAAA,KAAA,CAAM,CAACI,CAAU,CAAC,CAAA,CACrDD,CAAgB,CAAA,IAAA,CAAKE,CAAa,EACpC,CAEIF,CAAAA,CAAgB,MAClB/J,GAAAA,CAAAA,EAAO,CAAI+J,CAAAA,EAAAA,CAAAA,CAAgB,IAAK,CAAA,GAAG,CAAC,CAAA,CAAA,EAExC,CAGA,OAAO,CAAE,GAAA,CAAK,CAAO/J,IAAAA,EAAAA,CAAG,CAAI,CAAA,CAAA,QAAA,CAAU,EAAG,CAC3C,CACF,CAEOkK,CAAAA,EAAAA,CAAQ,IAAIge,EAAAA,CC1BnB,IAAMC,EAAAA,CAAN,KAA4D,CAE1D,KAAMze,CAAAA,CAAAA,CAAiB,CACrB,IAAMC,CAASD,CAAAA,CAAAA,CACTE,CAAM,CAAA,IAAIC,CAAU,CAAA,IAAA,CAAK,KAAO,CAAA,UAA+B,CAC/D,CAAA,CAAE,GAAA7J,CAAAA,CAAI,CAAI4J,CAAAA,CAAAA,CAAI,MAAM,CAACD,CAAAA,CAAO,UAAU,CAAC,CAC7C,CAAA,OAAO,CAAE,GAAA,CAAK,CAAO3J,IAAAA,EAAAA,CAAG,CAAI,CAAA,CAAA,QAAA,CAAU,EAAG,CAC3C,CACF,CAEOoK,CAAAA,EAAAA,CAAQ,IAAI+d,EAAAA,CCZnB,IAAMC,EAAAA,CAAN,KAA4D,CAE1D,KAAM1e,CAAAA,CAAAA,CAAiB,CAGrB,OAAO,CAAE,GAAA,CAAK,CAFHA,iBAAAA,EAAAA,CAAAA,CACK,OAAQ,CAAA,GAAA,CAAKxE,CAAM,EAAA,CAAA,CAAA,EAAIA,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,IAAA,CAAK,IAAI,CAChB,CAAK,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC1D,CACF,CAEOoF,CAAAA,EAAAA,CAAQ,IAAI8d,EAAAA,CCJnB,IAAMC,EAAAA,CAAN,KAA8D,CAE5D,KAAM3e,CAAAA,CAAAA,CAAiB,CACrB,IAAMc,CAAId,CAAAA,CAAAA,CACJE,CAAM,CAAA,IAAIC,CAAU,CAAA,IAAA,CAAK,KAAO,CAAA,UAA+B,CAC/D,CAAA,CAAE,GAAA7J,CAAAA,CAAI,CAAI4J,CAAAA,CAAAA,CAAI,KAAM,CAAA,CAACY,CAAE,CAAA,OAAO,CAAC,CAAA,CAC/B,EAAG,GAAGC,CAAU,CAAIzK,CAAAA,CAAAA,CAAI,IAAK,EAAA,CAAE,KAAM,CAAA,KAAK,CAC1C0K,CAAAA,CAAAA,CAAUD,CAAW,CAAA,IAAA,CAAK,GAAG,CAAA,CAG/BG,CAAY,CAAA,CAAA,QAAA,EAAWJ,CAAE,CAAA,MAAM,CAAKE,EAAAA,EAAAA,CAAO,CAG/C,CAAA,CAAA,GAAIF,CAAE,CAAA,OAAA,CAAQ,QAAa,GAAA,MAAA,CAAW,CACpC,IAAMma,CAAcna,CAAAA,CAAAA,CAAE,OAAQ,CAAA,QAAA,CAC1B,CAAWA,QAAAA,EAAAA,CAAAA,CAAE,MAAM,CAAA,MAAA,CAAA,CACnB,CAAWA,QAAAA,EAAAA,CAAAA,CAAE,MAAM,CAAA,UAAA,CAAA,CACvBI,CAAa,EAAA,CAAA,EAAA,EAAK+Z,CAAW,CAAA,EAC/B,CAEA,GAAIna,EAAE,OAAQ,CAAA,WAAA,CACZI,CAAa,EAAA,CAAA,UAAA,EAAaJ,CAAE,CAAA,MAAM,CACzBA,cAAAA,CAAAA,CAAAA,KAAAA,GAAAA,CAAAA,CAAE,OAAQ,CAAA,OAAA,GAAY,MAAW,CAAA,CAC1C,IAAIK,CAAAA,CAAeL,CAAE,CAAA,OAAA,CAAQ,OACzBK,CAAAA,CAAAA,GAAiB,IACnBA,CAAAA,CAAAA,CAAe,MACN,CAAA,OAAOA,CAAiB,EAAA,QAAA,GAC7BA,CAAiB,GAAA,MAAA,CACnBA,CAAe,CAAA,MAAA,CACNA,CAAiB,GAAA,MAAA,CAC1BA,CAAe,CAAA,GAAA,CACNA,CAAiB,GAAA,OAAA,CAC1BA,CAAe,CAAA,GAAA,CAEfA,CAAe,CAAA,CAAA,CAAA,EAAIA,CAAY,CAAA,CAAA,CAAA,CAAA,CAGnCD,CAAa,EAAA,CAAA,UAAA,EAAaJ,CAAE,CAAA,MAAM,CAAaK,UAAAA,EAAAA,CAAY,CAC7D,EAAA,CAEA,OAAIL,CAAAA,CAAE,OAAQ,CAAA,MAAA,GAAW,MACnBA,GAAAA,CAAAA,CAAE,OAAQ,CAAA,MAAA,CACZI,CAAa,EAAA,CAAA,yBAAA,EAA4BJ,CAAE,CAAA,MAAM,CAAcA,WAAAA,EAAAA,CAAAA,CAAE,MAAM,CAAA,EAAA,CAAA,CAEvEI,CAAa,EAAA,CAAA,0BAAA,EAA6BJ,CAAE,CAAA,MAAM,CAI/C,CAAA,CAAA,CAAA,CAAA,CAAE,GAAKI,CAAAA,CAAAA,CAAW,QAAU,CAAA,EAAG,CACxC,CACF,CAAA,CAEOE,EAAQ,CAAA,IAAIud,ECtDnB,CAAA,IAAMC,EAAN,CAAA,KAAyD,CAGvD,KAAA,CAAM5e,CAA+D,CAAA,CACnE,IAAM2P,CAAAA,CAAS3P,CAET4P,CAAAA,CAAAA,CADQ,IAAIb,CAAAA,CAAiB,IAAK,CAAA,KAAK,CACrB,CAAA,iBAAA,CAAkB,UAAYY,CAAAA,CAAAA,CAAO,KAAK,CAAA,CAElE,GAAI,CAACA,CAAO,CAAA,QAAA,EAAY,CAACA,CAAAA,CAAO,QAAS,CAAA,MAAA,CACvC,OAAO,CAAE,GAAK,CAAA,EAAA,CAAI,QAAU,CAAA,EAAG,CAAA,CAGjC,IAAMF,CAAAA,CAAY,IAAItP,CAAAA,CACpB,IAAK,CAAA,KAAA,CACL,UACF,CAAA,CACM2P,CAAkB,CAAA,GAClBC,CAAkB,CAAA,EAExB,CAAA,IAAA,IAAWC,CAASL,IAAAA,CAAAA,CAAO,QAAU,CAAA,CACnC,GAAM,CAAE,GAAArZ,CAAAA,CAAAA,CAAK,QAAU2Z,CAAAA,CAAc,CAAIR,CAAAA,CAAAA,CAAU,KAAM,CAAA,CAACO,CAAK,CAAC,CAChEF,CAAAA,CAAAA,CAAM,IAAKxZ,CAAAA,CAAAA,CAAI,IAAK,EAAC,CACrByZ,CAAAA,CAAAA,CAAS,IAAK,CAAA,GAAGE,CAAa,EAChC,CAEA,IAAMC,CAAOJ,CAAAA,CAAAA,CAAM,IAAK,CAAA,IAAI,CAG5B,CAAA,OAAO,CAAE,GAAA,CADQ,CAAGF,EAAAA,CAAS,CAAIM,CAAAA,EAAAA,CAAI,CACb,CAAA,CAAA,QAAA,CAAAH,CAAS,CACnC,CACF,CAAA,CAEOI,EAAQ,CAAA,IAAIyO,ECnCnB,CAAA,IAAMC,EAAN,CAAA,KAAyD,CAEvD,KAAA,CAAM7e,CAAiB,CAAA,CAErB,OAAO,CAAE,GAAK,CAAA,CAAA,aAAA,EADJA,CACsB,CAAA,MAAM,CAAK,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC1D,CACF,CAEOqQ,CAAAA,EAAAA,CAAQ,IAAIwO,EAAAA,CCRnB,IAAMC,EAAAA,CAAN,KAA6D,CAE3D,KAAM9e,CAAAA,CAAAA,CAAiB,CAErB,OAAO,CAAE,GAAA,CAAK,CADAA,iBAAAA,EAAAA,CAAAA,CAC0B,cAAc,CAAA,CAAA,CAAA,CAAK,QAAU,CAAA,EAAG,CAC1E,CACF,CAAA,CAEOuQ,EAAQ,CAAA,IAAIuO,ECLnB,CAAA,IAAMC,EAAN,CAAA,KAA0D,CAExD,KAAA,CAAM/e,CAAiB,CAAA,CAErB,OAAO,CAAE,GAAK,CAAA,CAAA,QAAA,EADJA,CACiB,CAAA,MAAM,CAAkB,cAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAClE,CACF,CAEOyQ,CAAAA,EAAAA,CAAQ,IAAIsO,EAAAA,CCRnB,IAAMC,EAAAA,CAAN,KAA0D,CAExD,KAAMhf,CAAAA,CAAAA,CAAiB,CAErB,OAAO,CAAE,GAAA,CAAK,CADJA,QAAAA,EAAAA,CAAAA,CACiB,MAAM,CAAA,MAAA,CAAA,CAAU,QAAU,CAAA,EAAG,CAC1D,CACF,CAAA,CAEO2Q,EAAQ,CAAA,IAAIqO,ECTnB,CAAA,IAAMC,EAAN,CAAA,KAA6D,CAE3D,KAAA,CAAMjN,CAAkB,CAAA,CACtB,OAAO,CAAE,GAAK,CAAA,kBAAA,CAAoB,QAAU,CAAA,EAAG,CACjD,CACF,CAAA,CAEOnB,EAAQ,CAAA,IAAIoO,ECTnB,CAAA,IAAMC,EAAN,CAAA,KAA2D,CAEzD,KAAA,CAAMlf,CAAiB,CAAA,CACrB,IAAMsJ,CAAAA,CAAItJ,CACV,CAAA,OAAO,CACL,GAAA,CAAK,CAAkBsJ,eAAAA,EAAAA,CAAAA,CAAE,OAAO,CAAA,MAAA,EAASA,CAAE,CAAA,OAAO,CAClD,CAAA,CAAA,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CAEOyH,CAAAA,EAAAA,CAAQ,IAAImO,EAAAA,CCXnB,IAAMC,EAAAA,CAAN,KAA0D,CAExD,KAAMnf,CAAAA,CAAAA,CAAiB,CAGrB,OAAO,CAAE,GAAA,CAAK,CAFHA,WAAAA,EAAAA,CAAAA,CAEoB,OAAO,CAAA,CAAA,CAAA,CAAK,QAAU,CAAA,EAAG,CAC1D,CACF,CAAA,CAEOiR,EAAQ,CAAA,IAAIkO,ECLnB,CAAA,IAAMC,EAAN,CAAA,KAAyD,CAEvD,KAAA,CAAMpf,CAAiB,CAAA,CACrB,IAAMrL,CAAAA,CAAIqL,CACNiG,CAAAA,CAAAA,CAEJ,OAAItR,CAAAA,CAAE,YAAwBuc,YAAAA,CAAAA,CAC5BjL,CAAMtR,CAAAA,CAAAA,CAAE,YAAa,CAAA,QAAA,CACZA,CAAE,CAAA,YAAA,GAAiB,MAC5BsR,CAAAA,CAAAA,CAAM,MACGtR,CAAAA,CAAAA,CAAE,YAAiB,GAAA,MAAA,CAC5BsR,CAAM,CAAA,GAAA,CACGtR,CAAE,CAAA,YAAA,GAAiB,OAC5BsR,CAAAA,CAAAA,CAAM,GAEN,CAAA,OAAOtR,CAAE,CAAA,YAAA,EAAiB,UAC1BA,CAAE,CAAA,YAAA,GAAiB,MAEnBsR,CAAAA,CAAAA,CAAM,CAAItR,CAAAA,EAAAA,CAAAA,CAAE,YAAY,CAAA,CAAA,CAAA,CAExBsR,CAAM,CAAA,MAAA,CAAOtR,CAAE,CAAA,YAAY,CAGtB,CAAA,CACL,GAAK,CAAA,CAAA,QAAA,EAAWA,CAAE,CAAA,MAAM,CAAasR,UAAAA,EAAAA,CAAG,CACxC,CAAA,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CAEOmL,CAAAA,EAAAA,CAAQ,IAAIgO,EAAAA,CC/BnB,IAAMC,EAAAA,CAAN,KAAyD,CAEvD,KAAMrf,CAAAA,CAAAA,CAAiB,CAErB,OAAO,CAAE,GAAA,CAAK,CADJA,QAAAA,EAAAA,CAAAA,CACiB,MAAM,CAAA,UAAA,CAAA,CAAc,QAAU,CAAA,EAAG,CAC9D,CACF,CAAA,CAEOsR,EAAQ,CAAA,IAAI+N,ECQnB,CAAA,IAAMC,EAAN,CAAA,KAAyD,CAGvD,KAAA,CAAMtf,CAA+D,CAAA,CACnE,IAAMwR,CAAAA,CAAUxR,CAChB,CAAA,GAAIwR,CAAQ,CAAA,UAAA,CACV,OAAO,CAAE,GAAKA,CAAAA,CAAAA,CAAQ,MAAkB,CAAA,QAAA,CAAU,EAAG,CAIvD,CAAA,IAAM1J,CADQ,CAAA,IAAIiH,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CACpB,kBACvB,CAAA,UAAA,CACAhJ,CAAeyL,CAAAA,CAAAA,CAAQ,MAAM,CAC/B,CAEMC,CAAAA,CAAAA,CAAKD,CAAQ,CAAA,QAAA,CAAS,WAAY,EAAA,CAExC,GAAIC,CAAAA,GAAO,MAAQ,CAAA,CACjB,IAAMC,CAAAA,CAAMF,CAAQ,CAAA,MAAA,EAAU,CAC9B,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG1J,EAAAA,CAAU,CAAS4J,MAAAA,EAAAA,CAAG,CAAK,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC3D,CAAA,KAAA,GAAWD,CAAO,GAAA,SAAA,CAAW,CAC3B,IAAMC,CAAMF,CAAAA,CAAAA,CAAQ,MAAU,EAAA,GAAA,CAC9B,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG1J,CAAU,CAAa4J,UAAAA,EAAAA,CAAG,CAAK,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC/D,CAAA,KAAO,CACLD,GAAAA,CAAAA,GAAO,MACPA,EAAAA,CAAAA,GAAO,UACPA,EAAAA,CAAAA,GAAO,YACPA,EAAAA,CAAAA,GAAO,UAEP,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAS,KAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC5C,CAAA,GAAI2J,CAAO,GAAA,MAAA,CAEhB,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,aAAA,CAAA,CAAiB,QAAU,CAAA,EAAG,CAAA,CACpD,GAAI2J,CAAAA,GAAO,MAChB,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAiB,aAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CACpD,CAAA,GAAI2J,CAAO,GAAA,QAAA,CAChB,OAAID,CAAAA,CAAQ,aAEH,CAAA,CACL,GAAK,CAAA,CAAA,EAAG1J,CAAU,CAAA,4CAAA,CAAA,CAClB,QAAU,CAAA,EACZ,CAAA,CAEK,CAAE,GAAA,CAAK,CAAGA,EAAAA,CAAU,CAAe,WAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAClD,CAAA,GAAI2J,CAAO,GAAA,SAAA,CAChB,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,UAAA,CAAA,CAAc,QAAU,CAAA,EAAG,CAAA,CACjD,GAAI2J,CAAAA,GAAO,UAChB,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAc,UAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CACjD,CAAA,GAAI2J,CAAO,GAAA,WAAA,CAChB,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,UAAA,CAAA,CAAc,QAAU,CAAA,EAAG,CAAA,CACjD,GAAI2J,CAAAA,GAAO,OAAWA,EAAAA,CAAAA,GAAO,MAClC,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAiB,aAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAAA,CACpD,GAAI2J,CAAAA,GAAO,QAChB,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAkB,cAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CACrD,CAAA,GAAI2J,CAAO,GAAA,SAAA,EAAaA,CAAO,GAAA,SAAA,CAAW,CAC/C,IAAME,CAAYH,CAAAA,CAAAA,CAAQ,SAAa,EAAA,EAAA,CACjCI,CAAQJ,CAAAA,CAAAA,CAAQ,KAAS,EAAA,CAAA,CAC/B,OAAO,CACL,GAAK,CAAA,CAAA,EAAG1J,CAAU,CAAA,QAAA,EAAW6J,CAAS,CAAA,EAAA,EAAKC,CAAK,CAAA,CAAA,CAAA,CAChD,QAAU,CAAA,EACZ,CACF,CAAO,KAAA,CAAA,GAAIH,CAAO,GAAA,MAAA,CAEhB,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,KAAA,CAAA,CAAS,QAAU,CAAA,EAAG,CAAA,CAC5C,GAAI2J,CAAAA,GAAO,MAChB,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAc,UAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CACjD,CAAA,GAAI2J,CAAO,GAAA,MAAA,CAEhB,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,YAAA,CAAA,CAAgB,QAAU,CAAA,EAAG,CAAA,CACnD,GAAI2J,CAAAA,GAAO,UAAcA,EAAAA,CAAAA,GAAO,WAAa,CAAA,CAClD,IAAM8N,CAAAA,CAAS/N,CAAQ,CAAA,YAAA,CAAe,iBAAoB,CAAA,EAAA,CACpDK,CACJ,CAAA,OAAOL,CAAQ,CAAA,SAAA,EAAc,QAAW,CAAA,CAAA,CAAA,EAAIA,CAAQ,CAAA,SAAS,CAAM,CAAA,CAAA,CAAA,EAAA,CACrE,OAAO,CACL,GAAK,CAAA,CAAA,EAAG1J,CAAU,CAAA,UAAA,EAAa+J,CAAC,CAAA,EAAG0N,CAAM,CAAA,CAAA,CAAG,OAAQ,EAAA,CACpD,QAAU,CAAA,EACZ,CACF,CAAO,KAAA,CAAA,GAAI9N,CAAO,GAAA,SAAA,EAAaA,CAAO,GAAA,MAAA,CAEpC,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,UAAA,CAAA,CAAc,QAAU,CAAA,EAAG,CAAA,CACjD,GACL2J,CAAAA,GAAO,OACPA,EAAAA,CAAAA,GAAO,QACPA,EAAAA,CAAAA,GAAO,WACPA,EAAAA,CAAAA,GAAO,MACPA,EAAAA,CAAAA,GAAO,UACPA,EAAAA,CAAAA,GAAO,YACPA,EAAAA,CAAAA,GAAO,UAEP,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAS,KAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC5C,CAAA,GAAI2J,CAAO,GAAA,MAAA,EAAUA,CAAO,GAAA,OAAA,CAEjC,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,KAAA,CAAA,CAAS,QAAU,CAAA,EAAG,CAAA,CAC5C,GAAI2J,CAAAA,GAAO,MAAQ,CAAA,CACxB,GAAID,CAAAA,CAAQ,UAAcA,EAAAA,CAAAA,CAAQ,UAAW,CAAA,MAAA,CAAS,CAAG,CAAA,CACvD,IAAMrC,CAAAA,CAASqC,CAAQ,CAAA,UAAA,CAAW,GAAKnL,CAAAA,CAAAA,EAAM,CAAIA,CAAAA,EAAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,IAAK,CAAA,IAAI,CAChE,CAAA,OAAO,CACL,GAAA,CAAK,CAAGyB,EAAAA,CAAU,CAAyBA,sBAAAA,EAAAA,CAAU,CAAQqH,KAAAA,EAAAA,CAAM,CACnE,EAAA,CAAA,CAAA,QAAA,CAAU,EACZ,CACF,CACA,OAAO,CAAE,GAAK,CAAA,CAAA,EAAGrH,CAAU,CAAA,cAAA,CAAA,CAAkB,QAAU,CAAA,EAAG,CAC5D,CAAO,KAAA,CAAA,GAAI2J,CAAO,GAAA,SAAA,EAAaA,CAAO,GAAA,KAAA,CACpC,OAAID,CAAAA,CAAQ,aAEH,CAAA,CACL,GAAK,CAAA,CAAA,EAAG1J,CAAU,CAAA,4CAAA,CAAA,CAClB,QAAU,CAAA,EACZ,CAAA,CAEK,CAAE,GAAA,CAAK,CAAGA,EAAAA,CAAU,CAAe,WAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAClD,CAAA,GACL2J,IAAO,UACPA,EAAAA,CAAAA,GAAO,OACPA,EAAAA,CAAAA,GAAO,YACPA,EAAAA,CAAAA,GAAO,SACPA,EAAAA,CAAAA,GAAO,YAGP,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAiB,aAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAG3D,CAAA,CAAA,CAAA,CAAA,OAAO,CACL,GAAA,CAAK,CAAGA,EAAAA,CAAU,CAAI2J,CAAAA,EAAAA,CAAE,CAAID,CAAAA,EAAAA,CAAAA,CAAQ,MAAS,CAAA,CAAA,CAAA,EAAIA,CAAQ,CAAA,MAAM,CAAM,CAAA,CAAA,CAAA,EAAE,CACvE,CAAA,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CAEOM,CAAAA,EAAAA,CAAQ,IAAIwN,EAAAA,CCjJnB,IAAME,EAAAA,CAAN,KAA8D,CAE5D,KAAMxN,CAAAA,CAAAA,CAAkB,CACtB,OAAO,CAAE,GAAA,CAAK,EAAI,CAAA,QAAA,CAAU,EAAG,CACjC,CACF,CAEOC,CAAAA,EAAAA,CAAQ,IAAIuN,EAAAA,CCNnB,IAAMC,EAAAA,CAAN,KAAyD,CAGvD,KAAMzf,CAAAA,CAAAA,CAA+D,CACnE,IAAMmS,CAAQnS,CAAAA,CAAAA,CAERoS,CAAQ,CAAA,IAAIrD,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAE7C,GAAIoD,CAAAA,CAAM,cAAmB,GAAA,aAAA,CAAe,CAC1C,GAAIA,CAAM,CAAA,OAAA,EAAWA,CAAM,CAAA,OAAA,CAAQ,MAAQ,CAAA,CACzC,IAAME,CAAAA,CAAYF,CAAM,CAAA,cAAA,CACpB,CAAeA,YAAAA,EAAAA,CAAAA,CAAM,cAAc,CAAA,EAAA,CAAA,CACnC,EACEG,CAAAA,CAAAA,CAAAA,CAAQH,CAAM,CAAA,OAAA,EAAW,EAAC,EAC7B,GAAK3W,CAAAA,CAAAA,EAAM4W,CAAM,CAAA,kBAAA,CAAmB,UAAYrM,CAAAA,CAAAA,CAAevK,CAAC,CAAC,CAAC,CAAA,CAClE,IAAK,CAAA,IAAI,CACZ,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG6W,EAAAA,CAAS,CAAgBC,aAAAA,EAAAA,CAAI,CAAK,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAClE,CACA,OAAO,CAAE,GAAA,CAAK,aAAe,CAAA,QAAA,CAAU,EAAG,CAC5C,CAEA,GAAIH,CAAAA,CAAM,cAAmB,GAAA,QAAA,CAAU,CACrC,GAAIA,CAAM,CAAA,OAAA,EAAWA,CAAM,CAAA,OAAA,CAAQ,MAAS,CAAA,CAAA,CAAG,CAC7C,IAAMI,CAAUJ,CAAAA,CAAAA,CAAM,OAAW,EAAA,EAC3BK,CAAAA,CAAAA,CAAaL,CAAM,CAAA,cAAA,CACrB,CAAeA,YAAAA,EAAAA,CAAAA,CAAM,cAAc,CAAA,EAAA,CAAA,CACnC,EACEG,CAAAA,CAAAA,CAAOC,CACV,CAAA,GAAA,CAAK/W,CAAM4W,EAAAA,CAAAA,CAAM,kBAAmB,CAAA,UAAA,CAAYrM,CAAevK,CAAAA,CAAC,CAAC,CAAC,CAClE,CAAA,IAAA,CAAK,IAAI,CAAA,CAEZ,OAAK2W,CAAAA,CAAM,cAGJ,CAAA,CAAE,GAAK,CAAA,CAAA,EAAGK,CAAU,CAAA,QAAA,EAAWF,CAAI,CAAA,CAAA,CAAA,CAAK,QAAU,CAAA,EAAG,CAAA,CAFnD,CAAE,GAAA,CAAK,QAAU,CAAA,QAAA,CAAU,EAAG,CAGzC,CACA,OAAO,CAAE,GAAK,CAAA,QAAA,CAAU,QAAU,CAAA,EAAG,CACvC,CAEA,GAAIH,CAAM,CAAA,cAAA,GAAmB,UAC3B,CAAA,OAAO,CAAE,GAAA,CAAK,UAAY,CAAA,QAAA,CAAU,EAAG,CAGzC,CAAA,GAAIA,CAAM,CAAA,cAAA,GAAmB,MAC3B,CAAA,OAAO,CAAE,GAAA,CAAK,MAAQ,CAAA,QAAA,CAAU,EAAG,CAGrC,CAAA,GAAIA,CAAM,CAAA,cAAA,GAAmB,SAAW,CAAA,CACtC,GAAIA,CAAAA,CAAM,YAAiB,GAAA,MAAA,CAAW,CACpC,IAAMlM,CAAMkM,CAAAA,CAAAA,CAAM,YAClB,CAAA,OAAIlM,CAAeiL,YAAAA,CAAAA,CACV,CAAE,GAAA,CAAK,WAAWjL,CAAI,CAAA,QAAQ,CAAI,CAAA,CAAA,QAAA,CAAU,EAAG,CAEpDA,CAAAA,CAAAA,GAAQ,MAAUA,EAAAA,CAAAA,GAAQ,IACrB,CAAA,CAAE,GAAK,CAAA,cAAA,CAAgB,QAAU,CAAA,EAAG,CAAA,CAGzCA,CAAQ,GAAA,MAAA,CACH,CAAE,GAAA,CAAK,WAAa,CAAA,QAAA,CAAU,EAAG,CAEtCA,CAAAA,CAAAA,GAAQ,OACH,CAAA,CAAE,GAAK,CAAA,WAAA,CAAa,QAAU,CAAA,EAAG,CAAA,CAEtC,OAAOA,CAAAA,EAAQ,QACV,CAAA,CAAE,GAAK,CAAA,CAAA,SAAA,EAAYA,CAAG,CAAA,CAAA,CAAA,CAAK,QAAU,CAAA,EAAG,CAAA,CAE1C,CAAE,GAAA,CAAK,CAAWA,QAAAA,EAAAA,CAAG,CAAI,CAAA,CAAA,QAAA,CAAU,EAAG,CAC/C,CACA,OAAO,CAAE,GAAK,CAAA,cAAA,CAAgB,QAAU,CAAA,EAAG,CAC7C,CAEA,GAAIkM,CAAM,CAAA,cAAA,GAAmB,aAAe,CAAA,CAC1C,GAAI,CAACA,CAAM,CAAA,OAAA,EAAW,CAACA,CAAAA,CAAM,OAAQ,CAAA,MAAA,CACnC,OAAO,CAAE,GAAK,CAAA,EAAA,CAAI,QAAU,CAAA,EAAG,CAAA,CAEjC,IAAMG,CAAAA,CAAOH,CAAM,CAAA,OAAA,CAChB,GAAK3W,CAAAA,CAAAA,EAAM4W,CAAM,CAAA,kBAAA,CAAmB,UAAYrM,CAAAA,CAAAA,CAAevK,CAAC,CAAC,CAAC,CAAA,CAClE,IAAK,CAAA,IAAI,CACZ,CAAA,GAAI,CAAC2W,CAAAA,CAAM,UACT,CAAA,OAAO,CAAE,GAAA,CAAK,EAAI,CAAA,QAAA,CAAU,EAAG,CAEjC,CAAA,IAAMM,CAAWL,CAAAA,CAAAA,CAAM,iBACrB,CAAA,UAAA,CACAD,CAAM,CAAA,UAAA,CAAW,KACnB,CAAA,CACMO,CAAUP,CAAAA,CAAAA,CAAM,UAAW,CAAA,OAAA,CAC9B,GAAK3W,CAAAA,CAAAA,EAAM4W,CAAM,CAAA,kBAAA,CAAmB,UAAYrM,CAAAA,CAAAA,CAAevK,CAAC,CAAC,CAAC,CAAA,CAClE,IAAK,CAAA,IAAI,CAIRlF,CAAAA,CAAAA,CAAM,CAHQ6b,EAAAA,CAAAA,CAAM,cACpB,CAAA,CAAA,YAAA,EAAeA,CAAM,CAAA,cAAc,CACnC,EAAA,CAAA,CAAA,EACkB,CAAgBG,aAAAA,EAAAA,CAAI,CAAgBG,aAAAA,EAAAA,CAAQ,CAAIC,CAAAA,EAAAA,CAAO,CAC7E,CAAA,CAAA,CAAA,OAAIP,CAAM,CAAA,QAAA,GACR7b,CAAO,EAAA,CAAA,WAAA,EAAc6b,CAAM,CAAA,QAAQ,CAG9B,CAAA,CAAA,CAAA,CAAE,GAAA7b,CAAAA,CAAAA,CAAK,QAAU,CAAA,EAAG,CAC7B,CAEA,OAAO,CAAE,GAAA,CAAK,EAAI,CAAA,QAAA,CAAU,EAAG,CACjC,CACF,CAEOqc,CAAAA,EAAAA,CAAQ,IAAI8M,EAAAA,CCxGnB,IAAMC,EAAAA,CAAN,KAA0D,CAGxD,KAAM1f,CAAAA,CAAAA,CAA+D,CACnE,IAAM6S,CAAS7S,CAAAA,CAAAA,CAGT4P,CADQ,CAAA,IAAIb,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CACrB,iBAAkB,CAAA,UAAA,CAAY8D,CAAO,CAAA,KAAK,CAElE,CAAA,GAAI,CAACA,CAAAA,CAAO,QAAY,EAAA,CAACA,CAAO,CAAA,QAAA,CAAS,MACvC,CAAA,OAAO,CAAE,GAAA,CAAK,CAAGjD,EAAAA,CAAS,CAAO,GAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAGhD,CAAA,IAAMH,CAAY,CAAA,IAAItP,CACpB,CAAA,IAAA,CAAK,KACL,CAAA,UACF,CAEM2P,CAAAA,CAAAA,CAAkB,EAAC,CACnBC,CAAkB,CAAA,EAExB,CAAA,IAAA,IAAWC,CAAS6C,IAAAA,CAAAA,CAAO,QAAU,CAAA,CACnC,GAAM,CAAE,GAAAvc,CAAAA,CAAAA,CAAK,QAAU2Z,CAAAA,CAAc,CAAIR,CAAAA,CAAAA,CAAU,KAAM,CAAA,CAACO,CAAK,CAAC,CAAA,CAEhE,GAAIA,CAAAA,CAAM,MAAW,GAAA,YAAA,CAAc,CACjC,IAAM8C,CAAOhD,CAAAA,CAAAA,CAAM,GAAI,EAAA,EAAK,EACtBiD,CAAAA,CAAAA,CAAsBzc,CAG5B,CAAA,GACE,WAAY,CAAA,IAAA,CAAKyc,CAAmB,CAAA,EACpC,OAAQ,CAAA,IAAA,CAAKA,CAAmB,CAAA,EAChC,UAAW,CAAA,IAAA,CAAKA,CAAmB,CAAA,CACnC,CACA,IAAIC,CAAW,CAAA,CAAA,EAAGF,CAAI,CAAA,CAAA,EAAIC,CAAmB,CAAA,CAAA,CAAG,IAAK,EAAA,CACrDC,CAAWA,CAAAA,CAAAA,CAAS,OAClB,CAAA,gDAAA,CACA,aACF,CAAA,CAEAA,CAAWA,CAAAA,CAAAA,CAAS,OAClB,CAAA,oDAAA,CACA,OACF,CAAA,CACAlD,CAAM,CAAA,IAAA,CAAKkD,CAAQ,CAAA,CACnBjD,CAAS,CAAA,IAAA,CAAK,GAAGE,CAAa,CAC9B,CAAA,QACF,CAEAH,CAAAA,CAAM,IAAKgD,CAAAA,CAAI,CACfhD,CAAAA,CAAAA,CAAM,IAAKiD,CAAAA,CAAmB,CAC9BhD,CAAAA,CAAAA,CAAS,IAAK,CAAA,GAAGE,CAAa,CAAA,CAC9B,QACF,CAEAH,CAAM,CAAA,IAAA,CAAKxZ,CAAG,CAAA,CACdyZ,CAAS,CAAA,IAAA,CAAK,GAAGE,CAAa,EAChC,CAEA,IAAW3P,IAAAA,CAAAA,IAAcuS,CAAO,CAAA,gBAAA,CAAkB,CAChD,GAAM,CAAE,GAAA,CAAAvc,CAAK,CAAA,QAAA,CAAU2c,CAAmB,CAAA,CAAIxD,CAAU,CAAA,KAAA,CAAM,CAC5DnP,CACF,CAAC,CAAA,CAEDwP,CAAM,CAAA,IAAA,CAAKxZ,CAAG,CAAA,CACdyZ,CAAS,CAAA,IAAA,CAAK,GAAGkD,CAAkB,EACrC,CAEA,IAAMC,CAAAA,CAAapD,CAAM,CAAA,IAAA,CAAK,IAAI,CAAA,CAGlC,OAAO,CAAE,GADQ,CAAA,CAAA,EAAGF,CAAS,CAAA,EAAA,EAAKsD,CAAU,CAAA,CAAA,CAAA,CACpB,SAAAnD,CAAS,CACnC,CACF,CAAA,CAEOoD,EAAQ,CAAA,IAAIuM,EC3EnB,CAAA,IAAMC,EAAN,CAAA,KAAqD,CAGnD,KAAA,CAAM3f,CAA+D,CAAA,CACnE,IAAMqT,CAAAA,CAAarT,CAEnB,CAAA,OACEqT,CAAW,CAAA,UAAA,EACX,OAAOA,CAAAA,CAAW,QAAS,CAAA,KAAA,EAAU,QAE9B,CAAA,CACL,GAAKA,CAAAA,CAAAA,CAAW,QAAS,CAAA,KAAA,CACzB,QAAU,CAAA,EACZ,CAAA,CAOK,CACL,GAAA,CALqB,IAAItE,CAAAA,CACzB,IAAK,CAAA,KACP,CAAE,CAAA,yBAAA,CAA0B,UAAYsE,CAAAA,CAAAA,CAAW,QAAoB,CAAA,CAIrE,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEOC,EAAQ,CAAA,IAAIqM,EC9BnB,CAAA,IAAMC,EAAN,CAAA,KAAuD,CAGrD,KAAA,CAAM5N,CAAgE,CAAA,CAEpE,OAAO,CACL,GAAK,CAAA,EAAA,CACL,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEOwB,EAAQ,CAAA,IAAIoM,ECJnB,CAAA,IAAMC,EAAN,CAAA,KAAyD,CAGvD,KAAA,CAAM7f,CAA+D,CAAA,CAOnE,OAAO,CACL,GAAK,CAAA,CAAA,CAAA,EAPgBA,CACQ,CAAA,OAAA,CAC5B,GAAK8F,CAAAA,CAAAA,EACJ,IAAIiJ,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CAAmB,UAAYjJ,CAAAA,CAAG,CACrE,CAAA,CACC,IAAK,CAAA,IAAI,CAEM,CAAA,CAAA,CAAA,CAChB,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEO4N,EAAQ,CAAA,IAAImM,ECnBnB,CAAA,IAAMC,EAAN,CAAA,KAAwD,CAEtD,KAAA,CAAM9f,CAAiB,CAAA,CACrB,IAAMyR,CAAAA,CAAKzR,CAKX,CAAA,OAAO,CAAE,GAAA,CAAK,CAJA,EAAA,IAAI+O,EAAiB,IAAK,CAAA,KAAK,CACtB,CAAA,iBAAA,CAAkB,UAAY0C,CAAAA,CAAAA,CAAG,KAAK,CAGpC,CAAwB,oBAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAChE,CACF,CAEOoC,CAAAA,EAAAA,CAAQ,IAAIiM,EAAAA,CClBnB,IAAMC,EAAAA,CAAN,KAA8D,CAE5D,KAAM/f,CAAAA,CAAAA,CAAiB,CAErB,OAAO,CACL,GAAA,CAAK,CAFKA,kDAAAA,EAAAA,CAAAA,CAEoD,aAAa,CAAA,CAAA,CAAA,CAC3E,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CACO+T,EAAQ,CAAA,IAAIgM,ECPnB,CAAA,IAAMC,EAAN,CAAA,KAAmD,CAGjD,KAAA,CAAMhgB,CAA+D,CAAA,CACnE,IAAMwP,CAAAA,CAAWxP,CAEjB,CAAA,GAAI,OAAOwP,CAAAA,CAAS,KAAU,EAAA,QAAA,CAAU,CACtC,IAAMyE,CAAmB,CAAA,IAAIlF,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAExD,OAAIS,CAAAA,CAAS,KAASA,EAAAA,CAAAA,CAAS,KAAM,CAAA,MAAA,CAAS,CAMrC,CAAA,CACL,GAAK,CAAA,CAAA,EANUyE,CAAiB,CAAA,iBAAA,CAChC,UACAzE,CAAAA,CAAAA,CAAS,KACX,CAGkB,CAAKA,EAAAA,EAAAA,CAAAA,CAAS,KAAK,CAAA,CAAA,CAAA,CACnC,QAAU,CAAA,EACZ,CAAA,CAQK,CAAE,GAAA,CALQyE,CAAiB,CAAA,iBAAA,CAChC,UACAzE,CAAAA,CAAAA,CAAS,KACX,CAAA,CAEwB,QAAU,CAAA,EAAG,CACvC,CAEA,IAAM0E,CAAgB,CAAA,KAAA,CAAM,OAAQ1E,CAAAA,CAAAA,CAAS,KAAK,CAAA,CAC9CA,CAAS,CAAA,KAAA,CACT,CAACA,CAAAA,CAAS,KAAK,CAAA,CAMb1Z,CAJY,CAAA,IAAIqK,CACpB,CAAA,IAAA,CAAK,KACL,CAAA,UACF,CACyB,CAAA,KAAA,CAAM+T,CAAa,CAAA,CAEtCC,CACJ3E,CAAAA,CAAAA,CAAS,KAASA,EAAAA,CAAAA,CAAS,KAAM,CAAA,MAAA,CAAS,CAAKA,EAAAA,EAAAA,CAAAA,CAAS,KAAK,CAAA,CAAA,CAAA,CAAM,EAErE,CAAA,OAAO,CACL,GAAA,CAAK,CAAI1Z,CAAAA,EAAAA,CAAAA,CAAO,GAAG,CAAA,CAAA,EAAIqe,CAAQ,CAAA,CAAA,CAC/B,QAAUre,CAAAA,CAAAA,CAAO,QACnB,CACF,CACF,CAAA,CAEOse,EAAQ,CAAA,IAAI4L,EClDnB,CAAA,IAAMC,EAAN,CAAA,KAAsD,CAGpD,KAAA,CAAMjgB,CAA+D,CAAA,CACnE,IAAMsU,CAAAA,CAActU,CACpB,CAAA,OAAIsU,CAAY,CAAA,UAAA,CACP,CACL,GAAA,CAAKA,CAAY,CAAA,MAAA,CACjB,QAAU,CAAA,EACZ,CAAA,CAQK,CACL,GAAA,CANgB,IAAIvF,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CACjD,UACAuF,CAAAA,CAAAA,CAAY,MACd,CAAA,CAIE,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEOC,EAAQ,CAAA,IAAI0L,ECxBnB,CAAA,IAAMC,EAAN,CAAA,KAAqD,CAGnD,KAAA,CAAMlgB,CAA+D,CAAA,CACnE,IAAMyU,CAAAA,CAAazU,CACnB,CAAA,GAAIyU,CAAW,CAAA,UAAA,CACb,OAAO,CACL,GAAKA,CAAAA,CAAAA,CAAW,MAChB,CAAA,QAAA,CAAUA,CAAW,CAAA,KACvB,CAGF,CAAA,IAAMC,CAAMD,CAAAA,CAAAA,CAAW,cACnBne,CAAAA,CAAAA,CAAM,EACNyZ,CAAAA,CAAAA,CAAkB,EAAC,CAUvB,GAPE,EAAE0E,CAAW,CAAA,KAAA,YAAiBpT,CAC9B,CAAA,EAAA,CAAC,KAAM,CAAA,OAAA,CAAQoT,CAAW,CAAA,KAAK,CAE/Bne,GAAAA,CAAAA,CAAM,CAAG,EAAA,IAAIyY,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBAAmB,CAAA,UAAA,CAAY0F,CAAW,CAAA,MAAM,CAAC,CAAA,CAAA,EAAIA,CAAW,CAAA,QAAQ,CAAKC,EAAAA,EAAAA,CAAG,CAC1H3E,CAAAA,CAAAA,CAAAA,CAAW,CAAC0E,CAAW,CAAA,KAAK,CAG1B,CAAA,CAAA,KAAA,CAAM,OAAQA,CAAAA,CAAAA,CAAW,KAAK,CAAA,CAAG,CACnC,IAAME,CAAeF,CAAAA,CAAAA,CAAW,KAC7B,CAAA,GAAA,CAAI,CAACnF,CAAAA,CAAG/P,CAAM,GAAA,CAAA,CAAA,EAAImV,CAAMnV,CAAAA,CAAC,CAAE,CAAA,CAAA,CAC3B,IAAK,CAAA,IAAI,CAEZjJ,CAAAA,CAAAA,CAAM,CAAG,EAAA,IAAIyY,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBAAmB,CAAA,UAAA,CAAY0F,CAAW,CAAA,MAAM,CAAC,CAAA,CAAA,EAAIA,CAAW,CAAA,QAAQ,CAAKE,EAAAA,EAAAA,CAAY,CACnI5E,CAAAA,CAAAA,CAAAA,CAAAA,CAAW0E,CAAW,CAAA,MACxB,CAEA,OAAIA,CAAW,CAAA,SAAA,GACbne,CAAM,CAAA,CAAA,KAAA,EAAQA,CAAG,CAAA,CAAA,CAAA,CAAA,CAGZ,CAAE,GAAA,CAAKA,CAAI,CAAA,IAAA,EAAQ,CAAA,QAAA,CAAAyZ,CAAS,CACrC,CACF,CAAA,CAEO6E,EAAQ,CAAA,IAAIsL,ECtCnB,CAAA,IAAMC,EAAN,CAAA,KAA0D,CAExD,KAAA,CAAMngB,CAAiB,CAAA,CACrB,IAAM8U,CAAAA,CAAK9U,CAEL4T,CAAAA,CAAAA,CADQ,IAAI7E,CAAAA,CAAiB,IAAK,CAAA,KAAK,CACtB,CAAA,iBAAA,CAAkB,UAAY+F,CAAAA,CAAAA,CAAG,KAAK,CAAA,CACvDxC,CAAOwC,CAAAA,CAAAA,CAAG,OAAQ,CAAA,GAAA,CAAKtZ,CAAM,EAAA,CAAA,CAAA,EAAIA,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,IAAA,CAAK,IAAI,CAAA,CAEtD,OAAO,CACL,GAAK,CAAA,CAAA,EAFQsZ,CAAG,CAAA,MAAA,CAAS,SAAY,CAAA,EAEvB,CAAIA,CAAAA,EAAAA,CAAAA,CAAG,SAAS,CAAA,KAAA,EAAQlB,CAAQ,CAAA,EAAA,EAAKtB,CAAI,CAAA,CAAA,CAAA,CACvD,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEOyC,EAAQ,CAAA,IAAIoL,ECfnB,CAAA,IAAMC,EAAN,CAAA,KAAwD,CAEtD,KAAMpgB,CAAAA,CAAAA,CAAiB,CAErB,OAAO,CACL,GAAA,CAAK,CAFIA,CAAAA,EAAAA,CAAAA,CAEG,SAAS,CAAA,CAAA,CAAA,CACrB,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEOkV,EAAQ,CAAA,IAAIkL,ECbnB,CAAA,IAAMC,EAAN,CAAA,KAAqD,CAGnD,KAAA,CAAMrgB,CAA+D,CAAA,CACnE,IAAMoV,CAAAA,CAAapV,CACnB,CAAA,GAAIoV,CAAW,CAAA,UAAA,CACb,OAAO,CACL,GAAKA,CAAAA,CAAAA,CAAW,QAAS,CAAA,KAAA,CACzB,QAAU,CAAA,EACZ,CAAA,CAGF,IAAMnB,CAAAA,CAAmB,IAAIlF,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAClDsG,CAAAA,CAAAA,CAAiBpB,CAAiB,CAAA,yBAAA,CACtC,UACAmB,CAAAA,CAAAA,CAAW,QACb,CAAA,CAEA,GAAI,CAACA,CAAW,CAAA,OAAA,CAAQ,MACtB,CAAA,OAAO,CACL,GAAA,CAAKC,CACL,CAAA,QAAA,CAAU,EACZ,CAGF,CAAA,IAAMC,CAAcF,CAAAA,CAAAA,CAAW,OAAQ,CAAA,CAAC,CAClC/Z,CAAAA,CAAAA,CAAU,MAAO,CAAA,IAAA,CAAKia,CAAW,CAAA,CACvC,GAAI,CAACja,CAAQ,CAAA,MAAA,CACX,OAAO,CACL,GAAKga,CAAAA,CAAAA,CACL,QAAU,CAAA,EACZ,CAAA,CAGF,IAAME,CAAAA,CAAmBla,CACtB,CAAA,GAAA,CAAKE,CAAW0Y,EAAAA,CAAAA,CAAiB,kBAAmB,CAAA,UAAA,CAAY1Y,CAAM,CAAC,CACvE,CAAA,IAAA,CAAK,IAAI,CAAA,CAENia,CAAmB,CAAA,EACnBC,CAAAA,CAAAA,CAA0B,EAAC,CAC7BC,CAAaN,CAAAA,CAAAA,CAAW,cAE5B,CAAA,IAAA,IAAWvZ,CAAUuZ,IAAAA,CAAAA,CAAW,OAAS,CAAA,CACvC,IAAMO,CAAAA,CAAeta,CAAQ,CAAA,GAAA,CAAKE,CAAWM,EAAAA,CAAAA,CAAON,CAAM,CAAC,EAErDoZ,CAAyB,CAAA,EAC/B,CAAA,IAAA,IAAW3hB,CAAS2iB,IAAAA,CAAAA,CACd3iB,CAAiBke,YAAAA,CAAAA,CACnByD,CAAa,CAAA,IAAA,CAAK3hB,CAAM,CAAA,QAAQ,CAEhCwiB,EAAAA,CAAAA,CAAU,IAAKxiB,CAAAA,CAAK,CACpB2hB,CAAAA,CAAAA,CAAa,IAAK,CAAA,CAAA,CAAA,EAAIe,CAAY,EAAA,CAAA,CAAE,CAIxCD,CAAAA,CAAAA,CAAAA,CAAc,IAAK,CAAA,CAAA,CAAA,EAAId,CAAa,CAAA,IAAA,CAAK,IAAI,CAAC,CAAG,CAAA,CAAA,EACnD,CAKA,IAAIre,CACJ,CAAA,GAAI8e,CAAW,CAAA,OAAA,CAAQ,MAAW,GAAA,CAAA,CAChC9e,CAAM,CAAA,CAAA,EAAG+e,CAAc,CAAA,EAAA,EAAKE,CAAgB,CAAA,SAAA,EAAYE,CAAc,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,KACnE,CAELL,CAAAA,CAAW,OAAU,CAAA,QAAA,CACrBM,CAAaN,CAAAA,CAAAA,CAAW,cACxB,CAAA,IAAMkL,CAA6B,CAAA,EAEnC,CAAA,IAAA,IAAWzkB,CAAUuZ,IAAAA,CAAAA,CAAW,OAAS,CAAA,CACvC,IAAMO,CAAAA,CAAeta,CAAQ,CAAA,GAAA,CAAKE,CAAWM,EAAAA,CAAAA,CAAON,CAAM,CAAC,CACrDoZ,CAAAA,CAAAA,CAAyB,EAAC,CAEhC,IAAW3hB,IAAAA,CAAAA,IAAS2iB,CACd3iB,CAAAA,CAAAA,YAAiBke,CACnByD,CAAAA,CAAAA,CAAa,IAAK3hB,CAAAA,CAAAA,CAAM,QAAQ,CAAA,CAEhC2hB,CAAa,CAAA,IAAA,CAAK,CAAIe,CAAAA,EAAAA,CAAAA,EAAY,CAAE,CAAA,CAAA,CAIxC4K,CAAiB,CAAA,IAAA,CACf,CAAQjL,KAAAA,EAAAA,CAAc,CAAKE,EAAAA,EAAAA,CAAgB,CAAaZ,UAAAA,EAAAA,CAAAA,CAAa,IAAK,CAAA,IAAI,CAAC,CAAA,CAAA,CACjF,EACF,CAEAre,CAAM,CAAA,CAAA,IAAA,EAAOgqB,CAAiB,CAAA,IAAA,CAAK,GAAG,CAAC,CACzC,mBAAA,EAAA,CAEA,OAAO,CACL,GAAAhqB,CAAAA,CAAAA,CACA,QAAUkf,CAAAA,CACZ,CACF,CACF,CAEOQ,CAAAA,EAAAA,CAAQ,IAAIqK,EAAAA,CClGnB,IAAME,EAAAA,CAAN,KAAmD,CAGjD,KAAMvgB,CAAAA,CAAAA,CAA+D,CACnE,IAAMkW,CAAWlW,CAAAA,CAAAA,CACjB,GAAIkW,CAAAA,CAAS,UACX,CAAA,OAAO,CACL,GAAA,CAAKA,CAAS,CAAA,KAAA,CACd,QAAU,CAAA,EACZ,CAAA,CAGF,IAAM9D,CAAAA,CAAQ,IAAIrD,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAEzCoH,CAAAA,CAAAA,CAAgBD,CAAS,CAAA,IAAA,CACxBC,CAAc,CAAA,QAAA,CAAS,GAAG,CAAA,GAC7BA,CAAgB,CAAA,CAAA,EAAGD,CAAS,CAAA,KAAK,CAAIC,CAAAA,EAAAA,CAAa,CAGpD,CAAA,CAAA,CAAA,IAAIC,CAAiBF,CAAAA,CAAAA,CAAS,KACzBE,CAAAA,CAAAA,CAAe,QAAS,CAAA,GAAG,CAC9BA,GAAAA,CAAAA,CAAiB,CAAG,EAAA,IAAA,CAAK,KAAM,CAAA,KAAK,CAAIA,CAAAA,EAAAA,CAAc,CAGxD,CAAA,CAAA,CAAA,IAAMC,CAAUjE,CAAAA,CAAAA,CAAM,kBAAmB,CAAA,UAAA,CAAY+D,CAAa,CAAA,CAC5DG,CAAWlE,CAAAA,CAAAA,CAAM,kBAAmB,CAAA,UAAA,CAAYgE,CAAc,CAAA,CAIpE,OAAO,CAAE,GADG,CAAA,CAAA,EAFKhE,CAAM,CAAA,iBAAA,CAAkB,UAAY8D,CAAAA,CAAAA,CAAS,KAAK,CAE5C,CAAOG,IAAAA,EAAAA,CAAO,CAAIH,CAAAA,EAAAA,CAAAA,CAAS,EAAI,EAAA,QAAQ,CAAII,CAAAA,EAAAA,CAAQ,CAC5D,CAAA,CAAA,QAAA,CAAU,EAAG,CAC7B,CACF,CAEOC,CAAAA,EAAAA,CAAQ,IAAIgK,EAAAA,CC9BnB,IAAMC,EAAAA,CAAN,KAAoD,CAGlD,KAAMxgB,CAAAA,CAAAA,CAA+D,CACnE,IAAMyW,CAAYzW,CAAAA,CAAAA,CAElB,OAAO,CACL,GAAK,CAAA,CAAA,CAAA,EAAIyW,CAAU,CAAA,cAAc,CACjC,CAAA,CAAA,QAAA,CAAU,CAACA,CAAAA,CAAU,KAAK,CAC5B,CACF,CACF,CAEOC,CAAAA,EAAAA,CAAQ,IAAI8J,EAAAA,CCVnB,IAAMtD,EAAwC,CAAA,CAC5C,UAAY,CAAA,YAAA,CACZ,SAAW,CAAA,YAAA,CACX,iBAAmB,CAAA,YAAA,CACnB,aAAe,CAAA,YACjB,CAEauD,CAAAA,EAAAA,CAAN,KAAmD,CAGxD,KAAMzgB,CAAAA,CAAAA,CAAmD,CACvD,IAAMod,CAAWpd,CAAAA,CAAAA,CACb1J,CAAM4mB,CAAAA,EAAAA,CAAcE,CAAS,CAAA,QAAQ,CAAK,EAAA,YAAA,CAG9C,OAAIA,CAAAA,CAAS,UACX9mB,GAAAA,CAAAA,EAAO,cAGL8mB,CAAAA,CAAAA,CAAAA,CAAS,MACX9mB,GAAAA,CAAAA,EAAO,SAGF,CAAA,CAAA,CACL,GAAAA,CAAAA,CAAAA,CACA,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEOsgB,EAAQ,CAAA,IAAI6J,ECjCnB,CAAA,IAAMC,EAAN,CAAA,KAAqD,CAGnD,KAAA,CAAM1gB,CAA+D,CAAA,CACnE,IAAM8W,CAAAA,CAAa9W,CAEnB,CAAA,OAAO,CACL,GAAA,CAAK,CAAI8W,CAAAA,EAAAA,CAAAA,CAAW,cAAc,CAAA,CAAA,CAClC,QAAU,CAAA,CAACA,CAAW,CAAA,MAAM,CAC9B,CACF,CACF,CAAA,CAEOC,EAAQ,CAAA,IAAI2J,ECPnB,CAAA,IAAMC,EAAN,CAAA,KAA0D,CAGxD,KAAA,CAAM3gB,CAA+D,CAAA,CACnE,IAAMiX,CAAAA,CAAkBjX,CAExB,CAAA,GAAIiX,CAAgB,CAAA,UAAA,CAClB,OAAO,CACL,GAAKA,CAAAA,CAAAA,CAAgB,KACrB,CAAA,QAAA,CAAU,EACZ,CAGF,CAAA,IAAMhD,CAAmB,CAAA,IAAIlF,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAClD6R,CAA2B3J,CAAAA,CAAAA,CAAgB,eAC9C,CAAA,GAAA,CAAK1b,CAAW0Y,EAAAA,CAAAA,CAAiB,kBAAmB,CAAA,UAAA,CAAY1Y,CAAM,CAAC,CACvE,CAAA,IAAA,CAAK,OAAO,CAAA,CAEf,GAAI0b,CAAAA,CAAgB,IAAS,GAAA,QAAA,CAG3B,OAAO,CACL,GAAK,CAAA,CAAA,IAAA,EAAO2J,CAAwB,CAAA,CAAA,CAAA,CACpC,SAAU,EACZ,CAGF,CAAA,IAAMC,CAAY5J,CAAAA,CAAAA,CAAgB,eAC/B,CAAA,GAAA,CACE1b,CACC,EAAA,CAAA,OAAA,EAAU0Y,CAAiB,CAAA,kBAAA,CAAmB,UAAY1Y,CAAAA,CAAM,CAAC,CAAA,UAAA,EAAa0Y,CAAiB,CAAA,kBAAA,CAAmB,UAAY1Y,CAAAA,CAAM,CAAC,CAAA,CACzI,CACC,CAAA,IAAA,CAAK,IAAI,CAAA,CAKZ,OAAO,CACL,GAHU,CAAA,CAAA,IAAA,EAAOqlB,CAAwB,CAAA,+BAAA,EAAkCC,CAAS,CAAA,CAAA,CAIpF,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEO3J,EAAQ,CAAA,IAAIyJ,ECrDnB,CAAA,IAAMG,EAAN,CAAA,KAAsD,CAGpD,KAAA,CAAM9gB,CAA+D,CAAA,CACnE,IAAMoX,CAAAA,CAAcpX,CACpB,CAAA,GAAIoX,CAAY,CAAA,UAAA,CACd,OAAO,CACL,GAAKA,CAAAA,CAAAA,CAAY,MACjB,CAAA,QAAA,CAAU,EACZ,CAGF,CAAA,IAAMC,CAAY,CAAA,IAAItI,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBACjD,CAAA,UAAA,CACAqI,CAAY,CAAA,MACd,CACME,CAAAA,CAAAA,CAAeF,CAAY,CAAA,SAAA,CAAU,WAAY,EAAA,CAEvD,OAAO,CACL,GAAK,CAAA,CAAA,EAAGC,CAAS,CAAA,CAAA,EAAIC,CAAY,CAAA,CAAA,CACjC,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEOC,EAAQ,CAAA,IAAIuJ,EC3BnB,CAAA,IAAMC,EAAN,CAAA,KAAkD,CAGhD,KAAA,CAAM/gB,CAAmD,CAAA,CAEvD,OAAO,CACL,GAFcA,CAAAA,CAAAA,CAED,QACb,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CAEOyX,CAAAA,EAAAA,CAAQ,IAAIsJ,EAAAA,CCRnB,IAAMC,EAAAA,CAAN,KAA6D,CAG3D,KAAMhP,CAAAA,CAAAA,CAAgE,CAgBpE,OAAO,CAAE,GAbG,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAFCA,EAAAA,CAAAA,CACM,KAAM,CAAA,WAAA,EAYA,CAAA;AAAA,oBAAA,CAAA,CAEX,SAAU,EAAG,CAC7B,CACF,CAAA,CAEO2F,GAAQ,IAAIqJ,EAAAA,CCvBnB,IAAMC,EAAAA,CAAN,KAAwD,CAGtD,KAAA,CAAMjP,EAAgE,CAiBpE,OAAO,CAAE,GAdG,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAFCA,EAAAA,CAAAA,CACM,KAAM,CAAA,WAAA,EAOA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yCAAA,CAAA,CAQX,SAAU,EAAG,CAC7B,CACF,CAAA,CAEO6F,GAAQ,IAAIoJ,EAAAA,CCxBnB,IAAMC,EAAAA,CAAN,KAA6D,CAG3D,KAAA,CAAMlP,EAAgE,CAWpE,OAAO,CAAE,GARG,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAFCA,EAAAA,CAAAA,CACM,KAAM,CAAA,WAAA,EAOA,CAAA;AAAA,oBAAA,CAAA,CAEX,SAAU,EAAG,CAC7B,CACF,CAAA,CAEO+F,GAAQ,IAAImJ,EAAAA,CClBnB,IAAMC,EAAAA,CAAN,KAAwD,CAGtD,KAAA,CAAMnP,EAAgE,CAcpE,OAAO,CAAE,GAXG,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAFCA,EAAAA,CAAAA,CACM,KAAM,CAAA,WAAA,EAUF,CAAA;AAAA,kBAAA,CAAA,CAET,QAAU,CAAA,EAAG,CAC7B,CACF,CAAA,CAEOiG,EAAQ,CAAA,IAAIkJ,ECtBnB,CAAA,IAAMC,EAAN,CAAA,KAAqD,CAGnD,KAAA,CAAMphB,CAA+D,CAAA,CACnE,IAAMmY,CAAAA,CAAanY,CACnB,CAAA,GAAImY,CAAW,CAAA,UAAA,CACb,OAAO,CACL,GAAKA,CAAAA,CAAAA,CAAW,MAChB,CAAA,QAAA,CAAU,EACZ,CAAA,CAGF,IAAMC,CAAAA,CAAe,IAAK,CAAA,YAAA,CACxBD,CAAW,CAAA,MAAA,CACXA,CAAW,CAAA,WACb,CACMhE,CAAAA,CAAAA,CAAW,IAAK,CAAA,WAAA,CAAYgE,CAAW,CAAA,KAAK,EAClD,OAAO,CACL,GAAK,CAAA,CAAA,EAAGC,CAAa,CAAA,GAAG,CAAGjE,EAAAA,CAAQ,CACnC,CAAA,CAAA,QAAA,CAAUiE,CAAa,CAAA,QACzB,CACF,CAEQ,YACN7c,CAAAA,CAAAA,CACA8c,EAC8C,CAC9C,GAAI,OAAO9c,CAAAA,EAAW,QAAU,CAAA,CAC9B,IAAMuK,CAAAA,CAAM,IAAIiJ,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CAC3C,UACAxT,CAAAA,CACF,CACIjF,CAAAA,CAAAA,CAAMwP,CACV,CAAA,OAAIuS,CACF/hB,GAAAA,CAAAA,CAAM,CAAG+hB,EAAAA,CAAAA,CAAY,WAAY,EAAC,CAAIvS,CAAAA,EAAAA,CAAG,CAEpC,CAAA,CAAA,CAAA,CAAA,CACL,GAAAxP,CAAAA,CAAAA,CACA,SAAU,EACZ,CACF,CAEA,GAAI,KAAA,CAAM,OAAQiF,CAAAA,CAAM,CAAKA,EAAAA,CAAAA,CAAO,MAAS,CAAA,CAAA,CAAG,CAK9C,IAAMzF,CAJY,CAAA,IAAIqK,EACpB,IAAK,CAAA,KAAA,CACL,UACF,CAAA,CACyB,KAAM5E,CAAAA,CAAM,CACjCjF,CAAAA,CAAAA,CAAM,CAAIR,CAAAA,EAAAA,CAAAA,CAAO,GAAG,CAAA,CAAA,CAAA,CACxB,OAAIuiB,CAAAA,GACF/hB,CAAM,CAAA,CAAA,EAAG+hB,EAAY,WAAY,EAAC,CAAG/hB,EAAAA,CAAG,CAEnC,CAAA,CAAA,CAAA,CACL,GAAAA,CAAAA,CAAAA,CACA,QAAUR,CAAAA,CAAAA,CAAO,QACnB,CACF,CAEA,GAAI,CAAC,KAAA,CAAM,OAAQyF,CAAAA,CAAM,CAAG,CAAA,CAK1B,IAAMzF,CAAAA,CAJY,IAAIqK,CAAAA,CACpB,IAAK,CAAA,KAAA,CACL,UACF,CAAA,CACyB,KAAM,CAAA,CAAC5E,CAAM,CAAC,EACnCjF,CAAM,CAAA,CAAA,CAAA,EAAIR,CAAO,CAAA,GAAG,CACxB,CAAA,CAAA,CAAA,OAAIuiB,CACF/hB,GAAAA,CAAAA,CAAM,CAAG+hB,EAAAA,CAAAA,CAAY,WAAY,EAAC,CAAG/hB,EAAAA,CAAG,CAEnC,CAAA,CAAA,CAAA,CACL,IAAAA,CACA,CAAA,QAAA,CAAUR,CAAO,CAAA,QACnB,CACF,CA0BA,OAAO,CACL,GAzBuByF,CAAAA,CAAAA,CAAO,GAAKuK,CAAAA,CAAAA,EAAQ,CAC3C,GAAI,OAAOA,CAAAA,EAAQ,SAAU,CAC3B,IAAMwS,CAAY,CAAA,IAAIvJ,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBACjD,CAAA,UAAA,CACAjJ,CACF,CAAA,CACA,OAAIuS,CAAAA,CACK,CAAGA,EAAAA,CAAAA,CAAY,WAAY,EAAC,CAAIC,CAAAA,EAAAA,CAAS,CAE3CA,CAAAA,CAAAA,CAAAA,CACT,CAOA,IAAIhiB,CAAM,CAAA,CAAA,CAAA,EALQ,IAAI6J,CAAAA,CACpB,IAAK,CAAA,KAAA,CACL,UACF,CAAA,CACyB,MAAM,CAAC2F,CAAG,CAAC,CAAA,CACf,GAAG,CAAA,CAAA,CAAA,CACxB,OAAIuS,CAAAA,GACF/hB,CAAM,CAAA,CAAA,EAAG+hB,CAAY,CAAA,WAAA,EAAa,CAAA,EAAG/hB,CAAG,CAAA,CAAA,CAAA,CAEnCA,CACT,CAAC,CAAA,CAGuB,IAAK,CAAA,IAAI,CAC/B,CAAA,QAAA,CAAU,EACZ,CACF,CAEQ,WAAY4Y,CAAAA,CAAAA,CAAwB,CAC1C,OAAIA,CAASA,EAAAA,CAAAA,CAAM,OAAS,CACnB,CAAA,CAAA,KAAA,EAAQA,CAAK,CAAA,CAAA,CAAA,CAEf,EACT,CACF,CAEOqJ,CAAAA,EAAAA,CAAQ,IAAI6I,EAAAA,CChHnB,IAAMC,EAAAA,CAAN,KAAuD,CAGrD,KAAMrhB,CAAAA,CAAAA,CAA+D,CACnE,IAAMyY,CAAezY,CAAAA,CAAAA,CAErB,OAAIyY,CAAAA,CAAa,UAAc,EAAA,OAAOA,CAAa,CAAA,QAAA,EAAa,QACvD,CAAA,CACL,GAAKA,CAAAA,CAAAA,CAAa,QAClB,CAAA,QAAA,CAAU,EACZ,CAAA,CAOK,CACL,GAAA,CALqB,IAAI1J,CAAAA,CACzB,IAAK,CAAA,KACP,CAAE,CAAA,yBAAA,CAA0B,UAAY0J,CAAAA,CAAAA,CAAa,QAAoB,CAAA,CAIvE,QAAU,CAAA,EACZ,CACF,CACF,CAEOC,CAAAA,EAAAA,CAAQ,IAAI2I,EAAAA,CC1BnB,IAAMC,EAAAA,CAAN,KAAoD,CAGlD,KAAMthB,CAAAA,CAAAA,CAA+D,CACnE,IAAM4Y,CAAY5Y,CAAAA,CAAAA,CACZ6Y,EAAS,IAAI1Y,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,UAAU,CAAA,CAC7C2Y,CAAQ,CAAA,KAAA,CAAM,OAAQF,CAAAA,CAAAA,CAAU,KAAK,CAAA,CACvCA,CAAU,CAAA,KAAA,CACV,CAACA,CAAAA,CAAU,KAAK,CAAA,CAEd1Y,CACJ,CAAA,OAAO0Y,CAAU,CAAA,KAAA,EAAU,QACvB,CAAA,CAAE,GAAKA,CAAAA,CAAAA,CAAU,KAAO,CAAA,QAAA,CAAU,EAAG,CACrCC,CAAAA,CAAAA,CAAO,MACLC,CAAM,CAAA,MAAA,CAAO,OAAO,CAAA,CACpBF,CAAU,CAAA,cACZ,CAEN,CAAA,OAAO,CACL,GAAA,CAAK1Y,CAAI,CAAA,GAAA,CACT,QAAUA,CAAAA,CAAAA,CAAI,QAChB,CACF,CACF,CAEO6Y,CAAAA,EAAAA,CAAQ,IAAIuI,EAAAA,CCtBnB,IAAMC,EAAAA,CAAN,KAAqD,CAGnD,KAAMvhB,CAAAA,CAAAA,CAA+D,CACnE,IAAMiZ,CAAajZ,CAAAA,CAAAA,CACnB,GAAIiZ,CAAAA,CAAW,YAAc,OAAOA,CAAAA,CAAW,QAAa,EAAA,QAAA,CAC1D,OAAO,CACL,GAAKA,CAAAA,CAAAA,CAAW,QAChB,CAAA,QAAA,CAAUA,CAAW,CAAA,MACvB,CAGF,CAAA,IAAMhF,CAAmB,CAAA,IAAIlF,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAClDsG,CAAiBpB,CAAAA,CAAAA,CAAiB,yBACtC,CAAA,UAAA,CACAgF,CAAW,CAAA,QACb,CAEA,CAAA,GAAI,CAACA,CAAAA,CAAW,OAAQ,CAAA,MAAA,EAAU,CAACA,CAAW,CAAA,MAAA,CAAO,MACnD,CAAA,OAAO,CACL,GAAA,CAAK5D,CACL,CAAA,QAAA,CAAU,EACZ,CAGF,CAAA,IAAIK,CAAauD,CAAAA,CAAAA,CAAW,cACtBE,CAAAA,CAAAA,CAAuB,EACvBC,CAAAA,CAAAA,CAAYH,CAAW,CAAA,OAAA,CAC1B,GAAI,CAAA,CAAC1d,CAAQoO,CAAAA,CAAAA,GAAU,CACtB,IAAM3W,CAAQimB,CAAAA,CAAAA,CAAW,MAAOtP,CAAAA,CAAK,CAErC,CAAA,OAAI3W,aAAiBke,CACZ,CAAA,CAAA,EAAG+C,CAAiB,CAAA,kBAAA,CAAmB,UAAY1Y,CAAAA,CAAM,CAAC,CAAA,GAAA,EAAMvI,CAAM,CAAA,QAAQ,CAGvFmmB,CAAAA,EAAAA,CAAAA,CAAc,IAAKnmB,CAAAA,CAAK,CACjB,CAAA,CAAA,EAAGihB,CAAiB,CAAA,kBAAA,CAAmB,UAAY1Y,CAAAA,CAAM,CAAC,CAAA,IAAA,EAAOma,CAAY,EAAA,CAAA,CAAA,CACtF,CAAC,CAAA,CACA,IAAK,CAAA,IAAI,CAEZ,CAAA,OAAO,CACL,GAAA,CAAK,GAAGL,CAAc,CAAA,KAAA,EAAQ+D,CAAS,CAAA,CAAA,CACvC,QAAUD,CAAAA,CACZ,CACF,CACF,CAEOE,CAAAA,EAAAA,CAAQ,IAAIkI,EAAAA,CChDnB,IAAMC,EAAAA,CAAN,KAAoD,CAGlD,MAAMxhB,CAA+D,CAAA,CACnE,IAAMuZ,CAAAA,CAAYvZ,CAClB,CAAA,GAAIuZ,CAAU,CAAA,UAAA,CACZ,OAAO,CACL,GAAKA,CAAAA,CAAAA,CAAU,MACf,CAAA,QAAA,CAAWA,CAAU,CAAA,KAAA,EAAmB,EAC1C,CAAA,CAGF,IAAM7E,CAAAA,CAAM6E,CAAU,CAAA,cAAA,CAClBjjB,CAAM,CAAA,EAAA,CACNyZ,CAAkB,CAAA,EAEtB,CAAA,GAAI,IAAK,CAAA,SAAA,CAAUwJ,CAAU,CAAA,KAAK,CAAG,CAAA,CACnC,IAAMC,CAAAA,CAAiB,IAAK,CAAA,6BAAA,CAC1BD,CAAU,CAAA,KAAA,CAAM,QAClB,CAAA,CACAjjB,CAAM,CAAA,CAAA,EAAG,IAAIyY,CAAAA,CAAiB,IAAK,CAAA,KAAK,EAAE,kBAAmB,CAAA,UAAA,CAAYwK,CAAU,CAAA,MAAM,CAAC,CAAA,CAAA,EAAIA,CAAU,CAAA,QAAQ,CAAIC,CAAAA,EAAAA,CAAc,CAClIzJ,CAAAA,CAAAA,CAAAA,CAAW,GACb,CAAW,KAAA,GAAA,KAAA,CAAM,QAAQwJ,CAAU,CAAA,KAAK,CACtC,CAAA,GAAIA,CAAU,CAAA,QAAA,CAAS,WAAY,EAAA,GAAM,SAAW,CAAA,CAClD,IAAM5E,CAAAA,CAAe,CAAID,CAAAA,EAAAA,CAAG,CAASA,MAAAA,EAAAA,CAAAA,CAAM,CAAC,CAC5Cpe,CAAAA,CAAAA,CAAAA,CAAM,CAAG,EAAA,IAAIyY,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBAAmB,CAAA,UAAA,CAAYwK,CAAU,CAAA,MAAM,CAAC,CAAA,SAAA,EAAY5E,CAAY,CAAA,CAAA,CAClH5E,CAAWwJ,CAAAA,CAAAA,CAAU,MACvB,CAAA,KAAO,CACL,IAAM5E,CAAe4E,CAAAA,CAAAA,CAAU,KAC5B,CAAA,GAAA,CAAI,CAACjK,CAAAA,CAAG/P,CAAM,GAAA,CAAA,CAAA,EAAImV,CAAMnV,CAAAA,CAAC,EAAE,CAC3B,CAAA,IAAA,CAAK,IAAI,CAAA,CACZjJ,CAAM,CAAA,CAAA,EAAG,IAAIyY,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CAAmB,UAAYwK,CAAAA,CAAAA,CAAU,MAAM,CAAC,IAAIA,CAAU,CAAA,QAAQ,CAAK5E,EAAAA,EAAAA,CAAY,CACjI5E,CAAAA,CAAAA,CAAAA,CAAAA,CAAWwJ,CAAU,CAAA,MACvB,CAEIA,KAAAA,GAAAA,CAAAA,CAAU,QAAS,CAAA,QAAA,CAAS,MAAM,CAAA,CACpCjjB,CAAM,CAAA,CAAA,EAAG,IAAIyY,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBAAmB,CAAA,UAAA,CAAYwK,CAAU,CAAA,MAAM,CAAC,CAAA,CAAA,EAAIA,CAAU,CAAA,QAAQ,CAChHxJ,CAAAA,CAAAA,CAAAA,CAAW,EAAC,CAAA,KACP,CAAIwJ,GAAAA,CAAAA,CAAU,KAAU,GAAA,MAAA,CAC7B,OAAO,CAAE,GAAK,CAAA,EAAA,CAAI,QAAU,CAAA,EAAG,CAAA,CAE/BjjB,CAAM,CAAA,CAAA,EAAG,IAAIyY,CAAAA,CAAiB,KAAK,KAAK,CAAA,CAAE,kBAAmB,CAAA,UAAA,CAAYwK,CAAU,CAAA,MAAM,CAAC,CAAA,CAAA,EAAIA,CAAU,CAAA,QAAQ,CAAK7E,EAAAA,EAAAA,CAAG,CACxH3E,CAAAA,CAAAA,CAAAA,CAAW,CAACwJ,CAAAA,CAAU,KAAK,EAI/B,CAAA,OAAIA,CAAU,CAAA,SAAA,GACZjjB,CAAM,CAAA,CAAA,KAAA,EAAQA,CAAG,CAAA,CAAA,CAAA,CAAA,CAGZ,CAAE,GAAA,CAAKA,CAAI,CAAA,IAAA,EAAQ,CAAA,QAAA,CAAAyZ,CAAS,CACrC,CAEQ,SAAU/c,CAAAA,CAAAA,CAA8B,CAC9C,OACEA,CACA,EAAA,OAAOA,CAAU,EAAA,QAAA,EACjB,UAAcA,GAAAA,CAAAA,EACdA,CAAM,CAAA,UAAA,GAAe,IAEzB,CAEQ,6BAA8B4mB,CAAAA,CAAAA,CAAqB,CAGzD,OADE,0DAA2D,CAAA,IAAA,CAAKA,CAAG,CAAA,CAI9D,IAAI7K,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CAAmB,UAAY6K,CAAAA,CAAG,CAFjEA,CAAAA,CAGX,CACF,CAEOC,CAAAA,EAAAA,CAAQ,IAAI2H,EAAAA,CCzEnB,IAAMC,EAAAA,CAAN,KAAyD,CAGvD,KAAMzhB,CAAAA,CAAAA,CAA+D,CACnE,IAAM+Z,CAAY/Z,CAAAA,CAAAA,CAClB,GAAI,CAAC+Z,EAAU,KAAS,EAAA,CAACA,CAAU,CAAA,KAAA,CAAM,MACvC,CAAA,OAAO,CAAE,GAAA,CAAK,EAAI,CAAA,QAAA,CAAU,EAAG,CAGjC,CAAA,IAAMtK,CAAY,CAAA,IAAItP,EACpB,IAAK,CAAA,KAAA,CACL,UACF,CAAA,CAEM,CAAE,GAAA,CAAA7J,CAAK,CAAA,QAAA,CAAAyZ,CAAS,CAAA,CAAIN,CAAU,CAAA,KAAA,CAClCsK,CAAU,CAAA,KAAA,CACVA,CAAU,CAAA,cAAA,CACV,IACF,CAAA,CAEA,OAAO,CACL,GAAK,CAAA,CAAA,CAAA,EAAIzjB,CAAG,CAAA,CAAA,CAAA,CACZ,QAAAyZ,CAAAA,CACF,CACF,CACF,CAEOiK,CAAAA,EAAAA,CAAQ,IAAIyH,EAAAA,CC3BnB,IAAMC,EAAN,CAAA,KAAwD,CAGtD,KAAA,CAAM1hB,CAA+D,CAAA,CACnE,IAAMka,CAAAA,CAAgBla,CACtB,CAAA,GAAIka,CAAc,CAAA,UAAA,CAChB,OAAO,CACL,GAAKA,CAAAA,CAAAA,CAAc,OACnB,QAAU,CAAA,EACZ,CAAA,CAGF,IAAI5jB,CAAAA,CAAM,EACNyZ,CAAAA,CAAAA,CAAkB,EAAC,CAEjBsH,CAAY,CAAA,IAAItI,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,mBACjD,UACAmL,CAAAA,CAAAA,CAAc,MAChB,CAAA,CAGA,OAAQA,CAAAA,CAAc,YAAc,EAClC,KAAK,GAAA,CAEH5jB,CAAM,CAAA,CAAA,WAAA,EAAc+gB,CAAS,CAAA,IAAA,CAAA,CAC7BtH,CAAW,CAAA,CAAC,IAAK,CAAA,SAAA,CAAUmK,CAAc,CAAA,KAAK,CAAC,CAAA,CAC/C,MACF,KAAK,UAEH5jB,CAAAA,CAAAA,CAAM,CAAe+gB,YAAAA,EAAAA,CAAS,CAC9BtH,qCAAAA,CAAAA,CAAAA,CAAAA,CAAW,CAAC,IAAA,CAAK,UAAUmK,CAAc,CAAA,KAAK,CAAC,CAAA,CAC/C,MACF,KAAK,cACH5jB,CAAAA,CAAAA,CAAM,CAAmB+gB,gBAAAA,EAAAA,CAAS,CAClCtH,qCAAAA,CAAAA,CAAAA,CAAAA,CAAW,CAAC,IAAA,CAAK,SAAUmK,CAAAA,CAAAA,CAAc,KAAK,CAAC,CAAA,CAC/C,MACF,KAAK,KACH5jB,CAAAA,CAAAA,CAAM4jB,CAAc,CAAA,MAAA,CACpBnK,CAAW,CAAA,KAAA,CAAM,OAAQmK,CAAAA,CAAAA,CAAc,KAAK,CAAA,CACxCA,CAAc,CAAA,KAAA,CACd,EACJ,CAAA,KACJ,CAEA,OAAIA,CAAc,CAAA,SAAA,GAChB5jB,CAAM,CAAA,CAAA,KAAA,EAAQA,CAAG,CAAA,CAAA,CAAA,CAAA,CAGZ,CAAE,GAAA,CAAKA,CAAI,CAAA,IAAA,EAAQ,CAAA,QAAA,CAAAyZ,CAAS,CACrC,CACF,CAAA,CAEOoK,EAAQ,CAAA,IAAIuH,ECpDnB,CAAA,IAAMC,EAAN,CAAA,KAA4D,CAG1D,KAAA,CAAM3hB,CAA+D,CAAA,CACnE,IAAMqa,CAAAA,CAAera,EAErB,OAAI,IAAA,CAAK,gBAAiBqa,CAAAA,CAAAA,CAAa,QAAQ,CAAA,CACtC,IAAK,CAAA,oBAAA,CAAqBA,CAAY,CAAA,CAG3C,IAAK,CAAA,eAAA,CAAgBA,CAAa,CAAA,QAAQ,CACrC,CAAA,IAAA,CAAK,oBAAoBA,CAAY,CAAA,CAGvC,IAAK,CAAA,oBAAA,CAAqBA,CAAY,CAC/C,CAEQ,gBAAA,CACNC,CACoB,CAAA,CACpB,OAAO,OAAOA,CAAa,EAAA,QAC7B,CAEQ,eAAA,CACNA,EACyB,CACzB,OAAO,KAAM,CAAA,OAAA,CAAQA,CAAQ,CAC/B,CAEQ,oBAAA,CACND,CAC8C,CAAA,CAE9C,OAAO,CAAE,GADG,CAAA,CAAA,EAAGA,CAAa,CAAA,MAAM,CAAIA,CAAAA,EAAAA,CAAAA,CAAa,QAAQ,CAAA,EAAA,EAAKA,CAAa,CAAA,QAAQ,CACnE,CAAA,CAAA,CAAA,IAAA,EAAQ,CAAA,QAAA,CAAU,EAAG,CACzC,CAEQ,mBACNA,CAAAA,CAAAA,CAC8C,CAC9C,IAAM5K,CAAAA,CAAY,IAAItP,CAAAA,CACpB,IAAK,CAAA,KAAA,CACL,UACF,CAAA,CACM,CAAE,GAAA,CAAKoa,CAAa,CAAA,QAAA,CAAUC,CAAiB,CAAA,CAAI/K,CAAU,CAAA,KAAA,CACjE4K,EAAa,QACbA,CAAAA,CAAAA,CAAa,cACf,CAAA,CAGA,OAAO,CAAE,GADG,CAAA,CAAA,EAAGA,CAAa,CAAA,MAAM,CAAIA,CAAAA,EAAAA,CAAAA,CAAa,QAAQ,CAAA,EAAA,EAAKE,CAAW,CAAA,CAAA,CAAA,CACzD,MAAQ,CAAA,QAAA,CAAUC,CAAiB,CACvD,CAEQ,oBAAA,CACNH,CAC8C,CAAA,CAC9C,IAAM5K,CAAAA,CAAY,IAAItP,CAAAA,CACpB,IAAK,CAAA,KAAA,CACL,UACF,CAAA,CACM,CAAE,GAAA,CAAKoa,CAAa,CAAA,QAAA,CAAUC,CAAiB,CAAA,CAAI/K,CAAU,CAAA,KAAA,CACjE,CAAC4K,CAAAA,CAAa,QAAqB,CAAA,CACnCA,CAAa,CAAA,cACf,CAGA,CAAA,OAAO,CAAE,GADG,CAAA,CAAA,EAAGA,CAAa,CAAA,MAAM,CAAIA,CAAAA,EAAAA,CAAAA,CAAa,QAAQ,CAAA,EAAA,EAAKE,CAAW,CAAA,CAAA,CAAA,CACzD,IAAK,EAAA,CAAG,QAAUC,CAAAA,CAAiB,CACvD,CACF,EAEOC,EAAQ,CAAA,IAAIkH,ECjEnB,CAAA,IAAMC,EAAN,CAAA,KAAmD,CAGjD,KAAA,CACE5hB,CAC8C,CAAA,CAC9C,IAAM2a,CAAAA,CAAW3a,CACX6Y,CAAAA,CAAAA,CAAS,IAAI1Y,CAAAA,CAAU,KAAK,KAAO,CAAA,UAAU,CAC7C2Y,CAAAA,CAAAA,CAAQ,KAAM,CAAA,OAAA,CAAQ6B,CAAS,CAAA,IAAI,CACrCA,CAAAA,CAAAA,CAAS,IACT,CAAA,CAACA,CAAS,CAAA,IAAI,CAEZza,CAAAA,CAAAA,CAAM2Y,CAAO,CAAA,KAAA,CACjBC,CAAM,CAAA,MAAA,CAAO,OAAO,CAAA,CACpB6B,CAAS,CAAA,cACX,CAKMkH,CAAAA,CAAAA,CACJlH,CAAS,CAAA,MAAA,GAAW,cAAiB,CAAA,qBAAA,CAAwB,EAE/D,CAAA,OAAO,CACL,GAAK,CAAA,CAAA,EAAGA,CAAS,CAAA,KAAK,CAAQkH,KAAAA,EAAAA,CAAkB,CAAG3hB,EAAAA,CAAAA,CAAI,GAAG,CAAA,CAAA,CAAA,CAC1D,QAAUA,CAAAA,CAAAA,CAAI,QAChB,CACF,CACF,CAAA,CAEO0a,GAAQ,IAAIgH,EAAAA,CClCnB,IAAME,EAAAA,CAAN,KAAoD,CAElD,KAAM9hB,CAAAA,CAAAA,CAAiB,CACrB,IAAMC,CAASD,CAAAA,CAAAA,CACTE,CAAM,CAAA,IAAIC,CAAU,CAAA,IAAA,CAAK,MAAO,UAA+B,CAAA,CACjE,CAAE,GAAA,CAAA7J,CAAI,CAAA,CAAI4J,CAAI,CAAA,KAAA,CAAM,CAACD,CAAAA,CAAO,MAAM,CAAC,CAEjCG,CAAAA,CAAAA,CAAqBH,CAAe,CAAA,iBAAA,CAC1C,GAAIG,CAAAA,EAAqBA,CAAkB,CAAA,MAAA,CAAQ,CACjD,IAAMC,CAA4B,CAAA,EAElC,CAAA,IAAA,IAAWC,CAAcF,IAAAA,CAAAA,CAAmB,CAC1C,GAAM,CAAE,GAAA,CAAKG,CAAc,CAAIL,CAAAA,CAAAA,CAAI,KAAM,CAAA,CAACI,CAAU,CAAC,CACrDD,CAAAA,CAAAA,CAAgB,IAAKE,CAAAA,CAAa,EACpC,CAEIF,CAAgB,CAAA,MAAA,GAClB/J,CAAO,EAAA,CAAA,CAAA,EAAI+J,EAAgB,IAAK,CAAA,GAAG,CAAC,CAAA,CAAA,EAExC,CAEA,OAAO,CAAE,GAAA,CAAK,CAAc/J,WAAAA,EAAAA,CAAG,CAAI,CAAA,CAAA,QAAA,CAAU,EAAG,CAClD,CACF,EACOkK,EAAQ,CAAA,IAAIshB,ECxBnB,CAAA,IAAMC,EAAN,CAAA,KAAwD,CAEtD,KAAA,CAAM/hB,CAAiB,CAAA,CACrB,IAAMC,CAAAA,CAASD,CACTE,CAAAA,CAAAA,CAAM,IAAIC,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,UAA+B,CAAA,CAC/D,CAAE,GAAA,CAAA7J,CAAI,CAAA,CAAI4J,CAAI,CAAA,KAAA,CAAM,CAACD,CAAAA,CAAO,UAAU,CAAC,CAC7C,CAAA,OAAO,CAAE,GAAK,CAAA,CAAA,IAAA,EAAO3J,CAAG,CAAA,CAAA,CAAI,QAAU,CAAA,EAAG,CAC3C,CACF,CAAA,CACOoK,EAAQ,CAAA,IAAIqhB,ECXnB,CAAA,IAAMC,EAAN,CAAA,KAAwD,CAEtD,KAAMhiB,CAAAA,CAAAA,CAAiB,CAGrB,OAAO,CAAE,GAAA,CAAK,CAFHA,iBAAAA,EAAAA,CAAAA,CACK,OAAQ,CAAA,GAAA,CAAKxE,CAAM,EAAA,CAAA,CAAA,EAAIA,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,IAAA,CAAK,IAAI,CAChB,CAAA,CAAA,CAAA,CAAK,QAAU,CAAA,EAAG,CAC1D,CACF,CAAA,CACOoF,EAAQ,CAAA,IAAIohB,ECNnB,CAAA,IAAMC,EAAN,CAAA,KAA0D,CAExD,KAAA,CAAMjiB,CAAiB,CAAA,CACrB,IAAMc,CAAAA,CAAId,CACJE,CAAAA,CAAAA,CAAM,IAAIC,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,UAA+B,CAAA,CAC/D,CAAE,GAAA,CAAA7J,CAAI,CAAA,CAAI4J,EAAI,KAAM,CAAA,CAACY,CAAE,CAAA,OAAO,CAAC,CAAA,CAC/B,EAAG,GAAGC,CAAU,CAAIzK,CAAAA,CAAAA,CAAI,IAAK,EAAA,CAAE,KAAM,CAAA,KAAK,EAC1C0K,CAAUD,CAAAA,CAAAA,CAAW,IAAK,CAAA,GAAG,CAG/BG,CAAAA,CAAAA,CAAY,CAAiBJ,cAAAA,EAAAA,CAAAA,CAAE,MAAM,CAAA,OAAA,EAAUE,CAAO,CAAA,CAAA,CAG1D,GAAIF,CAAAA,CAAE,OAAQ,CAAA,QAAA,GAAa,OAAW,CACpC,IAAMma,CAAcna,CAAAA,CAAAA,CAAE,OAAQ,CAAA,QAAA,CAC1B,CAAiBA,cAAAA,EAAAA,CAAAA,CAAE,MAAM,CAAA,eAAA,CAAA,CACzB,CAAiBA,cAAAA,EAAAA,CAAAA,CAAE,MAAM,CAAA,cAAA,CAAA,CAC7BI,CAAa,EAAA,CAAA,EAAA,EAAK+Z,CAAW,CAAA,EAC/B,CAEA,GAAIna,CAAE,CAAA,OAAA,CAAQ,WACZI,CAAAA,CAAAA,EAAa,CAAmBJ,gBAAAA,EAAAA,CAAAA,CAAE,MAAM,CAAA,cAAA,CAAA,CAAA,KAAA,GAC/BA,CAAE,CAAA,OAAA,CAAQ,OAAY,GAAA,MAAA,CAAW,CAC1C,IAAIK,CAAAA,CAAeL,CAAE,CAAA,OAAA,CAAQ,OACzBK,CAAAA,CAAAA,GAAiB,IACnBA,CAAAA,CAAAA,CAAe,MACN,CAAA,OAAOA,CAAiB,EAAA,QAAA,GAC7BA,CAAiB,GAAA,MAAA,CACnBA,CAAe,CAAA,MAAA,CACNA,IAAiB,MAAUA,EAAAA,CAAAA,GAAiB,OACrDA,CAAAA,CAAAA,CAAeA,CAAa,CAAA,WAAA,EAE5BA,CAAAA,CAAAA,CAAe,CAAIA,CAAAA,EAAAA,CAAY,CAGnCD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAAa,CAAmBJ,gBAAAA,EAAAA,CAAAA,CAAE,MAAM,CAAA,cAAA,EAAiBK,CAAY,CACvE,EAAA,CAEA,OAAIL,CAAAA,CAAE,OAAQ,CAAA,MAAA,GAAW,MACnBA,GAAAA,CAAAA,CAAE,OAAQ,CAAA,MAAA,CACZI,CAAa,EAAA,CAAA,yBAAA,EAA4BJ,CAAE,CAAA,MAAM,CAAcA,WAAAA,EAAAA,CAAAA,CAAE,MAAM,CAAA,EAAA,CAAA,CAEvEI,CAAa,EAAA,CAAA,0BAAA,EAA6BJ,CAAE,CAAA,MAAM,CAI/C,CAAA,CAAA,CAAA,CAAA,CAAE,GAAKI,CAAAA,CAAAA,CAAW,QAAU,CAAA,EAAG,CACxC,CACF,CAAA,CACOE,GAAQ,IAAI6gB,EAAAA,CChDnB,IAAMC,EAAAA,CAAN,KAA2D,CAGzD,KAAMliB,CAAAA,CAAAA,CAA+D,CACnE,IAAM2P,CAAS3P,CAAAA,CAAAA,CAET4P,CADQ,CAAA,IAAIb,CAAiB,CAAA,IAAA,CAAK,KAAK,CACrB,CAAA,iBAAA,CAAkB,UAAYY,CAAAA,CAAAA,CAAO,KAAK,CAAA,CAElE,GAAI,CAACA,CAAO,CAAA,QAAA,EAAY,CAACA,CAAAA,CAAO,QAAS,CAAA,MAAA,CACvC,OAAO,CAAE,IAAK,EAAI,CAAA,QAAA,CAAU,EAAG,CAGjC,CAAA,IAAMF,CAAY,CAAA,IAAItP,CACpB,CAAA,IAAA,CAAK,KACL,CAAA,UACF,CACM2P,CAAAA,CAAAA,CAAkB,EAAC,CACnBC,CAAkB,CAAA,EAExB,CAAA,IAAA,IAAWC,CAASL,IAAAA,CAAAA,CAAO,QAAU,CAAA,CACnC,GAAM,CAAE,GAAArZ,CAAAA,CAAAA,CAAK,QAAU2Z,CAAAA,CAAc,CAAIR,CAAAA,CAAAA,CAAU,MAAM,CAACO,CAAK,CAAC,CAAA,CAChEF,CAAM,CAAA,IAAA,CAAKxZ,CAAI,CAAA,IAAA,EAAM,CAAA,CACrByZ,CAAS,CAAA,IAAA,CAAK,GAAGE,CAAa,EAChC,CAEA,IAAMC,CAAOJ,CAAAA,CAAAA,CAAM,IAAK,CAAA,IAAI,CAG5B,CAAA,OAAO,CAAE,GAAA,CADQ,CADAH,EAAAA,CAAAA,CAAO,QAAW,CAAA,YAAA,CAAe,EACtB,CAAA,EAAGC,CAAS,CAAA,CAAA,EAAIM,CAAI,CACxB,CAAA,CAAA,QAAA,CAAAH,CAAS,CACnC,CACF,CAAA,CAEOI,EAAQ,CAAA,IAAI+R,ECnCnB,CAAA,IAAMC,EAAN,CAAA,KAAqD,CAEnD,KAAA,CAAMniB,CAAiB,CAAA,CAErB,OAAO,CAAE,GAAK,CAAA,CAAA,aAAA,EADJA,CACsB,CAAA,MAAM,CAAK,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC1D,CACF,CACOqQ,CAAAA,EAAAA,CAAQ,IAAI8R,EAAAA,CCPnB,IAAMC,EAAN,CAAA,KAAyD,CAEvD,KAAA,CAAMpiB,CAAiB,CAAA,CAErB,OAAO,CAAE,GAAK,CAAA,CAAA,iBAAA,EADAA,CAC0B,CAAA,cAAc,CAAK,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC1E,CACF,CAAA,CACOuQ,EAAQ,CAAA,IAAI6R,ECPnB,CAAA,IAAMC,EAAN,CAAA,KAA4D,CAE1D,KAAA,CAAMriB,CAAiB,CAAA,CAErB,OAAO,CAAE,GAAK,CAAA,CAAA,cAAA,EADJA,EACuB,MAAM,CAAA,cAAA,CAAA,CAAkB,QAAU,CAAA,EAAG,CACxE,CACF,CAAA,CACOyQ,EAAQ,CAAA,IAAI4R,ECPnB,CAAA,IAAMC,EAAN,CAAA,KAA4D,CAE1D,KAAA,CAAMtiB,CAAiB,CAAA,CAErB,OAAO,CAAE,GAAK,CAAA,CAAA,cAAA,EADJA,CACuB,CAAA,MAAM,CAAmB,eAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CACzE,CACF,CACO2Q,CAAAA,EAAAA,CAAQ,IAAI2R,ECRnB,CAAA,IAAMC,EAAN,CAAA,KAAyD,CAEvD,KAAA,CAAMvQ,CAAkB,CAAA,CAEtB,OAAO,CAAE,GAAK,CAAA,EAAA,CAAI,QAAU,CAAA,EAAG,CACjC,CACF,CACOnB,CAAAA,EAAAA,CAAQ,IAAI0R,EAAAA,CCNnB,IAAMC,EAAAA,CAAN,KAAuD,CAErD,KAAMxiB,CAAAA,CAAAA,CAAiB,CACrB,IAAMsJ,CAAItJ,CAAAA,CAAAA,CACV,OAAO,CACL,IAAK,CAAkBsJ,eAAAA,EAAAA,CAAAA,CAAE,OAAO,CAAA,MAAA,EAASA,CAAE,CAAA,OAAO,CAClD,CAAA,CAAA,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CACOyH,CAAAA,EAAAA,CAAQ,IAAIyR,EAAAA,CCVnB,IAAMC,EAAAA,CAAN,KAAsD,CAEpD,KAAMziB,CAAAA,CAAAA,CAAiB,CAErB,OAAO,CAAE,GAAA,CAAK,CADHA,CAAAA,EAAAA,CAAAA,CACU,OAAO,CAAA,CAAA,CAAA,CAAK,QAAU,CAAA,EAAG,CAChD,CACF,CACOiR,CAAAA,EAAAA,CAAQ,IAAIwR,EAAAA,CCNnB,IAAMC,EAAAA,CAAN,KAA2D,CAEzD,KAAM1iB,CAAAA,CAAAA,CAAiB,CACrB,IAAMrL,CAAIqL,CAAAA,CAAAA,CACNiG,EAEJ,OAAItR,CAAAA,CAAE,YAAwBuc,YAAAA,CAAAA,CAC5BjL,CAAMtR,CAAAA,CAAAA,CAAE,YAAa,CAAA,QAAA,CACZA,CAAE,CAAA,YAAA,GAAiB,MAC5BsR,CAAAA,CAAAA,CAAM,MACGtR,CAAAA,CAAAA,CAAE,YAAiB,GAAA,MAAA,EAAUA,EAAE,YAAiB,GAAA,OAAA,CACzDsR,CAAMtR,CAAAA,CAAAA,CAAE,YAAa,CAAA,WAAA,EAErB,CAAA,OAAOA,CAAE,CAAA,YAAA,EAAiB,QAC1BA,EAAAA,CAAAA,CAAE,YAAiB,GAAA,MAAA,EACnBA,CAAE,CAAA,YAAA,GAAiB,MACnBA,EAAAA,CAAAA,CAAE,YAAiB,GAAA,OAAA,CAEnBsR,CAAM,CAAA,CAAA,CAAA,EAAItR,CAAE,CAAA,YAAY,CAExBsR,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,MAAOtR,CAAAA,CAAAA,CAAE,YAAY,CAAA,CAGtB,CACL,GAAA,CAAK,iBAAiBA,CAAE,CAAA,MAAM,CAAiBsR,cAAAA,EAAAA,CAAG,CAClD,CAAA,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CACOmL,CAAAA,EAAAA,CAAQ,IAAIsR,EAAAA,CC9BnB,IAAMC,EAAAA,CAAN,KAA2D,CAEzD,KAAA,CAAM3iB,CAAiB,CAAA,CAErB,OAAO,CAAE,GAAK,CAAA,CAAA,cAAA,EADJA,CACuB,CAAA,MAAM,CAAkB,cAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CACxE,CACF,EACOsR,EAAQ,CAAA,IAAIqR,ECJnB,CAAA,IAAMC,EAAN,CAAA,KAA2D,CAGzD,KAAA,CAAM5iB,CAA+D,CAAA,CACnE,IAAMwR,CAAAA,CAAUxR,CAChB,CAAA,GAAIwR,CAAQ,CAAA,UAAA,CACV,OAAO,CAAE,GAAKA,CAAAA,CAAAA,CAAQ,MAAkB,CAAA,QAAA,CAAU,EAAG,CAIvD,CAAA,IAAM1J,CADQ,CAAA,IAAIiH,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CACpB,mBACvB,UACAhJ,CAAAA,CAAAA,CAAeyL,CAAQ,CAAA,MAAM,CAC/B,CAAA,CAEMC,CAAKD,CAAAA,CAAAA,CAAQ,QAAS,CAAA,WAAA,EAE5B,CAAA,GAAIC,CAAO,GAAA,MAAA,CAAQ,CACjB,IAAMC,EAAMF,CAAQ,CAAA,MAAA,EAAU,CAC9B,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG1J,EAAAA,CAAU,CAAS4J,MAAAA,EAAAA,CAAG,CAAK,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC3D,CAAA,KAAA,GAAWD,IAAO,SAAW,CAAA,CAC3B,IAAMC,CAAAA,CAAMF,CAAQ,CAAA,MAAA,EAAU,GAC9B,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG1J,EAAAA,CAAU,CAAY4J,SAAAA,EAAAA,CAAG,CAAK,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC9D,CAAA,KAAO,CACLD,GAAAA,CAAAA,GAAO,MACPA,EAAAA,CAAAA,GAAO,UACPA,EAAAA,CAAAA,GAAO,YACPA,EAAAA,CAAAA,GAAO,UAEP,CAAA,OAAO,CAAE,GAAA,CAAK,GAAG3J,CAAU,CAAA,KAAA,CAAA,CAAS,QAAU,CAAA,EAAG,CAAA,CAC5C,GAAI2J,CAAAA,GAAO,MAChB,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAS,KAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAAA,CAC5C,GAAI2J,CAAAA,GAAO,MAChB,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAgB,YAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CACnD,CAAA,GAAI2J,IAAO,QAChB,CAAA,OAAID,CAAQ,CAAA,aAAA,CACH,CAAE,GAAA,CAAK,CAAG1J,EAAAA,CAAU,CAAc,UAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAEjD,CAAA,CAAE,GAAK,CAAA,CAAA,EAAGA,CAAU,CAAA,OAAA,CAAA,CAAW,QAAU,CAAA,EAAG,CAAA,CAC9C,GAAI2J,CAAAA,GAAO,SAChB,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAa,SAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAAA,CAChD,GAAI2J,CAAAA,GAAO,UAChB,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAa,SAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAChD,CAAA,GAAI2J,IAAO,WAChB,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAY,QAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC/C,CAAA,GAAI2J,CAAO,GAAA,OAAA,EAAWA,CAAO,GAAA,MAAA,CAClC,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAS,KAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC5C,CAAA,GAAI2J,CAAO,GAAA,QAAA,CAChB,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,iBAAA,CAAA,CAAqB,QAAU,CAAA,EAAG,CAAA,CACxD,GAAI2J,CAAAA,GAAO,SAAaA,EAAAA,CAAAA,GAAO,SAAW,CAAA,CAC/C,IAAME,CAAAA,CAAYH,CAAQ,CAAA,SAAA,EAAa,GACjCI,CAAQJ,CAAAA,CAAAA,CAAQ,KAAS,EAAA,CAAA,CAC/B,OAAO,CACL,GAAK,CAAA,CAAA,EAAG1J,CAAU,CAAA,SAAA,EAAY6J,CAAS,CAAA,EAAA,EAAKC,CAAK,CAAA,CAAA,CAAA,CACjD,QAAU,CAAA,EACZ,CACF,CAAA,KAAO,CAAIH,GAAAA,CAAAA,GAAO,MAChB,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAS,KAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC5C,CAAA,GAAI2J,IAAO,MAChB,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAa,SAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAChD,CAAA,GAAI2J,CAAO,GAAA,MAAA,CAAQ,CACxB,IAAMI,CACJ,CAAA,OAAOL,CAAQ,CAAA,SAAA,EAAc,QAAW,CAAA,CAAA,CAAA,EAAIA,CAAQ,CAAA,SAAS,CAAM,CAAA,CAAA,CAAA,EAAA,CACrE,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG1J,CAAU,CAAA,KAAA,EAAQ+J,CAAC,CAAI,CAAA,CAAA,QAAA,CAAU,EAAG,CACvD,CAAA,KAAA,GAAWJ,CAAO,GAAA,UAAA,EAAcA,CAAO,GAAA,WAAA,CAAa,CAClD,IAAM8N,CAAS/N,CAAAA,CAAAA,CAAQ,YACnB,CAAA,iBAAA,CACA,qBACEK,CACJ,CAAA,OAAOL,CAAQ,CAAA,SAAA,EAAc,QAAW,CAAA,CAAA,CAAA,EAAIA,CAAQ,CAAA,SAAS,CAAM,CAAA,CAAA,CAAA,EAAA,CACrE,OAAO,CACL,GAAK,CAAA,CAAA,EAAG1J,CAAU,CAAA,UAAA,EAAa+J,CAAC,CAAG0N,EAAAA,CAAM,CAAG,CAAA,CAAA,OAAA,EAC5C,CAAA,QAAA,CAAU,EACZ,CACF,CAAA,KAAO,CAAI9N,GAAAA,CAAAA,GAAO,SAAaA,EAAAA,CAAAA,GAAO,MACpC,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAY,QAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC/C,CAAA,GACL2J,CAAO,GAAA,OAAA,EACPA,CAAO,GAAA,QAAA,EACPA,CAAO,GAAA,WAAA,EACPA,IAAO,MACPA,EAAAA,CAAAA,GAAO,UACPA,EAAAA,CAAAA,GAAO,YACPA,EAAAA,CAAAA,GAAO,UAEP,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAU,MAAA,CAAA,CAAA,QAAA,CAAU,EAAG,EAC7C,GAAI2J,CAAAA,GAAO,MAChB,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAS,KAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC5C,CAAA,GAAI2J,CAAO,GAAA,OAAA,CAChB,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAU,MAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC7C,CAAA,GAAI2J,CAAO,GAAA,MAAA,CAAQ,CACxB,GAAID,CAAQ,CAAA,UAAA,EAAcA,CAAQ,CAAA,UAAA,CAAW,MAAS,CAAA,CAAA,CAAG,CACvD,IAAMrC,CAASqC,CAAAA,CAAAA,CAAQ,UAAW,CAAA,GAAA,CAAKnL,CAAM,EAAA,CAAA,CAAA,EAAIA,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,IAAA,CAAK,IAAI,CAChE,CAAA,OAAO,CACL,GAAA,CAAK,CAAGyB,EAAAA,CAAU,CAAgBA,aAAAA,EAAAA,CAAU,CAAQqH,KAAAA,EAAAA,CAAM,CAC1D,EAAA,CAAA,CAAA,QAAA,CAAU,EACZ,CACF,CACA,OAAO,CAAE,GAAA,CAAK,CAAGrH,EAAAA,CAAU,CAAS,KAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CACnD,CAAA,KAAO,CAAI2J,GAAAA,CAAAA,GAAO,SAAaA,EAAAA,CAAAA,GAAO,KACpC,CAAA,OAAID,EAAQ,aACH,CAAA,CAAE,GAAK,CAAA,CAAA,EAAG1J,CAAU,CAAA,OAAA,CAAA,CAAW,QAAU,CAAA,EAAG,CAAA,CAG9C,CAAE,GAAA,CAAK,CAAGA,EAAAA,CAAU,CAAY,QAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC/C,CAAA,GAAI2J,CAAO,GAAA,UAAA,CAChB,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,SAAA,CAAA,CAAa,QAAU,CAAA,EAAG,CAAA,CAChD,GAAI2J,CAAO,GAAA,OAAA,CAChB,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,MAAA,CAAA,CAAU,QAAU,CAAA,EAAG,CAAA,CAC7C,GAAI2J,CAAAA,GAAO,YAChB,CAAA,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,WAAA,CAAA,CAAe,QAAU,CAAA,EAAG,CAAA,CAClD,GAAI2J,CAAAA,GAAO,SAChB,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,WAAY,QAAU,CAAA,EAAG,CAAA,CAC/C,GAAI2J,CAAAA,GAAO,YAChB,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAe,WAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAGzD,CAAA,CAAA,CAAA,CAAA,OAAO,CACL,GAAA,CAAK,CAAGA,EAAAA,CAAU,CAAI2J,CAAAA,EAAAA,CAAE,CAAID,CAAAA,EAAAA,CAAAA,CAAQ,MAAS,CAAA,CAAA,CAAA,EAAIA,CAAQ,CAAA,MAAM,CAAM,CAAA,CAAA,CAAA,EAAE,GACvE,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEOM,EAAQ,CAAA,IAAI8Q,EChInB,CAAA,IAAMC,EAAN,CAAA,KAA0D,CAExD,KAAA,CAAM7Q,CAAkB,CAAA,CACtB,OAAO,CAAE,GAAA,CAAK,EAAI,CAAA,QAAA,CAAU,EAAG,CACjC,CACF,CACOC,CAAAA,EAAAA,CAAQ,IAAI4Q,EAAAA,CCDnB,IAAMC,EAAAA,CAAN,KAA2D,CAGzD,MAAM9iB,CAA+D,CAAA,CACnE,IAAMmS,CAAAA,CAAQnS,CAERoS,CAAAA,CAAAA,CAAQ,IAAIrD,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAE7C,CAAA,GAAIoD,CAAM,CAAA,cAAA,GAAmB,aAAe,CAAA,CAC1C,GAAIA,CAAAA,CAAM,OAAWA,EAAAA,CAAAA,CAAM,OAAQ,CAAA,MAAA,CAAQ,CACzC,IAAME,CAAYF,CAAAA,CAAAA,CAAM,cACpB,CAAA,CAAA,YAAA,EAAeA,CAAM,CAAA,cAAc,CACnC,EAAA,CAAA,CAAA,EAAA,CACEG,GAAQH,CAAM,CAAA,OAAA,EAAW,EAAC,EAC7B,GAAK3W,CAAAA,CAAAA,EAAM4W,CAAM,CAAA,kBAAA,CAAmB,UAAYrM,CAAAA,CAAAA,CAAevK,CAAC,CAAC,CAAC,CAAA,CAClE,IAAK,CAAA,IAAI,EACZ,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG6W,CAAS,CAAA,aAAA,EAAgBC,CAAI,CAAA,CAAA,CAAA,CAAK,QAAU,CAAA,EAAG,CAClE,CACA,OAAO,CAAE,GAAA,CAAK,cAAe,QAAU,CAAA,EAAG,CAC5C,CAEA,GAAIH,CAAM,CAAA,cAAA,GAAmB,QAAU,CAAA,CACrC,GAAIA,CAAAA,CAAM,OAAWA,EAAAA,CAAAA,CAAM,OAAQ,CAAA,MAAA,CAAS,CAAG,CAAA,CAC7C,IAAMI,CAAAA,CAAUJ,CAAM,CAAA,OAAA,EAAW,EAAC,CAC5BK,CAAaL,CAAAA,CAAAA,CAAM,cACrB,CAAA,CAAA,YAAA,EAAeA,CAAM,CAAA,cAAc,CACnC,EAAA,CAAA,CAAA,EAAA,CACEG,EAAOC,CACV,CAAA,GAAA,CAAK/W,CAAM4W,EAAAA,CAAAA,CAAM,kBAAmB,CAAA,UAAA,CAAYrM,CAAevK,CAAAA,CAAC,CAAC,CAAC,CAClE,CAAA,IAAA,CAAK,IAAI,CAAA,CAEZ,OAAK2W,CAAAA,CAAM,eAGJ,CAAE,GAAA,CAAK,CAAGK,EAAAA,CAAU,CAAWF,QAAAA,EAAAA,CAAI,CAAK,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAFnD,CAAA,CAAE,GAAK,CAAA,QAAA,CAAU,QAAU,CAAA,EAAG,CAGzC,CACA,OAAO,CAAE,GAAK,CAAA,QAAA,CAAU,QAAU,CAAA,EAAG,CACvC,CAEA,GAAIH,CAAM,CAAA,cAAA,GAAmB,UAC3B,CAAA,OAAO,CAAE,GAAA,CAAK,UAAY,CAAA,QAAA,CAAU,EAAG,CAGzC,CAAA,GAAIA,CAAM,CAAA,cAAA,GAAmB,MAC3B,CAAA,OAAO,CAAE,GAAA,CAAK,MAAQ,CAAA,QAAA,CAAU,EAAG,CAAA,CAGrC,GAAIA,CAAAA,CAAM,cAAmB,GAAA,SAAA,CAAW,CACtC,GAAIA,CAAM,CAAA,YAAA,GAAiB,MAAW,CAAA,CACpC,IAAMlM,CAAAA,CAAMkM,CAAM,CAAA,YAAA,CAClB,OAAIlM,CAAeiL,YAAAA,CAAAA,CACV,CAAE,GAAA,CAAK,CAAWjL,QAAAA,EAAAA,CAAAA,CAAI,QAAQ,CAAA,CAAA,CAAI,QAAU,CAAA,EAAG,CAAA,CAEpDA,CAAQ,GAAA,MAAA,EAAUA,CAAQ,GAAA,IAAA,CACrB,CAAE,GAAK,CAAA,cAAA,CAAgB,QAAU,CAAA,EAAG,CAAA,CAEzCA,CAAQ,GAAA,MAAA,EAAUA,CAAQ,GAAA,OAAA,CACrB,CAAE,GAAA,CAAK,CAAWA,QAAAA,EAAAA,CAAAA,CAAI,WAAY,EAAC,CAAI,CAAA,CAAA,QAAA,CAAU,EAAG,CAEzD,CAAA,OAAOA,CAAQ,EAAA,QAAA,CACV,CAAE,GAAA,CAAK,CAAYA,SAAAA,EAAAA,CAAG,CAAK,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,EAE1C,CAAE,GAAA,CAAK,CAAWA,QAAAA,EAAAA,CAAG,CAAI,CAAA,CAAA,QAAA,CAAU,EAAG,CAC/C,CACA,OAAO,CAAE,GAAK,CAAA,cAAA,CAAgB,QAAU,CAAA,EAAG,CAC7C,CAEA,GAAIkM,CAAAA,CAAM,cAAmB,GAAA,aAAA,CAAe,CAC1C,GAAI,CAACA,CAAAA,CAAM,OAAW,EAAA,CAACA,CAAM,CAAA,OAAA,CAAQ,MACnC,CAAA,OAAO,CAAE,GAAK,CAAA,EAAA,CAAI,QAAU,CAAA,EAAG,CAAA,CAEjC,IAAMG,CAAAA,CAAOH,CAAM,CAAA,OAAA,CAChB,GAAK3W,CAAAA,CAAAA,EAAM4W,CAAM,CAAA,kBAAA,CAAmB,UAAYrM,CAAAA,CAAAA,CAAevK,CAAC,CAAC,CAAC,CAAA,CAClE,IAAK,CAAA,IAAI,CACZ,CAAA,GAAI,CAAC2W,CAAAA,CAAM,UACT,CAAA,OAAO,CAAE,GAAA,CAAK,EAAI,CAAA,QAAA,CAAU,EAAG,CAAA,CAEjC,IAAMM,CAAAA,CAAWL,CAAM,CAAA,iBAAA,CACrB,UACAD,CAAAA,CAAAA,CAAM,UAAW,CAAA,KACnB,CACMO,CAAAA,CAAAA,CAAUP,CAAM,CAAA,UAAA,CAAW,OAC9B,CAAA,GAAA,CAAK3W,GAAM4W,CAAM,CAAA,kBAAA,CAAmB,UAAYrM,CAAAA,CAAAA,CAAevK,CAAC,CAAC,CAAC,CAAA,CAClE,IAAK,CAAA,IAAI,CAIRlF,CAAAA,CAAAA,CAAM,CAHQ6b,EAAAA,CAAAA,CAAM,cACpB,CAAA,CAAA,YAAA,EAAeA,EAAM,cAAc,CAAA,EAAA,CAAA,CACnC,EACkB,CAAA,aAAA,EAAgBG,CAAI,CAAA,aAAA,EAAgBG,CAAQ,CAAA,CAAA,EAAIC,CAAO,CAAA,CAAA,CAAA,CAC7E,OAAIP,CAAAA,CAAM,QACR7b,GAAAA,CAAAA,EAAO,CAAc6b,WAAAA,EAAAA,CAAAA,CAAM,QAAQ,CAAA,CAAA,CAAA,CAEjCA,CAAM,CAAA,QAAA,GACR7b,CAAO,EAAA,CAAA,WAAA,EAAc6b,CAAM,CAAA,QAAQ,CAE9B,CAAA,CAAA,CAAA,CAAE,GAAA7b,CAAAA,CAAAA,CAAK,QAAU,CAAA,EAAG,CAC7B,CAEA,OAAO,CAAE,GAAK,CAAA,EAAA,CAAI,QAAU,CAAA,EAAG,CACjC,CACF,CAAA,CAEOqc,EAAQ,CAAA,IAAImQ,ECtGnB,CAAA,IAAMC,EAAN,CAAA,KAA4D,CAG1D,KAAM/iB,CAAAA,CAAAA,CAA+D,CACnE,IAAM6S,CAAS7S,CAAAA,CAAAA,CAGT4P,CADQ,CAAA,IAAIb,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CACrB,iBAAkB,CAAA,UAAA,CAAY8D,CAAO,CAAA,KAAK,EAElE,GAAI,CAACA,CAAO,CAAA,QAAA,EAAY,CAACA,CAAAA,CAAO,QAAS,CAAA,MAAA,CACvC,OAAO,CAAE,GAAK,CAAA,CAAA,EAAGjD,CAAS,CAAA,GAAA,CAAA,CAAO,QAAU,CAAA,EAAG,CAAA,CAGhD,IAAMH,CAAAA,CAAY,IAAItP,CAAAA,CACpB,IAAK,CAAA,KAAA,CACL,UACF,CAAA,CAEM2P,CAAkB,CAAA,EAClBC,CAAAA,CAAAA,CAAkB,EAAC,CAEzB,QAAWC,CAAS6C,IAAAA,CAAAA,CAAO,QAAU,CAAA,CACnC,GAAM,CAAE,GAAAvc,CAAAA,CAAAA,CAAK,QAAU2Z,CAAAA,CAAc,CAAIR,CAAAA,CAAAA,CAAU,KAAM,CAAA,CAACO,CAAK,CAAC,EAEhE,GAAIA,CAAAA,CAAM,MAAW,GAAA,YAAA,CAAc,CACjC,IAAM8C,CAAOhD,CAAAA,CAAAA,CAAM,GAAI,EAAA,EAAK,EACtBiD,CAAAA,CAAAA,CAAsBzc,CAG5B,CAAA,GACE,WAAY,CAAA,IAAA,CAAKyc,CAAmB,CACpC,EAAA,OAAA,CAAQ,IAAKA,CAAAA,CAAmB,CAChC,EAAA,UAAA,CAAW,IAAKA,CAAAA,CAAmB,CACnC,CAAA,CACA,IAAIC,CAAAA,CAAW,CAAGF,EAAAA,CAAI,CAAIC,CAAAA,EAAAA,CAAmB,CAAG,CAAA,CAAA,IAAA,EAChDC,CAAAA,CAAAA,CAAWA,CAAS,CAAA,OAAA,CAClB,gDACA,CAAA,aACF,CACAlD,CAAAA,CAAAA,CAAM,IAAKkD,CAAAA,CAAQ,CACnBjD,CAAAA,CAAAA,CAAS,IAAK,CAAA,GAAGE,CAAa,CAC9B,CAAA,QACF,CAEAH,CAAAA,CAAM,IAAKgD,CAAAA,CAAI,CACfhD,CAAAA,CAAAA,CAAM,IAAKiD,CAAAA,CAAmB,CAC9BhD,CAAAA,CAAAA,CAAS,IAAK,CAAA,GAAGE,CAAa,CAAA,CAC9B,QACF,CAEAH,CAAAA,CAAM,IAAKxZ,CAAAA,CAAG,CACdyZ,CAAAA,CAAAA,CAAS,IAAK,CAAA,GAAGE,CAAa,EAChC,CAEA,IAAA,IAAW3P,CAAcuS,IAAAA,CAAAA,CAAO,gBAAkB,CAAA,CAChD,GAAM,CAAE,GAAA,CAAAvc,CAAK,CAAA,QAAA,CAAU2c,CAAmB,CAAA,CAAIxD,CAAU,CAAA,KAAA,CAAM,CAC5DnP,CACF,CAAC,CAAA,CAEDwP,CAAM,CAAA,IAAA,CAAKxZ,CAAG,CAAA,CACdyZ,CAAS,CAAA,IAAA,CAAK,GAAGkD,CAAkB,EACrC,CAEA,IAAMC,CAAAA,CAAapD,CAAM,CAAA,IAAA,CAAK,IAAI,CAAA,CAGlC,OAAO,CAAE,GADQ,CAAA,CAAA,EADG+C,EAAO,WAAc,CAAA,gBAAA,CAAmB,EAC7B,CAAA,EAAGjD,CAAS,CAAA,EAAA,EAAKsD,CAAU,CAAA,CAAA,CAAA,CAClC,QAAAnD,CAAAA,CAAS,CACnC,CACF,CAEOoD,CAAAA,EAAAA,CAAQ,IAAI4P,EAAAA,CCtEnB,IAAMC,EAAN,CAAA,KAAuD,CAGrD,KAAA,CAAMhjB,CAA+D,CAAA,CACnE,IAAMqT,CAAAA,CAAarT,CAEnB,CAAA,OACEqT,CAAW,CAAA,UAAA,EACX,OAAOA,CAAAA,CAAW,QAAS,CAAA,KAAA,EAAU,SAE9B,CACL,GAAA,CAAKA,CAAW,CAAA,QAAA,CAAS,KACzB,CAAA,QAAA,CAAU,EACZ,CAOK,CAAA,CACL,GALqB,CAAA,IAAItE,CACzB,CAAA,IAAA,CAAK,KACP,CAAA,CAAE,yBAA0B,CAAA,UAAA,CAAYsE,CAAW,CAAA,QAAoB,CAIrE,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CAEOC,CAAAA,EAAAA,CAAQ,IAAI0P,EAAAA,CC9BnB,IAAMC,EAAAA,CAAN,KAAyD,CAGvD,KAAA,CAAMjR,CAAgE,CAAA,CACpE,OAAO,CACL,GAAK,CAAA,EAAA,CACL,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEOwB,EAAQ,CAAA,IAAIyP,GCTnB,IAAMC,EAAAA,CAAN,KAA2D,CAGzD,KAAMljB,CAAAA,CAAAA,CAA+D,CAOnE,OAAO,CACL,GAAA,CAAK,CAPgBA,CAAAA,EAAAA,CAAAA,CACQ,OAC5B,CAAA,GAAA,CAAK8F,CACJ,EAAA,IAAIiJ,EAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CAAmB,UAAYjJ,CAAAA,CAAG,CACrE,CAAA,CACC,IAAK,CAAA,IAAI,CAEM,CAAA,CAAA,CAAA,CAChB,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEO4N,EAAQ,CAAA,IAAIwP,EClBnB,CAAA,IAAMC,EAAN,CAAA,KAAoD,CAElD,KAAA,CAAMnjB,CAAiB,CAAA,CACrB,IAAMyR,CAAAA,CAAKzR,CAEL4T,CAAAA,CAAAA,CADQ,IAAI7E,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CACtB,iBAAkB,CAAA,UAAA,CAAY0C,CAAG,CAAA,KAAK,CAE7D,CAAA,OAAO,CAAE,GAAA,CAAK,CADCA,EAAAA,CAAAA,CAAG,QAAW,CAAA,YAAA,CAAe,EACrB,CAAGmC,EAAAA,CAAQ,CAAI,CAAA,CAAA,QAAA,CAAU,EAAG,CACrD,CACF,CACOC,CAAAA,EAAAA,CAAQ,IAAIsP,EAAAA,CCXnB,IAAMC,EAAAA,CAAN,KAAgE,CAE9D,MAAMpjB,CAAiB,CAAA,CACrB,IAAM/F,CAAAA,CAAM+F,CAEZ,CAAA,OAAO,CACL,GAAA,CAAK,CAFa/F,EAAAA,CAAAA,CAAI,WAAc,CAAA,gBAAA,CAAmB,EAEpC,CAAA,CAAA,EAAIA,CAAI,CAAA,aAAa,CACxC,CAAA,CAAA,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CACO8Z,CAAAA,EAAAA,CAAQ,IAAIqP,EAAAA,CCRnB,IAAMC,EAAAA,CAAN,KAAqD,CAGnD,KAAMrjB,CAAAA,CAAAA,CAA+D,CACnE,IAAMwP,CAAAA,CAAWxP,CAEjB,CAAA,GAAI,OAAOwP,CAAAA,CAAS,KAAU,EAAA,QAAA,CAAU,CACtC,IAAMyE,CAAmB,CAAA,IAAIlF,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAExD,OAAIS,CAAS,CAAA,KAAA,EAASA,CAAS,CAAA,KAAA,CAAM,MAAS,CAAA,CAAA,CAMrC,CACL,GAAA,CAAK,CANUyE,EAAAA,CAAAA,CAAiB,iBAChC,CAAA,UAAA,CACAzE,CAAS,CAAA,KACX,CAGkB,CAAA,KAAA,EAAQA,EAAS,KAAK,CAAA,CAAA,CAAA,CACtC,QAAU,CAAA,EACZ,CAAA,CAQK,CAAE,GAAA,CALQyE,CAAiB,CAAA,iBAAA,CAChC,UACAzE,CAAAA,CAAAA,CAAS,KACX,CAAA,CAEwB,QAAU,CAAA,EAAG,CACvC,CAEA,IAAM0E,CAAgB,CAAA,KAAA,CAAM,OAAQ1E,CAAAA,CAAAA,CAAS,KAAK,CAAA,CAC9CA,CAAS,CAAA,KAAA,CACT,CAACA,CAAAA,CAAS,KAAK,CAAA,CAMb1Z,EAJY,IAAIqK,CAAAA,CACpB,IAAK,CAAA,KAAA,CACL,UACF,CAAA,CACyB,KAAM+T,CAAAA,CAAa,CAEtCC,CAAAA,CAAAA,CACJ3E,CAAS,CAAA,KAAA,EAASA,CAAS,CAAA,KAAA,CAAM,MAAS,CAAA,CAAA,KAAA,EAAQA,EAAS,KAAK,CAAA,CAAA,CAAA,CAAM,EAExE,CAAA,OAAO,CACL,GAAA,CAAK,CAAI1Z,CAAAA,EAAAA,CAAAA,CAAO,GAAG,CAAA,CAAA,EAAIqe,CAAQ,CAAA,CAAA,CAC/B,QAAUre,CAAAA,CAAAA,CAAO,QACnB,CACF,CACF,CAEOse,CAAAA,EAAAA,CAAQ,IAAIiP,EAAAA,CClDnB,IAAMC,EAAAA,CAAN,KAAwD,CAGtD,KAAMtjB,CAAAA,CAAAA,CAA+D,CACnE,IAAMsU,CAActU,CAAAA,CAAAA,CACpB,OAAIsU,CAAAA,CAAY,UACP,CAAA,CACL,GAAKA,CAAAA,CAAAA,CAAY,MACjB,CAAA,QAAA,CAAU,EACZ,CAQK,CAAA,CACL,GANgB,CAAA,IAAIvF,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,mBACjD,UACAuF,CAAAA,CAAAA,CAAY,MACd,CAAA,CAIE,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEOC,EAAQ,CAAA,IAAI+O,ECxBnB,CAAA,IAAMC,EAAN,CAAA,KAAuD,CAGrD,KAAMvjB,CAAAA,CAAAA,CAA+D,CACnE,IAAMyU,CAAazU,CAAAA,CAAAA,CACnB,GAAIyU,CAAAA,CAAW,UACb,CAAA,OAAO,CACL,GAAA,CAAKA,CAAW,CAAA,MAAA,CAChB,QAAUA,CAAAA,CAAAA,CAAW,KACvB,CAGF,CAAA,IAAMC,CAAMD,CAAAA,CAAAA,CAAW,cACnBne,CAAAA,CAAAA,CAAM,EACNyZ,CAAAA,CAAAA,CAAkB,EAAC,CAUvB,GAPE,EAAE0E,CAAW,CAAA,KAAA,YAAiBpT,CAC9B,CAAA,EAAA,CAAC,KAAM,CAAA,OAAA,CAAQoT,CAAW,CAAA,KAAK,CAE/Bne,GAAAA,CAAAA,CAAM,CAAG,EAAA,IAAIyY,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBAAmB,CAAA,UAAA,CAAY0F,CAAW,CAAA,MAAM,CAAC,CAAIA,CAAAA,EAAAA,CAAAA,CAAW,QAAQ,CAAA,EAAA,EAAKC,CAAG,CAAA,CAAA,CAC1H3E,CAAW,CAAA,CAAC0E,CAAW,CAAA,KAAK,CAG1B,CAAA,CAAA,KAAA,CAAM,OAAQA,CAAAA,CAAAA,CAAW,KAAK,CAAA,CAAG,CACnC,IAAME,CAAAA,CAAeF,CAAW,CAAA,KAAA,CAC7B,GAAI,CAAA,CAACnF,CAAG/P,CAAAA,CAAAA,GAAM,CAAImV,CAAAA,EAAAA,CAAAA,CAAMnV,CAAC,CAAA,CAAE,CAC3B,CAAA,IAAA,CAAK,IAAI,CAAA,CAEZjJ,EAAM,CAAG,EAAA,IAAIyY,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBAAmB,CAAA,UAAA,CAAY0F,CAAW,CAAA,MAAM,CAAC,CAAA,CAAA,EAAIA,CAAW,CAAA,QAAQ,CAAKE,EAAAA,EAAAA,CAAY,CACnI5E,CAAAA,CAAAA,CAAAA,CAAAA,CAAW0E,CAAW,CAAA,MACxB,CAEA,OAAIA,CAAW,CAAA,SAAA,GACbne,CAAM,CAAA,CAAA,KAAA,EAAQA,CAAG,CAAA,CAAA,CAAA,CAAA,CAGZ,CAAE,GAAA,CAAKA,CAAI,CAAA,IAAA,GAAQ,QAAAyZ,CAAAA,CAAS,CACrC,CACF,CAEO6E,CAAAA,EAAAA,CAAQ,IAAI2O,EAAAA,CC1CnB,IAAMC,EAAAA,CAAN,KAAsD,CAEpD,KAAMxjB,CAAAA,CAAAA,CAAiB,CACrB,IAAM8U,EAAK9U,CAEL4T,CAAAA,CAAAA,CADQ,IAAI7E,CAAAA,CAAiB,IAAK,CAAA,KAAK,CACtB,CAAA,iBAAA,CAAkB,UAAY+F,CAAAA,CAAAA,CAAG,KAAK,CAAA,CACvDxC,CAAOwC,CAAAA,CAAAA,CAAG,OAAQ,CAAA,GAAA,CAAKtZ,GAAM,CAAIA,CAAAA,EAAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,IAAK,CAAA,IAAI,CAEtD,CAAA,OAAO,CACL,GAAA,CAAK,CAFQsZ,EAAAA,CAAAA,CAAG,MAAS,CAAA,SAAA,CAAY,EAEvB,CAAA,CAAA,EAAKA,CAAG,CAAA,SAAS,CAASlB,KAAAA,EAAAA,CAAQ,CAAKtB,EAAAA,EAAAA,CAAI,CACzD,CAAA,CAAA,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CACOyC,CAAAA,EAAAA,CAAQ,IAAIyO,EAAAA,CCfnB,IAAMC,EAAN,CAAA,KAA0D,CAExD,KAAA,CAAMzjB,CAAiB,CAAA,CACrB,IAAMiV,CAAAA,CAAKjV,CACX,CAAA,OAAO,CACL,GAAA,CAAK,CAAIiV,CAAAA,EAAAA,CAAAA,CAAG,SAAS,CAAA,EAAA,EAAKA,EAAG,OAAU,CAAA,SAAA,CAAY,EAAE,CAAA,CAAA,CACrD,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CACOC,EAAQ,CAAA,IAAIuO,ECPnB,CAAA,IAAMC,EAAN,CAAA,KAAuD,CAGrD,KAAM1jB,CAAAA,CAAAA,CAA+D,CACnE,IAAMoV,CAAapV,CAAAA,CAAAA,CACnB,GAAIoV,CAAAA,CAAW,UACb,CAAA,OAAO,CACL,GAAA,CAAKA,CAAW,CAAA,QAAA,CAAS,KACzB,CAAA,QAAA,CAAU,EACZ,CAGF,CAAA,IAAMnB,CAAmB,CAAA,IAAIlF,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAClDsG,CAAiBpB,CAAAA,CAAAA,CAAiB,yBACtC,CAAA,UAAA,CACAmB,CAAW,CAAA,QACb,EAEA,GAAI,CAACA,CAAW,CAAA,OAAA,CAAQ,MACtB,CAAA,OAAO,CACL,GAAA,CAAKC,CACL,CAAA,QAAA,CAAU,EACZ,CAGF,CAAA,IAAMC,CAAcF,CAAAA,CAAAA,CAAW,QAAQ,CAAC,CAAA,CAClC/Z,CAAU,CAAA,MAAA,CAAO,IAAKia,CAAAA,CAAW,CACvC,CAAA,GAAI,CAACja,CAAAA,CAAQ,MACX,CAAA,OAAO,CACL,GAAA,CAAKga,CACL,CAAA,QAAA,CAAU,EACZ,CAAA,CAGF,IAAME,CAAAA,CAAmBla,CACtB,CAAA,GAAA,CAAKE,CAAW0Y,EAAAA,CAAAA,CAAiB,kBAAmB,CAAA,UAAA,CAAY1Y,CAAM,CAAC,CACvE,CAAA,IAAA,CAAK,IAAI,CAAA,CAENia,CAAmB,CAAA,EACnBC,CAAAA,CAAAA,CAA0B,EAAC,CAC7BC,CAAaN,CAAAA,CAAAA,CAAW,cAE5B,CAAA,IAAA,IAAWvZ,CAAUuZ,IAAAA,CAAAA,CAAW,OAAS,CAAA,CACvC,IAAMO,CAAAA,CAAeta,EAAQ,GAAKE,CAAAA,CAAAA,EAAWM,CAAON,CAAAA,CAAM,CAAC,CAAA,CAErDoZ,CAAyB,CAAA,EAC/B,CAAA,IAAA,IAASpV,CAAI,CAAA,CAAA,CAAGA,CAAIlE,CAAAA,CAAAA,CAAQ,MAAQkE,CAAAA,CAAAA,EAAAA,CAAK,CACvC,IAAMvM,CAAAA,CAAQ2iB,CAAapW,CAAAA,CAAC,CAExBvM,CAAAA,CAAAA,YAAiBke,CACnByD,CAAAA,CAAAA,CAAa,IAAK3hB,CAAAA,CAAAA,CAAM,QAAQ,CAAA,EAEhCwiB,CAAU,CAAA,IAAA,CAAKxiB,CAAK,CAAA,CACpB2hB,EAAa,IAAK,CAAA,CAAA,CAAA,EAAIe,CAAY,EAAA,CAAA,EAAG,IAAK,CAAA,cAAA,CAAe1iB,CAAK,CAAC,CAAE,CAAA,CAAA,EAErE,CAEAyiB,CAAAA,CAAc,IAAK,CAAA,CAAA,CAAA,EAAId,CAAa,CAAA,IAAA,CAAK,IAAI,CAAC,CAAG,CAAA,CAAA,EACnD,CAEA,IAAIre,CAAM,CAAA,CAAA,EAAG+e,CAAc,CAAA,EAAA,EAAKE,CAAgB,CAAA,SAAA,EAAYE,CAAc,CAAA,IAAA,CAAK,IAAI,CAAC,GAEpF,GAAI,CAACL,CAAW,CAAA,gBAAA,CACd,GAAIA,CAAAA,CAAW,SAAaA,EAAAA,CAAAA,CAAW,SAAU,CAAA,MAAA,CAAQ,CACvD,IAAMQ,CAAgBR,CAAAA,CAAAA,CAAW,SAC9B,CAAA,GAAA,CAAK7Z,GACJ0Y,CAAiB,CAAA,kBAAA,CAAmB,UAAY1Y,CAAAA,CAAM,CACxD,CAAA,CACC,IAAK,CAAA,IAAI,CACZjF,CAAAA,CAAAA,EAAO,CAAcsf,WAAAA,EAAAA,CAAa,CACpC,EAAA,CAAA,KACEtf,CAAO,EAAA,cAAA,CAIX,OAAO,CACL,GAAA,CAAAA,CACA,CAAA,QAAA,CAAUkf,CACZ,CACF,CAEQ,cAAA,CAAexiB,CAAoB,CAAA,CACzC,IAAI2wB,CAAAA,CAAW,EACf,CAAA,OAAI,MAAO,CAAA,QAAA,CAAS3wB,CAAK,CAAA,CACvB2wB,CAAW,CAAA,SAAA,CACF,KAAM,CAAA,OAAA,CAAQ3wB,CAAK,CAAA,CAC5B2wB,CAAW,CAAA,SAAA,CAEX,OAAO3wB,CAAAA,EAAU,QACjBA,EAAAA,CAAAA,GAAU,IACV,EAAA,EAAEA,aAAiB,IAEnB2wB,CAAAA,CAAAA,CAAAA,CAAW,SACF,CAAA,OAAO3wB,CAAU,EAAA,SAAA,CAC1B2wB,CAAW,CAAA,WAAA,CACF,OAAO3wB,CAAAA,EAAU,QAC1B2wB,GAAAA,CAAAA,CAAW,UAGNA,CAAAA,CAAAA,CACT,CACF,CAAA,CAEO3N,GAAQ,IAAI0N,EAAAA,CCxGnB,IAAME,EAAAA,CAAN,KAAqD,CAGnD,KAAM5jB,CAAAA,CAAAA,CAA+D,CACnE,IAAMkW,CAAWlW,CAAAA,CAAAA,CACjB,GAAIkW,CAAAA,CAAS,UACX,CAAA,OAAO,CACL,GAAKA,CAAAA,CAAAA,CAAS,KACd,CAAA,QAAA,CAAU,EACZ,CAGF,CAAA,IAAM9D,CAAQ,CAAA,IAAIrD,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAEzCoH,CAAgBD,CAAAA,CAAAA,CAAS,IACxBC,CAAAA,CAAAA,CAAc,QAAS,CAAA,GAAG,CAC7BA,GAAAA,CAAAA,CAAgB,CAAGD,EAAAA,CAAAA,CAAS,KAAK,CAAA,CAAA,EAAIC,CAAa,CAAA,CAAA,CAAA,CAGpD,IAAIC,CAAAA,CAAiBF,CAAS,CAAA,KAAA,CACzBE,EAAe,QAAS,CAAA,GAAG,CAC9BA,GAAAA,CAAAA,CAAiB,CAAG,EAAA,IAAA,CAAK,KAAM,CAAA,KAAK,CAAIA,CAAAA,EAAAA,CAAc,CAGxD,CAAA,CAAA,CAAA,IAAMC,CAAUjE,CAAAA,CAAAA,CAAM,kBAAmB,CAAA,UAAA,CAAY+D,CAAa,CAC5DG,CAAAA,CAAAA,CAAWlE,CAAM,CAAA,kBAAA,CAAmB,UAAYgE,CAAAA,CAAc,CAIpE,CAAA,OAAO,CAAE,GAAA,CADG,CAFKhE,EAAAA,CAAAA,CAAM,iBAAkB,CAAA,UAAA,CAAY8D,CAAS,CAAA,KAAK,CAE5C,CAAOG,IAAAA,EAAAA,CAAO,CAAIH,CAAAA,EAAAA,CAAAA,CAAS,EAAI,EAAA,QAAQ,CAAII,CAAAA,EAAAA,CAAQ,CAC5D,CAAA,CAAA,QAAA,CAAU,EAAG,CAC7B,CACF,CAEOC,CAAAA,EAAAA,CAAQ,IAAIqN,EAAAA,CClCnB,IAAMC,EAAAA,CAAN,KAAsD,CAGpD,KAAM7jB,CAAAA,CAAAA,CAA+D,CACnE,IAAMyW,CAAYzW,CAAAA,CAAAA,CAGlB,OAAO,CACL,GAAK,CAAA,CAAA,CAAA,EAFKyW,EAAU,cAER,CAAA,CAAA,CACZ,QAAU,CAAA,CAACA,CAAU,CAAA,KAAK,CAC5B,CACF,CACF,CAAA,CAEOC,EAAQ,CAAA,IAAImN,ECfnB,CAAA,IAAM3G,EAAwC,CAAA,CAC5C,WAAY,YACZ,CAAA,SAAA,CAAW,WACX,CAAA,iBAAA,CAAmB,mBACnB,CAAA,aAAA,CAAe,eACjB,CAAA,CAEa4G,EAAN,CAAA,KAAqD,CAG1D,KAAA,CAAM9jB,CAAmD,CAAA,CACvD,IAAMod,CAAAA,CAAWpd,EACb1J,CAAM4mB,CAAAA,EAAAA,CAAcE,CAAS,CAAA,QAAQ,CAAK,EAAA,YAAA,CAC9C,OAAIA,CAAAA,CAAS,UACX9mB,GAAAA,CAAAA,EAAO,cAGL8mB,CAAAA,CAAAA,CAAAA,CAAS,MACX9mB,GAAAA,CAAAA,EAAO,SAEF,CAAA,CAAA,CACL,GAAAA,CAAAA,CAAAA,CACA,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEOsgB,EAAQ,CAAA,IAAIkN,EC1BnB,CAAA,IAAMC,EAAN,CAAA,KAAuD,CAGrD,KAAA,CAAM/jB,EAA+D,CACnE,IAAM8W,CAAa9W,CAAAA,CAAAA,CAGnB,OAAO,CACL,GAAK,CAAA,CAAA,CAAA,EAFK8W,CAAW,CAAA,cAET,CACZ,CAAA,CAAA,QAAA,CAAU,CAACA,CAAAA,CAAW,MAAM,CAC9B,CACF,CACF,CAAA,CAEOC,EAAQ,CAAA,IAAIgN,ECbnB,CAAA,IAAMC,EAAN,CAAA,KAA4D,CAG1D,KAAA,CAAMhkB,CAA+D,CAAA,CACnE,IAAMiX,CAAAA,CAAkBjX,CAExB,CAAA,GAAIiX,EAAgB,UAClB,CAAA,OAAO,CACL,GAAA,CAAKA,CAAgB,CAAA,KAAA,CACrB,QAAU,CAAA,EACZ,CAAA,CAGF,IAAMhD,CAAAA,CAAmB,IAAIlF,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAClD6R,CAAAA,CAAAA,CAA2B3J,CAAgB,CAAA,eAAA,CAC9C,GAAK1b,CAAAA,CAAAA,EAAW0Y,CAAiB,CAAA,kBAAA,CAAmB,UAAY1Y,CAAAA,CAAM,CAAC,CAAA,CACvE,IAAK,CAAA,IAAI,CAEZ,CAAA,GAAI0b,EAAgB,IAAS,GAAA,QAAA,CAC3B,OAAO,CACL,GAAK,CAAA,CAAA,aAAA,EAAgB2J,CAAwB,CAAA,YAAA,CAAA,CAC7C,QAAU,CAAA,EACZ,CAAA,CAGF,IAAMC,CAAAA,CAAY5J,CAAgB,CAAA,eAAA,CAC/B,IACE1b,CACC,EAAA,CAAA,EAAG0Y,CAAiB,CAAA,kBAAA,CAAmB,UAAY1Y,CAAAA,CAAM,CAAC,CAAA,YAAA,EAAe0Y,CAAiB,CAAA,kBAAA,CAAmB,UAAY1Y,CAAAA,CAAM,CAAC,CAAA,CACpI,CACC,CAAA,IAAA,CAAK,IAAI,CAERjF,CAAAA,CAAAA,CAAM,CAAgBsqB,aAAAA,EAAAA,CAAwB,CAAmBC,gBAAAA,EAAAA,CAAS,CAE9E,CAAA,CAAA,GAAI5J,CAAgB,CAAA,SAAA,EAAaA,CAAgB,CAAA,SAAA,CAAU,MAAQ,CAAA,CACjE,IAAMrB,CAAAA,CAAgBqB,CAAgB,CAAA,SAAA,CACnC,GAAK1b,CAAAA,CAAAA,EACJ0Y,CAAiB,CAAA,kBAAA,CAAmB,UAAY1Y,CAAAA,CAAM,CACxD,CAAA,CACC,IAAK,CAAA,IAAI,CACZjF,CAAAA,CAAAA,EAAO,CAAcsf,WAAAA,EAAAA,CAAa,GACpC,CACEtf,KAAAA,CAAAA,EAAO,cAGT,CAAA,OAAO,CACL,GAAA,CAAAA,CACA,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CAEO4gB,CAAAA,EAAAA,CAAQ,IAAI8M,EAAAA,CCpDnB,IAAMC,EAAN,CAAA,KAAwD,CAGtD,KAAA,CAAMjkB,CAA+D,CAAA,CACnE,IAAMoX,CAAAA,CAAcpX,CACpB,CAAA,GAAIoX,CAAY,CAAA,UAAA,CACd,OAAO,CACL,GAAKA,CAAAA,CAAAA,CAAY,OACjB,QAAU,CAAA,EACZ,CAAA,CAGF,IAAMC,CAAAA,CAAY,IAAItI,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CACjD,UACAqI,CAAAA,CAAAA,CAAY,MACd,CAAA,CACME,EAAeF,CAAY,CAAA,SAAA,CAAU,WAAY,EAAA,CAEvD,OAAO,CACL,GAAK,CAAA,CAAA,EAAGC,CAAS,CAAA,CAAA,EAAIC,CAAY,CAAA,CAAA,CACjC,QAAU,CAAA,EACZ,CACF,CACF,CAEOC,CAAAA,EAAAA,CAAQ,IAAI0M,EAAAA,CC3BnB,IAAMC,EAAAA,CAAN,KAAoD,CAGlD,KAAMlkB,CAAAA,CAAAA,CAAmD,CAEvD,OAAO,CACL,GAAA,CAFcA,CAED,CAAA,QAAA,CACb,SAAU,EACZ,CACF,CACF,CAEOyX,CAAAA,EAAAA,CAAQ,IAAIyM,EAAAA,CCXnB,IAAMC,EAAAA,CAAN,KAA+D,CAG7D,KAAMnS,CAAAA,CAAAA,CAAgE,CAmBpE,OAAO,CAAE,GAhBG,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yGAAA,EAFCA,EACM,KAeyF,CAAA;AAAA,iCAAA,CAAA,CAE9F,SAAU,EAAG,CAC7B,CACF,CAAA,CAEO2F,GAAQ,IAAIwM,EAAAA,CC1BnB,IAAMC,EAAAA,CAAN,KAA0D,CAGxD,KAAA,CAAMpS,EAAgE,CAuBpE,OAAO,CAAE,GApBG,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAFCA,EACM,KAiBK,CAAA;AAAA;AAAA;AAAA,iCAAA,CAAA,CAIV,SAAU,EAAG,CAC7B,CACF,CAAA,CAEO6F,GAAQ,IAAIuM,EAAAA,CC9BnB,IAAMC,EAAAA,CAAN,KAA+D,CAG7D,KAAA,CAAMrS,EAAgE,CAWpE,OAAO,CAAE,GARG,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yGAAA,EAFCA,EACM,KAOyF,CAAA;AAAA,iCAAA,CAAA,CAE9F,SAAU,EAAG,CAC7B,CACF,CAAA,CAEO+F,GAAQ,IAAIsM,EAAAA,CClBnB,IAAMC,EAAAA,CAAN,KAA0D,CAGxD,KAAA,CAAMtS,EAAgE,CAcpE,OAAO,CAAE,GAXG,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAA,EAFCA,EACM,KAUI,CAAA;AAAA,yBAET,CAAA,CAAA,QAAA,CAAU,EAAG,CAC7B,CACF,EAEOiG,EAAQ,CAAA,IAAIqM,ECnBnB,CAAA,IAAMC,EAAN,CAAA,KAAuD,CAGrD,KAAMvkB,CAAAA,CAAAA,CAA+D,CACnE,IAAMmY,CAAanY,CAAAA,CAAAA,CACnB,GAAImY,CAAAA,CAAW,UACb,CAAA,OAAO,CACL,GAAA,CAAKA,CAAW,CAAA,MAAA,CAChB,SAAU,EACZ,CAGF,CAAA,IAAMC,CAAe,CAAA,IAAA,CAAK,YACxBD,CAAAA,CAAAA,CAAW,MACXA,CAAAA,CAAAA,CAAW,WACb,CAAA,CACMhE,CAAW,CAAA,IAAA,CAAK,YAAYgE,CAAW,CAAA,KAAK,CAClD,CAAA,OAAO,CACL,GAAA,CAAK,CAAGC,EAAAA,CAAAA,CAAa,GAAG,CAAA,EAAGjE,CAAQ,CAAA,CAAA,CACnC,QAAUiE,CAAAA,CAAAA,CAAa,QACzB,CACF,CAEQ,YACN7c,CAAAA,CAAAA,CACA8c,CAC8C,CAAA,CAC9C,GAAI,OAAO9c,CAAAA,EAAW,QAAU,CAAA,CAC9B,IAAMuK,CAAAA,CAAM,IAAIiJ,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBAC3C,CAAA,UAAA,CACAxT,CACF,CAAA,CACIjF,CAAMwP,CAAAA,CAAAA,CACV,OAAIuS,CAAAA,GACF/hB,CAAM,CAAA,CAAA,EAAG+hB,EAAY,WAAY,EAAC,CAAIvS,CAAAA,EAAAA,CAAG,CAEpC,CAAA,CAAA,CAAA,CAAA,CACL,GAAAxP,CAAAA,CAAAA,CACA,QAAU,CAAA,EACZ,CACF,CAEA,GAAI,MAAM,OAAQiF,CAAAA,CAAM,CAAKA,EAAAA,CAAAA,CAAO,MAAS,CAAA,CAAA,CAAG,CAK9C,IAAMzF,CAJY,CAAA,IAAIqK,CACpB,CAAA,IAAA,CAAK,KACL,CAAA,UACF,EACyB,KAAM5E,CAAAA,CAAM,CACjCjF,CAAAA,CAAAA,CAAM,CAAIR,CAAAA,EAAAA,CAAAA,CAAO,GAAG,CACxB,CAAA,CAAA,CAAA,OAAIuiB,CACF/hB,GAAAA,CAAAA,CAAM,CAAG+hB,EAAAA,CAAAA,CAAY,aAAa,CAAA,EAAG/hB,CAAG,CAAA,CAAA,CAAA,CAEnC,CACL,GAAA,CAAAA,CACA,CAAA,QAAA,CAAUR,CAAO,CAAA,QACnB,CACF,CAEA,GAAI,CAAC,MAAM,OAAQyF,CAAAA,CAAM,CAAG,CAAA,CAK1B,IAAMzF,CAAAA,CAJY,IAAIqK,CAAAA,CACpB,IAAK,CAAA,KAAA,CACL,UACF,CAAA,CACyB,KAAM,CAAA,CAAC5E,CAAM,CAAC,CAAA,CACnCjF,CAAM,CAAA,CAAA,CAAA,EAAIR,CAAO,CAAA,GAAG,CACxB,CAAA,CAAA,CAAA,OAAIuiB,CACF/hB,GAAAA,CAAAA,CAAM,CAAG+hB,EAAAA,CAAAA,CAAY,WAAY,EAAC,GAAG/hB,CAAG,CAAA,CAAA,CAAA,CAEnC,CACL,GAAA,CAAAA,CACA,CAAA,QAAA,CAAUR,EAAO,QACnB,CACF,CA0BA,OAAO,CACL,GAAA,CAzBuByF,EAAO,GAAKuK,CAAAA,CAAAA,EAAQ,CAC3C,GAAI,OAAOA,CAAAA,EAAQ,QAAU,CAAA,CAC3B,IAAMwS,CAAAA,CAAY,IAAIvJ,CAAAA,CAAiB,IAAK,CAAA,KAAK,EAAE,kBACjD,CAAA,UAAA,CACAjJ,CACF,CAAA,CACA,OAAIuS,CAAAA,CACK,CAAGA,EAAAA,CAAAA,CAAY,WAAY,EAAC,CAAIC,CAAAA,EAAAA,CAAS,CAE3CA,CAAAA,CAAAA,CAAAA,CACT,CAOA,IAAIhiB,CAAAA,CAAM,CALQ,CAAA,EAAA,IAAI6J,CACpB,CAAA,IAAA,CAAK,KACL,CAAA,UACF,CACyB,CAAA,KAAA,CAAM,CAAC2F,CAAG,CAAC,CAAA,CACf,GAAG,CACxB,CAAA,CAAA,CAAA,OAAIuS,CACF/hB,GAAAA,CAAAA,CAAM,CAAG+hB,EAAAA,CAAAA,CAAY,aAAa,CAAA,EAAG/hB,CAAG,CAAA,CAAA,CAAA,CAEnCA,CACT,CAAC,EAGuB,IAAK,CAAA,IAAI,CAC/B,CAAA,QAAA,CAAU,EACZ,CACF,CAEQ,WAAY4Y,CAAAA,CAAAA,CAAwB,CAC1C,OAAIA,CAASA,EAAAA,CAAAA,CAAM,OAAS,CACnB,CAAA,CAAA,KAAA,EAAQA,CAAK,CAAA,CAAA,CAAA,CAEf,EACT,CACF,CAEOqJ,CAAAA,EAAAA,CAAQ,IAAIgM,EAAAA,CChHnB,IAAMC,EAAAA,CAAN,KAAyD,CAGvD,MAAMxkB,CAA+D,CAAA,CACnE,IAAMyY,CAAAA,CAAezY,CAErB,CAAA,OAAIyY,CAAa,CAAA,UAAA,EAAc,OAAOA,CAAAA,CAAa,QAAa,EAAA,QAAA,CACvD,CACL,GAAA,CAAKA,EAAa,QAClB,CAAA,QAAA,CAAU,EACZ,CAOK,CAAA,CACL,IALqB,IAAI1J,CAAAA,CACzB,IAAK,CAAA,KACP,CAAE,CAAA,yBAAA,CAA0B,WAAY0J,CAAa,CAAA,QAAoB,CAIvE,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CAEOC,CAAAA,EAAAA,CAAQ,IAAI8L,EAAAA,CC1BnB,IAAMC,EAAAA,CAAN,KAAsD,CAGpD,KAAA,CAAMzkB,CAA+D,CAAA,CACnE,IAAM4Y,CAAAA,CAAY5Y,CACZ6Y,CAAAA,CAAAA,CAAS,IAAI1Y,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,UAAU,CAAA,CAC7C2Y,EAAQ,KAAM,CAAA,OAAA,CAAQF,CAAU,CAAA,KAAK,CACvCA,CAAAA,CAAAA,CAAU,KACV,CAAA,CAACA,CAAU,CAAA,KAAK,CAEd1Y,CAAAA,CAAAA,CACJ,OAAO0Y,CAAAA,CAAU,OAAU,QACvB,CAAA,CAAE,GAAKA,CAAAA,CAAAA,CAAU,KAAO,CAAA,QAAA,CAAU,EAAG,CAAA,CACrCC,CAAO,CAAA,KAAA,CACLC,CAAM,CAAA,MAAA,CAAO,OAAO,CACpBF,CAAAA,CAAAA,CAAU,cACZ,CAAA,CAEN,OAAO,CACL,GAAK1Y,CAAAA,CAAAA,CAAI,GACT,CAAA,QAAA,CAAUA,CAAI,CAAA,QAChB,CACF,CACF,EAEO6Y,EAAQ,CAAA,IAAI0L,ECtBnB,CAAA,IAAMC,EAAN,CAAA,KAAuD,CAGrD,KAAA,CAAM1kB,CAA+D,CAAA,CACnE,IAAMiZ,CAAAA,CAAajZ,CACnB,CAAA,GAAIiZ,EAAW,UAAc,EAAA,OAAOA,CAAW,CAAA,QAAA,EAAa,QAC1D,CAAA,OAAO,CACL,GAAA,CAAKA,CAAW,CAAA,QAAA,CAChB,QAAUA,CAAAA,CAAAA,CAAW,MACvB,CAAA,CAGF,IAAMhF,CAAmB,CAAA,IAAIlF,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAClDsG,CAAiBpB,CAAAA,CAAAA,CAAiB,yBACtC,CAAA,UAAA,CACAgF,CAAW,CAAA,QACb,CAEA,CAAA,GAAI,CAACA,CAAW,CAAA,OAAA,CAAQ,MAAU,EAAA,CAACA,CAAW,CAAA,MAAA,CAAO,MACnD,CAAA,OAAO,CACL,GAAA,CAAK5D,CACL,CAAA,QAAA,CAAU,EACZ,EAGF,IAAI6D,CAAAA,CAAe,CACbC,CAAAA,CAAAA,CAAuB,EAAC,CACxBC,CAAYH,CAAAA,CAAAA,CAAW,OAC1B,CAAA,GAAA,CAAI,CAAC1d,CAAAA,CAAQoO,CAAU,GAAA,CACtB,IAAM+K,CAAMuE,CAAAA,CAAAA,CAAW,cAAiBtP,CAAAA,CAAAA,CAAQuP,CAC1ClmB,CAAAA,CAAAA,CAAQimB,CAAW,CAAA,MAAA,CAAOtP,CAAK,CAAA,CAErC,OAAI3W,CAAAA,YAAiBke,CACnBgI,EAAAA,CAAAA,EAAAA,CACO,GAAGjF,CAAiB,CAAA,kBAAA,CAAmB,UAAY1Y,CAAAA,CAAM,CAAC,CAAA,GAAA,EAAMvI,EAAM,QAAQ,CAAA,CAAA,GAGvFmmB,CAAc,CAAA,IAAA,CAAKnmB,CAAK,CAAA,CACjB,GAAGihB,CAAiB,CAAA,kBAAA,CAAmB,UAAY1Y,CAAAA,CAAM,CAAC,CAAA,IAAA,EAAOmZ,CAAG,CAAA,EAAG,IAAK,CAAA,cAAA,CAAe1hB,CAAK,CAAC,CAC1G,CAAA,CAAA,CAAC,EACA,IAAK,CAAA,IAAI,CAEZ,CAAA,OAAO,CACL,GAAA,CAAK,CAAGqiB,EAAAA,CAAc,CAAQ+D,KAAAA,EAAAA,CAAS,CACvC,CAAA,CAAA,QAAA,CAAUD,CACZ,CACF,CAEQ,cAAenmB,CAAAA,CAAAA,CAAoB,CACzC,IAAI2wB,CAAW,CAAA,EAAA,CACf,OAAI,MAAA,CAAO,QAAS3wB,CAAAA,CAAK,CACvB2wB,CAAAA,CAAAA,CAAW,SACF,CAAA,KAAA,CAAM,QAAQ3wB,CAAK,CAAA,CAC5B2wB,CAAW,CAAA,SAAA,CAEX,OAAO3wB,CAAAA,EAAU,UACjBA,CAAU,GAAA,IAAA,EACV,EAAEA,CAAAA,YAAiB,IAEnB2wB,CAAAA,CAAAA,CAAAA,CAAW,UACF,OAAO3wB,CAAAA,EAAU,SAC1B2wB,CAAAA,CAAAA,CAAW,WACF,CAAA,OAAO3wB,CAAU,EAAA,QAAA,GAC1B2wB,CAAW,CAAA,UAAA,CAAA,CAGNA,CACT,CACF,CAEOtK,CAAAA,EAAAA,CAAQ,IAAIqL,ECvEnB,CAAA,IAAMC,EAAN,CAAA,KAAsD,CAGpD,KAAA,CAAM3kB,CAA+D,CAAA,CACnE,IAAMuZ,CAAAA,CAAYvZ,CAClB,CAAA,GAAIuZ,CAAU,CAAA,UAAA,CACZ,OAAO,CACL,GAAA,CAAKA,CAAU,CAAA,MAAA,CACf,QAAWA,CAAAA,CAAAA,CAAU,KAAmB,EAAA,EAC1C,CAAA,CAGF,IAAM7E,CAAAA,CAAM6E,CAAU,CAAA,cAAA,CAClBjjB,EAAM,EACNyZ,CAAAA,CAAAA,CAAkB,EAAC,CAEvB,GAAI,IAAA,CAAK,UAAUwJ,CAAU,CAAA,KAAK,CAAG,CAAA,CACnC,IAAMC,CAAAA,CAAiB,KAAK,6BAC1BD,CAAAA,CAAAA,CAAU,KAAM,CAAA,QAClB,CACAjjB,CAAAA,CAAAA,CAAM,CAAG,EAAA,IAAIyY,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBAAmB,CAAA,UAAA,CAAYwK,EAAU,MAAM,CAAC,CAAIA,CAAAA,EAAAA,CAAAA,CAAU,QAAQ,CAAA,CAAA,EAAIC,CAAc,CAAA,CAAA,CAClIzJ,CAAW,CAAA,GACb,CAAA,KAAA,GAAW,KAAM,CAAA,OAAA,CAAQwJ,EAAU,KAAK,CAAA,CACtC,GAAIA,CAAAA,CAAU,QAAS,CAAA,WAAA,EAAkB,GAAA,SAAA,CAAW,CAClD,IAAM5E,CAAe,CAAA,CAAA,CAAA,EAAID,CAAG,CAAA,MAAA,EAASA,EAAM,CAAC,CAAA,CAAA,CAC5Cpe,CAAM,CAAA,CAAA,EAAG,IAAIyY,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CAAmB,UAAYwK,CAAAA,CAAAA,CAAU,MAAM,CAAC,YAAY5E,CAAY,CAAA,CAAA,CAClH5E,CAAWwJ,CAAAA,CAAAA,CAAU,MACvB,CAAA,KAAO,CACL,IAAM5E,CAAe4E,CAAAA,CAAAA,CAAU,KAC5B,CAAA,GAAA,CAAI,CAACjK,CAAAA,CAAG/P,IAAM,CAAImV,CAAAA,EAAAA,CAAAA,CAAMnV,CAAC,CAAA,CAAE,CAC3B,CAAA,IAAA,CAAK,IAAI,CAAA,CACZjJ,CAAM,CAAA,CAAA,EAAG,IAAIyY,CAAAA,CAAiB,IAAK,CAAA,KAAK,EAAE,kBAAmB,CAAA,UAAA,CAAYwK,CAAU,CAAA,MAAM,CAAC,CAAA,CAAA,EAAIA,CAAU,CAAA,QAAQ,CAAK5E,EAAAA,EAAAA,CAAY,CACjI5E,CAAAA,CAAAA,CAAAA,CAAAA,CAAWwJ,CAAU,CAAA,MACvB,SAEIA,CAAU,CAAA,QAAA,CAAS,QAAS,CAAA,MAAM,CACpCjjB,CAAAA,CAAAA,CAAM,GAAG,IAAIyY,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CAAmB,WAAYwK,CAAU,CAAA,MAAM,CAAC,CAAA,CAAA,EAAIA,CAAU,CAAA,QAAQ,CAChHxJ,CAAAA,CAAAA,CAAAA,CAAW,EAAC,CAAA,KACP,CAAIwJ,GAAAA,CAAAA,CAAU,KAAU,GAAA,MAAA,CAC7B,OAAO,CAAE,GAAA,CAAK,EAAI,CAAA,QAAA,CAAU,EAAG,CAE/BjjB,CAAAA,CAAAA,CAAM,CAAG,EAAA,IAAIyY,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,mBAAmB,UAAYwK,CAAAA,CAAAA,CAAU,MAAM,CAAC,CAAIA,CAAAA,EAAAA,CAAAA,CAAU,QAAQ,CAAA,EAAA,EAAK7E,CAAG,CAAA,CAAA,CACxH3E,CAAW,CAAA,CAACwJ,CAAU,CAAA,KAAK,GAI/B,OAAIA,CAAAA,CAAU,SACZjjB,GAAAA,CAAAA,CAAM,CAAQA,KAAAA,EAAAA,CAAG,KAGZ,CAAE,GAAA,CAAKA,CAAI,CAAA,IAAA,EAAQ,CAAA,QAAA,CAAAyZ,CAAS,CACrC,CAEQ,SAAU/c,CAAAA,CAAAA,CAA8B,CAC9C,OACEA,CACA,EAAA,OAAOA,CAAU,EAAA,QAAA,EACjB,UAAcA,GAAAA,CAAAA,EACdA,CAAM,CAAA,UAAA,GAAe,IAEzB,CAEQ,6BAAA,CAA8B4mB,CAAqB,CAAA,CAGzD,OADE,0DAAA,CAA2D,IAAKA,CAAAA,CAAG,CAI9D,CAAA,IAAI7K,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,mBAAmB,UAAY6K,CAAAA,CAAG,CAFjEA,CAAAA,CAGX,CACF,CAAA,CAEOC,EAAQ,CAAA,IAAI8K,ECzEnB,CAAA,IAAMC,EAAN,CAAA,KAA2D,CAGzD,KAAA,CAAM5kB,EAA+D,CACnE,IAAM+Z,CAAY/Z,CAAAA,CAAAA,CAClB,GAAI,CAAC+Z,EAAU,KAAS,EAAA,CAACA,CAAU,CAAA,KAAA,CAAM,MACvC,CAAA,OAAO,CAAE,GAAK,CAAA,EAAA,CAAI,QAAU,CAAA,EAAG,CAAA,CAGjC,IAAMtK,CAAAA,CAAY,IAAItP,CAAAA,CACpB,IAAK,CAAA,KAAA,CACL,UACF,CAAA,CAEM,CAAE,GAAA7J,CAAAA,CAAAA,CAAK,QAAAyZ,CAAAA,CAAS,CAAIN,CAAAA,CAAAA,CAAU,KAClCsK,CAAAA,CAAAA,CAAU,KACVA,CAAAA,CAAAA,CAAU,cACV,CAAA,IACF,CAEA,CAAA,OAAO,CACL,GAAK,CAAA,CAAA,CAAA,EAAIzjB,CAAG,CAAA,CAAA,CAAA,CACZ,QAAAyZ,CAAAA,CACF,CACF,CACF,CAEOiK,CAAAA,EAAAA,CAAQ,IAAI4K,EAAAA,CC3BnB,IAAMC,EAAAA,CAAN,KAA0D,CAGxD,KAAA,CAAM7kB,CAA+D,CAAA,CACnE,IAAMka,CAAAA,CAAgBla,CACtB,CAAA,GAAIka,CAAc,CAAA,UAAA,CAChB,OAAO,CACL,GAAKA,CAAAA,CAAAA,CAAc,OACnB,QAAU,CAAA,EACZ,CAAA,CAGF,IAAMxF,CAAAA,CAAMwF,CAAc,CAAA,cAAA,CACtB5jB,CAAM,CAAA,EAAA,CACNyZ,CAAkB,CAAA,EAEhBsH,CAAAA,CAAAA,CAAY,IAAItI,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBACjD,CAAA,UAAA,CACAmL,CAAc,CAAA,MAChB,CAEA,CAAA,OAAQA,CAAc,CAAA,YAAA,EACpB,KAAK,IAEH5jB,CAAM,CAAA,CAAA,EAAG+gB,CAAS,CAAA,IAAA,EAAO3C,CAAG,CAAA,OAAA,CAAA,CAC5B3E,CAAW,CAAA,CAAC,IAAK,CAAA,SAAA,CAAUmK,CAAc,CAAA,KAAK,CAAC,CAAA,CAC/C,MACF,KAAK,UAAA,CACH5jB,CAAM,CAAA,CAAA,EAAG+gB,CAAS,CAAA,KAAA,EAAQ3C,CAAG,CAC7B3E,OAAAA,CAAAA,CAAAA,CAAAA,CAAW,CAAC,IAAA,CAAK,SAAUmK,CAAAA,CAAAA,CAAc,KAAK,CAAC,CAAA,CAC/C,MACF,KAAK,cACH5jB,CAAAA,CAAAA,CAAM,CAAG+gB,EAAAA,CAAS,CAAQ3C,KAAAA,EAAAA,CAAG,CAC7B3E,OAAAA,CAAAA,CAAAA,CAAAA,CAAW,CAAC,IAAA,CAAK,UAAUmK,CAAc,CAAA,KAAK,CAAC,CAAA,CAC/C,MACF,KAAK,KACH5jB,CAAAA,CAAAA,CAAM4jB,CAAc,CAAA,MAAA,CACpBnK,CAAW,CAAA,KAAA,CAAM,OAAQmK,CAAAA,CAAAA,CAAc,KAAK,CACxCA,CAAAA,CAAAA,CAAc,KACd,CAAA,EACJ,CAAA,KACJ,CAEA,OAAIA,CAAc,CAAA,SAAA,GAChB5jB,CAAM,CAAA,CAAA,KAAA,EAAQA,CAAG,CAAA,CAAA,CAAA,CAAA,CAGZ,CAAE,GAAKA,CAAAA,CAAAA,CAAI,IAAK,EAAA,CAAG,QAAAyZ,CAAAA,CAAS,CACrC,CACF,CAAA,CAEOoK,EAAQ,CAAA,IAAI0K,ECnDnB,CAAA,IAAMC,GAAN,KAA8D,CAG5D,KAAM9kB,CAAAA,CAAAA,CAA+D,CACnE,IAAMqa,CAAera,CAAAA,CAAAA,CAErB,OAAI,IAAA,CAAK,gBAAiBqa,CAAAA,CAAAA,CAAa,QAAQ,CAAA,CACtC,KAAK,oBAAqBA,CAAAA,CAAY,CAG3C,CAAA,IAAA,CAAK,eAAgBA,CAAAA,CAAAA,CAAa,QAAQ,CAAA,CACrC,IAAK,CAAA,mBAAA,CAAoBA,CAAY,CAAA,CAGvC,IAAK,CAAA,oBAAA,CAAqBA,CAAY,CAC/C,CAEQ,gBACNC,CAAAA,CAAAA,CACoB,CACpB,OAAO,OAAOA,CAAAA,EAAa,QAC7B,CAEQ,eACNA,CAAAA,CAAAA,CACyB,CACzB,OAAO,MAAM,OAAQA,CAAAA,CAAQ,CAC/B,CAEQ,oBACND,CAAAA,CAAAA,CAC8C,CAE9C,OAAO,CAAE,GADG,CAAA,CAAA,EAAGA,CAAa,CAAA,MAAM,IAAIA,CAAa,CAAA,QAAQ,CAAKA,EAAAA,EAAAA,CAAAA,CAAa,QAAQ,CAAA,CAAA,CAAA,CACnE,IAAK,EAAA,CAAG,QAAU,CAAA,EAAG,CACzC,CAEQ,mBAAA,CACNA,EAC8C,CAC9C,IAAM5K,CAAY,CAAA,IAAItP,CACpB,CAAA,IAAA,CAAK,KACL,CAAA,UACF,CACM,CAAA,CAAE,GAAKoa,CAAAA,CAAAA,CAAa,QAAUC,CAAAA,CAAiB,EAAI/K,CAAU,CAAA,KAAA,CACjE4K,CAAa,CAAA,QAAA,CACbA,CAAa,CAAA,cACf,CAGA,CAAA,OAAO,CAAE,GAAA,CADG,CAAGA,EAAAA,CAAAA,CAAa,MAAM,CAAA,CAAA,EAAIA,EAAa,QAAQ,CAAA,EAAA,EAAKE,CAAW,CAAA,CAAA,CAAA,CACzD,IAAK,EAAA,CAAG,SAAUC,CAAiB,CACvD,CAEQ,oBAAA,CACNH,CAC8C,CAAA,CAC9C,IAAM5K,CAAY,CAAA,IAAItP,CACpB,CAAA,IAAA,CAAK,KACL,CAAA,UACF,CACM,CAAA,CAAE,GAAKoa,CAAAA,CAAAA,CAAa,QAAUC,CAAAA,CAAiB,CAAI/K,CAAAA,CAAAA,CAAU,MACjE,CAAC4K,CAAAA,CAAa,QAAqB,CAAA,CACnCA,CAAa,CAAA,cACf,CAGA,CAAA,OAAO,CAAE,GAAA,CADG,CAAGA,EAAAA,CAAAA,CAAa,MAAM,CAAA,CAAA,EAAIA,EAAa,QAAQ,CAAA,EAAA,EAAKE,CAAW,CAAA,CAAA,CAAA,CACzD,IAAK,EAAA,CAAG,QAAUC,CAAAA,CAAiB,CACvD,CACF,CAEOC,CAAAA,EAAAA,CAAQ,IAAIqK,EAAAA,CCtEnB,IAAMC,EAAN,CAAA,KAAqD,CAGnD,KAAA,CACE/kB,CAC8C,CAAA,CAC9C,IAAM2a,CAAW3a,CAAAA,CAAAA,CACX6Y,CAAS,CAAA,IAAI1Y,CAAU,CAAA,IAAA,CAAK,MAAO,UAAU,CAAA,CAC7C2Y,CAAQ,CAAA,KAAA,CAAM,OAAQ6B,CAAAA,CAAAA,CAAS,IAAI,CAAA,CACrCA,CAAS,CAAA,IAAA,CACT,CAACA,CAAAA,CAAS,IAAI,CAAA,CAEZza,EAAM2Y,CAAO,CAAA,KAAA,CACjBC,CAAM,CAAA,MAAA,CAAO,OAAO,CAAA,CACpB6B,CAAS,CAAA,cACX,CAEMkH,CAAAA,CAAAA,CACJlH,CAAS,CAAA,MAAA,GAAW,cAAiB,CAAA,eAAA,CAAkB,GAEzD,OAAO,CACL,GAAK,CAAA,CAAA,EAAGA,CAAS,CAAA,KAAK,CAAMkH,GAAAA,EAAAA,CAAkB,CAAK3hB,EAAAA,EAAAA,CAAAA,CAAI,GAAG,CAAA,CAAA,CAAA,CAC1D,QAAUA,CAAAA,CAAAA,CAAI,QAChB,CACF,CACF,CAEO0a,CAAAA,EAAAA,CAAQ,IAAImK,EAAAA,CC1BnB,IAAMC,EAAN,CAAA,KAAwD,CAEtD,KAAA,CAAMhlB,CAAiB,CAAA,CACrB,IAAMC,CAASD,CAAAA,CAAAA,CACTE,CAAM,CAAA,IAAIC,CAAU,CAAA,IAAA,CAAK,KAAO,CAAA,QAA6B,CAC/D,CAAA,CAAE,GAAA7J,CAAAA,CAAI,CAAI4J,CAAAA,CAAAA,CAAI,MAAM,CAACD,CAAAA,CAAO,MAAM,CAAC,CAEjCG,CAAAA,CAAAA,CAAqBH,CAAe,CAAA,iBAAA,CAC1C,GAAIG,CAAAA,EAAqBA,CAAkB,CAAA,MAAA,CAAS,CAAG,CAAA,CACrD,IAAMC,CAA4B,CAAA,EAElC,CAAA,IAAA,IAAWC,CAAcF,IAAAA,CAAAA,CAAmB,CAC1C,GAAM,CAAE,GAAA,CAAKG,CAAc,CAAA,CAAIL,CAAI,CAAA,KAAA,CAAM,CAACI,CAAU,CAAC,CACrDD,CAAAA,CAAAA,CAAgB,IAAKE,CAAAA,CAAa,EACpC,CAEIF,CAAAA,CAAgB,MAAS,CAAA,CAAA,GAC3B/J,CAAO,EAAA,CAAA,CAAA,EAAI+J,EAAgB,IAAK,CAAA,GAAG,CAAC,CAAA,CAAA,EAExC,CAEA,OAAO,CAAE,GAAA,CAAK,CAAc/J,WAAAA,EAAAA,CAAG,CAAI,CAAA,CAAA,QAAA,CAAU,EAAG,CAClD,CACF,CAAA,CAEOkK,EAAQ,CAAA,IAAIwkB,EC5BnB,CAAA,IAAMC,EAAN,CAAA,KAA4D,CAE1D,KAAA,CAAMjT,CAAkB,CAAA,CACtB,OAAO,CAAE,IAAK,EAAI,CAAA,QAAA,CAAU,EAAG,CACjC,CACF,CACOtR,CAAAA,EAAAA,CAAQ,IAAIukB,EAAAA,CCNnB,IAAMC,EAAAA,CAAN,KAA8D,CAE5D,MAAMlT,CAAkB,CAAA,CACtB,OAAO,CAAE,GAAK,CAAA,EAAA,CAAI,QAAU,CAAA,EAAG,CACjC,CACF,CAAA,CACO5Q,EAAQ,CAAA,IAAI8jB,GCFnB,IAAMC,EAAAA,CAAN,KAAyD,CAGvD,KAAMnlB,CAAAA,CAAAA,CAA+D,CACnE,IAAM2P,CAAS3P,CAAAA,CAAAA,CAET4P,CADQ,CAAA,IAAIb,CAAiB,CAAA,IAAA,CAAK,KAAK,CACrB,CAAA,iBAAA,CAAkB,QAAUY,CAAAA,CAAAA,CAAO,KAAK,CAAA,CAEhE,GAAI,CAACA,CAAO,CAAA,QAAA,EAAY,CAACA,CAAAA,CAAO,QAAS,CAAA,MAAA,CACvC,OAAO,CAAE,GAAA,CAAK,EAAI,CAAA,QAAA,CAAU,EAAG,CAGjC,CAAA,IAAMF,CAAY,CAAA,IAAItP,CAAU,CAAA,IAAA,CAAK,KAAO,CAAA,QAA6B,EACnE2P,CAAkB,CAAA,EAClBC,CAAAA,CAAAA,CAAkB,EAAC,CAErBqV,EAAsB,KAC1B,CAAA,IAAA,IAAWpV,CAASL,IAAAA,CAAAA,CAAO,QAAU,CAAA,CACnC,GAAM,CAAE,GAAA,CAAArZ,CAAK,CAAA,QAAA,CAAU2Z,CAAc,CAAA,CAAIR,CAAU,CAAA,KAAA,CAAM,CAACO,CAAK,CAAC,CAAA,CAChE,GAAI,EAAA,CAAC1Z,GAAO,CAACA,CAAAA,CAAI,IAAK,EAAA,CAAA,CAItB,CAAI0Z,GAAAA,CAAAA,CAAM,IAAS,GAAA,YAAA,CACjBF,CAAM,CAAA,IAAA,CAAKxZ,CAAG,CAAA,CACd8uB,CAAsB,CAAA,IAAA,CAAA,KAAA,GACbpV,EAAM,IAAS,GAAA,gBAAA,EAAoBoV,CAAqB,CAAA,CACjE,IAAMtS,CAAAA,CAAOhD,CAAM,CAAA,GAAA,EAAS,EAAA,EAAA,CACtBuV,CAAa/uB,CAAAA,CAAAA,CAAI,OAAQ,CAAA,aAAA,CAAe,EAAE,CAAE,CAAA,SAAA,EAClDwZ,CAAAA,CAAAA,CAAM,IAAK,CAAA,CAAA,EAAGgD,CAAI,CAAIuS,CAAAA,EAAAA,CAAU,CAAE,CAAA,EACpC,CAAO,KAAA,CAAA,GACLrV,EAAM,IAAS,GAAA,cAAA,EACfA,CAAM,CAAA,IAAA,GAAS,eAGf,CAAA,SACK,GACLA,CAAAA,CAAM,IAAS,GAAA,aAAA,EACfA,CAAM,CAAA,IAAA,GAAS,cAGf,CAAA,SAEAF,EAAM,IAAKxZ,CAAAA,CAAG,CACd8uB,CAAAA,CAAAA,CAAsB,MAGxBrV,CAAAA,CAAAA,CAAS,IAAK,CAAA,GAAGE,CAAa,EAAA,CAChC,CAEA,IAAMC,CAAOJ,CAAAA,CAAAA,CAAM,KAAK,IAAI,CAAA,CACtByL,CAAW5L,CAAAA,CAAAA,CAAO,QAAW,CAAA,YAAA,CAAe,EAElD,CAAA,OAAKO,CAAK,CAAA,IAAA,EAKH,CAAA,CAAE,GADQ,CAAA,CAAA,EAAGqL,CAAQ,CAAG3L,EAAAA,CAAS,CAAIM,CAAAA,EAAAA,CAAI,CACxB,CAAA,CAAA,QAAA,CAAAH,CAAS,CAJxB,CAAA,CAAE,GAAK,CAAA,EAAA,CAAI,QAAU,CAAA,EAAG,CAKnC,CACF,CAEOI,CAAAA,EAAAA,CAAQ,IAAIgV,EAAAA,CCjEnB,IAAMG,EAAAA,CAAN,KAAyD,CAEvD,KAAMtlB,CAAAA,CAAAA,CAAiB,CAErB,OAAO,CAAE,GAAK,CAAA,CAAA,aAAA,EADJA,CACsB,CAAA,MAAM,CAAK,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC1D,CACF,CAEOqQ,CAAAA,EAAAA,CAAQ,IAAIiV,EAAAA,CCTnB,IAAMC,EAAN,CAAA,KAA6D,CAE3D,KAAA,CAAMvT,CAAkB,CAAA,CACtB,OAAO,CAAE,GAAK,CAAA,EAAA,CAAI,QAAU,CAAA,EAAG,CACjC,CACF,CACOzB,CAAAA,EAAAA,CAAQ,IAAIgV,EAAAA,CCLnB,IAAMC,EAAAA,CAAN,KAA0D,CAExD,KAAMxlB,CAAAA,CAAAA,CAAiB,CAErB,OAAO,CAAE,GAAA,CAAK,iBADJA,CACuB,CAAA,MAAM,CAAkB,cAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CACxE,CACF,CACOyQ,CAAAA,EAAAA,CAAQ,IAAI+U,EAAAA,CCPnB,IAAMC,EAAAA,CAAN,KAA0D,CAExD,KAAA,CAAMzlB,CAAiB,CAAA,CAErB,OAAO,CAAE,GAAK,CAAA,CAAA,cAAA,EADJA,CACuB,CAAA,MAAM,CAAmB,eAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CACzE,CACF,CAAA,CACO2Q,EAAQ,CAAA,IAAI8U,ECRnB,CAAA,IAAMC,EAAN,CAAA,KAA6D,CAE3D,KAAA,CAAM1T,CAAkB,CAAA,CAEtB,OAAO,CAAE,IAAK,EAAI,CAAA,QAAA,CAAU,EAAG,CACjC,CACF,EACOnB,EAAQ,CAAA,IAAI6U,ECNnB,CAAA,IAAMC,EAAN,CAAA,KAA2D,CAEzD,KAAM3lB,CAAAA,CAAAA,CAAiB,CACrB,IAAMsJ,CAAItJ,CAAAA,CAAAA,CACV,OAAO,CACL,GAAK,CAAA,CAAA,eAAA,EAAkBsJ,CAAE,CAAA,OAAO,CAASA,MAAAA,EAAAA,CAAAA,CAAE,OAAO,CAClD,CAAA,CAAA,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CACOyH,CAAAA,EAAAA,CAAQ,IAAI4U,EAAAA,CCVnB,IAAMC,EAAAA,CAAN,KAA0D,CAExD,MAAM5lB,CAAiB,CAAA,CAErB,OAAO,CAAE,GAAK,CAAA,CAAA,CAAA,EADHA,CACU,CAAA,OAAO,CAAK,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAChD,CACF,EACOiR,EAAQ,CAAA,IAAI2U,ECNnB,CAAA,IAAMC,EAAN,CAAA,KAAyD,CAEvD,KAAM7lB,CAAAA,CAAAA,CAAiB,CACrB,IAAMrL,CAAIqL,CAAAA,CAAAA,CACNiG,EAEJ,OAAItR,CAAAA,CAAE,YAAwBuc,YAAAA,CAAAA,CAC5BjL,CAAMtR,CAAAA,CAAAA,CAAE,YAAa,CAAA,QAAA,CACZA,CAAE,CAAA,YAAA,GAAiB,MAC5BsR,CAAAA,CAAAA,CAAM,MACGtR,CAAAA,CAAAA,CAAE,eAAiB,MAAUA,EAAAA,CAAAA,CAAE,YAAiB,GAAA,OAAA,CACzDsR,CAAMtR,CAAAA,CAAAA,CAAE,YAAa,CAAA,WAAA,EAErB,CAAA,OAAOA,CAAE,CAAA,YAAA,EAAiB,QAC1BA,EAAAA,CAAAA,CAAE,eAAiB,MACnBA,EAAAA,CAAAA,CAAE,YAAiB,GAAA,MAAA,EACnBA,CAAE,CAAA,YAAA,GAAiB,OAEnBsR,CAAAA,CAAAA,CAAM,CAAItR,CAAAA,EAAAA,CAAAA,CAAE,YAAY,CAAA,CAAA,CAAA,CAExBsR,CAAM,CAAA,MAAA,CAAOtR,EAAE,YAAY,CAAA,CAGtB,CACL,GAAA,CAAK,CAAiBA,cAAAA,EAAAA,CAAAA,CAAE,MAAM,CAAiBsR,cAAAA,EAAAA,CAAG,CAClD,CAAA,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CAAA,CACOmL,EAAQ,CAAA,IAAIyU,EC9BnB,CAAA,IAAMC,EAAN,CAAA,KAAyD,CAEvD,KAAA,CAAM9lB,CAAiB,CAAA,CAErB,OAAO,CAAE,IAAK,CADJA,cAAAA,EAAAA,CAAAA,CACuB,MAAM,CAAA,cAAA,CAAA,CAAkB,QAAU,CAAA,EAAG,CACxE,CACF,CAAA,CACOsR,EAAQ,CAAA,IAAIwU,ECJnB,CAAA,IAAMC,GAAN,KAAyD,CAGvD,KAAM/lB,CAAAA,CAAAA,CAA+D,CACnE,IAAMwR,CAAUxR,CAAAA,CAAAA,CAChB,GAAIwR,CAAAA,CAAQ,UACV,CAAA,OAAO,CAAE,GAAA,CAAKA,EAAQ,MAAkB,CAAA,QAAA,CAAU,EAAG,CAIvD,CAAA,IAAM1J,CADQ,CAAA,IAAIiH,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CACpB,kBACvB,CAAA,QAAA,CACAhJ,EAAeyL,CAAQ,CAAA,MAAM,CAC/B,CAAA,CACMC,CAAKD,CAAAA,CAAAA,CAAQ,QAAS,CAAA,WAAA,EAE5B,CAAA,GAAIC,CAAO,GAAA,MAAA,EAAUA,CAAO,GAAA,SAAA,CAC1B,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAS,KAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC5C,CAAA,GAAI2J,CAAO,GAAA,MAAA,CAChB,OAAO,CAAE,IAAK,CAAG3J,EAAAA,CAAU,CAAgB,YAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CACnD,CAAA,GAAI2J,CAAO,GAAA,MAAA,CAChB,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAgB,YAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAG1D,CAAA,GAAI2J,EAAG,QAAS,CAAA,MAAM,CACpB,CAAA,OAAO,CAAE,GAAA,CAAK,GAAG3J,CAAU,CAAA,KAAA,CAAA,CAAS,QAAU,CAAA,EAAG,CAAA,CAC5C,GAAI2J,CAAAA,GAAO,SAAaA,EAAAA,CAAAA,GAAO,QAAYA,EAAAA,CAAAA,GAAO,KACvD,CAAA,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,QAAA,CAAA,CAAY,QAAU,CAAA,EAAG,CAAA,CAC/C,GAAI2J,CAAAA,GAAO,SAChB,CAAA,OAAO,CAAE,GAAA,CAAK,GAAG3J,CAAU,CAAA,QAAA,CAAA,CAAY,QAAU,CAAA,EAAG,CAAA,CAC/C,GAAI2J,CAAAA,GAAO,UAChB,CAAA,OAAO,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,WAAY,QAAU,CAAA,EAAG,CAAA,CAC/C,GAAI2J,CAAAA,GAAO,YAChB,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,QAAA,CAAA,CAAY,SAAU,EAAG,CAGtD,CAAA,GAAI2J,CAAO,GAAA,OAAA,EAAWA,CAAO,GAAA,QAAA,CAC3B,OAAO,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,KAAA,CAAA,CAAS,SAAU,EAAG,CAC5C,CAAA,GAAI2J,CAAO,GAAA,SAAA,EAAaA,CAAO,GAAA,SAAA,CAAW,CAC/C,IAAME,CAAYH,CAAAA,CAAAA,CAAQ,SAAa,EAAA,EAAA,CACjCI,EAAQJ,CAAQ,CAAA,KAAA,EAAS,CAC/B,CAAA,OAAO,CACL,GAAA,CAAK,CAAG1J,EAAAA,CAAU,CAAY6J,SAAAA,EAAAA,CAAS,CAAKC,EAAAA,EAAAA,CAAK,CACjD,CAAA,CAAA,CAAA,QAAA,CAAU,EACZ,CACF,CAEA,OACEH,CAAO,GAAA,MAAA,EACPA,IAAO,UACPA,EAAAA,CAAAA,GAAO,WACPA,EAAAA,CAAAA,GAAO,MACPA,EAAAA,CAAAA,GAAO,OAEA,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,CAAS,KAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CACxC2J,CAAAA,CAAAA,GAAO,SACT,CAAA,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAY,QAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC3C2J,CAAAA,CAAAA,GAAO,MAAUA,EAAAA,CAAAA,GAAO,OAC1B,CAAA,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,KAAA,CAAA,CAAS,SAAU,EAAG,CACxC2J,CAAAA,CAAAA,GAAO,MACT,CAAA,CAAE,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,KAAA,CAAA,CAAS,QAAU,CAAA,EAAG,CAAA,CAEjD2J,IAAO,OACPA,EAAAA,CAAAA,GAAO,MACPA,EAAAA,CAAAA,GAAO,QACPA,EAAAA,CAAAA,GAAO,YACPA,CAAO,GAAA,YAAA,EACPA,CAAO,GAAA,UAAA,CAEA,CAAE,GAAA,CAAK,GAAG3J,CAAU,CAAA,KAAA,CAAA,CAAS,QAAU,CAAA,EAAG,CAAA,CACxC2J,CAAO,GAAA,SAAA,EAAaA,CAAO,GAAA,KAAA,CAChCD,CAAQ,CAAA,aAAA,CACH,CAAE,GAAA,CAAK,GAAG1J,CAAU,CAAA,OAAA,CAAA,CAAW,QAAU,CAAA,EAAG,CAAA,CAG9C,CAAE,GAAA,CAAK,CAAGA,EAAAA,CAAU,CAAY,QAAA,CAAA,CAAA,QAAA,CAAU,EAAG,EAEpD2J,CAAO,GAAA,UAAA,EACPA,CAAO,GAAA,OAAA,EACPA,CAAO,GAAA,YAAA,EACPA,CAAO,GAAA,SAAA,EACPA,CAAO,GAAA,YAAA,CAEA,CAAE,GAAA,CAAK,CAAG3J,EAAAA,CAAU,IAAI2J,CAAE,CAAA,CAAA,CAAI,QAAU,CAAA,EAAG,CAAA,CAG7C,CACL,GAAK,CAAA,CAAA,EAAG3J,CAAU,CAAA,CAAA,EAAI2J,CAAE,CAAA,CAAA,EAAID,EAAQ,MAAS,CAAA,CAAA,CAAA,EAAIA,CAAQ,CAAA,MAAM,CAAM,CAAA,CAAA,CAAA,EAAE,CACvE,CAAA,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CAEOM,CAAAA,EAAAA,CAAQ,IAAIiU,ECjGnB,CAAA,IAAMC,EAAN,CAAA,KAA8D,CAE5D,KAAA,CAAMhU,CAAkB,CAAA,CACtB,OAAO,CAAE,GAAK,CAAA,EAAA,CAAI,QAAU,CAAA,EAAG,CACjC,CACF,CACOC,CAAAA,EAAAA,CAAQ,IAAI+T,EAAAA,CCDnB,IAAMC,EAAAA,CAAN,KAAyD,CAGvD,KAAMjmB,CAAAA,CAAAA,CAA+D,CACnE,IAAMmS,EAAQnS,CACRoS,CAAAA,CAAAA,CAAQ,IAAIrD,CAAAA,CAAiB,IAAK,CAAA,KAAK,EACvCqN,CAASjK,CAAAA,CAAAA,CAAM,cACjB,CAAA,CAAA,YAAA,EAAeA,CAAM,CAAA,cAAc,KACnC,EAEJ,CAAA,GAAIA,CAAM,CAAA,cAAA,GAAmB,aAAe,CAAA,CAC1C,IAAM+T,CAAAA,CAAgB,CAAS/T,CAAAA,CAAAA,CAAc,aACvCgU,CAAAA,CAAAA,CAAAA,CAAehU,CAAc,CAAA,UAAA,EAAc,IAAI,WAAY,EAAA,CACjE,OACE+T,CAAAA,GACCC,CAAe,GAAA,SAAA,EAAaA,CAAe,GAAA,QAAA,CAAA,CAErC,CAAE,GAAA,CAAK,CAAG/J,EAAAA,CAAM,CAA6B,yBAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAAA,CAE5D,CAAE,GAAA,CAAK,CAAGA,EAAAA,CAAM,CAAe,WAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CACrD,CAEA,GAAIjK,CAAAA,CAAM,iBAAmB,QAAU,CAAA,CACrC,GAAIA,CAAAA,CAAM,OAAWA,EAAAA,CAAAA,CAAM,QAAQ,MAAQ,CAAA,CACzC,IAAMG,CAAAA,CAAOH,CAAM,CAAA,OAAA,CAChB,IAAK3W,CAAM4W,EAAAA,CAAAA,CAAM,kBAAmB,CAAA,QAAA,CAAUrM,CAAevK,CAAAA,CAAC,CAAC,CAAC,CAChE,CAAA,IAAA,CAAK,IAAI,CAAA,CAEZ,OAAK2W,CAAAA,CAAM,eAGJ,CAAE,GAAA,CAAK,CAAGiK,EAAAA,CAAM,CAAW9J,QAAAA,EAAAA,CAAI,CAAK,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAF/C,CAAA,CAAE,GAAK,CAAA,QAAA,CAAU,SAAU,EAAG,CAGzC,CACA,OAAO,CAAE,GAAK,CAAA,QAAA,CAAU,QAAU,CAAA,EAAG,CACvC,CAEA,GAAIH,EAAM,cAAmB,GAAA,UAAA,CAC3B,OAAO,CAAE,GAAK,CAAA,UAAA,CAAY,QAAU,CAAA,EAAG,CAAA,CAGzC,GAAIA,CAAAA,CAAM,cAAmB,GAAA,MAAA,CAC3B,OAAO,CAAE,GAAA,CAAK,MAAQ,CAAA,QAAA,CAAU,EAAG,CAGrC,CAAA,GAAIA,CAAM,CAAA,cAAA,GAAmB,SAAW,CAAA,CACtC,IAAMlM,CAAAA,CAAMkM,EAAM,YAClB,CAAA,OAAIlM,CAAeiL,YAAAA,CAAAA,CACV,CAAE,GAAA,CAAK,CAAWjL,QAAAA,EAAAA,CAAAA,CAAI,QAAQ,CAAA,CAAA,CAAI,QAAU,CAAA,EAAG,CAAA,CAEpDA,IAAQ,MAAUA,EAAAA,CAAAA,GAAQ,IACrB,CAAA,CAAE,GAAK,CAAA,cAAA,CAAgB,QAAU,CAAA,EAAG,CAAA,CAEzCA,CAAQ,GAAA,MAAA,EAAUA,CAAQ,GAAA,OAAA,CACrB,CAAE,GAAK,CAAA,CAAA,QAAA,EAAWA,CAAI,CAAA,WAAA,EAAa,CAAA,CAAA,CAAI,SAAU,EAAG,CAEzD,CAAA,OAAOA,CAAQ,EAAA,QAAA,CACV,CAAE,GAAK,CAAA,CAAA,SAAA,EAAYA,CAAG,CAAA,CAAA,CAAA,CAAK,QAAU,CAAA,EAAG,CAAA,CAE1C,CAAE,GAAA,CAAK,CAAWA,QAAAA,EAAAA,CAAG,CAAI,CAAA,CAAA,QAAA,CAAU,EAAG,CAC/C,CAEA,GAAIkM,CAAM,CAAA,cAAA,GAAmB,aAAe,CAAA,CAC1C,GAAI,CAACA,CAAM,CAAA,UAAA,CACT,OAAO,CAAE,IAAK,EAAI,CAAA,QAAA,CAAU,EAAG,CAEjC,CAAA,IAAMG,CAAQH,CAAAA,CAAAA,CAAAA,CAAM,OAAW,EAAA,EAC5B,EAAA,GAAA,CAAK3W,CAAM4W,EAAAA,CAAAA,CAAM,mBAAmB,QAAUrM,CAAAA,CAAAA,CAAevK,CAAC,CAAC,CAAC,CAAA,CAChE,KAAK,IAAI,CAAA,CACNiX,CAAWL,CAAAA,CAAAA,CAAM,iBACrB,CAAA,QAAA,CACAD,EAAM,UAAW,CAAA,KACnB,CACMO,CAAAA,CAAAA,CAAUP,CAAM,CAAA,UAAA,CAAW,OAC9B,CAAA,GAAA,CAAK3W,CAAM4W,EAAAA,CAAAA,CAAM,kBAAmB,CAAA,QAAA,CAAUrM,CAAevK,CAAAA,CAAC,CAAC,CAAC,CAAA,CAChE,IAAK,CAAA,IAAI,CACRlF,CAAAA,CAAAA,CAAM,CAAG8lB,EAAAA,CAAM,CAAgB9J,aAAAA,EAAAA,CAAI,CAAgBG,aAAAA,EAAAA,CAAQ,CAAIC,CAAAA,EAAAA,CAAO,IAC1E,OAAIP,CAAAA,CAAM,QACR7b,GAAAA,CAAAA,EAAO,CAAc6b,WAAAA,EAAAA,CAAAA,CAAM,QAAQ,CAAA,CAAA,CAAA,CAEjCA,CAAM,CAAA,QAAA,GACR7b,CAAO,EAAA,CAAA,WAAA,EAAc6b,CAAM,CAAA,QAAQ,IAE9B,CAAE,GAAA,CAAA7b,CAAK,CAAA,QAAA,CAAU,EAAG,CAC7B,CAEA,OAAO,CAAE,GAAA,CAAK,EAAI,CAAA,QAAA,CAAU,EAAG,CACjC,CACF,CAAA,CAEOqc,EAAQ,CAAA,IAAIsT,EC1FnB,CAAA,IAAMG,EAAN,CAAA,KAA0D,CAGxD,KAAA,CAAMpmB,CAA+D,CAAA,CACnE,IAAM6S,CAAS7S,CAAAA,CAAAA,CAET4P,CADQ,CAAA,IAAIb,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CACrB,iBAAkB,CAAA,QAAA,CAAU8D,CAAO,CAAA,KAAK,CAEhE,CAAA,GAAI,CAACA,CAAO,CAAA,QAAA,EAAY,CAACA,CAAAA,CAAO,QAAS,CAAA,MAAA,CACvC,OAAO,CAAE,GAAK,CAAA,CAAA,EAAGjD,CAAS,CAAA,GAAA,CAAA,CAAO,QAAU,CAAA,EAAG,CAGhD,CAAA,IAAMH,CAAY,CAAA,IAAItP,CAAU,CAAA,IAAA,CAAK,KAAO,CAAA,QAA6B,CACnE2P,CAAAA,CAAAA,CAAkB,EAAC,CACnBC,CAAkB,CAAA,GAExB,IAAWC,IAAAA,CAAAA,IAAS6C,CAAO,CAAA,QAAA,CAAU,CACnC,GAAM,CAAE,GAAA,CAAAvc,CAAK,CAAA,QAAA,CAAU2Z,CAAc,CAAA,CAAIR,CAAU,CAAA,KAAA,CAAM,CAACO,CAAK,CAAC,CAEhE,CAAA,GAAIA,CAAM,CAAA,MAAA,GAAW,YAAc,CAAA,CACjC,IAAM8C,CAAAA,CAAOhD,CAAM,CAAA,GAAA,EAAS,EAAA,EAAA,CACtBiD,EAAsBzc,CAE5B,CAAA,GACE,WAAY,CAAA,IAAA,CAAKyc,CAAmB,CAAA,EACpC,OAAQ,CAAA,IAAA,CAAKA,CAAmB,CAAA,EAChC,UAAW,CAAA,IAAA,CAAKA,CAAmB,CAAA,EACnC,eAAe,IAAKA,CAAAA,CAAmB,CACvC,CAAA,CACA,IAAIC,CAAAA,CAAW,GAAGF,CAAI,CAAA,CAAA,EAAIC,CAAmB,CAAA,CAAA,CAAG,IAAK,EAAA,CACrDC,EAAWA,CAAS,CAAA,OAAA,CAClB,gDACA,CAAA,aACF,CAEAlD,CAAAA,CAAAA,CAAM,IAAKkD,CAAAA,CAAQ,CACnBjD,CAAAA,CAAAA,CAAS,IAAK,CAAA,GAAGE,CAAa,CAAA,CAC9B,QACF,CAEAH,CAAAA,CAAM,IAAKgD,CAAAA,CAAI,CACfhD,CAAAA,CAAAA,CAAM,IAAKiD,CAAAA,CAAmB,CAC9BhD,CAAAA,CAAAA,CAAS,IAAK,CAAA,GAAGE,CAAa,CAAA,CAC9B,QACF,CAEAH,CAAAA,CAAM,IAAKxZ,CAAAA,CAAG,CACdyZ,CAAAA,CAAAA,CAAS,IAAK,CAAA,GAAGE,CAAa,EAChC,CAEA,IAAA,IAAW3P,CAAcuS,IAAAA,CAAAA,CAAO,iBAAkB,CAChD,GAAM,CAAE,GAAA,CAAAvc,CAAK,CAAA,QAAA,CAAU2c,CAAmB,CAAIxD,CAAAA,CAAAA,CAAU,KAAM,CAAA,CAC5DnP,CACF,CAAC,EAEDwP,CAAM,CAAA,IAAA,CAAKxZ,CAAG,CAAA,CACdyZ,CAAS,CAAA,IAAA,CAAK,GAAGkD,CAAkB,EACrC,CAEA,IAAMC,CAAAA,CAAapD,CAAM,CAAA,IAAA,CAAK,IAAI,CAGlC,CAAA,OAAO,CAAE,GAAA,CADQ,CADG+C,EAAAA,CAAAA,CAAO,WAAc,CAAA,gBAAA,CAAmB,EAC7B,CAAA,EAAGjD,CAAS,CAAA,EAAA,EAAKsD,CAAU,CAAA,CAAA,CAAA,CAClC,SAAAnD,CAAS,CACnC,CACF,CAAA,CAEOoD,EAAQ,CAAA,IAAIiT,EClEnB,CAAA,IAAMC,EAAN,CAAA,KAAqD,CAGnD,KAAA,CAAMrmB,CAA+D,CAAA,CACnE,IAAMqT,CAAarT,CAAAA,CAAAA,CAEnB,OACEqT,CAAAA,CAAW,UACX,EAAA,OAAOA,EAAW,QAAS,CAAA,KAAA,EAAU,QAE9B,CAAA,CACL,GAAKA,CAAAA,CAAAA,CAAW,SAAS,KACzB,CAAA,QAAA,CAAU,EACZ,CAOK,CAAA,CACL,GALqB,CAAA,IAAItE,CACzB,CAAA,IAAA,CAAK,KACP,CAAA,CAAE,yBAA0B,CAAA,QAAA,CAAUsE,EAAW,QAAoB,CAAA,CAInE,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEOC,EAAQ,CAAA,IAAI+S,EC9BnB,CAAA,IAAMC,EAAN,CAAA,KAAuD,CAGrD,KAAMtU,CAAAA,CAAAA,CAAgE,CACpE,OAAO,CACL,GAAA,CAAK,UACL,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CAEOwB,CAAAA,EAAAA,CAAQ,IAAI8S,ECVnB,CAAA,IAAMA,EAAN,CAAA,KAAuD,CAGrD,KAAA,CAAMtU,CAAgE,CAAA,CACpE,OAAArc,CAAAA,CAAO,IAAK,CAAA,qCAAqC,CAC1C,CAAA,CACL,IAAK,EACL,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CAEO+d,CAAAA,EAAAA,CAAQ,IAAI4S,EAAAA,CCZnB,IAAMC,EAAAA,CAAN,KAAwD,CAEtD,MAAMvmB,CAAiB,CAAA,CACrB,IAAMyR,CAAAA,CAAKzR,CAEL4T,CAAAA,CAAAA,CADQ,IAAI7E,CAAAA,CAAiB,IAAK,CAAA,KAAK,CACtB,CAAA,iBAAA,CAAkB,QAAU0C,CAAAA,CAAAA,CAAG,KAAK,CAE3D,CAAA,OAAO,CAAE,GAAA,CAAK,CADCA,EAAAA,CAAAA,CAAG,QAAW,CAAA,YAAA,CAAe,EACrB,CAAA,EAAGmC,CAAQ,CAAA,CAAA,CAAI,QAAU,CAAA,EAAG,CACrD,CACF,CACOC,CAAAA,EAAAA,CAAQ,IAAI0S,EAAAA,CCXnB,IAAMC,EAAN,CAAA,KAA8D,CAE5D,KAAA,CAAMxmB,CAAiB,CAAA,CAErB,OAAO,CACL,GAAA,CAAK,CAFKA,qEAAAA,EAAAA,CAAAA,CAEuE,aAAa,CAAA,CAAA,CAAA,CAC9F,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CACO+T,EAAQ,CAAA,IAAIyS,GCPnB,IAAMC,EAAAA,CAAN,KAAmD,CAGjD,KAAMzmB,CAAAA,CAAAA,CAA+D,CACnE,IAAMwP,CAAWxP,CAAAA,CAAAA,CAEjB,GAAI,OAAOwP,CAAS,CAAA,KAAA,EAAU,SAAU,CACtC,IAAMyE,CAAmB,CAAA,IAAIlF,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAExD,OAAIS,CAAAA,CAAS,KAASA,EAAAA,CAAAA,CAAS,KAAM,CAAA,MAAA,CAAS,EAMrC,CACL,GAAA,CAAK,CANUyE,EAAAA,CAAAA,CAAiB,iBAChC,CAAA,QAAA,CACAzE,EAAS,KACX,CAGkB,CAAQA,KAAAA,EAAAA,CAAAA,CAAS,KAAK,CAAA,CAAA,CAAA,CACtC,SAAU,EACZ,CAQK,CAAA,CAAE,GALQyE,CAAAA,CAAAA,CAAiB,iBAChC,CAAA,QAAA,CACAzE,CAAS,CAAA,KACX,CAEwB,CAAA,QAAA,CAAU,EAAG,CACvC,CAEA,IAAM0E,CAAgB,CAAA,KAAA,CAAM,OAAQ1E,CAAAA,CAAAA,CAAS,KAAK,CAAA,CAC9CA,CAAS,CAAA,KAAA,CACT,CAACA,CAAAA,CAAS,KAAK,CAAA,CAGb1Z,EADY,IAAIqK,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,QAA6B,CAAA,CAChD,KAAM+T,CAAAA,CAAa,CAEtCC,CAAAA,CAAAA,CACJ3E,CAAS,CAAA,KAAA,EAASA,CAAS,CAAA,KAAA,CAAM,OAAS,CAAQA,KAAAA,EAAAA,CAAAA,CAAS,KAAK,CAAA,CAAA,CAAA,CAAM,EAExE,CAAA,OAAO,CACL,GAAK,CAAA,CAAA,CAAA,EAAI1Z,CAAO,CAAA,GAAG,CAAIqe,CAAAA,EAAAA,CAAQ,GAC/B,QAAUre,CAAAA,CAAAA,CAAO,QACnB,CACF,CACF,CAAA,CAEOse,EAAQ,CAAA,IAAIqS,EC/CnB,CAAA,IAAMC,EAAN,CAAA,KAAsD,CAGpD,KAAA,CAAM1mB,EAA+D,CACnE,IAAMsU,CAActU,CAAAA,CAAAA,CACpB,OAAIsU,CAAAA,CAAY,UACP,CAAA,CACL,GAAKA,CAAAA,CAAAA,CAAY,MACjB,CAAA,QAAA,CAAU,EACZ,EAQK,CACL,GAAA,CANgB,IAAIvF,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CACjD,QACAuF,CAAAA,CAAAA,CAAY,MACd,CAAA,CAIE,QAAU,CAAA,EACZ,CACF,CACF,CAEOC,CAAAA,EAAAA,CAAQ,IAAImS,EAAAA,CCxBnB,IAAMC,EAAAA,CAAN,KAAqD,CAGnD,KAAM3mB,CAAAA,CAAAA,CAA+D,CACnE,IAAMyU,EAAazU,CACnB,CAAA,GAAIyU,CAAW,CAAA,UAAA,CACb,OAAO,CACL,GAAKA,CAAAA,CAAAA,CAAW,MAChB,CAAA,QAAA,CAAUA,CAAW,CAAA,KACvB,CAGF,CAAA,IAAMC,EAAMD,CAAW,CAAA,cAAA,CACnBne,CAAM,CAAA,EAAA,CACNyZ,CAAkB,CAAA,EAUtB,CAAA,GAPE,EAAE0E,CAAAA,CAAW,KAAiBpT,YAAAA,CAAAA,CAAAA,EAC9B,CAAC,KAAA,CAAM,QAAQoT,CAAW,CAAA,KAAK,CAE/Bne,GAAAA,CAAAA,CAAM,CAAG,EAAA,IAAIyY,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBAAmB,CAAA,QAAA,CAAU0F,CAAW,CAAA,MAAM,CAAC,CAAIA,CAAAA,EAAAA,CAAAA,CAAW,QAAQ,CAAA,EAAA,EAAKC,CAAG,CAAA,CAAA,CACxH3E,EAAW,CAAC0E,CAAAA,CAAW,KAAK,CAAA,CAAA,CAG1B,KAAM,CAAA,OAAA,CAAQA,EAAW,KAAK,CAAA,CAAG,CACnC,IAAME,CAAeF,CAAAA,CAAAA,CAAW,KAC7B,CAAA,GAAA,CAAI,CAACnF,CAAAA,CAAG/P,CAAM,GAAA,CAAA,CAAA,EAAImV,CAAMnV,CAAAA,CAAC,EAAE,CAC3B,CAAA,IAAA,CAAK,IAAI,CAAA,CAEZjJ,CAAM,CAAA,CAAA,EAAG,IAAIyY,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CAAmB,QAAU0F,CAAAA,CAAAA,CAAW,MAAM,CAAC,CAAA,CAAA,EAAIA,CAAW,CAAA,QAAQ,CAAKE,EAAAA,EAAAA,CAAY,CACjI5E,CAAAA,CAAAA,CAAAA,CAAAA,CAAW0E,CAAW,CAAA,MACxB,CAEA,OAAIA,CAAW,CAAA,SAAA,GACbne,EAAM,CAAQA,KAAAA,EAAAA,CAAG,CAGZ,CAAA,CAAA,CAAA,CAAA,CAAE,GAAKA,CAAAA,CAAAA,CAAI,MAAQ,CAAA,QAAA,CAAAyZ,CAAS,CACrC,CACF,CAAA,CAEO6E,GAAQ,IAAI+R,EAAAA,CC1CnB,IAAMC,EAAAA,CAAN,KAA0D,CAExD,KAAM5mB,CAAAA,CAAAA,CAAiB,CACrB,IAAM8U,CAAK9U,CAAAA,CAAAA,CAEL4T,CADQ,CAAA,IAAI7E,EAAiB,IAAK,CAAA,KAAK,CACtB,CAAA,iBAAA,CAAkB,QAAU+F,CAAAA,CAAAA,CAAG,KAAK,CAAA,CACrDxC,CAAOwC,CAAAA,CAAAA,CAAG,OAAQ,CAAA,GAAA,CAAKtZ,CAAM,EAAA,CAAA,CAAA,EAAIA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,IAAK,CAAA,IAAI,CAEtD,CAAA,OAAO,CACL,GAAA,CAAK,CAFQsZ,EAAAA,CAAAA,CAAG,MAAS,CAAA,SAAA,CAAY,EAEvB,CAAA,CAAA,EAAKA,EAAG,SAAS,CAAA,KAAA,EAASlB,CAAQ,CAAA,EAAA,EAAKtB,CAAI,CAAA,CAAA,CAAA,CACzD,SAAU,EACZ,CACF,CACF,CACOyC,CAAAA,EAAAA,CAAQ,IAAI6R,ECfnB,CAAA,IAAMC,EAAN,CAAA,KAAwD,CAEtD,KAAA,CAAM7mB,CAAiB,CAAA,CAErB,OAAO,CAAE,GAAK,CAAA,CAAA,EAAA,EADHA,CACY,CAAA,SAAS,IAAM,QAAU,CAAA,EAAG,CACrD,CACF,CAAA,CACOkV,EAAQ,CAAA,IAAI2R,ECJnB,CAAA,IAAMC,EAAN,CAAA,KAAqD,CAGnD,KAAA,CAAM9mB,EAA+D,CACnE,IAAMoV,CAAapV,CAAAA,CAAAA,CACnB,GAAIoV,CAAAA,CAAW,UACb,CAAA,OAAO,CACL,GAAA,CAAKA,CAAW,CAAA,QAAA,CAAS,KACzB,CAAA,QAAA,CAAU,EACZ,CAAA,CAGF,IAAMnB,CAAAA,CAAmB,IAAIlF,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAClDsG,CAAAA,CAAAA,CAAiBpB,CAAiB,CAAA,yBAAA,CACtC,QACAmB,CAAAA,CAAAA,CAAW,QACb,CAEA,CAAA,GAAI,CAACA,CAAAA,CAAW,OAAQ,CAAA,MAAA,CACtB,OAAO,CACL,GAAKC,CAAAA,CAAAA,CACL,QAAU,CAAA,EACZ,CAAA,CAGF,IAAMC,CAAcF,CAAAA,CAAAA,CAAW,OAAQ,CAAA,CAAC,CAClC/Z,CAAAA,CAAAA,CAAU,MAAO,CAAA,IAAA,CAAKia,CAAW,CAAA,CAEvC,GAAI,CAACja,CAAQ,CAAA,MAAA,CACX,OAAO,CACL,GAAA,CAAKga,CACL,CAAA,QAAA,CAAU,EACZ,CAGF,CAAA,IAAME,CAAmBla,CAAAA,CAAAA,CACtB,GAAKE,CAAAA,CAAAA,EAAW0Y,CAAiB,CAAA,kBAAA,CAAmB,SAAU1Y,CAAM,CAAC,CACrE,CAAA,IAAA,CAAK,IAAI,CAAA,CAENia,EAAmB,EAAC,CACpBC,CAA0B,CAAA,EAEhC,CAAA,IAAA,IAAW5Z,KAAUuZ,CAAW,CAAA,OAAA,CAAS,CACvC,IAAMO,CAAeta,CAAAA,CAAAA,CAAQ,GAAKE,CAAAA,CAAAA,EAAWM,CAAON,CAAAA,CAAM,CAAC,CAAA,CAErDoZ,CAAyB,CAAA,GAC/B,IAAW3hB,IAAAA,CAAAA,IAAS2iB,CACd3iB,CAAAA,CAAAA,YAAiBke,CACnByD,CAAAA,CAAAA,CAAa,IAAK3hB,CAAAA,CAAAA,CAAM,QAAQ,CAAA,EAEhCwiB,CAAU,CAAA,IAAA,CAAKxiB,CAAK,CAAA,CACpB2hB,EAAa,IAAK,CAAA,GAAG,CAIzBc,CAAAA,CAAAA,CAAAA,CAAc,IAAK,CAAA,CAAA,CAAA,EAAId,CAAa,CAAA,IAAA,CAAK,IAAI,CAAC,CAAG,CAAA,CAAA,EACnD,CAIA,OAAO,CACL,GAHU,CAAA,CAAA,EAAGU,CAAc,CAAA,EAAA,EAAKE,CAAgB,CAAA,SAAA,EAAYE,EAAc,IAAK,CAAA,IAAI,CAAC,CAAA,CAAA,CAIpF,QAAUD,CAAAA,CACZ,CACF,CACF,CAAA,CAEOQ,EAAQ,CAAA,IAAI8Q,ECpEnB,CAAA,IAAMC,EAAN,CAAA,KAAmD,CAGjD,KAAA,CAAM/mB,CAA+D,CAAA,CACnE,IAAMkW,CAAAA,CAAWlW,EACjB,GAAIkW,CAAAA,CAAS,UACX,CAAA,OAAO,CACL,GAAA,CAAKA,CAAS,CAAA,KAAA,CACd,QAAU,CAAA,EACZ,CAAA,CAGF,IAAM9D,CAAAA,CAAQ,IAAIrD,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAEzCoH,CAAgBD,CAAAA,CAAAA,CAAS,IACxBC,CAAAA,CAAAA,CAAc,QAAS,CAAA,GAAG,CAC7BA,GAAAA,CAAAA,CAAgB,CAAGD,EAAAA,CAAAA,CAAS,KAAK,CAAIC,CAAAA,EAAAA,CAAa,CAGpD,CAAA,CAAA,CAAA,IAAIC,CAAiBF,CAAAA,CAAAA,CAAS,MACzBE,CAAe,CAAA,QAAA,CAAS,GAAG,CAAA,GAC9BA,CAAiB,CAAA,CAAA,EAAG,KAAK,KAAM,CAAA,KAAK,CAAIA,CAAAA,EAAAA,CAAc,CAGxD,CAAA,CAAA,CAAA,IAAMC,CAAUjE,CAAAA,CAAAA,CAAM,kBAAmB,CAAA,QAAA,CAAU+D,CAAa,CAAA,CAC1DG,CAAWlE,CAAAA,CAAAA,CAAM,mBAAmB,QAAUgE,CAAAA,CAAc,CAIlE,CAAA,OAAO,CAAE,GAAA,CADG,CAFKhE,EAAAA,CAAAA,CAAM,iBAAkB,CAAA,QAAA,CAAU8D,CAAS,CAAA,KAAK,CAE1C,CAAA,IAAA,EAAOG,CAAO,CAAIH,CAAAA,EAAAA,CAAAA,CAAS,EAAI,EAAA,QAAQ,CAAII,CAAAA,EAAAA,CAAQ,CAC5D,CAAA,CAAA,QAAA,CAAU,EAAG,CAC7B,CACF,CAEOC,CAAAA,EAAAA,CAAQ,IAAIwQ,EClCnB,CAAA,IAAMC,EAAN,CAAA,KAAoD,CAGlD,KAAA,CAAMhnB,CAA+D,CAAA,CAGnE,OAAO,CACL,GAAK,CAAA,GAAA,CACL,QAAU,CAAA,CAJMA,EAIK,KAAK,CAC5B,CACF,CACF,CAEO0W,CAAAA,EAAAA,CAAQ,IAAIsQ,EAAAA,CCfZ,IAAMC,EAAAA,CAAN,KAAmD,CAGxD,KAAMjV,CAAAA,CAAAA,CAAoD,CAExD,OAAO,CACL,GAAK,CAAA,EAAA,CACL,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEO4E,EAAQ,CAAA,IAAIqQ,ECVnB,CAAA,IAAMC,GAAN,KAAqD,CAGnD,KAAMlnB,CAAAA,CAAAA,CAA+D,CAGnE,OAAO,CACL,GAAA,CAAK,GACL,CAAA,QAAA,CAAU,CAJOA,CAAAA,CAIK,MAAM,CAC9B,CACF,CACF,CAAA,CAEO+W,EAAQ,CAAA,IAAImQ,ECZnB,CAAA,IAAMC,GAAN,KAA0D,CAGxD,KAAMnnB,CAAAA,CAAAA,CAA+D,CACnE,IAAMiX,EAAkBjX,CAExB,CAAA,GAAIiX,CAAgB,CAAA,UAAA,CAClB,OAAO,CACL,GAAKA,CAAAA,CAAAA,CAAgB,KACrB,CAAA,QAAA,CAAU,EACZ,CAGF,CAAA,IAAMhD,EAAmB,IAAIlF,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAClD6R,CAAAA,CAAAA,CAA2B3J,CAAgB,CAAA,eAAA,CAC9C,GAAK1b,CAAAA,CAAAA,EAAW0Y,CAAiB,CAAA,kBAAA,CAAmB,QAAU1Y,CAAAA,CAAM,CAAC,CACrE,CAAA,IAAA,CAAK,IAAI,CAAA,CAEZ,GAAI0b,CAAAA,CAAgB,IAAS,GAAA,QAAA,CAC3B,OAAO,CACL,GAAK,CAAA,CAAA,aAAA,EAAgB2J,CAAwB,CAAA,YAAA,CAAA,CAC7C,SAAU,EACZ,CAGF,CAAA,IAAMC,CAAY5J,CAAAA,CAAAA,CAAgB,gBAC/B,GACE1b,CAAAA,CAAAA,EACC,CAAG0Y,EAAAA,CAAAA,CAAiB,kBAAmB,CAAA,QAAA,CAAU1Y,CAAM,CAAC,CAAA,YAAA,EAAe0Y,CAAiB,CAAA,kBAAA,CAAmB,QAAU1Y,CAAAA,CAAM,CAAC,CAAA,CAChI,CACC,CAAA,IAAA,CAAK,IAAI,CAAA,CAEZ,OAAO,CACL,IAAK,CAAgBqlB,aAAAA,EAAAA,CAAwB,CAAmBC,gBAAAA,EAAAA,CAAS,CACzE,CAAA,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CAEO3J,CAAAA,EAAAA,CAAQ,IAAIiQ,EAAAA,CCvCnB,IAAMC,EAAN,CAAA,KAAsD,CAGpD,KAAA,CAAMpnB,CAA+D,CAAA,CACnE,IAAMoX,CAAAA,CAAcpX,CACpB,CAAA,GAAIoX,CAAY,CAAA,UAAA,CACd,OAAO,CACL,IAAKA,CAAY,CAAA,MAAA,CACjB,QAAU,CAAA,EACZ,CAAA,CAGF,IAAMC,CAAY,CAAA,IAAItI,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,mBACjD,QACAqI,CAAAA,CAAAA,CAAY,MACd,CAAA,CACME,CAAeF,CAAAA,CAAAA,CAAY,SAAU,CAAA,WAAA,EAE3C,CAAA,OAAO,CACL,GAAA,CAAK,CAAGC,EAAAA,CAAS,IAAIC,CAAY,CAAA,CAAA,CACjC,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEOC,EAAQ,CAAA,IAAI6P,EC3BnB,CAAA,IAAMC,EAAN,CAAA,KAAkD,CAGhD,KAAMrnB,CAAAA,CAAAA,CAAmD,CAEvD,OAAO,CACL,GAAA,CAFcA,CAED,CAAA,QAAA,CACb,QAAU,CAAA,EACZ,CACF,CACF,CAAA,CAEOyX,GAAQ,IAAI4P,EAAAA,CCXnB,IAAMC,EAAAA,CAAN,KAA6D,CAG3D,KAAMtV,CAAAA,CAAAA,CAAgE,CAIpE,OAAO,CAAE,GAAA,CADG,CAFCA,wBAAAA,EAAAA,CAAAA,CACM,KACyB,CAC9B,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC7B,CACF,CAEO2F,CAAAA,EAAAA,CAAQ,IAAI2P,EAAAA,CCXnB,IAAMC,EAAAA,CAAN,KAAwD,CAGtD,MAAMvV,CAAgE,CAAA,CAIpE,OAAO,CAAE,GADG,CAAA,CAAA,kBAAA,EAFCA,CACM,CAAA,KACmB,CACxB,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC7B,CACF,EAEO6F,EAAQ,CAAA,IAAI0P,ECXnB,CAAA,IAAMC,EAAN,CAAA,KAA6D,CAG3D,KAAA,CAAMxV,CAAgE,CAAA,CASpE,OAAO,CAAE,GANG,CAAA,CAAA;AAAA;AAAA;AAAA,4BAAA,EAFCA,EACM,KAIY,CAAA;AAAA;AAAA,eAGjB,CAAA,CAAA,QAAA,CAAU,EAAG,CAC7B,CACF,CAEO+F,CAAAA,EAAAA,CAAQ,IAAIyP,EAAAA,CChBnB,IAAMC,EAAAA,CAAN,KAAwD,CAGtD,MAAMzV,CAAgE,CAAA,CAIpE,OAAO,CAAE,GADG,CAAA,CAAA,kBAAA,EAFCA,CACM,CAAA,KACmB,CACxB,CAAA,CAAA,CAAA,QAAA,CAAU,EAAG,CAC7B,CACF,EAEOiG,EAAQ,CAAA,IAAIwP,ECTnB,CAAA,IAAMC,EAAN,CAAA,KAAqD,CAGnD,KAAA,CAAM1nB,CAA+D,CAAA,CACnE,IAAMmY,CAAAA,CAAanY,CACnB,CAAA,GAAImY,EAAW,UACb,CAAA,OAAO,CACL,GAAA,CAAKA,CAAW,CAAA,MAAA,CAChB,QAAU,CAAA,EACZ,CAAA,CAGF,IAAMC,CAAAA,CAAe,IAAK,CAAA,YAAA,CACxBD,EAAW,MACXA,CAAAA,CAAAA,CAAW,WACb,CAAA,CACMhE,CAAW,CAAA,IAAA,CAAK,WAAYgE,CAAAA,CAAAA,CAAW,KAAK,CAAA,CAClD,OAAO,CACL,GAAK,CAAA,CAAA,EAAGC,EAAa,GAAG,CAAA,EAAGjE,CAAQ,CAAA,CAAA,CACnC,QAAUiE,CAAAA,CAAAA,CAAa,QACzB,CACF,CAEQ,YAAA,CACN7c,CACA8c,CAAAA,CAAAA,CAC8C,CAC9C,GAAI,OAAO9c,CAAW,EAAA,QAAA,CAAU,CAC9B,IAAMuK,CAAM,CAAA,IAAIiJ,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBAC3C,CAAA,QAAA,CACAxT,CACF,CAAA,CACIjF,EAAMwP,CACV,CAAA,OAAIuS,CACF/hB,GAAAA,CAAAA,CAAM,CAAG+hB,EAAAA,CAAAA,CAAY,WAAY,EAAC,CAAIvS,CAAAA,EAAAA,CAAG,CAEpC,CAAA,CAAA,CAAA,CAAA,CACL,GAAAxP,CAAAA,CAAAA,CACA,SAAU,EACZ,CACF,CAEA,GAAI,KAAA,CAAM,OAAQiF,CAAAA,CAAM,CAAKA,EAAAA,CAAAA,CAAO,MAAS,CAAA,CAAA,CAAG,CAK9C,IAAMzF,EAJY,IAAIqK,CAAAA,CACpB,IAAK,CAAA,KAAA,CACL,QACF,CAAA,CACyB,KAAM5E,CAAAA,CAAM,CACjCjF,CAAAA,CAAAA,CAAM,CAAIR,CAAAA,EAAAA,CAAAA,CAAO,GAAG,CAAA,CAAA,CAAA,CACxB,OAAIuiB,CACF/hB,GAAAA,CAAAA,CAAM,CAAG+hB,EAAAA,CAAAA,CAAY,WAAY,EAAC,CAAG/hB,EAAAA,CAAG,CAEnC,CAAA,CAAA,CAAA,CACL,GAAAA,CAAAA,CAAAA,CACA,QAAUR,CAAAA,CAAAA,CAAO,QACnB,CACF,CAEA,GAAI,CAAC,KAAM,CAAA,OAAA,CAAQyF,CAAM,CAAA,CAAG,CAK1B,IAAMzF,CAJY,CAAA,IAAIqK,CACpB,CAAA,IAAA,CAAK,MACL,QACF,CAAA,CACyB,KAAM,CAAA,CAAC5E,CAAM,CAAC,CACnCjF,CAAAA,CAAAA,CAAM,CAAIR,CAAAA,EAAAA,CAAAA,CAAO,GAAG,CAAA,CAAA,CAAA,CACxB,OAAIuiB,CAAAA,GACF/hB,EAAM,CAAG+hB,EAAAA,CAAAA,CAAY,WAAY,EAAC,CAAG/hB,EAAAA,CAAG,CAEnC,CAAA,CAAA,CAAA,CACL,GAAAA,CAAAA,CAAAA,CACA,QAAUR,CAAAA,CAAAA,CAAO,QACnB,CACF,CA0BA,OAAO,CACL,GAzBuByF,CAAAA,CAAAA,CAAO,GAAKuK,CAAAA,CAAAA,EAAQ,CAC3C,GAAI,OAAOA,CAAAA,EAAQ,QAAU,CAAA,CAC3B,IAAMwS,CAAAA,CAAY,IAAIvJ,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBACjD,CAAA,QAAA,CACAjJ,CACF,CAAA,CACA,OAAIuS,CAAAA,CACK,CAAGA,EAAAA,CAAAA,CAAY,WAAY,EAAC,IAAIC,CAAS,CAAA,CAAA,CAAA,CAE3CA,CACT,CAOA,IAAIhiB,CAAAA,CAAM,CALQ,CAAA,EAAA,IAAI6J,CACpB,CAAA,IAAA,CAAK,KACL,CAAA,QACF,CACyB,CAAA,KAAA,CAAM,CAAC2F,CAAG,CAAC,CACf,CAAA,GAAG,CACxB,CAAA,CAAA,CAAA,OAAIuS,CACF/hB,GAAAA,CAAAA,CAAM,CAAG+hB,EAAAA,CAAAA,CAAY,WAAY,EAAC,CAAG/hB,EAAAA,CAAG,IAEnCA,CACT,CAAC,CAGuB,CAAA,IAAA,CAAK,IAAI,CAAA,CAC/B,QAAU,CAAA,EACZ,CACF,CAEQ,WAAA,CAAY4Y,CAAwB,CAAA,CAC1C,OAAIA,CAASA,EAAAA,CAAAA,CAAM,MAAS,CAAA,CAAA,CACnB,CAAQA,KAAAA,EAAAA,CAAK,CAEf,CAAA,CAAA,CAAA,EACT,CACF,CAAA,CAEOqJ,EAAQ,CAAA,IAAImP,EChHnB,CAAA,IAAMC,GAAN,KAAuD,CAGrD,KAAM3nB,CAAAA,CAAAA,CAA+D,CACnE,IAAMyY,CAAezY,CAAAA,CAAAA,CAErB,GAAIyY,CAAAA,CAAa,UAAc,EAAA,OAAOA,CAAa,CAAA,QAAA,EAAa,SAC9D,OAAAA,CAAAA,CAAa,OAAU,CAAA,EAAA,CAEhB,CACL,GAAA,CAAKA,CAAa,CAAA,QAAA,CAClB,QAAU,CAAA,EACZ,CAAA,CAGF,IAAMpD,CAAAA,CAAiB,IAAItG,CACzB,CAAA,IAAA,CAAK,KACP,CAAA,CAAE,yBAA0B,CAAA,QAAA,CAAU0J,CAAa,CAAA,QAAoB,CAEvE,CAAA,OAAAA,CAAa,CAAA,OAAA,CAAU,aAEhB,CAAA,CACL,IAAKpD,CACL,CAAA,QAAA,CAAU,EACZ,CACF,CACF,CAEOqD,CAAAA,EAAAA,CAAQ,IAAIiP,EAAAA,CC9BnB,IAAMC,EAAAA,CAAN,KAAoD,CAGlD,MAAM5nB,CAA+D,CAAA,CACnE,IAAM4Y,CAAAA,CAAY5Y,CACZ6Y,CAAAA,CAAAA,CAAS,IAAI1Y,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,QAAQ,CAAA,CAC3C2Y,CAAQ,CAAA,KAAA,CAAM,QAAQF,CAAU,CAAA,KAAK,CACvCA,CAAAA,CAAAA,CAAU,KACV,CAAA,CAACA,CAAU,CAAA,KAAK,CAEd1Y,CAAAA,CAAAA,CACJ,OAAO0Y,CAAAA,CAAU,KAAU,EAAA,QAAA,CACvB,CAAE,GAAKA,CAAAA,CAAAA,CAAU,KAAO,CAAA,QAAA,CAAU,EAAG,CACrCC,CAAAA,CAAAA,CAAO,KACLC,CAAAA,CAAAA,CAAM,MAAO,CAAA,OAAO,CACpBF,CAAAA,CAAAA,CAAU,cACZ,CAEN,CAAA,OAAO,CACL,GAAA,CAAK1Y,CAAI,CAAA,GAAA,CACT,QAAUA,CAAAA,CAAAA,CAAI,QAChB,CACF,CACF,CAAA,CAEO6Y,EAAQ,CAAA,IAAI6O,GCtBnB,IAAMC,EAAAA,CAAN,KAAqD,CAGnD,KAAM7nB,CAAAA,CAAAA,CAA+D,CACnE,IAAMiZ,CAAajZ,CAAAA,CAAAA,CACnB,GAAIiZ,CAAAA,CAAW,UAAc,EAAA,OAAOA,EAAW,QAAa,EAAA,QAAA,CAC1D,OAAO,CACL,GAAKA,CAAAA,CAAAA,CAAW,QAChB,CAAA,QAAA,CAAUA,CAAW,CAAA,MACvB,CAGF,CAAA,IAAMhF,CAAmB,CAAA,IAAIlF,EAAiB,IAAK,CAAA,KAAK,CAClDsG,CAAAA,CAAAA,CAAiBpB,CAAiB,CAAA,yBAAA,CACtC,QACAgF,CAAAA,CAAAA,CAAW,QACb,CAAA,CAEA,GAAI,CAACA,CAAW,CAAA,OAAA,CAAQ,MAAU,EAAA,CAACA,CAAW,CAAA,MAAA,CAAO,MACnD,CAAA,OAAO,CACL,GAAA,CAAK5D,CACL,CAAA,QAAA,CAAU,EACZ,CAGF,CAAA,IAAM8D,CAAuB,CAAA,GACvBC,CAAYH,CAAAA,CAAAA,CAAW,OAC1B,CAAA,GAAA,CAAI,CAAC1d,CAAAA,CAAQoO,CAAU,GAAA,CACtB,IAAM3W,CAAAA,CAAQimB,CAAW,CAAA,MAAA,CAAOtP,CAAK,CAAA,CACrC,OAAI3W,CAAiBke,YAAAA,CAAAA,CACZ,CAAG+C,EAAAA,CAAAA,CAAiB,kBAAmB,CAAA,QAAA,CAAU1Y,CAAM,CAAC,CAAMvI,GAAAA,EAAAA,CAAAA,CAAM,QAAQ,CAAA,CAAA,EAGrFmmB,CAAc,CAAA,IAAA,CAAKnmB,CAAK,CACjB,CAAA,CAAA,EAAGihB,CAAiB,CAAA,kBAAA,CAAmB,QAAU1Y,CAAAA,CAAM,CAAC,CAAA,IAAA,CAAA,CACjE,CAAC,CAAA,CACA,IAAK,CAAA,IAAI,CAEZ,CAAA,OAAO,CACL,GAAK,CAAA,CAAA,EAAG8Z,CAAc,CAAA,KAAA,EAAQ+D,CAAS,CAAA,CAAA,CACvC,QAAUD,CAAAA,CACZ,CACF,CACF,CAEOE,CAAAA,EAAAA,CAAQ,IAAIwO,EAAAA,CC9CnB,IAAMC,EAAN,CAAA,KAAoD,CAGlD,KAAA,CAAM9nB,CAA+D,CAAA,CACnE,IAAMuZ,CAAAA,CAAYvZ,CAClB,CAAA,GAAIuZ,CAAU,CAAA,UAAA,CACZ,OAAO,CACL,IAAKA,CAAU,CAAA,MAAA,CACf,QAAWA,CAAAA,CAAAA,CAAU,KAAmB,EAAA,EAC1C,CAAA,CAGF,IAAIjjB,CAAAA,CAAM,EACNyZ,CAAAA,CAAAA,CAAkB,EAAC,CAEvB,GAAI,IAAK,CAAA,SAAA,CAAUwJ,CAAU,CAAA,KAAK,CAAG,CAAA,CACnC,IAAMC,CAAAA,CAAiB,IAAK,CAAA,6BAAA,CAC1BD,CAAU,CAAA,KAAA,CAAM,QAClB,CAAA,CACAjjB,EAAM,CAAG,EAAA,IAAIyY,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBAAmB,CAAA,QAAA,CAAUwK,CAAU,CAAA,MAAM,CAAC,CAAA,CAAA,EAAIA,CAAU,CAAA,QAAQ,IAAIC,CAAc,CAAA,CAAA,CAChIzJ,CAAW,CAAA,GACb,CAAA,KAAA,GAAW,KAAM,CAAA,OAAA,CAAQwJ,CAAU,CAAA,KAAK,CACtC,CAAA,GAAIA,CAAU,CAAA,QAAA,CAAS,aAAkB,GAAA,SAAA,CAEvCjjB,CAAM,CAAA,CAAA,EAAG,IAAIyY,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CAAmB,QAAUwK,CAAAA,CAAAA,CAAU,MAAM,CAAC,mBACxFxJ,CAAWwJ,CAAAA,CAAAA,CAAU,KAChB,CAAA,KAAA,CACL,IAAM5E,CAAAA,CAAe4E,CAAU,CAAA,KAAA,CAAM,GAAKjK,CAAAA,CAAAA,EAAM,GAAG,CAAA,CAAE,IAAK,CAAA,IAAI,EAC9DhZ,CAAM,CAAA,CAAA,EAAG,IAAIyY,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CAAmB,QAAUwK,CAAAA,CAAAA,CAAU,MAAM,CAAC,CAAIA,CAAAA,EAAAA,CAAAA,CAAU,QAAQ,CAAK5E,EAAAA,EAAAA,CAAY,CAC/H5E,CAAAA,CAAAA,CAAAA,CAAAA,CAAWwJ,CAAU,CAAA,MACvB,CAEIA,KAAAA,GAAAA,CAAAA,CAAU,QAAS,CAAA,QAAA,CAAS,MAAM,CAAA,CACpCjjB,CAAM,CAAA,CAAA,EAAG,IAAIyY,CAAiB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,kBAAmB,CAAA,QAAA,CAAUwK,CAAU,CAAA,MAAM,CAAC,CAAA,CAAA,EAAIA,CAAU,CAAA,QAAQ,CAC9GxJ,CAAAA,CAAAA,CAAAA,CAAW,EACN,CAAA,KAAA,CAAA,GAAIwJ,CAAU,CAAA,KAAA,GAAU,MAC7B,CAAA,OAAO,CAAE,GAAA,CAAK,EAAI,CAAA,QAAA,CAAU,EAAG,CAE/BjjB,CAAAA,CAAAA,CAAM,GAAG,IAAIyY,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CAAmB,QAAUwK,CAAAA,CAAAA,CAAU,MAAM,CAAC,CAAIA,CAAAA,EAAAA,CAAAA,CAAU,QAAQ,CAAA,EAAA,CAAA,CAC9GxJ,EAAW,CAACwJ,CAAAA,CAAU,KAAK,EAAA,CAI/B,OAAIA,CAAAA,CAAU,SACZjjB,GAAAA,CAAAA,CAAM,CAAQA,KAAAA,EAAAA,CAAG,CAGZ,CAAA,CAAA,CAAA,CAAA,CAAE,GAAKA,CAAAA,CAAAA,CAAI,MAAQ,CAAA,QAAA,CAAAyZ,CAAS,CACrC,CAEQ,SAAA,CAAU/c,CAA8B,CAAA,CAC9C,OACEA,CAAAA,EACA,OAAOA,CAAAA,EAAU,QACjB,EAAA,UAAA,GAAcA,GACdA,CAAM,CAAA,UAAA,GAAe,IAEzB,CAEQ,6BAA8B4mB,CAAAA,CAAAA,CAAqB,CAGzD,OADE,0DAA2D,CAAA,IAAA,CAAKA,CAAG,CAAA,CAI9D,IAAI7K,CAAAA,CAAiB,KAAK,KAAK,CAAA,CAAE,kBAAmB,CAAA,QAAA,CAAU6K,CAAG,CAAA,CAF/DA,CAGX,CACF,CAEOC,CAAAA,EAAAA,CAAQ,IAAIiO,EAAAA,CCtEnB,IAAMC,EAAAA,CAAN,KAAyD,CAGvD,KAAA,CAAM/nB,CAA+D,CAAA,CACnE,IAAM+Z,CAAAA,CAAY/Z,CAClB,CAAA,GAAI,CAAC+Z,CAAAA,CAAU,KAASA,EAAAA,CAAAA,CAAU,KAAM,CAAA,MAAA,GAAW,EACjD,OAAO,CAAE,GAAK,CAAA,EAAA,CAAI,QAAU,CAAA,EAAG,CAAA,CAGjC,IAAMtK,CAAAA,CAAY,IAAItP,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,QAA6B,CACnE,CAAA,CAAE,GAAA7J,CAAAA,CAAAA,CAAK,QAAAyZ,CAAAA,CAAS,CAAIN,CAAAA,CAAAA,CAAU,KAClCsK,CAAAA,CAAAA,CAAU,KACVA,CAAAA,CAAAA,CAAU,cACV,CAAA,IACF,EAEA,OAAO,CACL,GAAK,CAAA,CAAA,CAAA,EAAIzjB,CAAG,CAAA,CAAA,CAAA,CACZ,QAAAyZ,CAAAA,CACF,CACF,CACF,CAEOiK,CAAAA,EAAAA,CAAQ,IAAI+N,EAAAA,CCvBnB,IAAMC,EAAN,CAAA,KAAwD,CAGtD,KAAA,CAAMhoB,CAA+D,CAAA,CACnE,IAAMka,CAAAA,CAAgBla,CACtB,CAAA,GAAIka,CAAc,CAAA,UAAA,CAChB,OAAO,CACL,IAAKA,CAAc,CAAA,MAAA,CACnB,QAAU,CAAA,EACZ,CAAA,CAGF,IAAI5jB,CAAAA,CAAM,EACNyZ,CAAAA,CAAAA,CAAkB,EAAC,CAEjBsH,CAAY,CAAA,IAAItI,EAAiB,IAAK,CAAA,KAAK,CAAE,CAAA,kBAAA,CACjD,QACAmL,CAAAA,CAAAA,CAAc,MAChB,CAAA,CAEA,OAAQA,CAAAA,CAAc,YAAc,EAClC,KAAK,GAAA,CACH5jB,EAAM,CAAQ+gB,KAAAA,EAAAA,CAAS,CACvBtH,WAAAA,CAAAA,CAAAA,CAAAA,CAAW,CAAC,IAAA,CAAK,SAAUmK,CAAAA,CAAAA,CAAc,KAAK,CAAC,CAC/C,CAAA,MACF,KAAK,UAAA,CACH5jB,EAAM,CAAQ+gB,KAAAA,EAAAA,CAAS,CACvBtH,WAAAA,CAAAA,CAAAA,CAAAA,CAAW,CAAC,IAAA,CAAK,SAAUmK,CAAAA,CAAAA,CAAc,KAAK,CAAC,CAC/C,CAAA,MACF,KAAK,cAAA,CACH5jB,EAAM,CAAQ+gB,KAAAA,EAAAA,CAAS,CACvBtH,WAAAA,CAAAA,CAAAA,CAAAA,CAAW,CAAC,IAAA,CAAK,SAAUmK,CAAAA,CAAAA,CAAc,KAAK,CAAC,CAC/C,CAAA,MACF,KAAK,KAAA,CACH5jB,EAAM4jB,CAAc,CAAA,MAAA,CACpBnK,CAAW,CAAA,KAAA,CAAM,OAAQmK,CAAAA,CAAAA,CAAc,KAAK,CAAA,CACxCA,CAAc,CAAA,KAAA,CACd,EAAC,CACL,KACJ,CAEA,OAAIA,CAAAA,CAAc,SAChB5jB,GAAAA,CAAAA,CAAM,CAAQA,KAAAA,EAAAA,CAAG,CAGZ,CAAA,CAAA,CAAA,CAAA,CAAE,GAAKA,CAAAA,CAAAA,CAAI,IAAK,EAAA,CAAG,QAAAyZ,CAAAA,CAAS,CACrC,CACF,EAEOoK,EAAQ,CAAA,IAAI6N,ECjDnB,CAAA,IAAMC,EAAN,CAAA,KAA4D,CAG1D,KAAA,CAAMjoB,CAA+D,CAAA,CACnE,IAAMqa,CAAAA,CAAera,CAErB,CAAA,OAAI,KAAK,gBAAiBqa,CAAAA,CAAAA,CAAa,QAAQ,CAAA,CACtC,IAAK,CAAA,oBAAA,CAAqBA,CAAY,CAAA,CAG3C,IAAK,CAAA,eAAA,CAAgBA,CAAa,CAAA,QAAQ,CACrC,CAAA,IAAA,CAAK,oBAAoBA,CAAY,CAAA,CAGvC,IAAK,CAAA,oBAAA,CAAqBA,CAAY,CAC/C,CAEQ,gBAAA,CACNC,CACoB,CAAA,CACpB,OAAO,OAAOA,CAAa,EAAA,QAC7B,CAEQ,eACNA,CAAAA,CAAAA,CACyB,CACzB,OAAO,KAAM,CAAA,OAAA,CAAQA,CAAQ,CAC/B,CAEQ,oBAAA,CACND,CAC8C,CAAA,CAE9C,OAAO,CAAE,IADG,CAAGA,EAAAA,CAAAA,CAAa,MAAM,CAAA,CAAA,EAAIA,CAAa,CAAA,QAAQ,CAAKA,EAAAA,EAAAA,CAAAA,CAAa,QAAQ,CAAA,CAAA,CAAA,CACnE,IAAK,EAAA,CAAG,QAAU,CAAA,EAAG,CACzC,CAEQ,mBACNA,CAAAA,CAAAA,CAC8C,CAC9C,IAAM5K,CAAY,CAAA,IAAItP,CAAU,CAAA,IAAA,CAAK,KAAO,CAAA,QAA6B,CACnE,CAAA,CAAE,IAAKoa,CAAa,CAAA,QAAA,CAAUC,CAAiB,CAAA,CAAI/K,CAAU,CAAA,KAAA,CACjE4K,CAAa,CAAA,QAAA,CACbA,CAAa,CAAA,cACf,CAGA,CAAA,OAAO,CAAE,GAAA,CADG,GAAGA,CAAa,CAAA,MAAM,CAAIA,CAAAA,EAAAA,CAAAA,CAAa,QAAQ,CAAA,EAAA,EAAKE,CAAW,CAAA,CAAA,CAAA,CACzD,IAAK,EAAA,CAAG,QAAUC,CAAAA,CAAiB,CACvD,CAEQ,qBACNH,CAC8C,CAAA,CAC9C,IAAM5K,CAAAA,CAAY,IAAItP,CAAAA,CAAU,IAAK,CAAA,KAAA,CAAO,QAA6B,CAAA,CACnE,CAAE,GAAA,CAAKoa,CAAa,CAAA,QAAA,CAAUC,CAAiB,CAAI/K,CAAAA,CAAAA,CAAU,KACjE,CAAA,CAAC4K,CAAa,CAAA,QAAqB,CACnCA,CAAAA,CAAAA,CAAa,cACf,CAAA,CAGA,OAAO,CAAE,GADG,CAAA,CAAA,EAAGA,EAAa,MAAM,CAAA,CAAA,EAAIA,CAAa,CAAA,QAAQ,CAAKE,EAAAA,EAAAA,CAAW,CACzD,CAAA,CAAA,CAAA,IAAA,EAAQ,CAAA,QAAA,CAAUC,CAAiB,CACvD,CACF,CAAA,CAEOC,GAAQ,IAAIwN,EAAAA,CChEnB,IAAMC,EAAAA,CAAN,KAAmD,CAGjD,KAAMloB,CAAAA,CAAAA,CAA+D,CACnE,IAAM2a,CAAW3a,CAAAA,CAAAA,CACX6Y,CAAS,CAAA,IAAI1Y,EAAU,IAAK,CAAA,KAAA,CAAO,QAAQ,CAAA,CAC3C2Y,CAAQ,CAAA,KAAA,CAAM,OAAQ6B,CAAAA,CAAAA,CAAS,IAAI,CAAA,CACrCA,CAAS,CAAA,IAAA,CACT,CAACA,CAAAA,CAAS,IAAI,CAEZza,CAAAA,CAAAA,CAAM2Y,CAAO,CAAA,KAAA,CACjBC,CAAM,CAAA,MAAA,CAAO,OAAO,CAAA,CACpB6B,CAAS,CAAA,cACX,CAEA,CAAA,OAAO,CACL,GAAA,CAAK,GAAGA,CAAS,CAAA,KAAK,CAAQza,KAAAA,EAAAA,CAAAA,CAAI,GAAG,CAAA,CAAA,CAAA,CACrC,QAAUA,CAAAA,CAAAA,CAAI,QAChB,CACF,CACF,CAAA,CAEO0a,EAAQ,CAAA,IAAIsN,GCyNZ,IAAMC,EAAAA,CAAiB,CAC5B,KAAA,CAAO,CACL,WAAA,CAAa,CACX,UAAA,CAAY3nB,EACZ,CAAA,cAAA,CAAgBE,EAChB,CAAA,eAAA,CAAiBE,EACjB,CAAA,iBAAA,CAAmBQ,GACnB,WAAa+O,CAAAA,EAAAA,CACb,WAAaE,CAAAA,EAAAA,CACb,eAAiBE,CAAAA,EAAAA,CACjB,YAAcE,CAAAA,EAAAA,CACd,aAAeE,CAAAA,EAAAA,CACf,gBAAkBE,CAAAA,EAAAA,CAClB,aAAeE,CAAAA,EAAAA,CACf,aAAcE,EACd,CAAA,WAAA,CAAaG,EACb,CAAA,YAAA,CAAcE,EAChB,CAAA,CACA,MAAQ,CAAA,CACN,WAAaQ,CAAAA,EACf,CACA,CAAA,UAAA,CAAY,CACV,KAAA,CAAOG,GACP,UAAYU,CAAAA,EACd,CACA,CAAA,YAAA,CAAc,CACZ,YAAA,CAAcQ,EAChB,CAAA,CACA,MAAQ,CAAA,CACN,MAAQG,CAAAA,EACV,CACA,CAAA,QAAA,CAAU,CACR,QAAUE,CAAAA,EAAAA,CACV,WAAaE,CAAAA,EACf,CACA,CAAA,UAAA,CAAY,CACV,UAAA,CAAYG,EACd,CAAA,CACA,SAAW,CAAA,CACT,gBAAkBE,CAAAA,EACpB,EACA,IAAM,CAAA,CACJ,IAAMK,CAAAA,EACR,CACA,CAAA,QAAA,CAAU,CACR,QAAA,CAAUG,EACZ,CAAA,CACA,MAAQ,CAAA,CACN,MAAQK,CAAAA,EACV,EACA,QAAU,CAAA,CACR,YAAcG,CAAAA,EAAAA,CACd,UAAYG,CAAAA,EACd,CACA,CAAA,MAAA,CAAQ,CACN,MAAA,CAAQc,EACV,CAAA,CACA,IAAM,CAAA,CACJ,KAAMO,EACR,CAAA,CACA,KAAO,CAAA,CACL,KAAOG,CAAAA,EACT,CACA,CAAA,IAAA,CAAM,CACJ,IAAA,CAAME,EACR,CAAA,CACA,MAAQ,CAAA,CACN,OAAQG,EACV,CAAA,CACA,YAAc,CAAA,CACZ,YAAcG,CAAAA,EAChB,CACA,CAAA,QAAA,CAAU,CACR,QAAA,CAAUK,EACZ,CAAA,CACA,GAAK,CAAA,CACH,IAAKE,EACP,CAAA,CACA,MAAQ,CAAA,CACN,gBAAkBE,CAAAA,EAAAA,CAClB,UAAYE,CAAAA,EAAAA,CACZ,gBAAkBE,CAAAA,EAAAA,CAClB,UAAYE,CAAAA,EACd,CACA,CAAA,MAAA,CAAQ,CACN,MAAQM,CAAAA,EACV,CACA,CAAA,QAAA,CAAU,CACR,QAAA,CAAUG,EACZ,CAAA,CACA,KAAO,CAAA,CACL,KAAOK,CAAAA,EACT,CACA,CAAA,MAAA,CAAQ,CACN,MAAQM,CAAAA,EACV,CACA,CAAA,KAAA,CAAO,CACL,KAAA,CAAOQ,EACP,CAAA,WAAA,CAAaG,EACb,CAAA,UAAA,CAAYG,EACZ,CAAA,cAAA,CAAgBM,EAClB,CAAA,CACA,KAAM,CACJ,IAAA,CAAMG,EACR,CACF,CACA,CAAA,KAAA,CAAO,CACL,WAAA,CAAa,CACX,UAAA,CAAYpa,EACZ,CAAA,cAAA,CAAgBE,EAChB,CAAA,eAAA,CAAiBE,GACjB,iBAAmBQ,CAAAA,EAAAA,CACnB,WAAa+O,CAAAA,EAAAA,CACb,WAAaE,CAAAA,EAAAA,CACb,eAAiBE,CAAAA,EAAAA,CACjB,YAAcE,CAAAA,EAAAA,CACd,aAAeE,CAAAA,EAAAA,CACf,gBAAkBE,CAAAA,EAAAA,CAClB,cAAeE,EACf,CAAA,YAAA,CAAcE,EACd,CAAA,WAAA,CAAaG,EACb,CAAA,YAAA,CAAcE,EAChB,CAAA,CACA,MAAQ,CAAA,CACN,WAAaQ,CAAAA,EACf,CACA,CAAA,UAAA,CAAY,CACV,KAAOG,CAAAA,EAAAA,CACP,UAAYU,CAAAA,EACd,CACA,CAAA,YAAA,CAAc,CACZ,YAAA,CAAcQ,EAChB,CAAA,CACA,MAAQ,CAAA,CACN,MAAQG,CAAAA,EACV,CACA,CAAA,QAAA,CAAU,CACR,QAAA,CAAUE,EACV,CAAA,WAAA,CAAaE,EACf,CAAA,CACA,UAAY,CAAA,CACV,UAAYG,CAAAA,EACd,CACA,CAAA,SAAA,CAAW,CACT,gBAAA,CAAkBE,EACpB,CACA,CAAA,IAAA,CAAM,CACJ,IAAA,CAAMK,EACR,CAAA,CACA,QAAU,CAAA,CACR,QAAUG,CAAAA,EACZ,CACA,CAAA,MAAA,CAAQ,CACN,MAAA,CAAQK,EACV,CACA,CAAA,QAAA,CAAU,CACR,YAAA,CAAcG,EACd,CAAA,UAAA,CAAYG,EACd,CAAA,CACA,MAAQ,CAAA,CACN,MAAQc,CAAAA,EACV,CACA,CAAA,IAAA,CAAM,CACJ,IAAMO,CAAAA,EACR,CACA,CAAA,KAAA,CAAO,CACL,KAAA,CAAOG,EACT,CAAA,CACA,IAAM,CAAA,CACJ,IAAME,CAAAA,EACR,CACA,CAAA,MAAA,CAAQ,CACN,MAAQG,CAAAA,EACV,CACA,CAAA,YAAA,CAAc,CACZ,YAAA,CAAcG,EAChB,CAAA,CACA,QAAU,CAAA,CACR,QAAUK,CAAAA,EACZ,CACA,CAAA,GAAA,CAAK,CACH,GAAKE,CAAAA,EACP,CACA,CAAA,MAAA,CAAQ,CACN,gBAAA,CAAkBE,EAClB,CAAA,UAAA,CAAYE,EACZ,CAAA,gBAAA,CAAkBE,EAClB,CAAA,UAAA,CAAYE,EACd,CAAA,CACA,OAAQ,CACN,MAAA,CAAQM,EACV,CAAA,CACA,QAAU,CAAA,CACR,QAAUG,CAAAA,EACZ,CACA,CAAA,KAAA,CAAO,CACL,KAAA,CAAOK,EACT,CAAA,CACA,OAAQ,CACN,MAAA,CAAQM,EACV,CAAA,CACA,KAAO,CAAA,CACL,KAAOQ,CAAAA,EAAAA,CACP,WAAaG,CAAAA,EAAAA,CACb,UAAYG,CAAAA,EAAAA,CACZ,cAAgBM,CAAAA,EAClB,EACA,IAAM,CAAA,CACJ,IAAMG,CAAAA,EACR,CACF,CAAA,CACA,QAAU,CAAA,CACR,WAAa,CAAA,CACX,UAAYpa,CAAAA,EAAAA,CACZ,cAAgBE,CAAAA,EAAAA,CAChB,gBAAiBE,EACjB,CAAA,iBAAA,CAAmBQ,EACnB,CAAA,WAAA,CAAa+O,EACb,CAAA,WAAA,CAAaE,EACb,CAAA,eAAA,CAAiBE,EACjB,CAAA,YAAA,CAAcE,EACd,CAAA,aAAA,CAAeE,EACf,CAAA,gBAAA,CAAkBE,GAClB,aAAeE,CAAAA,EAAAA,CACf,YAAcE,CAAAA,EAAAA,CACd,WAAaG,CAAAA,EAAAA,CACb,YAAcE,CAAAA,EAChB,CACA,CAAA,MAAA,CAAQ,CACN,WAAA,CAAaQ,EACf,CAAA,CACA,WAAY,CACV,KAAA,CAAOG,EACP,CAAA,UAAA,CAAYU,EACd,CAAA,CACA,YAAc,CAAA,CACZ,YAAcQ,CAAAA,EAChB,CACA,CAAA,MAAA,CAAQ,CACN,MAAA,CAAQG,EACV,CACA,CAAA,QAAA,CAAU,CACR,QAAA,CAAUE,EACV,CAAA,WAAA,CAAaE,EACf,CAAA,CACA,UAAY,CAAA,CACV,UAAYG,CAAAA,EACd,CACA,CAAA,SAAA,CAAW,CACT,gBAAkBE,CAAAA,EACpB,CACA,CAAA,IAAA,CAAM,CACJ,IAAA,CAAMK,EACR,CAAA,CACA,QAAU,CAAA,CACR,QAAUG,CAAAA,EACZ,CACA,CAAA,MAAA,CAAQ,CACN,MAAQK,CAAAA,EACV,CACA,CAAA,QAAA,CAAU,CACR,YAAA,CAAcG,EACd,CAAA,UAAA,CAAYG,EACd,CAAA,CACA,MAAQ,CAAA,CACN,MAAQc,CAAAA,EACV,EACA,IAAM,CAAA,CACJ,IAAMO,CAAAA,EACR,CACA,CAAA,KAAA,CAAO,CACL,KAAA,CAAOG,EACT,CAAA,CACA,IAAM,CAAA,CACJ,IAAME,CAAAA,EACR,CACA,CAAA,MAAA,CAAQ,CACN,MAAA,CAAQG,EACV,CAAA,CACA,YAAc,CAAA,CACZ,YAAcG,CAAAA,EAChB,CACA,CAAA,QAAA,CAAU,CACR,QAAA,CAAUK,EACZ,CAAA,CACA,IAAK,CACH,GAAA,CAAKE,EACP,CAAA,CACA,MAAQ,CAAA,CACN,gBAAkBE,CAAAA,EAAAA,CAClB,UAAYE,CAAAA,EAAAA,CACZ,gBAAkBE,CAAAA,EAAAA,CAClB,UAAYE,CAAAA,EACd,EACA,MAAQ,CAAA,CACN,MAAQM,CAAAA,EACV,CACA,CAAA,QAAA,CAAU,CACR,QAAA,CAAUG,EACZ,CAAA,CACA,KAAO,CAAA,CACL,KAAOK,CAAAA,EACT,EACA,MAAQ,CAAA,CACN,MAAQM,CAAAA,EACV,CACA,CAAA,KAAA,CAAO,CACL,KAAA,CAAOQ,EACP,CAAA,WAAA,CAAaG,EACb,CAAA,UAAA,CAAYG,EACZ,CAAA,cAAA,CAAgBM,EAClB,CACA,CAAA,IAAA,CAAM,CACJ,IAAA,CAAMG,EACR,CACF,CACA,CAAA,QAAA,CAAU,CACR,WAAA,CAAa,CACX,UAAA,CAAYpa,EACZ,CAAA,cAAA,CAAgBE,GAChB,eAAiBE,CAAAA,EAAAA,CACjB,iBAAmBQ,CAAAA,EAAAA,CACnB,WAAa+O,CAAAA,EAAAA,CACb,WAAaE,CAAAA,EAAAA,CACb,eAAiBE,CAAAA,EAAAA,CACjB,YAAcE,CAAAA,EAAAA,CACd,aAAeE,CAAAA,EAAAA,CACf,iBAAkBE,EAClB,CAAA,aAAA,CAAeE,EACf,CAAA,YAAA,CAAcE,EACd,CAAA,WAAA,CAAaG,EACb,CAAA,YAAA,CAAcE,EAChB,CAAA,CACA,MAAQ,CAAA,CACN,WAAaQ,CAAAA,EACf,EACA,UAAY,CAAA,CACV,KAAOG,CAAAA,EAAAA,CACP,UAAYU,CAAAA,EACd,CACA,CAAA,YAAA,CAAc,CACZ,YAAA,CAAcQ,EAChB,CAAA,CACA,MAAQ,CAAA,CACN,OAAQG,EACV,CAAA,CACA,QAAU,CAAA,CACR,QAAUE,CAAAA,EAAAA,CACV,WAAaE,CAAAA,EACf,CACA,CAAA,UAAA,CAAY,CACV,UAAA,CAAYG,EACd,CAAA,CACA,UAAW,CACT,gBAAA,CAAkBE,EACpB,CAAA,CACA,IAAM,CAAA,CACJ,IAAMK,CAAAA,EACR,CACA,CAAA,QAAA,CAAU,CACR,QAAA,CAAUG,EACZ,CAAA,CACA,OAAQ,CACN,MAAA,CAAQK,EACV,CAAA,CACA,QAAU,CAAA,CACR,YAAcG,CAAAA,EAAAA,CACd,UAAYG,CAAAA,EACd,CACA,CAAA,MAAA,CAAQ,CACN,MAAA,CAAQc,EACV,CACA,CAAA,IAAA,CAAM,CACJ,IAAA,CAAMO,EACR,CAAA,CACA,KAAO,CAAA,CACL,KAAOG,CAAAA,EACT,CACA,CAAA,IAAA,CAAM,CACJ,IAAA,CAAME,EACR,CACA,CAAA,MAAA,CAAQ,CACN,MAAA,CAAQG,EACV,CAAA,CACA,YAAc,CAAA,CACZ,YAAcG,CAAAA,EAChB,CACA,CAAA,QAAA,CAAU,CACR,QAAA,CAAUK,EACZ,CACA,CAAA,GAAA,CAAK,CACH,GAAA,CAAKE,EACP,CAAA,CACA,MAAQ,CAAA,CACN,gBAAkBE,CAAAA,EAAAA,CAClB,UAAYE,CAAAA,EAAAA,CACZ,gBAAkBE,CAAAA,EAAAA,CAClB,WAAYE,EACd,CAAA,CACA,MAAQ,CAAA,CACN,MAAQM,CAAAA,EACV,CACA,CAAA,QAAA,CAAU,CACR,QAAA,CAAUG,EACZ,CAAA,CACA,KAAO,CAAA,CACL,MAAOK,EACT,CAAA,CACA,MAAQ,CAAA,CACN,MAAQM,CAAAA,EACV,CACA,CAAA,KAAA,CAAO,CACL,KAAA,CAAOQ,EACP,CAAA,WAAA,CAAaG,EACb,CAAA,UAAA,CAAYG,EACZ,CAAA,cAAA,CAAgBM,EAClB,CAAA,CACA,IAAM,CAAA,CACJ,IAAMG,CAAAA,EACR,CACF,CAAA,CACA,MAAQ,CAAA,CACN,WAAa,CAAA,CACX,UAAYpa,CAAAA,EAAAA,CACZ,eAAgBE,EAChB,CAAA,iBAAA,CAAmBU,EACnB,CAAA,WAAA,CAAa+O,EACb,CAAA,WAAA,CAAaE,EACb,CAAA,eAAA,CAAiBE,EACjB,CAAA,YAAA,CAAcE,EACd,CAAA,aAAA,CAAeE,EACf,CAAA,gBAAA,CAAkBE,GAClB,aAAeE,CAAAA,EAAAA,CACf,YAAcE,CAAAA,EAAAA,CACd,WAAaG,CAAAA,EAAAA,CACb,YAAcE,CAAAA,EAChB,CACA,CAAA,MAAA,CAAQ,CACN,WAAA,CAAaQ,EACf,CAAA,CACA,WAAY,CACV,KAAA,CAAOG,EACP,CAAA,UAAA,CAAYU,EACd,CAAA,CACA,YAAc,CAAA,CACZ,YAAcQ,CAAAA,EAChB,CACA,CAAA,MAAA,CAAQ,CACN,MAAA,CAAQG,EACV,CACA,CAAA,QAAA,CAAU,CACR,QAAA,CAAUE,EACV,CAAA,WAAA,CAAaE,EACf,CAAA,CACA,UAAY,CAAA,CACV,UAAYG,CAAAA,EACd,CACA,CAAA,SAAA,CAAW,CACT,gBAAkBE,CAAAA,EACpB,CACA,CAAA,IAAA,CAAM,CACJ,IAAA,CAAMK,EACR,CAAA,CACA,QAAU,CAAA,CACR,QAAUG,CAAAA,EACZ,CACA,CAAA,MAAA,CAAQ,CACN,MAAQK,CAAAA,EACV,CACA,CAAA,QAAA,CAAU,CACR,YAAA,CAAcG,EACd,CAAA,UAAA,CAAYG,EACd,CAAA,CACA,MAAQ,CAAA,CACN,MAAQc,CAAAA,EACV,EACA,IAAM,CAAA,CACJ,IAAMO,CAAAA,EACR,CACA,CAAA,KAAA,CAAO,CACL,KAAA,CAAOG,EACT,CAAA,CACA,IAAM,CAAA,CACJ,IAAME,CAAAA,EACR,EACA,MAAQ,CAAA,CACN,MAAQG,CAAAA,EACV,CACA,CAAA,YAAA,CAAc,CACZ,YAAA,CAAcG,EAChB,CAAA,CACA,QAAU,CAAA,CACR,QAAUK,CAAAA,EACZ,EACA,GAAK,CAAA,CACH,GAAKE,CAAAA,EACP,CACA,CAAA,MAAA,CAAQ,CACN,gBAAA,CAAkBE,EAClB,CAAA,UAAA,CAAYE,EACZ,CAAA,gBAAA,CAAkBE,EAClB,CAAA,UAAA,CAAYE,EACd,CACA,CAAA,MAAA,CAAQ,CACN,MAAA,CAAQM,EACV,CAAA,CACA,QAAU,CAAA,CACR,QAAUG,CAAAA,EACZ,CACA,CAAA,KAAA,CAAO,CACL,KAAA,CAAOK,EACT,CACA,CAAA,MAAA,CAAQ,CACN,MAAA,CAAQM,EACV,CAAA,CACA,KAAO,CAAA,CACL,KAAOQ,CAAAA,EAAAA,CACP,WAAaG,CAAAA,EAAAA,CACb,UAAYG,CAAAA,EAAAA,CACZ,eAAgBM,EAClB,CAAA,CACA,IAAM,CAAA,CACJ,IAAMG,CAAAA,EACR,CACF,CACF,CC3vBO,CAAA,IAAMza,CAAN,CAAA,KAAgB,CAIrB,WAAA,CAAYhF,EAAqBtF,CAA2B,CAAA,CAC1D,IAAK,CAAA,MAAA,CAASA,CACd,CAAA,IAAA,CAAK,KAAQsF,CAAAA,EACf,CAEA,KAAA,CACE2d,CACAsP,CAAAA,CAAAA,CAA4B,CAC5BC,CAAAA,CAAAA,CAA6B,MACd,CACf,GAAI,CAACvP,CAAAA,CAAM,MACT,CAAA,OAAO,CACL,GAAA,CAAK,EACL,CAAA,QAAA,CAAU,EACZ,CAGF,CAAA,IAAMwP,EAAiBxP,CAAM,CAAA,IAAA,CAC1B9Y,CACC,EAAA,CAAC,CAACA,CAAAA,EAAQA,CAAK,CAAA,MAAA,GAAW,YAC9B,CAAA,CACMuoB,CACJ,CAAA,CAACD,CACDxP,EAAAA,CAAAA,CAAM,KACH9Y,CAA4B,EAAA,CAAC,CAACA,CAAAA,EAAQA,CAAK,CAAA,MAAA,GAAW,UACzD,CAAA,CAGIod,CACJ,CAAA,IAAA,CAAK,MAAW,GAAA,OAAA,CACXtE,CAAM,CAAA,IAAA,CAEH9Y,GAKG,CAAC,CAACA,CAAQA,EAAAA,CAAAA,CAAK,MAAW,GAAA,MACjC,CAAK,EAAA,IAAA,CACL,IACAwoB,CAAAA,CAAAA,CAAkBpL,CAAW,CAAA,IAAA,CAAK,kBAAmBA,CAAAA,CAAQ,EAAI,EAEjEqL,CAAAA,CAAAA,CAAgB3P,CAAM,CAAA,MAAA,CACzB9Y,CACCA,EAAAA,CAAAA,GAAS,IACTA,EAAAA,CAAAA,CAAK,MAAW,GAAA,UAAA,EAChBA,CAAK,CAAA,MAAA,GAAW,YACpB,CAAA,CAEM0oB,EAAYD,CAAc,CAAA,IAAA,CAAM9zB,CAAMA,EAAAA,CAAAA,CAAE,MAAW,GAAA,QAAQ,CAC3Dg0B,CAAAA,CAAAA,CAAaF,CAAc,CAAA,IAAA,CAAM9zB,CAAMA,EAAAA,CAAAA,CAAE,MAAW,GAAA,UAAU,EAC9D8hB,CAAYgS,CAAAA,CAAAA,CAAc,IAAM9zB,CAAAA,CAAAA,EAAMA,CAAE,CAAA,MAAA,GAAW,OAAO,CAAA,CAG1DmiB,CAAa2R,CAAAA,CAAAA,CAAc,IAAM9zB,CAAAA,CAAAA,EAAMA,CAAE,CAAA,MAAA,GAAW,QAAQ,CAG5Di0B,CAAAA,CAAAA,CACJ,IAAK,CAAA,MAAA,GAAW,OAAWnS,EAAAA,CAAAA,EAAa,CAACiS,CAAAA,EAAa,CAACC,CAAAA,CACnDE,CACJ,CAAA,IAAA,CAAK,MAAW,GAAA,OAAA,EAAW,CAACD,CAAgBnS,GAAAA,CAAAA,EAAaK,CAErDgS,CAAAA,CAAAA,CAAAA,CACJ,IAAK,CAAA,MAAA,GAAW,UAAerS,GAAAA,CAAAA,EAAaK,CAExCiS,CAAAA,CAAAA,CAAAA,CAAqB,EAAC,CACtBC,CAAqB,CAAA,GACvBC,CAAmC,CAAA,IAAA,CAEnCL,CAAenS,EAAAA,CAAAA,EACjBuS,CAAY,CAAA,IAAA,CAAKvS,CAAU,CAAA,KAAK,CAGlC,CAAA,IAAA,IAASlX,CAAI,CAAA,CAAA,CAAGA,CAAIkpB,CAAAA,CAAAA,CAAc,OAAQlpB,CAAK,EAAA,CAAA,CAC7C,IAAMS,CAAAA,CAAOyoB,CAAclpB,CAAAA,CAAC,CAa5B,CAAA,GAXIqpB,CAAe5oB,EAAAA,CAAAA,CAAK,MAAW,GAAA,OAAA,EAKjC6oB,CACC7oB,GAAAA,CAAAA,CAAK,SAAW,OAAWA,EAAAA,CAAAA,CAAK,MAAW,GAAA,QAAA,CAAA,EAM5C8oB,CACC9oB,GAAAA,CAAAA,CAAK,MAAW,GAAA,OAAA,EAAWA,CAAK,CAAA,MAAA,GAAW,QAE5C,CAAA,CAAA,SAGFA,CAAK,CAAA,cAAA,CAAiBooB,EAAoBY,CAAY,CAAA,MAAA,CAEtD,IAAME,CAAAA,CACJf,EAAe,CAAA,IAAA,CAAK,eAAgB,CAAA,IAAA,CAAK,MAAM,CAAC,CAAEnoB,CAAAA,CAAAA,CAAK,MAAM,CAAA,CAC3DA,EAAK,IACP,CAAA,CAEF,GAAI,CAACkpB,CACH,CAAA,MAAM,IAAI,KAAA,CACR,CAA6B,0BAAA,EAAA,IAAA,CAAK,MAAM,CAAA,CAAA,EAAIlpB,CAAK,CAAA,OAAO,EAC1D,CAGFkpB,CAAAA,CAAAA,CAAY,KAAQ,CAAA,IAAA,CAAK,KACzB,CAAA,IAAMC,CAAeD,CAAAA,CAAAA,CAAY,KAAMlpB,CAAAA,CAAI,CAE3C,CAAA,GAAI,CAACmpB,CAAAA,CAAa,KAAO,CAACA,CAAAA,CAAa,GAAI,CAAA,IAAA,EAAO,CAAA,MAAA,CAChD,SAGF,IAAMC,CAAWX,CAAAA,CAAAA,CAAclpB,CAAI,CAAA,CAAC,CAE9B8pB,CAAAA,CAAAA,CADe,CAACD,CAAYA,EAAAA,CAAAA,CAAS,OAAYppB,GAAAA,CAAAA,CAAK,OAC3B,CAAA,EAAA,CAAKopB,CAAS,CAAA,UAAA,CAE/C,GACEppB,CAAAA,CAAK,MAAW,GAAA,MAAA,EAChBA,CAAK,CAAA,MAAA,GAAW,gBAChBA,CAAK,CAAA,MAAA,GAAW,QAChB,CAAA,CACA+oB,CAAS,CAAA,IAAA,CAAK,CAAGI,EAAAA,CAAAA,CAAa,GAAG,CAAA,EAAGE,CAAS,CAAA,CAAE,CAC/CL,CAAAA,CAAAA,CAAY,IAAK,CAAA,GAAGG,CAAa,CAAA,QAAQ,CACzCF,CAAAA,CAAAA,CAAoBjpB,CAAK,CAAA,OAAA,CACzB,QACF,CAEA,GACEipB,CAAAA,GAAsBjpB,CAAK,CAAA,OAAA,EAC3BA,CAAK,CAAA,6BAAA,CACL,CACA,GAAIqoB,CAAAA,CACFU,CAAS,CAAA,IAAA,CAAK,CAAGI,EAAAA,CAAAA,CAAa,GAAG,CAAA,EAAGE,CAAS,CAAA,CAAE,CAC1C,CAAA,KAAA,CACL,IAAIC,CAAAA,CAAgBtpB,EAAK,OACzB,CAAA,GAAIA,CAAK,CAAA,MAAA,GAAW,MAEd,EAAA,IAAA,CAAK,MAAW,GAAA,OAAA,CAAS,CAC3B,IAAIupB,EAAIhqB,CAAAA,CAAAA,CACJiqB,EAAe,CAAA,KAAA,CACnB,KACED,EAAId,CAAAA,CAAAA,CAAc,MAClBA,EAAAA,CAAAA,CAAcc,EAAC,CAAA,CAAE,OAAYvpB,GAAAA,CAAAA,CAAK,OAClC,EAAA,CACA,IAAMypB,EAAAA,CAAYhB,CAAcc,CAAAA,EAAC,EACjC,GACEE,EAAAA,CAAU,MAAW,GAAA,MAAA,EACrBA,EAAU,CAAA,MAAA,GAAW,WACrB,CAAA,CACAD,EAAe,CAAA,IAAA,CACf,KACF,CACAD,EACF,GAAA,CACIC,KACFF,CAAgB,CAAA,CAAA,EAAGA,CAAa,CAAA,UAAA,CAAA,EAEpC,CAGF,GAAIA,CAAkB,GAAA,QAAA,CAAU,CAC9B,IAAMI,EAAYd,CAAAA,CAAAA,CAAc,CAASR,MAAAA,EAAAA,CAAiB,KAAO,EACjE,CAAA,GAAIE,CAAgB,CAAA,CAClB,IAAMjtB,EAAAA,CAAU,KAAM,CAAA,OAAA,CAASitB,CAAuB,CAAA,OAAO,CACxDA,CAAAA,CAAAA,CAAuB,OAAQ,CAAA,IAAA,CAAK,IAAI,CACzC,CAAA,EAAA,CACJS,CAAS,CAAA,IAAA,CACP,CAAUW,OAAAA,EAAAA,EAAS,CAAgBruB,aAAAA,EAAAA,EAAO,CAAK8tB,EAAAA,EAAAA,CAAAA,CAAa,GAAG,CAAA,EAAGE,CAAS,CAAA,CAC7E,EACF,CAAWd,KAAAA,CAAAA,CACTQ,CAAS,CAAA,IAAA,CACP,CAAUW,OAAAA,EAAAA,EAAS,CAAYP,SAAAA,EAAAA,CAAAA,CAAa,GAAG,CAAA,EAAGE,CAAS,CAAA,CAC7D,CAEAN,CAAAA,CAAAA,CAAS,KACP,CAAUW,OAAAA,EAAAA,EAAS,CAAGP,EAAAA,CAAAA,CAAa,GAAG,CAAA,EAAGE,CAAS,CAAA,CACpD,EAEJ,CAAA,KAAWC,CAAkB,GAAA,MAAA,EAAUd,CAErCO,CAAAA,CAAAA,CAAS,KACP,CAAGO,EAAAA,CAAa,CAAIH,CAAAA,EAAAA,CAAAA,CAAa,GAAG,CAAA,EAAGX,CAAe,CAAA,EAAGa,CAAS,CAAA,CACpE,CAEAN,CAAAA,CAAAA,CAAS,IAAK,CAAA,CAAA,EAAGO,CAAa,CAAIH,CAAAA,EAAAA,CAAAA,CAAa,GAAG,CAAA,EAAGE,CAAS,CAAA,CAAE,EAEpE,CACAJ,CAAoBjpB,CAAAA,CAAAA,CAAK,QAC3B,CAAA,KACE+oB,CAAS,CAAA,IAAA,CAAK,GAAGI,CAAa,CAAA,GAAG,CAAGE,EAAAA,CAAS,CAAE,CAAA,CAAA,CAGjDL,CAAY,CAAA,IAAA,CAAK,GAAGG,CAAAA,CAAa,QAAQ,EAC3C,CAEA,GAAIN,EAAqB,CAClBF,CAAAA,EACHI,CAAS,CAAA,IAAA,CAAK,wBAAwB,CAAA,CAGxC,IAAMY,CAAAA,CAAY7S,CAAY,EAAA,MAAA,EAAU,CACxCkS,CAAAA,CAAAA,CAAY,IAAKW,CAAAA,CAAS,EAE1B,IAAIC,CAAAA,CAAgB,CADGxB,QAAAA,EAAAA,CAAAA,CAAoBY,CAAY,CAAA,MAAA,CAAS,CACnB,CAAA,KAAA,CAAA,CAE7C,GAAIvS,CAAAA,CAAW,CACbuS,CAAAA,CAAY,IAAKvS,CAAAA,CAAAA,CAAU,KAAK,CAChC,CAAA,IAAMoT,CAAgBzB,CAAAA,CAAAA,CAAoBY,CAAY,CAAA,MAAA,CAAS,CAC/DY,CAAAA,CAAAA,EAAiB,CAAgBC,aAAAA,EAAAA,CAAa,CAChD,UAAA,EAAA,CAEAd,CAAS,CAAA,IAAA,CAAKa,CAAa,EAC7B,CAEA,GAAId,CAAsB,CAAA,CACnBH,CACHI,EAAAA,CAAAA,CAAS,IAAK,CAAA,eAAe,CAG/B,CAAA,IAAMY,CAAY7S,CAAAA,CAAAA,EAAY,MAAU,EAAA,CAAA,CACxCkS,EAAY,IAAKW,CAAAA,CAAS,CAE1B,CAAA,IAAIC,CAAgB,CAAA,CAAA,QAAA,EADGxB,CAAoBY,CAAAA,CAAAA,CAAY,MAAS,CAAA,CACnB,CAE7C,KAAA,CAAA,CAAA,GAAIvS,CAAW,CAAA,CACbuS,EAAY,IAAKvS,CAAAA,CAAAA,CAAU,KAAK,CAAA,CAChC,IAAMoT,CAAAA,CAAgBzB,CAAoBY,CAAAA,CAAAA,CAAY,MAAS,CAAA,CAAA,CAC/DY,CAAiB,EAAA,CAAA,aAAA,EAAgBC,CAAa,CAAA,UAAA,EAChD,CAEAd,CAAS,CAAA,IAAA,CAAKa,CAAa,EAC7B,CAIA,OAAO,CACL,GAAA,CAHeb,CAAS,CAAA,IAAA,CAAK,GAAG,CAAA,CAIhC,QAAUC,CAAAA,CACZ,CACF,CAKQ,eAAA,CAAgBnzB,CAA2B,CAAA,CACjD,OAAQA,CAAAA,EACN,KAAK,SACH,CAAA,OAAO,OACT,CAAA,KAAK,aACH,CAAA,OAAO,WACT,QACE,OAAOA,CACX,CACF,CAOQ,kBAAA,CACNunB,CAKQ,CAAA,CACR,IAAM0M,CAAAA,CAAkB,EAAC,CAEzB,OAAQ1M,CAAAA,CAAS,UACf,KAAK,QACH0M,CAAAA,CAAAA,CAAM,IAAK,CAAA,SAAS,CACpB,CAAA,MACF,KAAK,OAAA,CACHA,CAAM,CAAA,IAAA,CAAK,UAAU,CAAA,CACrB,MACF,KAAK,eAAA,CACHA,CAAM,CAAA,IAAA,CAAK,SAAS,CAAA,CACpB,MACF,KAAK,WACHA,CAAAA,CAAAA,CAAM,IAAK,CAAA,UAAU,CACrB,CAAA,KACJ,CAEA,OAAI1M,CAAAA,CAAS,UACX0M,EAAAA,CAAAA,CAAM,IAAK,CAAA,UAAU,CAKnB1M,CAAAA,CAAAA,CAAS,MACX0M,EAAAA,CAAAA,CAAM,IAAK,CAAA,QAAQ,CAGdA,CAAAA,CAAAA,CAAM,OAAS,CAAI,CAAA,CAAA,OAAA,EAAUA,CAAM,CAAA,IAAA,CAAK,IAAI,CAAC,CAAM,CAAA,CAAA,CAAA,EAC5D,CACF,CAAA,CCnTO,IAAMC,EAAAA,CAAN,cAAiC1oB,CAAU,CAOhD,WAAYnL,CAAAA,CAAAA,CAAe,CACzB,KAAA,CAAM,QAAQ,CAAA,CANhB,IAAa,CAAA,UAAA,CAAA,GAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,KAAA,CAChC,IAAS,CAAA,MAAA,CAAA,QAAA,CACT,IAAO,CAAA,IAAA,CAAA,kBAAA,CAIL,KAAK,KAAQA,CAAAA,EACf,CACF,CAAA,CCXO,IAAM8zB,EAAAA,CAAN,cAA4B3oB,CAAU,CAO3C,WAAA,CAAYnL,CAAe,CAAA,CACzB,KAAM,CAAA,QAAQ,EANhB,IAAa,CAAA,UAAA,CAAA,GAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,KAAA,CAChC,IAAS,CAAA,MAAA,CAAA,QAAA,CACT,IAAO,CAAA,IAAA,CAAA,YAAA,CAIL,IAAK,CAAA,KAAA,CAAQA,EACf,CACF,CCXO,CAAA,IAAM+zB,GAAN,cAAiC5oB,CAAU,CAOhD,WAAA,CAAYnL,CAAe,CAAA,CACzB,KAAM,CAAA,QAAQ,CANhB,CAAA,IAAA,CAAA,UAAA,CAAa,GACb,CAAA,IAAA,CAAA,6BAAA,CAAgC,KAChC,CAAA,IAAA,CAAA,MAAA,CAAS,SACT,IAAO,CAAA,IAAA,CAAA,kBAAA,CAIL,IAAK,CAAA,KAAA,CAAQA,EACf,CACF,CCXO,CAAA,IAAMg0B,EAAN,CAAA,cAA4B7oB,CAAU,CAO3C,WAAYnL,CAAAA,CAAAA,CAAe,CACzB,KAAM,CAAA,QAAQ,CANhB,CAAA,IAAA,CAAA,UAAA,CAAa,GACb,CAAA,IAAA,CAAA,6BAAA,CAAgC,KAChC,CAAA,IAAA,CAAA,MAAA,CAAS,QACT,CAAA,IAAA,CAAA,IAAA,CAAO,YAIL,CAAA,IAAA,CAAK,KAAQA,CAAAA,EACf,CACF,CAAA,CCVO,IAAMi0B,EAAAA,CAAN,cAA4B9oB,CAAU,CAO3C,WAAA,CAAY9F,CAAwB,CAAA,CAClC,MAAM,EAAE,CAAA,CANV,IAAa,CAAA,UAAA,CAAA,GAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,IAAA,CAChC,IAAS,CAAA,MAAA,CAAA,aAAA,CACT,IAAO,CAAA,IAAA,CAAA,YAAA,CAIL,IAAK,CAAA,MAAA,CAASA,EAChB,CACF,ECXO,IAAM6uB,EAAAA,CAAN,cAAgC/oB,CAAU,CAO/C,WAAA,CAAYf,CAA4B,CAAA,CACtC,KAAM,CAAA,EAAE,CANV,CAAA,IAAA,CAAA,UAAA,CAAa,GACb,CAAA,IAAA,CAAA,6BAAA,CAAgC,KAChC,IAAS,CAAA,MAAA,CAAA,aAAA,CACT,IAAO,CAAA,IAAA,CAAA,gBAAA,CAIL,IAAK,CAAA,UAAA,CAAaA,EACpB,CACF,CCZO,CAAA,IAAM+pB,EAAN,CAAA,cAAgChpB,CAAU,CAO/C,YAAYhG,CAAmB,CAAA,CAC7B,KAAM,CAAA,EAAE,CANV,CAAA,IAAA,CAAA,UAAA,CAAa,GACb,CAAA,IAAA,CAAA,6BAAA,CAAgC,KAChC,CAAA,IAAA,CAAA,MAAA,CAAS,aACT,CAAA,IAAA,CAAA,IAAA,CAAO,iBAIL,CAAA,IAAA,CAAK,QAAUA,EACjB,CACF,CCHO,CAAA,IAAMivB,EAAN,CAAA,cAAkCjpB,CAAU,CASjD,WACE9F,CAAAA,CAAAA,CACAgvB,CACAr2B,CAAAA,CAAAA,CAA8B,EAAC,CAC/B,CACA,KAAM,CAAA,EAAE,CAVV,CAAA,IAAA,CAAA,UAAA,CAAa,GACb,CAAA,IAAA,CAAA,6BAAA,CAAgC,IAChC,CAAA,IAAA,CAAA,MAAA,CAAS,aACT,CAAA,IAAA,CAAA,IAAA,CAAO,mBAQL,CAAA,IAAA,CAAK,MAASqH,CAAAA,CAAAA,CACd,KAAK,OAAUgvB,CAAAA,CAAAA,CACf,IAAK,CAAA,OAAA,CAAUr2B,EACjB,CACF,CC3BO,CAAA,IAAMs2B,EAAN,CAAA,cAA6BnpB,CAAU,CAS5C,WACEnL,CAAAA,CAAAA,CACAu0B,EAAwB,EAAC,CACzBlP,CAAoB,CAAA,KAAA,CACpB,CACA,KAAA,CAAM,aAAa,CAAA,CAXrB,IAAa,CAAA,UAAA,CAAA,GAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,KAAA,CAChC,IAAS,CAAA,MAAA,CAAA,aAAA,CACT,UAAO,aASL,CAAA,IAAA,CAAK,KAAQrlB,CAAAA,CAAAA,CACb,IAAK,CAAA,QAAA,CAAWu0B,CAChB,CAAA,IAAA,CAAK,QAAWlP,CAAAA,EAClB,CACF,CAAA,CCnBO,IAAMmP,EAAAA,CAAN,cAA6BrpB,CAAU,CAM5C,WAAY9F,CAAAA,CAAAA,CAAgB,CAC1B,KAAA,CAAM,EAAE,CAAA,CALV,IAAa,CAAA,UAAA,CAAA,GAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,IAAA,CAChC,IAAS,CAAA,MAAA,CAAA,aAAA,CACT,UAAO,aAGL,CAAA,IAAA,CAAK,MAASA,CAAAA,EAChB,CACF,CAAA,CCVO,IAAMovB,EAAAA,CAAN,cAAiCtpB,CAAU,CAOhD,WAAA,CAAYrL,CAAc,CAAA,CACxB,MAAM,EAAE,CAAA,CANV,IAAa,CAAA,UAAA,CAAA,GAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,IAAA,CAChC,IAAS,CAAA,MAAA,CAAA,aAAA,CACT,IAAO,CAAA,IAAA,CAAA,iBAAA,CAIL,IAAK,CAAA,cAAA,CAAiBA,EACxB,CACF,ECXO,IAAM40B,EAAAA,CAAN,cAA8BvpB,CAAU,CAO7C,WAAA,CAAY9F,CAAgB,CAAA,CAC1B,KAAM,CAAA,EAAE,CANV,CAAA,IAAA,CAAA,UAAA,CAAa,GACb,CAAA,IAAA,CAAA,6BAAA,CAAgC,KAChC,IAAS,CAAA,MAAA,CAAA,aAAA,CACT,IAAO,CAAA,IAAA,CAAA,cAAA,CAIL,IAAK,CAAA,MAAA,CAASA,EAChB,CACF,CCXO,CAAA,IAAMsvB,EAAN,CAAA,cAA8BxpB,CAAU,CAO7C,YAAY9F,CAAgB,CAAA,CAC1B,KAAM,CAAA,EAAE,CANV,CAAA,IAAA,CAAA,UAAA,CAAa,GACb,CAAA,IAAA,CAAA,6BAAA,CAAgC,IAChC,CAAA,IAAA,CAAA,MAAA,CAAS,aACT,CAAA,IAAA,CAAA,IAAA,CAAO,eAIL,CAAA,IAAA,CAAK,OAASA,EAChB,CACF,CCXO,CAAA,IAAMuvB,EAAN,CAAA,cAAiCzpB,CAAU,CAOhD,WAAYnL,CAAAA,CAAAA,CAAgB,CAC1B,KAAA,CAAM,EAAE,CAAA,CAPV,gBAAa,GACb,CAAA,IAAA,CAAA,6BAAA,CAAgC,KAChC,CAAA,IAAA,CAAA,MAAA,CAAS,aACT,CAAA,IAAA,CAAA,IAAA,CAAO,kBAKL,CAAA,IAAA,CAAK,KAAQA,CAAAA,EACf,CACF,CAAA,CCXO,IAAM60B,EAAAA,CAAN,cAA+B1pB,CAAU,CAO9C,WAAY2pB,CAAAA,CAAAA,CAAiBvpB,CAAiB,CAAA,CAC5C,KAAM,CAAA,EAAE,CALV,CAAA,IAAA,CAAA,UAAA,CAAa,GACb,CAAA,IAAA,CAAA,6BAAA,CAAgC,IAChC,CAAA,IAAA,CAAA,MAAA,CAAS,cACT,IAAO,CAAA,IAAA,CAAA,eAAA,CAGL,IAAK,CAAA,OAAA,CAAUupB,CACf,CAAA,IAAA,CAAK,OAAUvpB,CAAAA,EACjB,CACF,CAAA,CCXO,IAAMwpB,EAAAA,CAAN,cAA6B5pB,CAAU,CAQ5C,WAAY9F,CAAAA,CAAAA,CAAgB4F,CAAgC,CAAA,CAC1D,KAAM,CAAA,EAAE,CANV,CAAA,IAAA,CAAA,UAAA,CAAa,GACb,CAAA,IAAA,CAAA,6BAAA,CAAgC,IAChC,CAAA,IAAA,CAAA,MAAA,CAAS,aACT,CAAA,IAAA,CAAA,IAAA,CAAO,cAIL,IAAK,CAAA,MAAA,CAAS5F,CACd,CAAA,IAAA,CAAK,YAAe4F,CAAAA,EACtB,CACF,CAAA,CCdO,IAAM+pB,EAAAA,CAAN,cAA6B7pB,CAAU,CAO5C,WAAA,CAAY9F,EAAgB,CAC1B,KAAA,CAAM,EAAE,CAAA,CANV,IAAa,CAAA,UAAA,CAAA,GAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,IAAA,CAChC,IAAS,CAAA,MAAA,CAAA,aAAA,CACT,IAAO,CAAA,IAAA,CAAA,cAAA,CAIL,IAAK,CAAA,MAAA,CAASA,EAChB,CACF,CAAA,CCFO,IAAM4vB,CAAAA,CAAN,cAA6B9pB,CAAU,CAc5C,WAAA,CACE+pB,CACArgB,CAAAA,CAAAA,CAQI,EAAC,CACLxJ,CAAsB,CAAA,KAAA,CACtB,CACA,KAAM,CAAA,EAAE,CAlBV,CAAA,IAAA,CAAA,UAAA,CAAa,GACb,CAAA,IAAA,CAAA,6BAAA,CAAgC,IAChC,CAAA,IAAA,CAAA,MAAA,CAAS,YACT,CAAA,IAAA,CAAA,IAAA,CAAO,YAgBL,CAAA,IAAA,CAAK,cAAiB6pB,CAAAA,CAAAA,CACtB,KAAK,OAAUrgB,CAAAA,CAAAA,CAAK,OACpB,CAAA,IAAA,CAAK,UAAaA,CAAAA,CAAAA,CAAK,UACvB,CAAA,IAAA,CAAK,cAAiBA,CAAAA,CAAAA,CAAK,cAC3B,CAAA,IAAA,CAAK,QAAWA,CAAAA,CAAAA,CAAK,SACrB,IAAK,CAAA,QAAA,CAAWA,CAAK,CAAA,QAAA,CACrB,IAAK,CAAA,YAAA,CAAeA,CAAK,CAAA,YAAA,CACzB,IAAK,CAAA,eAAA,CAAkBA,CAAK,CAAA,eAAA,CAC5B,IAAK,CAAA,UAAA,CAAaxJ,EACpB,CACF,CAAA,CC9CO,IAAM8pB,EAAAA,CAAN,cAA8BhqB,CAAU,CAU7C,WAAA,CACEnL,CACAu0B,CAAAA,CAAAA,CAAwB,EAAC,CACzBa,CAAqC,CAAA,GACrCC,CAAuB,CAAA,KAAA,CACvB,CACA,KAAA,CAAM,cAAc,CAAA,CAZtB,IAAa,CAAA,UAAA,CAAA,GAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,KAAA,CAChC,IAAS,CAAA,MAAA,CAAA,cAAA,CACT,IAAO,CAAA,IAAA,CAAA,cAAA,CAUL,KAAK,KAAQr1B,CAAAA,CAAAA,CACb,IAAK,CAAA,QAAA,CAAWu0B,CAChB,CAAA,IAAA,CAAK,gBAAmBa,CAAAA,CAAAA,CACxB,IAAK,CAAA,WAAA,CAAcC,EACrB,CACF,CCvBO,CAAA,IAAMC,GAAN,cAA4BnqB,CAAU,CAQ3C,WAAA,CAAYnL,CAAeqlB,CAAAA,CAAAA,CAAoB,KAAO,CAAA,CACpD,KAAM,CAAA,YAAY,CANpB,CAAA,IAAA,CAAA,UAAA,CAAa,GACb,CAAA,IAAA,CAAA,6BAAA,CAAgC,MAChC,IAAS,CAAA,MAAA,CAAA,YAAA,CACT,IAAO,CAAA,IAAA,CAAA,YAAA,CAIL,IAAK,CAAA,KAAA,CAAQrlB,CACb,CAAA,IAAA,CAAK,QAAWqlB,CAAAA,EAClB,CACF,CAAA,CCbO,IAAMkQ,EAAAA,CAAN,cAAkCpqB,CAAU,CAQjD,WAAA,CAAYqqB,CAAuBH,CAAAA,CAAAA,CAAuB,IAAM,CAAA,CAC9D,KAAM,CAAA,kBAAkB,CAN1B,CAAA,IAAA,CAAA,UAAA,CAAa,GACb,CAAA,IAAA,CAAA,6BAAA,CAAgC,KAChC,CAAA,IAAA,CAAA,MAAA,CAAS,YACT,IAAO,CAAA,IAAA,CAAA,kBAAA,CAIL,IAAK,CAAA,aAAA,CAAgBG,CACrB,CAAA,IAAA,CAAK,WAAcH,CAAAA,EACrB,CACF,CAAA,CCbO,IAAMI,EAAAA,CAAN,cAA8BtqB,CAAU,CAU7C,WACEnL,CAAAA,CAAAA,CACAmF,CACAuwB,CAAAA,CAAAA,CACAC,CAAS,CAAA,KAAA,CACT,CACA,KAAA,CAAM,cAAc,CAAA,CAXtB,IAAa,CAAA,UAAA,CAAA,GAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,KAAA,CAChC,YAAS,UACT,CAAA,IAAA,CAAA,IAAA,CAAO,cASL,CAAA,IAAA,CAAK,KAAQ31B,CAAAA,CAAAA,CACb,IAAK,CAAA,OAAA,CAAUmF,CACf,CAAA,IAAA,CAAK,SAAYuwB,CAAAA,CAAAA,CACjB,IAAK,CAAA,MAAA,CAASC,EAChB,CACF,CAAA,CCtBO,IAAMC,EAAAA,CAAN,cAA4BzqB,CAAU,CAS3C,WAAA,CAAYuqB,CAAmB11B,CAAAA,CAAAA,CAAgB61B,CAAmB,CAAA,CAChE,KAAM,CAAA,YAAY,EAPpB,IAAa,CAAA,UAAA,CAAA,GAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,KAAA,CAChC,IAAU,CAAA,OAAA,CAAA,KAAA,CACV,IAAS,CAAA,MAAA,CAAA,UAAA,CACT,IAAO,CAAA,IAAA,CAAA,YAAA,CAIL,IAAK,CAAA,SAAA,CAAYH,CACjB,CAAA,IAAA,CAAK,MAAQ11B,CACb,CAAA,IAAA,CAAK,OAAU61B,CAAAA,CAAAA,EAAW,MAC5B,CACF,CCdO,CAAA,IAAMC,EAAN,CAAA,cAA2B3qB,CAAU,CAO1C,WAAYmO,CAAAA,CAAAA,CAA6BjO,EAAsB,KAAO,CAAA,CACpE,KAAM,CAAA,UAAA,CAAYA,CAAU,CAAA,CAN9B,IAAa,CAAA,UAAA,CAAA,GAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,KAAA,CAChC,IAAS,CAAA,MAAA,CAAA,UAAA,CACT,IAAO,CAAA,IAAA,CAAA,UAAA,CAIL,KAAK,QAAWiO,CAAAA,EAClB,CACF,CAAA,CCZO,IAAMyc,CAAAA,CAAN,cAA6B5qB,CAAU,CAe5C,WAAA,CACE9F,CACA2wB,CAAAA,CAAAA,CACAC,CAQI,CAAA,GACJ,CACA,KAAA,CAAM,EAAE,CAAA,CAnBV,IAAa,CAAA,UAAA,CAAA,GAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,IAAA,CAChC,IAAS,CAAA,MAAA,CAAA,QAAA,CACT,IAAO,CAAA,IAAA,CAAA,aAAA,CACP,IAAa,CAAA,UAAA,CAAA,KAAA,CAgBX,KAAK,MAAS5wB,CAAAA,CAAAA,CACd,IAAK,CAAA,QAAA,CAAW2wB,CAChB,CAAA,IAAA,CAAK,MAASC,CAAAA,CAAAA,CAAK,MACnB,CAAA,IAAA,CAAK,SAAYA,CAAAA,CAAAA,CAAK,SACtB,CAAA,IAAA,CAAK,MAAQA,CAAK,CAAA,KAAA,CAClB,IAAK,CAAA,UAAA,CAAaA,CAAK,CAAA,UAAA,CACvB,IAAK,CAAA,YAAA,CAAeA,CAAK,CAAA,YAAA,CACzB,IAAK,CAAA,aAAA,CAAgBA,CAAK,CAAA,aAAA,CAC1B,KAAK,UAAaA,CAAAA,CAAAA,CAAK,UAAc,EAAA,MACvC,CACF,CAAA,CCjCO,IAAMC,EAAAA,CAAN,cAAuB/qB,CAAU,CAStC,WAAA,CACEgrB,CACAC,CAAAA,CAAAA,CAAsB,MACtBC,CAAkB,CAAA,KAAA,CAClB,CACA,KAAA,CAAM,MAAM,CAAA,CAVd,IAAa,CAAA,UAAA,CAAA,GAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,KAAA,CAChC,IAAS,CAAA,MAAA,CAAA,MAAA,CACT,IAAO,CAAA,IAAA,CAAA,MAAA,CAQL,KAAK,QAAWF,CAAAA,CAAAA,CAChB,IAAK,CAAA,UAAA,CAAaC,CAClB,CAAA,IAAA,CAAK,MAASC,CAAAA,EAChB,CACF,CAAA,CCzBO,IAAMC,EAAAA,CAAN,cAAwBnrB,CAAU,CAQvC,WAAY9L,CAAAA,CAAAA,CAAyCk3B,CAAiB,CAAA,KAAA,CAAO,CAC3E,KAAA,CAAMA,CAAQ,CAAA,WAAA,CAAc,OAAO,CAAA,CANrC,IAAa,CAAA,UAAA,CAAA,GAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,IAAA,CAChC,IAAS,CAAA,MAAA,CAAA,OAAA,CACT,IAAO,CAAA,IAAA,CAAA,OAAA,CAIL,IAAK,CAAA,KAAA,CAAQl3B,CACb,CAAA,IAAA,CAAK,KAAQk3B,CAAAA,EACf,CACF,CAAA,CCbO,IAAMC,EAAAA,CAAN,cAAuBrrB,CAAU,CAStC,WAAYsrB,CAAAA,CAAAA,CAAgBzd,CAAe0d,CAAAA,CAAAA,CAA+B,CACpED,CAAAA,GAAW,QACbA,GAAAA,CAAAA,CAAS,EAGX,CAAA,CAAA,KAAA,CAAM,MAAM,CAAA,CAVd,IAAa,CAAA,UAAA,CAAA,GAAA,CACb,mCAAgC,KAChC,CAAA,IAAA,CAAA,MAAA,CAAS,MACT,CAAA,IAAA,CAAA,IAAA,CAAO,MAQL,CAAA,IAAA,CAAK,KAAQzd,CAAAA,CAAAA,CACb,IAAK,CAAA,IAAA,CAAO0d,CACZ,CAAA,IAAA,CAAK,MAASD,CAAAA,EAChB,CACF,CCnBO,CAAA,IAAeE,EAAf,CAAA,KAA2B,CAGhC,WAAA,CAAY/T,CAAoB,CAAA,CAC9B,IAAK,CAAA,KAAA,CAAQA,EACf,CAEA,QAAwB,EAAA,CACtB,OAAO,IAAK,CAAA,KACd,CACF,CAAA,CCVO,IAAMgU,EAAAA,CAAN,cAAkCzrB,CAAU,CAOjD,WAAA,CAAY9F,CAAgB,CAAA,CAC1B,KAAM,CAAA,EAAE,EANV,IAAa,CAAA,UAAA,CAAA,GAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,IAAA,CAChC,IAAS,CAAA,MAAA,CAAA,YAAA,CACT,IAAO,CAAA,IAAA,CAAA,OAAA,CAIL,IAAK,CAAA,MAAA,CAASA,EAChB,CACF,CCOO,CAAA,IAAMwxB,GAAN,cAAgCF,EAAY,CAOjD,WAAA,CACEztB,CACA0Z,CAAAA,CAAAA,CACAkU,CACApd,CAAAA,CAAAA,CACA0b,CAAgC,CAAA,EAChC2B,CAAAA,CAAAA,CAA8B,cAC9B,CAAA,CACA,MAAMnU,CAAK,CAAA,CACX,IAAK,CAAA,UAAA,CAAakU,CAClB,CAAA,IAAA,CAAK,SAAYpd,CAAAA,CAAAA,CACjB,IAAK,CAAA,gBAAA,CAAmB0b,CACxB,CAAA,IAAA,CAAK,OAAU2B,CAAAA,CAAAA,CACf,KAAK,OAAU7tB,CAAAA,EACjB,CAOA,UAAA,CAAWlL,CAAmC,CAAA,CAC5C,IAAMg5B,CAAAA,CAActgB,EAClB,CAAA,IAAA,CAAK,SACL7G,CAAAA,CAAAA,CAAe,IAAK,CAAA,UAAA,CAAW,MAAM,CACvC,CAAA,CAEA,OAAI,IAAA,CAAK,OAAY,GAAA,aAAA,EACnB,IAAK,CAAA,KAAA,CAAM,IACT,CAAA,IAAIolB,CAAe,CAAA,aAAA,CAAe,CAChC,OAAA,CAAS,CAACplB,CAAe,CAAA,IAAA,CAAK,UAAW,CAAA,MAAM,CAAC,CAAA,CAChD,cAAgB7R,CAAAA,CAAAA,EAAS,cAAkBg5B,EAAAA,CAC7C,CAAC,CACH,CAEO,CAAA,IAAA,EAGL,KAAK,OAAY,GAAA,QAAA,CACZ,IAAK,CAAA,yBAAA,CACVh5B,CAAW,EAAA,CAAE,cAAgBg5B,CAAAA,CAAY,CAC3C,CAAA,EAGF,IAAK,CAAA,gBAAA,CAAiB,IACpB,CAAA,IAAI/B,EAAe,aAAe,CAAA,CAChC,OAAS,CAAA,CAACplB,CAAe,CAAA,IAAA,CAAK,UAAW,CAAA,MAAM,CAAC,CAAA,CAChD,cAAgB7R,CAAAA,CAAAA,EAAS,cAAkBg5B,EAAAA,CAC7C,CAAC,CACH,CAAA,CAEO,IACT,CAAA,CAWA,UACEC,CAAAA,CAAAA,CACAj5B,CACM,CAAA,CACN,GAAM,CAACgC,CAAOoc,CAAAA,CAAI,CAAI6a,CAAAA,CAAAA,CAAW,MAAM,GAAG,CAAA,CACpCza,CAAUJ,CAAAA,CAAAA,CAAK,KAAM,CAAA,GAAG,CACxBtc,CAAAA,CAAAA,CACJ9B,CAAS,EAAA,cAAA,EACTuY,CACE,CAAA,IAAA,CAAK,SAAa,EAAA,EAAA,CAClB1G,EAAe,IAAK,CAAA,UAAA,CAAW,MAAM,CAAA,CACrC2M,CAAQ,CAAA,CAAC,CACX,CAAA,CAEF,OAAI,IAAA,CAAK,OAAY,GAAA,aAAA,EACnB,IAAK,CAAA,KAAA,CAAM,IACT,CAAA,IAAIyY,CAAe,CAAA,aAAA,CAAe,CAChC,OAAA,CAAS,CAACplB,CAAAA,CAAe,IAAK,CAAA,UAAA,CAAW,MAAM,CAAC,CAChD,CAAA,UAAA,CAAY,CAAE,KAAA,CAAA7P,EAAO,OAASwc,CAAAA,CAAQ,CACtC,CAAA,cAAA,CAAgB1c,CAChB,CAAA,QAAA,CAAU9B,CAAS,EAAA,QAAA,CACnB,QAAUA,CAAAA,CAAAA,EAAS,QACrB,CAAC,CACH,CAAA,CAEO,OAGT,IAAK,CAAA,gBAAA,CAAiB,IACpB,CAAA,IAAIi3B,CAAe,CAAA,aAAA,CAAe,CAChC,OAAA,CAAS,CAACplB,CAAAA,CAAe,IAAK,CAAA,UAAA,CAAW,MAAM,CAAC,EAChD,UAAY,CAAA,CAAE,KAAA7P,CAAAA,CAAAA,CAAO,OAASwc,CAAAA,CAAQ,CACtC,CAAA,cAAA,CAAgB1c,CAChB,CAAA,QAAA,CAAU9B,CAAS,EAAA,QAAA,CACnB,QAAUA,CAAAA,CAAAA,EAAS,QACrB,CAAC,CACH,CAEO,CAAA,IAAA,CACT,CAKA,SAAA,EAAkB,CAChB,OAAA,IAAA,CAAK,UAAW,CAAA,aAAA,CAAgB,IACzB,CAAA,IACT,CAQA,WAAA,EAAoB,CAClB,OAAK,IAAA,CAAA,KAAA,CAAM,IACT,CAAA,IAAIi3B,CAAe,CAAA,UAAA,CAAY,CAC7B,OAAA,CAAS,CAACplB,CAAAA,CAAe,IAAK,CAAA,UAAA,CAAW,MAAM,CAAC,CAClD,CAAC,CACH,CACO,CAAA,IACT,CAQA,QAAA,EAAiB,CACf,OAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CACT,IAAIolB,CAAAA,CAAe,MAAQ,CAAA,CACzB,QAAS,CAACplB,CAAAA,CAAe,IAAK,CAAA,UAAA,CAAW,MAAM,CAAC,CAClD,CAAC,CACH,CAAA,CAEO,IACT,CAUA,OAAQ/S,CAAAA,CAAAA,CAAyD,CAC/D,IAAIo6B,CAAAA,CAEJ,OAAIp6B,CAAAA,YAAiBke,CACnBkc,CAAAA,CAAAA,CAAap6B,CACJA,CAAAA,CAAAA,GAAU,IACnBo6B,CAAAA,CAAAA,CAAa,MACJ,CAAA,OAAOp6B,CAAU,EAAA,SAAA,CAC1Bo6B,EAAap6B,CAAQ,CAAA,MAAA,CAAS,OACrBA,CAAAA,CAAAA,GAAU,MACnBo6B,GAAAA,CAAAA,CAAap6B,CAAM,CAAA,QAAA,EAGrB,CAAA,CAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CACT,IAAIm4B,CAAAA,CAAe,UAAW,CAC5B,YAAA,CAAciC,CAChB,CAAC,CACH,CAAA,CAEO,IACT,CASA,MAAOl5B,CAAAA,CAAAA,CAAyC,CAC9C,OAAI,IAAK,CAAA,OAAA,GAAY,eACnB,IAAK,CAAA,KAAA,CAAM,IACT,CAAA,IAAIi3B,CAAe,CAAA,QAAA,CAAU,CAC3B,OAAA,CAAS,CAACplB,CAAAA,CAAe,IAAK,CAAA,UAAA,CAAW,MAAM,CAAC,EAChD,cACE7R,CAAAA,CAAAA,EAAS,cACTsY,EAAAA,EAAAA,CACE,IAAK,CAAA,SAAA,EAAa,EAClBzG,CAAAA,CAAAA,CAAe,IAAK,CAAA,UAAA,CAAW,MAAM,CACvC,CACJ,CAAC,CACH,CAEO,CAAA,IAAA,GAGT,IAAK,CAAA,gBAAA,CAAiB,IACpB,CAAA,IAAIolB,CAAe,CAAA,QAAA,CAAU,CAC3B,OAAA,CAAS,CAACplB,CAAAA,CAAe,IAAK,CAAA,UAAA,CAAW,MAAM,CAAC,CAAA,CAChD,cACE7R,CAAAA,CAAAA,EAAS,cACTsY,EAAAA,EAAAA,CACE,IAAK,CAAA,SAAA,EAAa,EAClBzG,CAAAA,CAAAA,CAAe,IAAK,CAAA,UAAA,CAAW,MAAM,CACvC,CACJ,CAAC,CACH,CAEO,CAAA,IAAA,CACT,CASA,KAAA,CAAM+B,CAA0B,CAAA,CAC9B,OAAK,IAAA,CAAA,KAAA,CAAM,IAAK,CAAA,IAAIglB,EAAoBhlB,CAAAA,CAAU,CAAC,CAC5C,CAAA,IACT,CAKQ,yBAAA,CAA0B5T,CAAmC,CAAA,CACnE,OAAK,IAAA,CAAA,KAAA,CAAM,IACT,CAAA,IAAIi3B,CAAe,CAAA,aAAA,CAAe,CAChC,OAAA,CAAS,CAACplB,CAAe,CAAA,IAAA,CAAK,UAAW,CAAA,MAAM,CAAC,CAAA,CAChD,cAAgB7R,CAAAA,CAAAA,EAAS,cACzB,CAAA,aAAA,CAAe,IAAK,CAAA,UAAA,CAAW,aAC/B,CAAA,UAAA,CAAY,SACd,CAAQ,CACV,CACO,CAAA,IACT,CACF,CAAA,CClQO,IAAMm5B,EAAAA,CAAN,cAAiCR,EAAY,CAMlD,WAAA,CACEztB,CACA0Z,CAAAA,CAAAA,CACAlJ,EACAqd,CACA,CAAA,CACA,KAAMnU,CAAAA,CAAK,CATb,CAAA,IAAA,CAAQ,OAA0C,CAAA,cAAA,CAUhD,IAAK,CAAA,SAAA,CAAYlJ,CACjB,CAAA,IAAA,CAAK,gBAAmB,CAAA,GACxB,IAAK,CAAA,OAAA,CAAUqd,CAAW,EAAA,cAAA,CAC1B,IAAK,CAAA,OAAA,CAAU7tB,EACjB,CAEQ,KAAMY,CAAAA,CAAAA,CAAyC,CACrD,OAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAKA,CAAI,CACb,CAAA,IAAI+sB,EACT,CAAA,IAAA,CAAK,OACL,CAAA,IAAA,CAAK,KACL/sB,CAAAA,CAAAA,CACA,IAAK,CAAA,SAAA,CACL,IAAK,CAAA,gBAAA,CACL,IAAK,CAAA,OACP,CACF,CASA,YAAA,CAAahN,CAAwB,CAAA,CACnC,OAAO,IAAIke,CAAQle,CAAAA,CAAK,CAC1B,CASA,IAAKgD,CAAAA,CAAAA,CAAcgP,CAAiB,CAAA,CAAA,CAAsB,CACxD,IAAMhF,CAAAA,CAAO,IAAIisB,CAAAA,CAAej2B,CAAM,CAAA,MAAA,CAAQ,CAAE,MAAA,CAAAgP,CAAO,CAAC,CACxD,CAAA,OAAO,IAAK,CAAA,KAAA,CAAMhF,CAAI,CACxB,CAQA,OAAQhK,CAAAA,CAAAA,CAAcgP,CAAiB,CAAA,GAAA,CAAwB,CAC7D,IAAMhF,CAAO,CAAA,IAAIisB,CAAej2B,CAAAA,CAAAA,CAAM,SAAW,CAAA,CAAE,OAAAgP,CAAO,CAAC,CAC3D,CAAA,OAAO,IAAK,CAAA,KAAA,CAAMhF,CAAI,CACxB,CAKA,MAAA,CAAOhK,CAAcgP,CAAAA,CAAAA,CAAiB,GAAwB,CAAA,CAC5D,OAAO,IAAK,CAAA,OAAA,CAAQhP,CAAMgP,CAAAA,CAAM,CAClC,CAQA,IACEhP,CAAAA,CAAAA,CACA3C,CAA+C,CAAA,UAAA,CAC5B,CACnB,IAAM2M,CAAO,CAAA,IAAIisB,EAAej2B,CAAM3C,CAAAA,CAAI,CAC1C,CAAA,OAAO,IAAK,CAAA,KAAA,CAAM2M,CAAI,CACxB,CAOA,QAAA,CAAShK,CAAiC,CAAA,CACxC,OAAO,IAAA,CAAK,KAAKA,CAAM,CAAA,UAAU,CACnC,CAOA,UAAWA,CAAAA,CAAAA,CAAiC,CAC1C,OAAO,IAAK,CAAA,IAAA,CAAKA,CAAM,CAAA,YAAY,CACrC,CAOA,SAASA,CAAiC,CAAA,CACxC,OAAO,IAAA,CAAK,IAAKA,CAAAA,CAAAA,CAAM,UAAU,CACnC,CAQA,IAAA,CAAKA,CAAiC,CAAA,CACpC,IAAMgK,CAAAA,CAAO,IAAIisB,CAAej2B,CAAAA,CAAAA,CAAM,MAAM,CAAA,CAC5C,OAAO,IAAA,CAAK,KAAMgK,CAAAA,CAAI,CACxB,CAQA,IAAKhK,CAAAA,CAAAA,CAAiC,CACpC,IAAMgK,EAAO,IAAIisB,CAAAA,CAAej2B,CAAM,CAAA,MAAM,CAC5C,CAAA,OAAO,IAAK,CAAA,KAAA,CAAMgK,CAAI,CACxB,CAWA,OAAA,CAAQhK,CAAcgP,CAAAA,CAAAA,CAAiB,GAAwB,CAAA,CAC7D,IAAMhF,CAAAA,CAAO,IAAIisB,CAAAA,CAAej2B,CAAM,CAAA,SAAA,CAAW,CAAE,MAAA,CAAAgP,CAAO,CAAC,CAC3D,CAAA,OAAO,IAAK,CAAA,KAAA,CAAMhF,CAAI,CACxB,CAQA,OAAQhK,CAAAA,CAAAA,CAAcgP,CAAiB,CAAA,GAAA,CAAwB,CAC7D,IAAMhF,CAAO,CAAA,IAAIisB,CAAej2B,CAAAA,CAAAA,CAAM,SAAW,CAAA,CAAE,OAAAgP,CAAO,CAAC,CAC3D,CAAA,OAAO,IAAK,CAAA,KAAA,CAAMhF,CAAI,CACxB,CAQA,QAAA,CAAShK,CAAcgP,CAAAA,CAAAA,CAAiB,GAAwB,CAAA,CAC9D,IAAMhF,CAAO,CAAA,IAAIisB,CAAej2B,CAAAA,CAAAA,CAAM,UAAY,CAAA,CAAE,MAAAgP,CAAAA,CAAO,CAAC,CAAA,CAC5D,OAAO,IAAA,CAAK,KAAMhF,CAAAA,CAAI,CACxB,CAQA,SAAA,CAAUhK,CAAcgP,CAAAA,CAAAA,CAAiB,GAAwB,CAAA,CAC/D,IAAMhF,CAAAA,CAAO,IAAIisB,CAAAA,CAAej2B,CAAM,CAAA,WAAA,CAAa,CAAE,MAAA,CAAAgP,CAAO,CAAC,CAAA,CAC7D,OAAO,IAAA,CAAK,KAAMhF,CAAAA,CAAI,CACxB,CAQA,UAAWhK,CAAAA,CAAAA,CAAcgP,CAAiB,CAAA,GAAA,CAAwB,CAChE,IAAMhF,EAAO,IAAIisB,CAAAA,CAAej2B,CAAM,CAAA,QAAA,CAAU,CAAE,MAAA,CAAAgP,CAAO,CAAC,CAC1D,CAAA,OAAO,IAAK,CAAA,KAAA,CAAMhF,CAAI,CACxB,CAKA,MAAOhK,CAAAA,CAAAA,CAAcgP,CAAiB,CAAA,GAAA,CAAwB,CAC5D,OAAO,IAAK,CAAA,UAAA,CAAWhP,CAAMgP,CAAAA,CAAM,CACrC,CAQA,KAAMhP,CAAAA,CAAAA,CAAc2b,EAAoB,EAAuB,CAAA,CAC7D,IAAM3R,CAAAA,CAAO,IAAIisB,CAAAA,CAAej2B,CAAM,CAAA,OAAA,CAAS,CAAE,SAAA,CAAA2b,CAAU,CAAC,CAC5D,CAAA,OAAO,KAAK,KAAM3R,CAAAA,CAAI,CACxB,CAQA,MAAOhK,CAAAA,CAAAA,CAAc2b,CAAoB,CAAA,EAAA,CAAuB,CAC9D,IAAM3R,CAAO,CAAA,IAAIisB,CAAej2B,CAAAA,CAAAA,CAAM,SAAU,CAAE,SAAA,CAAA2b,CAAU,CAAC,CAC7D,CAAA,OAAO,IAAK,CAAA,KAAA,CAAM3R,CAAI,CACxB,CAQA,IAAA,CAAKhK,CAAc2b,CAAAA,CAAAA,CAAoB,GAAuB,CAC5D,IAAM3R,CAAO,CAAA,IAAIisB,CAAej2B,CAAAA,CAAAA,CAAM,MAAQ,CAAA,CAAE,SAAA2b,CAAAA,CAAU,CAAC,CAAA,CAC3D,OAAO,IAAA,CAAK,MAAM3R,CAAI,CACxB,CAQA,OAAA,CACEhK,CACA2b,CAAAA,CAAAA,CAAoB,EACpBC,CAAAA,CAAAA,CAAgB,CACG,CAAA,CACnB,IAAM5R,CAAAA,CAAO,IAAIisB,CAAAA,CAAej2B,EAAM,SAAW,CAAA,CAAE,SAAA2b,CAAAA,CAAAA,CAAW,KAAAC,CAAAA,CAAM,CAAC,CAAA,CACrE,OAAO,IAAA,CAAK,KAAM5R,CAAAA,CAAI,CACxB,CAQA,QACEhK,CACA2b,CAAAA,CAAAA,CAAoB,EACpBC,CAAAA,CAAAA,CAAgB,CACG,CAAA,CACnB,IAAM5R,CAAAA,CAAO,IAAIisB,CAAAA,CAAej2B,CAAM,CAAA,SAAA,CAAW,CAAE,SAAA,CAAA2b,EAAW,KAAAC,CAAAA,CAAM,CAAC,CAAA,CACrE,OAAO,IAAA,CAAK,KAAM5R,CAAAA,CAAI,CACxB,CAWA,SACEhK,CAAAA,CAAAA,CACAgP,CAAiB,CAAA,GAAA,CACqB,CACtC,OAAO,IAAK,CAAA,OAAA,CAAQhP,CAAMgP,CAAAA,CAAM,CAAE,CAAA,SAAA,EACpC,CAQA,YACEhP,CAAAA,CAAAA,CACAgP,CAAiB,CAAA,GAAA,CACqB,CACtC,OAAO,KAAK,UAAWhP,CAAAA,CAAAA,CAAMgP,CAAM,CAAA,CAAE,SAAU,EACjD,CAWA,IAAA,CAAKhP,CAAc2b,CAAAA,CAAAA,CAAuC,CACxD,IAAM3R,CAAO,CAAA,IAAIisB,EAAej2B,CAAM,CAAA,MAAA,CAAQ,CAAE,SAAA,CAAA2b,CAAU,CAAC,CAC3D,CAAA,OAAO,IAAK,CAAA,KAAA,CAAM3R,CAAI,CACxB,CAQA,IAAA,CAAKhK,EAAc2b,CAAuC,CAAA,CACxD,IAAM3R,CAAAA,CAAO,IAAIisB,CAAAA,CAAej2B,CAAM,CAAA,MAAA,CAAQ,CAAE,SAAA,CAAA2b,CAAU,CAAC,CAC3D,CAAA,OAAO,KAAK,KAAM3R,CAAAA,CAAI,CACxB,CAQA,IAAKhK,CAAAA,CAAAA,CAAiC,CACpC,IAAMgK,CAAO,CAAA,IAAIisB,CAAej2B,CAAAA,CAAAA,CAAM,MAAM,CAAA,CAC5C,OAAO,IAAK,CAAA,KAAA,CAAMgK,CAAI,CACxB,CAQA,QAAA,CACEhK,CACA9B,CAAAA,CAAAA,CACmB,CACnB,IAAM8L,CAAO,CAAA,IAAIisB,CAAej2B,CAAAA,CAAAA,CAAM,WAAY,CAChD,YAAA,CAAc9B,CAAS,EAAA,YAAA,EAAgB,KACvC,CAAA,SAAA,CAAWA,CAAS,EAAA,SACtB,CAAC,CAAA,CACD,OAAO,IAAA,CAAK,KAAM8L,CAAAA,CAAI,CACxB,CAQA,SAAA,CACEhK,CACA9B,CAAAA,CAAAA,CACmB,CACnB,IAAM8L,CAAO,CAAA,IAAIisB,CAAej2B,CAAAA,CAAAA,CAAM,WAAa,CAAA,CACjD,YAAc9B,CAAAA,CAAAA,EAAS,cAAgB,KACvC,CAAA,SAAA,CAAWA,CAAS,EAAA,SACtB,CAAC,CAAA,CACD,OAAO,IAAA,CAAK,KAAM8L,CAAAA,CAAI,CACxB,CAWA,OAAQhK,CAAAA,CAAAA,CAAiC,CACvC,IAAMgK,CAAAA,CAAO,IAAIisB,CAAAA,CAAej2B,CAAM,CAAA,SAAS,CAC/C,CAAA,OAAO,IAAK,CAAA,KAAA,CAAMgK,CAAI,CACxB,CAWA,MAAA,CAAOhK,EAAiC,CACtC,IAAMgK,CAAO,CAAA,IAAIisB,CAAej2B,CAAAA,CAAAA,CAAM,QAAQ,CAAA,CAC9C,OAAO,IAAA,CAAK,KAAMgK,CAAAA,CAAI,CACxB,CAQA,UAAUhK,CAAcgP,CAAAA,CAAAA,CAAiB,GAAwB,CAAA,CAC/D,IAAMhF,CAAAA,CAAO,IAAIisB,CAAAA,CAAej2B,CAAM,CAAA,WAAA,CAAa,CAAE,MAAA,CAAAgP,CAAO,CAAC,EAC7D,OAAO,IAAA,CAAK,KAAMhF,CAAAA,CAAI,CACxB,CAQA,IAAKhK,CAAAA,CAAAA,CAAiC,CACpC,IAAMgK,CAAO,CAAA,IAAIisB,CAAej2B,CAAAA,CAAAA,CAAM,MAAM,CAC5C,CAAA,OAAO,IAAK,CAAA,KAAA,CAAMgK,CAAI,CACxB,CAQA,QAAA,CAAShK,CAAiC,CAAA,CACxC,IAAMgK,CAAAA,CAAO,IAAIisB,CAAAA,CAAej2B,EAAM,UAAU,CAAA,CAChD,OAAO,IAAA,CAAK,KAAMgK,CAAAA,CAAI,CACxB,CAQA,UAAWhK,CAAAA,CAAAA,CAAiC,CAC1C,IAAMgK,CAAO,CAAA,IAAIisB,EAAej2B,CAAM,CAAA,YAAY,CAClD,CAAA,OAAO,IAAK,CAAA,KAAA,CAAMgK,CAAI,CACxB,CAQA,QAAA,CAAShK,CAAiC,CAAA,CACxC,IAAMgK,CAAAA,CAAO,IAAIisB,CAAAA,CAAej2B,CAAM,CAAA,UAAU,CAChD,CAAA,OAAO,IAAK,CAAA,KAAA,CAAMgK,CAAI,CACxB,CAYA,IAAA,CAAKhK,CAAiC,CAAA,CACpC,IAAMgK,CAAAA,CAAO,IAAIisB,CAAej2B,CAAAA,CAAAA,CAAM,MAAM,CAAA,CAC5C,OAAO,IAAA,CAAK,KAAMgK,CAAAA,CAAI,CACxB,CAQA,KAAMhK,CAAAA,CAAAA,CAAiC,CACrC,IAAMgK,EAAO,IAAIisB,CAAAA,CAAej2B,CAAM,CAAA,OAAO,CAC7C,CAAA,OAAO,IAAK,CAAA,KAAA,CAAMgK,CAAI,CACxB,CAWA,IAAA,CAAKhK,CAAcmZ,CAAAA,CAAAA,CAA8C,CAC/D,IAAMnP,CAAAA,CAAO,IAAIisB,CAAAA,CAAej2B,CAAM,CAAA,MAAA,CAAQ,CAAE,UAAA,CAAYmZ,CAAO,CAAC,CACpE,CAAA,OAAO,IAAK,CAAA,KAAA,CAAMnP,CAAI,CACxB,CAWA,MAAOhK,CAAAA,CAAAA,CAAc3C,CAAc2R,CAAAA,CAAAA,CAAoC,CACrE,IAAMhF,CAAO,CAAA,IAAIisB,CAAej2B,CAAAA,CAAAA,CAAM3C,CAAM,CAAA,CAAE,OAAA2R,CAAO,CAAC,CACtD,CAAA,OAAO,IAAK,CAAA,KAAA,CAAMhF,CAAI,CACxB,CAYA,SAAA,CAAU4Z,CAAgC,CAAA,CACxC,IAAM5Z,CAAAA,CAAO,IAAIisB,CAAerS,CAAAA,CAAAA,CAAK,EAAI,CAAA,CAAE,UAAY,CAAA,IAAK,CAAC,CAAA,CAC7D,OAAO,IAAA,CAAK,KAAM5Z,CAAAA,CAAI,CACxB,CAUA,SAAShK,CAAiC,CAAA,CACxC,IAAMgK,CAAAA,CAAO,IAAIisB,CAAAA,CAAej2B,CAAM,CAAA,UAAU,CAChD,CAAA,OAAO,IAAK,CAAA,KAAA,CAAMgK,CAAI,CACxB,CAQA,KAAMhK,CAAAA,CAAAA,CAAiC,CACrC,IAAMgK,CAAO,CAAA,IAAIisB,CAAej2B,CAAAA,CAAAA,CAAM,OAAO,CAAA,CAC7C,OAAO,IAAA,CAAK,KAAMgK,CAAAA,CAAI,CACxB,CAQA,UAAA,CAAWhK,CAAiC,CAAA,CAC1C,IAAMgK,CAAAA,CAAO,IAAIisB,CAAAA,CAAej2B,CAAM,CAAA,YAAY,CAClD,CAAA,OAAO,IAAK,CAAA,KAAA,CAAMgK,CAAI,CACxB,CAQA,OAAQhK,CAAAA,CAAAA,CAAiC,CACvC,IAAMgK,CAAO,CAAA,IAAIisB,CAAej2B,CAAAA,CAAAA,CAAM,SAAS,CAAA,CAC/C,OAAO,IAAA,CAAK,MAAMgK,CAAI,CACxB,CAQA,UAAA,CAAWhK,CAAiC,CAAA,CAC1C,IAAMgK,CAAAA,CAAO,IAAIisB,CAAAA,CAAej2B,CAAM,CAAA,YAAY,CAClD,CAAA,OAAO,KAAK,KAAMgK,CAAAA,CAAI,CACxB,CAIA,mBAAmC,EAAA,CACjC,OAAO,IAAA,CAAK,gBACd,CACF,CCziBO,CAAA,IAAMstB,EAAN,CAAA,cAAgCT,EAAY,CAIjD,WAAA,CAAY32B,CAAe4iB,CAAAA,CAAAA,CAAoB1Z,CAA4B,CAAA,CACzE,KAAM0Z,CAAAA,CAAK,CACX,CAAA,IAAA,CAAK,KAAQ5iB,CAAAA,CAAAA,CACb,IAAK,CAAA,OAAA,CAAUkJ,EACjB,CASA,YAAA,CAAapM,CAAwB,CAAA,CACnC,OAAO,IAAIke,CAAQle,CAAAA,CAAK,CAC1B,CAOA,SAAUu6B,CAAAA,CAAAA,CAA0D,CAClE,IAAIC,EAAyB,EAAC,CACxBC,CAAU,CAAA,IAAIJ,EAClB,CAAA,IAAA,CAAK,OACLG,CAAAA,CAAAA,CACA,IAAK,CAAA,KAAA,CACL,aACF,CAAA,CACME,CAAcH,CAAAA,CAAAA,CAAGE,CAAO,CAC9B,CAAA,GAAI,CAACD,CAAAA,CAAU,MACb,CAAA,OAGF,IAAMlC,CAAAA,CAAgCmC,CAAQ,CAAA,mBAAA,EACxCE,CAAAA,CAAAA,CAAcH,CAAU,CAAA,MAAA,CAAQ74B,GAAMA,CAAE,CAAA,MAAA,GAAW,QAAQ,CAAA,CAGjE,GAFA64B,CAAAA,CAAYA,CAAU,CAAA,MAAA,CAAOlC,CAAgB,CAAA,CAEzCqC,CAAY,CAAA,MAAA,GAAW,CACzB,CAAA,MAAM,IAAI,KAAM,CAAA,mDAAmD,CAGrE,CAAA,IAAMnc,CAAUmc,CAAAA,CAAAA,CAAY,CAAC,CAAA,CAEvBvtB,CAAoBstB,CAAAA,CAAAA,CAAY,QAAS,EAAA,CAAE,MAAQ/4B,CAAAA,CAAAA,EAAiB,CACxE,IAAMi5B,CAAAA,CAAiBj5B,CACvB,CAAA,OACEi5B,CAAe,CAAA,cAAA,GAAmB,UAClCA,EAAAA,CAAAA,CAAe,cAAmB,GAAA,MAAA,EAClCA,CAAe,CAAA,cAAA,GAAmB,SAEtC,CAAC,EAEKC,CAAgB,CAAA,IAAI1D,EAAc3Y,CAAAA,CAAO,CAC9Cqc,CAAAA,CAAAA,CAAsB,iBAAoBztB,CAAAA,CAAAA,CAC3C,IAAK,CAAA,KAAA,CAAM,IAAKytB,CAAAA,CAAa,CAEAH,CAAAA,CAAAA,CAC1B,UACA,CAAA,MAAA,CAAQ/4B,CAAiB,EAAA,CACxB,IAAMi5B,CAAAA,CAAiBj5B,CACvB,CAAA,OACEi5B,CAAe,CAAA,cAAA,GAAmB,QAClCA,EAAAA,CAAAA,CAAe,cAAmB,GAAA,aAAA,EAClCA,EAAe,cAAmB,GAAA,aAEtC,CAAC,CAAA,CAEkB,OAASj5B,CAAAA,CAAAA,EAAM,CAClC,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,IAAIy1B,EAAAA,CAAkBz1B,CAAmB,CAAC,EAC5D,CAAC,EACH,CAOA,WAAA,CAAYm5B,CAA+D,CAAA,CACzE,GAAI,IAAA,CAAK,OAAY,GAAA,QAAA,CACnB,MAAM,IAAIj9B,CACR,CAAA,gCAAA,CACA,uBACA,IAAI,KAAA,CAAM,gDAAgD,CAC5D,CAGF,CAAA,IAAM28B,CAAyB,CAAA,EACzBC,CAAAA,CAAAA,CAAU,IAAIJ,EAAAA,CAClB,IAAK,CAAA,OAAA,CACLG,EACA,IAAK,CAAA,KAAA,CACL,aACF,CAAA,CAEME,CAAcI,CAAAA,CAAAA,CAAcL,CAAO,CAAA,CACzC,GAAI,CAACD,CAAU,CAAA,MAAA,CACb,OAGF,IAAMG,EAAcH,CAAU,CAAA,MAAA,CAAQ74B,CAAMA,EAAAA,CAAAA,CAAE,MAAW,GAAA,QAAQ,CACjE,CAAA,GAAIg5B,CAAY,CAAA,MAAA,GAAW,CACzB,CAAA,MAAM,IAAI,KAAA,CAAM,qDAAqD,CAGvE,CAAA,IAAMnc,CAAUmc,CAAAA,CAAAA,CAAY,CAAC,CAAA,CACvB7lB,CAAa/B,CAAAA,CAAAA,CAAeyL,CAAQ,CAAA,MAAM,CAC1Cuc,CAAAA,CAAAA,CAAaL,CAAY,CAAA,QAAA,GAAW,IAAM/4B,CAAAA,CAAAA,EACvBA,CACD,CAAA,cAAA,GAAmB,MAC1C,CAAA,CAOKq5B,CALgBN,CAAAA,CAAAA,CAAY,QAAS,EAAA,CAAE,IAAM/4B,CAAAA,CAAAA,EAC1BA,CACD,CAAA,cAAA,GAAmB,UAC1C,CAGkBo5B,EAAAA,CAAAA,CACbE,CAAaP,CAAAA,CAAAA,CAAY,QAAS,EAAA,CAAE,IAAM/4B,CAAAA,CAAAA,EACvBA,CACD,CAAA,cAAA,GAAmB,SAC1C,CAAA,CAGD,IAAK,CAAA,KAAA,CAAM,KACT,IAAI21B,EAAAA,CAAoBvkB,CAAe+B,CAAAA,CAAU,CAAG0J,CAAAA,CAAAA,CAAS,EAAE,CACjE,CAAA,CAGIwc,CACEA,GAAAA,CAAAA,CAAa,cAAmB,GAAA,UAAA,CAClC,KAAK,KAAM,CAAA,IAAA,CAAK,IAAI9C,EAAAA,CAAenlB,CAAe+B,CAAAA,CAAU,CAAC,CAAC,CACrDkmB,CAAAA,CAAAA,CAAa,cAAmB,GAAA,MAAA,EACzC,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,IAAInD,EAAgB9kB,CAAAA,CAAAA,CAAe+B,CAAU,CAAC,CAAC,CAAA,CAAA,CAK/DmmB,CAEAA,GAAAA,CAAAA,CAAW,YAAiB,GAAA,MAAA,EAC5BA,CAAW,CAAA,YAAA,GAAiB,IAE5B,CAAA,IAAA,CAAK,MAAM,IAAK,CAAA,IAAIrD,EAAgB7kB,CAAAA,CAAAA,CAAe+B,CAAU,CAAC,CAAC,CAAA,CAE/D,IAAK,CAAA,KAAA,CAAM,IACT,CAAA,IAAImjB,EACFllB,CAAAA,CAAAA,CAAe+B,CAAU,CACzBmmB,CAAAA,CAAAA,CAAW,YACb,CACF,CAKJP,CAAAA,CAAAA,CAAAA,CAAY,QAAS,EAAA,CAAE,OAAS/4B,CAAAA,CAAAA,EAAiB,CAC/C,IAAMi5B,CAAiBj5B,CAAAA,CAAAA,CACvB,OAAQi5B,CAAe,CAAA,cAAA,EACrB,KAAK,aACH,CAAA,IAAA,CAAK,aAAc7nB,CAAAA,CAAAA,CAAe+B,CAAU,CAAC,CAC7C,CAAA,MACF,KAAK,QAAA,CACH,KAAK,MAAO/B,CAAAA,CAAAA,CAAe+B,CAAU,CAAA,CAAG,CACtC,cAAA,CAAgB8lB,CAAe,CAAA,cACjC,CAAC,CAAA,CACD,MACF,KAAK,aACH,CAAA,IAAA,CAAK,WACH7nB,CAAe+B,CAAAA,CAAU,CACzB8lB,CAAAA,CAAAA,CAAe,UAAY,EAAA,KAAA,EAAS,EACpC7nB,CAAAA,CAAAA,CAAe6nB,CAAe,CAAA,UAAA,EAAY,OAAU,GAAA,CAAC,CAAK,EAAA,EAAE,EAC5D,CACE,cAAA,CAAgBA,CAAe,CAAA,cAAA,CAC/B,QAAUA,CAAAA,CAAAA,CAAe,QACzB,CAAA,QAAA,CAAUA,CAAe,CAAA,QAC3B,CACF,CAAA,CACA,KACJ,CACF,CAAC,EACH,CAMA,UAAW53B,CAAAA,CAAAA,CAAc,CACvB,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,IAAI00B,EAAAA,CAAe10B,CAAI,CAAC,EAC1C,CAMA,aAAag1B,CAAiBvpB,CAAAA,CAAAA,CAAiB,CAC7C,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,IAAIspB,EAAAA,CAAiBC,CAASvpB,CAAAA,CAAO,CAAC,EACxD,CAOA,WAAA,CAAYqG,EAAoB,CAC9B,GAAI,IAAK,CAAA,OAAA,GAAY,QACnB,CAAA,MAAM,IAAIjX,CAAAA,CACR,gCACA,CAAA,sBAAA,CACA,IAAI,KAAA,CAAM,gDAAgD,CAC5D,EAGF,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,IAAI+5B,EAAgB9iB,CAAAA,CAAU,CAAC,EACjD,CAQA,aAAA,CAAcA,CAAoB,CAAA,CAChC,GAAI,IAAA,CAAK,UAAY,QACnB,CAAA,MAAM,IAAIjX,CAAAA,CACR,gCACA,CAAA,sBAAA,CACA,IAAI,KAAA,CAAM,gDAAgD,CAC5D,CAGF,CAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,IAAIw5B,EAAkB,CAAA,CAACviB,CAAU,CAAC,CAAC,EACrD,CAOA,aAAA,CAAA,GAAiB5T,CAAuD,CAAA,CACtE,GAAI,IAAA,CAAK,OAAY,GAAA,QAAA,CACnB,MAAM,IAAIrD,CAAAA,CACR,gCACA,CAAA,sBAAA,CACA,IAAI,KAAA,CAAM,gDAAgD,CAC5D,CAGF,CAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,IAAIu5B,EAAAA,CAAkB,IAAIe,CAAe,CAAA,GAAGj3B,CAAO,CAAC,CAAC,EACvE,CAUA,UAAA,CACE4T,CACAomB,CAAAA,CAAAA,CACAC,CACAj6B,CAAAA,CAAAA,CACA,CACA,GAAI,KAAK,OAAY,GAAA,QAAA,CACnB,MAAM,IAAIrD,CACR,CAAA,gCAAA,CACA,sBACA,CAAA,IAAI,KAAM,CAAA,gDAAgD,CAC5D,CAAA,CAGF,IAAK,CAAA,KAAA,CAAM,IACT,CAAA,IAAIu5B,EACF,CAAA,IAAIe,CAAe,CAAA,aAAA,CAAe,CAChC,OAAA,CAAS,CAACrjB,CAAU,CACpB,CAAA,UAAA,CAAY,CAAE,KAAA,CAAOomB,CAAc,CAAA,OAAA,CAAS,CAACC,CAAa,CAAE,CAC5D,CAAA,cAAA,CACEj6B,CAAS,EAAA,cAAA,EACTuY,CAA2B,CAAA,IAAA,CAAK,KAAO3E,CAAAA,CAAAA,CAAYqmB,CAAa,CAAA,CAClE,QAAUj6B,CAAAA,CAAAA,EAAS,SACnB,QAAUA,CAAAA,CAAAA,EAAS,QACrB,CAAC,CACH,CACF,EACF,CASA,MAAO4T,CAAAA,CAAAA,CAAoB5T,CAAmC,CAAA,CAC5D,GAAI,IAAA,CAAK,UAAY,QACnB,CAAA,MAAM,IAAIrD,CAAAA,CACR,gCACA,CAAA,sBAAA,CACA,IAAI,KAAA,CAAM,gDAAgD,CAC5D,CAGF,CAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CACT,IAAIu5B,EACF,CAAA,IAAIe,CAAe,CAAA,QAAA,CAAU,CAC3B,OAAA,CAAS,CAACrjB,CAAU,CACpB,CAAA,cAAA,CACE5T,CAAS,EAAA,cAAA,EACTsY,EAA+B,CAAA,IAAA,CAAK,MAAO1E,CAAU,CACzD,CAAC,CACH,CACF,EACF,CASA,cAAA,CAAe4E,CAAoBC,CAAAA,CAAAA,CAAqB,CACtD,GAAI,IAAK,CAAA,OAAA,GAAY,SACnB,MAAM,IAAI9b,CACR,CAAA,mCAAA,CACA,sBACA,CAAA,IAAI,KAAM,CAAA,gDAAgD,CAC5D,CAAA,CAGF,IAAMu9B,CAAAA,CAAwB3hB,CAC5B,CAAA,IAAA,CAAK,MACLC,CACAC,CAAAA,CACF,CACA,CAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,IAAIge,EAAAA,CAAmByD,CAAqB,CAAC,EAC/D,CASA,UAAWtmB,CAAAA,CAAAA,CAAoB5T,EAAmC,CAChE,GAAI,IAAK,CAAA,OAAA,GAAY,QACnB,CAAA,MAAM,IAAIrD,CAAAA,CACR,+BACA,CAAA,sBAAA,CACA,IAAI,KAAA,CAAM,gDAAgD,CAC5D,EAGF,GAAI,IAAA,CAAK,OAAY,GAAA,aAAA,CACnB,MAAM,IAAIA,CACR,CAAA,+BAAA,CACA,2BACA,CAAA,IAAI,KAAM,CAAA,qDAAqD,CACjE,CAAA,CAGF,IAAMu9B,CACJl6B,CAAAA,CAAAA,EAAS,cACTsY,EAAAA,EAAAA,CAA+B,IAAK,CAAA,KAAA,CAAO1E,CAAU,CAAA,CAEvD,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,IAAI6iB,EAAmByD,CAAAA,CAAqB,CAAC,EAC/D,CAMA,cAAeC,CAAAA,CAAAA,CAAwB,CACrC,GAAI,IAAK,CAAA,OAAA,GAAY,QACnB,CAAA,MAAM,IAAIx9B,CAAAA,CACR,mCACA,CAAA,sBAAA,CACA,IAAI,KAAM,CAAA,gDAAgD,CAC5D,CAAA,CAGF,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,IAAI85B,EAAmB0D,CAAAA,CAAc,CAAC,EACxD,CASA,cAAA,CAAen4B,EAAgB,CAC7B,GAAI,IAAK,CAAA,OAAA,GAAY,QACnB,CAAA,MAAM,IAAIrF,CAAAA,CACR,mCACA,CAAA,sBAAA,CACA,IAAI,KAAA,CAAM,gDAAgD,CAC5D,EAGF,GAAI,IAAA,CAAK,OAAY,GAAA,UAAA,EAAc,CAACqF,CAAAA,CAClC,MAAM,IAAIrF,CACR,CAAA,mCAAA,CACA,yBACA,CAAA,IAAI,KAAM,CAAA,kCAAkC,CAC9C,CAGF,CAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,IAAIi6B,EAAAA,CAAmB50B,CAAK,CAAC,EAC/C,CACF,CC7ZA,CAAA,IAAqBo4B,EAArB,CAAA,KAA4B,CAI1B,WAAA,CAAYlvB,CAA6B,CAAA,CAGvC,GAFA,IAAA,CAAK,OAAWA,CAAAA,CAAAA,EAAWjM,CAAI,CAAA,OAAA,CAE3B,CAAC,IAAA,CAAK,OACR,CAAA,MAAM,IAAItC,CAAAA,CACR,sBACA,aACA,CAAA,IAAI,KAAM,CAAA,8CAA8C,CAC1D,CAAA,CAGF,IAAK,CAAA,eAAA,CAAkB,GACzB,CAYA,YAAA,CAAamC,CAAe,CAAA,CAC1B,OAAO,IAAIke,CAAAA,CAAQle,CAAK,CAC1B,CAKA,QAAA,CAASuC,CAAqB,CAAA,CAC5B,IAAK,CAAA,eAAA,CAAgB,IAAKA,CAAAA,CAAK,EACjC,CAMA,QAAQ6C,CAAwB,CAAA,CAC9B,GAAI,CAACvF,mBAAG,CAAA,UAAA,CAAWuF,CAAQ,CAAA,CACzB,MAAM,IAAIvH,CACR,CAAA,iBAAA,CACA,kCACF,CAAA,CAGF,IAAMmJ,CAAO1C,CAAAA,mBAAAA,CAAK,QAASc,CAAAA,CAAQ,CAC7Bm2B,CAAAA,CAAAA,CAAgBj3B,mBAAK,CAAA,OAAA,CAAQ0C,CAAI,CAAA,CACvC,GAAIu0B,CAAAA,GAAkB,MAAUA,EAAAA,CAAAA,GAAkB,OAChD,MAAM,IAAI19B,CAAc,CAAA,iBAAA,CAAmB,4BAA4B,CAAA,CAKzE,IAAM29B,CAAAA,CAFQ37B,mBAAG,CAAA,YAAA,CAAauF,CAAU,CAAA,OAAO,CAG5C,CAAA,KAAA,CAAM,GAAG,CACT,CAAA,GAAA,CAAK8X,CAASA,EAAAA,CAAAA,CAAK,IAAK,EAAC,CACzB,CAAA,MAAA,CAAQA,CAASA,EAAAA,CAAAA,CAAK,MAAS,CAAA,CAAA,EAAK,CAACA,CAAAA,CAAK,WAAW,IAAI,CAAC,CAE7D,CAAA,IAAA,IAAWue,CAAaD,IAAAA,CAAAA,CACtB,IAAK,CAAA,QAAA,CAASC,CAAS,EAE3B,CAMA,WAAA,CACEv4B,CACAq3B,CAAAA,CAAAA,CACAr5B,EACM,CACN,IAAMw6B,CAAe,CAAA,IAAIrB,EAAmB,CAAA,IAAA,CAAK,OAAS,CAAA,EAAIn3B,CAAAA,CAAK,CACnEq3B,CAAAA,CAAAA,CAAGmB,CAAY,CAAA,CAEf,IAAM5V,CAAQ4V,CAAAA,CAAAA,CAAa,QAAS,EAAA,CAC9Bjf,CAAY,CAAA,IAAItP,CACpB,CAAA,CACE,KAAOjK,CAAAA,CAAAA,CACP,sBAAwB,CAAA,UAAA,CACxB,mBAAqB,CAAA,UACvB,EACA,IAAK,CAAA,OACP,CAEMy4B,CAAAA,CAAAA,CAAkB,IAAItD,EAAAA,CAC1Bn1B,CACA4iB,CAAAA,CAAAA,CACA4V,CAAa,CAAA,mBAAA,EACbx6B,CAAAA,CAAAA,EAAS,WACX,CAAA,CAEM06B,EAAOnf,CAAU,CAAA,KAAA,CAAM,CAACkf,CAAe,CAAC,CAAA,CAAE,GAC1Cze,CAAAA,CAAAA,CAAO0e,CAAK,CAAA,UAAA,CAAW,cAAc,CAAA,CACvCA,CACA,CAAA,CAAA,aAAA,EAAgBA,CAAI,CACxB,CAAA,CAAA,IAAA,CAAK,QAAS1e,CAAAA,CAAI,EACpB,CAMA,UAAWha,CAAAA,CAAAA,CAAeq3B,CAA0C,CAAA,CAClE,IAAMzU,CAAAA,CAAqB,EAAC,CACtB2U,EAAU,IAAIH,EAAAA,CAAkBp3B,CAAO4iB,CAAAA,CAAAA,CAAO,IAAK,CAAA,OAAO,CAGhE,CAAA,GAFAyU,CAAGE,CAAAA,CAAO,CAEN,CAAA,CAAC3U,CAAM,CAAA,MAAA,CACT,OAGF,IAAMrJ,CAAAA,CAAY,IAAK,CAAA,mBAAA,CAAoB,CACzC,KAAA,CAAAvZ,CACA,CAAA,sBAAA,CAAwB,UACxB,CAAA,mBAAA,CAAqB,UACvB,CAAiB,CAEb2L,CAAAA,CAAAA,CAAqB,EACnBgtB,CAAAA,CAAAA,CAAa,IAAM,CACvB,GAAI,CAAChtB,CAAM,CAAA,MAAA,CACT,OAGF,IAAMitB,CAAY,CAAA,IAAItE,EAAet0B,CAAAA,CAAAA,CAAO2L,CAAK,CAC3C+sB,CAAAA,CAAAA,CAAOnf,CAAU,CAAA,KAAA,CAAM,CAACqf,CAAS,CAAC,CAAA,CAAE,GAC1C,CAAA,GAAI,CAACF,CAAAA,EAAQ,CAACA,CAAAA,CAAK,MACjB,CAAA,OAGF,IAAM1e,CAAAA,CAAO0e,CAAK,CAAA,UAAA,CAAW,aAAa,CAAA,CACtCA,CACA,CAAA,CAAA,YAAA,EAAeA,CAAI,CAAA,CAAA,CACvB,IAAK,CAAA,QAAA,CAAS1e,CAAI,CAClBrO,CAAAA,CAAAA,CAAQ,GACV,CAEA,CAAA,IAAA,IAAWmO,CAAS8I,IAAAA,CAAAA,CAEhB9I,CAAM,CAAA,IAAA,GAAS,gBACfnO,EAAAA,CAAAA,CAAM,MACLA,EAAAA,CAAAA,CAAM,CAAC,CAAU,CAAA,IAAA,GAAS,YAK3BgtB,EAAAA,CAAAA,EACAhtB,CAAAA,CAAAA,CAAM,IAAKmO,CAAAA,CAAK,CAGpB6e,CAAAA,CAAAA,GACF,CAKA,SAAU34B,CAAAA,CAAAA,CAAeqlB,EAAoB,KAAa,CAAA,CACxD,IAAMvb,CAAAA,CAAO,IAAIwrB,EAAAA,CAAct1B,CAAOqlB,CAAAA,CAAQ,CACxC9L,CAAAA,CAAAA,CAAY,IAAK,CAAA,mBAAA,CAAoB,CACzC,KAAA,CAAAvZ,EACA,sBAAwB,CAAA,UAAA,CACxB,mBAAqB,CAAA,UACvB,CAAiB,CAAA,CACjB,IAAK,CAAA,QAAA,CAASuZ,CAAU,CAAA,KAAA,CAAM,CAACzP,CAAI,CAAC,CAAA,CAAE,GAAG,EAC3C,CAMA,WAAY+uB,CAAAA,CAAAA,CAAkBC,CAAwB,CAAA,CACpD,IAAMhvB,CAAAA,CAAO,IAAIwqB,EAAAA,CAAeuE,CAAU,CAAA,CAAC,IAAIvtB,EAAAA,CAAgBwtB,CAAQ,CAAC,CAAC,CACnEvf,CAAAA,CAAAA,CAAY,IAAK,CAAA,mBAAA,CAAoB,CACzC,KAAA,CAAOsf,CACP,CAAA,sBAAA,CAAwB,UACxB,CAAA,mBAAA,CAAqB,UACvB,CAAiB,EAEjB,IAAK,CAAA,QAAA,CAAStf,CAAU,CAAA,KAAA,CAAM,CAACzP,CAAI,CAAC,CAAA,CAAE,GAAG,EAC3C,CAKA,aAAA,CAAc9J,CAAqB,CAAA,CACjC,IAAM8J,CAAO,CAAA,IAAIgsB,EAAa91B,CAAAA,CAAAA,CAAO,IAAI,CAAA,CACnCuZ,CAAY,CAAA,IAAA,CAAK,mBAAoB,CAAA,CACzC,KAAAvZ,CAAAA,CAAAA,CACA,sBAAwB,CAAA,UAAA,CACxB,oBAAqB,UACvB,CAAiB,CACjB,CAAA,IAAA,CAAK,QAASuZ,CAAAA,CAAAA,CAAU,KAAM,CAAA,CAACzP,CAAI,CAAC,CAAE,CAAA,GAAG,EAC3C,CAKA,YACE9J,CACAmF,CAAAA,CAAAA,CACAnH,CACM,CAAA,CACD,KAAM,CAAA,OAAA,CAAQmH,CAAO,CAAA,GACxBA,CAAU,CAAA,CAACA,CAAO,CAAA,CAAA,CAGpB,IAAMuwB,CAAAA,CACJ13B,EAAQ,cAAkBqY,EAAAA,EAAAA,CAAoBrW,CAAOmF,CAAAA,CAAAA,CAAQ,IAAK,CAAA,GAAG,CAAC,CAAA,CAClE2E,CAAO,CAAA,IAAI2rB,EAAgBz1B,CAAAA,CAAAA,CAAOmF,CAASuwB,CAAAA,CAAS,EACpDnc,CAAY,CAAA,IAAA,CAAK,mBAAoB,CAAA,CACzC,KAAAvZ,CAAAA,CAAAA,CACA,sBAAwB,CAAA,UAAA,CACxB,mBAAqB,CAAA,UACvB,CAAiB,CAAA,CACjB,IAAK,CAAA,QAAA,CAASuZ,EAAU,KAAM,CAAA,CAACzP,CAAI,CAAC,CAAE,CAAA,GAAG,EAC3C,CAMA,SAAU4rB,CAAAA,CAAAA,CAAmB11B,CAAsB,CAAA,CACjD,IAAM8J,CAAAA,CAAO,IAAI8rB,EAAcF,CAAAA,CAAAA,CAAW11B,CAAK,CAAA,CACzCuZ,CAAY,CAAA,IAAA,CAAK,mBAAoB,CAAA,CACzC,KAAAvZ,CAAAA,CAAAA,CACA,sBAAwB,CAAA,UAAA,CACxB,mBAAqB,CAAA,UACvB,CAAiB,CAAA,CACjB,IAAK,CAAA,QAAA,CAASuZ,CAAU,CAAA,KAAA,CAAM,CAACzP,CAAI,CAAC,CAAA,CAAE,GAAG,EAC3C,CAKA,aAAA,CAAc9J,CAAemF,CAAAA,CAAAA,CAAyB,CACpD,IAAM2E,CAAAA,CAAO,IAAIqqB,EAAAA,CAAkBhvB,CAAO,CAAA,CACpCoU,CAAY,CAAA,IAAA,CAAK,mBAAoB,CAAA,CACzC,KAAAvZ,CAAAA,CAAAA,CACA,sBAAwB,CAAA,UAAA,CACxB,oBAAqB,UACvB,CAAiB,CACjB,CAAA,IAAA,CAAK,QAASuZ,CAAAA,CAAAA,CAAU,KAAM,CAAA,CAACzP,CAAI,CAAC,CAAE,CAAA,GAAG,EAC3C,CAKA,UACE9J,CACAmF,CAAAA,CAAAA,CACAnH,CACM,CAAA,CACN,IAAMoe,CAAAA,CAAO,KAAM,CAAA,OAAA,CAAQjX,CAAO,CAAA,CAAIA,CAAU,CAAA,CAACA,CAAO,CAAA,CAClDgzB,EACJn6B,CAAS,EAAA,cAAA,EACTsY,EAA+BtW,CAAAA,CAAAA,CAAOoc,CAAK,CAAA,IAAA,CAAK,GAAG,CAAC,CAEhDhS,CAAAA,CAAAA,CAAa,IAAI6qB,CAAAA,CAAe,QAAU,CAAA,CAC9C,QAAS7Y,CACT,CAAA,cAAA,CAAA+b,CACF,CAAC,CAEKY,CAAAA,CAAAA,CAAY,IAAIzE,EAAAA,CAAet0B,CAAO,CAAA,CAC1C,IAAIk0B,EAAAA,CAAkB9pB,CAAU,CAClC,CAAC,CAEKmP,CAAAA,CAAAA,CAAY,IAAK,CAAA,mBAAA,CAAoB,CACzC,KAAA,CAAAvZ,CACA,CAAA,sBAAA,CAAwB,UACxB,CAAA,mBAAA,CAAqB,UACvB,CAAiB,CAEjB,CAAA,IAAA,CAAK,SAASuZ,CAAU,CAAA,KAAA,CAAM,CAACwf,CAAS,CAAC,CAAA,CAAE,GAAG,EAChD,CAMA,cAAA,CAAe/4B,CAAewW,CAAAA,CAAAA,CAAoBC,CAA2B,CAAA,CAC3E,IAAM0hB,CAAiB5hB,CAAAA,CAAAA,CACrBvW,CACAwW,CAAAA,CAAAA,CACAC,CACF,CAAA,CAEMuiB,CAAW,CAAA,IAAIvE,EAAmB0D,CAAAA,CAAc,CAChDY,CAAAA,CAAAA,CAAY,IAAIzE,EAAAA,CAAet0B,EAAO,CAACg5B,CAAQ,CAAC,CAAA,CAEhDzf,CAAY,CAAA,IAAA,CAAK,mBAAoB,CAAA,CACzC,KAAAvZ,CAAAA,CAAAA,CACA,sBAAwB,CAAA,UAAA,CACxB,mBAAqB,CAAA,UACvB,CAAiB,CAEjB,CAAA,IAAA,CAAK,QAASuZ,CAAAA,CAAAA,CAAU,KAAM,CAAA,CAACwf,CAAS,CAAC,CAAE,CAAA,GAAG,EAChD,CAMA,UACE/4B,CAAAA,CAAAA,CACAi5B,EACAj7B,CACM,CAAA,CACN,IAAMk7B,CAAAA,CAAe,KAAM,CAAA,OAAA,CAAQD,CAAuB,CAAA,CACtD3iB,EAA+BtW,CAAAA,CAAAA,CAAOi5B,CAAwB,CAAA,IAAA,CAAK,GAAG,CAAC,EACvE3iB,EAA+BtW,CAAAA,CAAAA,CAAOi5B,CAAuB,CAAA,CAE3Dd,CAAiBn6B,CAAAA,CAAAA,EAAS,cAAkBk7B,EAAAA,CAAAA,CAE5CF,CAAW,CAAA,IAAIvE,EAAmB0D,CAAAA,CAAc,CAChDY,CAAAA,CAAAA,CAAY,IAAIzE,EAAet0B,CAAAA,CAAAA,CAAO,CAACg5B,CAAQ,CAAC,CAAA,CAEhDzf,CAAY,CAAA,IAAA,CAAK,mBAAoB,CAAA,CACzC,KAAAvZ,CAAAA,CAAAA,CACA,sBAAwB,CAAA,UAAA,CACxB,oBAAqB,UACvB,CAAiB,CAEjB,CAAA,IAAA,CAAK,QAASuZ,CAAAA,CAAAA,CAAU,KAAM,CAAA,CAACwf,CAAS,CAAC,CAAE,CAAA,GAAG,EAChD,CAKA,eAAe/4B,CAAqB,CAAA,CAClC,IAAM8J,CAAAA,CAAO,IAAI8qB,EAAAA,CACXrb,CAAY,CAAA,IAAA,CAAK,mBAAoB,CAAA,CACzC,KAAAvZ,CAAAA,CAAAA,CACA,sBAAwB,CAAA,UAAA,CACxB,mBAAqB,CAAA,UACvB,CAAiB,CAAA,CACjB,IAAK,CAAA,QAAA,CAASuZ,CAAU,CAAA,KAAA,CAAM,CAACzP,CAAI,CAAC,CAAA,CAAE,GAAG,EAC3C,CAKA,aAAA,CACE9J,KACGhC,CACG,CAAA,CACN,IAAMoM,CAAAA,CAAa,IAAI6qB,CAAAA,CAAe,GAAGj3B,CAAO,CAE1C+6B,CAAAA,CAAAA,CAAY,IAAIzE,EAAAA,CAAet0B,CAAO,CAAA,CAC1C,IAAIk0B,EAAkB9pB,CAAAA,CAAU,CAClC,CAAC,CAEKmP,CAAAA,CAAAA,CAAY,IAAK,CAAA,mBAAA,CAAoB,CACzC,KAAA,CAAAvZ,CACA,CAAA,sBAAA,CAAwB,UACxB,CAAA,mBAAA,CAAqB,UACvB,CAAiB,CAAA,CACjB,IAAK,CAAA,QAAA,CAASuZ,CAAU,CAAA,KAAA,CAAM,CAACwf,CAAS,CAAC,CAAA,CAAE,GAAG,EAChD,CAKA,cAAA,CAAe/4B,EAAem4B,CAA8B,CAAA,CAC1D,IAAMruB,CAAAA,CAAO,IAAI2qB,EAAAA,CAAmB0D,CAAc,CAAA,CAC5C5e,CAAY,CAAA,IAAA,CAAK,mBAAoB,CAAA,CACzC,KAAAvZ,CAAAA,CAAAA,CACA,uBAAwB,UACxB,CAAA,mBAAA,CAAqB,UACvB,CAAiB,CACjB,CAAA,IAAA,CAAK,QAASuZ,CAAAA,CAAAA,CAAU,KAAM,CAAA,CAACzP,CAAI,CAAC,CAAE,CAAA,GAAG,EAC3C,CAeA,eAAA,CACE0rB,CACAH,CAAAA,CAAAA,CAAuB,IACjB,CAAA,CACN,IAAMvrB,CAAAA,CAAO,IAAIyrB,EAAAA,CAAoBC,CAAeH,CAAAA,CAAW,CACzD9b,CAAAA,CAAAA,CAAY,KAAK,mBAAoB,CAAA,CACzC,KAAO,CAAA,EAAA,CACP,sBAAwB,CAAA,UAAA,CACxB,mBAAqB,CAAA,UACvB,CAAiB,CAAA,CACjB,IAAK,CAAA,QAAA,CAASA,CAAU,CAAA,KAAA,CAAM,CAACzP,CAAI,CAAC,CAAE,CAAA,GAAG,EAC3C,CAEQ,mBAAoB7E,CAAAA,CAAAA,CAAgC,CAC1D,OAAO,IAAIgF,CAAAA,CAAUhF,CAAO,CAAA,IAAA,CAAK,OAAO,CAC1C,CACF,CC1bA,CCUO,IAAMk0B,EAAN,CAAA,KAAwB,CAI7B,WAAA,CAAY/4B,CAAoB,CAAA,CAC9B,KAAK,GAAMA,CAAAA,CAAAA,CACX,IAAK,CAAA,MAAA,CAAS,MAAO,CAAA,MAAA,CAAO,IAAK,CAAA,GAAA,CAAI,MAAM,EAC7C,CAKA,qBAAA,CAAsBg5B,CAAgC,CAAA,CACpD,IAAMC,CAAc,CAAA,IAAI,GAClBt5B,CAAAA,CAAAA,CAAS,IAAI,GAAA,CACby3B,CAAc,CAAA,IAAI,GAGxB,CAAA,IAAA,IAAW1kB,CAAYsmB,IAAAA,CAAAA,CAAQ,eAAmB,EAAA,GAAI,CACpD,IAAME,CAAO,CAAA,CAAA,EAAGxmB,CAAS,CAAA,KAAK,CAAIA,CAAAA,EAAAA,CAAAA,CAAS,QAAS,CAAA,IAAI,CAClDymB,CAAAA,CAAAA,CAAAA,CAAyB,EAAC,CAQhC,GALIzmB,CAAS,CAAA,QAAA,CAAS,eACpBymB,EAAAA,CAAAA,CAAa,IAAK,CAAA,CAAA,MAAA,EAASzmB,CAAS,CAAA,QAAA,CAAS,eAAe,CAAA,CAAE,CAI5DA,CAAAA,CAAAA,CAAS,QAAS,CAAA,iBAAA,CACpB,QAAWlD,CAAOkD,IAAAA,CAAAA,CAAS,QAAS,CAAA,iBAAA,CAClCymB,CAAa,CAAA,IAAA,CACX,CAAUzmB,OAAAA,EAAAA,CAAAA,CAAS,QAAS,CAAA,eAAe,CAAIlD,CAAAA,EAAAA,CAAG,CACpD,CAAA,CAAA,CAIJypB,EAAY,GAAIC,CAAAA,CAAAA,CAAMC,CAAY,EACpC,CAGA,IAAA,IAAWv5B,CAASo5B,IAAAA,CAAAA,CAAQ,YAAgB,EAAA,EAAI,CAAA,CAC9C,IAAMI,CAAAA,CAAU,CAASx5B,MAAAA,EAAAA,CAAAA,CAAM,KAAK,CAAA,CAAA,CAC9Bu5B,CAAyB,CAAA,EAG/B,CAAA,IAAA,IAAWt0B,CAAS,IAAA,IAAA,CAAK,MAAQ,CAAA,CAC/B,IAAMgT,CAAAA,CAAYhT,CAAM,CAAA,YAAA,GACxB,IAAW6N,IAAAA,CAAAA,IAAYmF,CACjBnF,CAAAA,CAAAA,CAAS,IAAS,GAAA,WAAA,EACCA,CAAS,CAAA,KAAA,EACb,CAAA,KAAA,GAAU9S,CAAM,CAAA,KAAA,EAC/Bu5B,CAAa,CAAA,IAAA,CAAK,MAAMt0B,CAAM,CAAA,KAAK,CAAI6N,CAAAA,EAAAA,CAAAA,CAAS,cAAc,CAAA,CAAE,EAIxE,CAEA/S,CAAO,CAAA,GAAA,CAAIy5B,CAASD,CAAAA,CAAY,EAClC,CAGA,QAAWl0B,CAAU+zB,IAAAA,CAAAA,CAAQ,aAAiB,EAAA,EAAI,CAAA,CAChD,IAAMK,CAAAA,CAAW,CAAUp0B,OAAAA,EAAAA,CAAAA,CAAO,KAAK,CAAA,CAAA,EAAIA,CAAO,CAAA,MAAM,GAClDk0B,CAAyB,CAAA,EAGzBt0B,CAAAA,CAAAA,CAAQ,IAAK,CAAA,MAAA,CAAO,IAAMy0B,CAAAA,CAAAA,EAAMA,CAAE,CAAA,KAAA,GAAUr0B,CAAO,CAAA,KAAK,CAC9D,CAAA,GAAIJ,EAAO,CACT,IAAM8L,CAAc9L,CAAAA,CAAAA,CACjB,UAAW,EAAA,CACX,IAAMK,CAAAA,CAAAA,EAAMA,CAAE,CAAA,YAAA,GAAiBD,CAAO,CAAA,MAAM,CAC/C,CAAA,GAAI0L,EAAa,CAEXA,CAAAA,CAAY,SACdwoB,EAAAA,CAAAA,CAAa,IAAK,CAAA,CAAA,GAAA,EAAMl0B,CAAO,CAAA,KAAK,CAAE,CAAA,CAAA,CAIxC,IAAM4S,CAAAA,CAAYhT,CAAM,CAAA,YAAA,GACxB,IAAW6N,IAAAA,CAAAA,IAAYmF,CACjBnF,CAAAA,CAAAA,CAAS,UAAe/B,GAAAA,CAAAA,CAAY,UACtCwoB,EAAAA,CAAAA,CAAa,IACX,CAAA,CAAA,GAAA,EAAMl0B,CAAO,CAAA,KAAK,CAAIyN,CAAAA,EAAAA,CAAAA,CAAS,cAAc,CAC/C,CAAA,EAGN,CACF,CAEA0kB,CAAY,CAAA,GAAA,CAAIiC,CAAUF,CAAAA,CAAY,EACxC,CAEA,OAAO,CAAE,WAAAF,CAAAA,CAAAA,CAAa,OAAAt5B,CAAQ,CAAA,WAAA,CAAAy3B,CAAY,CAC5C,CAKA,sBAAA,CACEmC,CACAC,CAAAA,CAAAA,CACU,CACV,IAAMC,CAAU,CAAA,IAAI,GACdC,CAAAA,CAAAA,CAAO,IAAI,GACXl6B,CAAAA,CAAAA,CAAmB,EAAC,CAEpBm6B,CAASC,CAAAA,CAAAA,EAAiB,CAC9B,GAAIF,CAAK,CAAA,GAAA,CAAIE,CAAI,CAAA,CACf,MAAM,IAAI,MAAM,CAAiCA,8BAAAA,EAAAA,CAAI,CAAE,CAAA,CAAA,CAGzD,GAAIH,CAAAA,CAAQ,GAAIG,CAAAA,CAAI,CAClB,CAAA,OAGFF,CAAK,CAAA,GAAA,CAAIE,CAAI,CAAA,CACb,IAAMT,CAAeK,CAAAA,CAAAA,CAAgBI,CAAI,CAAA,CACzC,IAAWC,IAAAA,CAAAA,IAAOV,CAChBQ,CAAAA,CAAAA,CAAME,CAAG,CAAA,CAEXH,CAAK,CAAA,MAAA,CAAOE,CAAI,CAAA,CAChBH,EAAQ,GAAIG,CAAAA,CAAI,CAChBp6B,CAAAA,CAAAA,CAAO,IAAKo6B,CAAAA,CAAI,EAClB,CAAA,CAEA,IAAWA,IAAAA,CAAAA,IAAQL,CAAM,CAAA,IAAA,EAClBE,CAAAA,CAAAA,CAAQ,IAAIG,CAAI,CAAA,EACnBD,CAAMC,CAAAA,CAAI,CAId,CAAA,OAAOp6B,CACT,CAKA,sBAAuBw5B,CAAAA,CAAAA,CAAoC,CACzD,IAAMc,CAAW,CAAA,IAAA,CAAK,sBAAsBd,CAAO,CAAA,CAC7Ce,CAAmC,CAAA,EAGnCC,CAAAA,CAAAA,CAAY,IAAK,CAAA,sBAAA,CACrBF,CAAS,CAAA,WAAA,CACRn5B,CAAOm5B,EAAAA,CAAAA,CAAS,WAAY,CAAA,GAAA,CAAIn5B,CAAE,CAAK,EAAA,EAC1C,CAAA,CAGA,IAAWu4B,IAAAA,CAAAA,IAAQc,CAAW,CAAA,CAC5B,GAAM,CAACp6B,CAAOm4B,CAAAA,CAAc,CAAImB,CAAAA,CAAAA,CAAK,MAAM,GAAG,CAAA,CACxCxmB,CAAWsmB,CAAAA,CAAAA,CAAQ,eAAiB,EAAA,IAAA,CACvChmB,CAAWA,EAAAA,CAAAA,CAAE,KAAUpT,GAAAA,CAAAA,EAASoT,CAAE,CAAA,QAAA,CAAS,IAAS+kB,GAAAA,CACvD,EAEIrlB,CACFqnB,EAAAA,CAAAA,CAAW,IAAK,CAAA,CACd,IACA,CAAA,kBAAA,CAAA,KAAA,CAAA,wBAAA,CACA,KAAAn6B,CAAAA,CAAAA,CACA,UAAYm4B,CAAAA,CAAAA,CACZ,IAAMrlB,CAAAA,CAAAA,CACN,YAAconB,CAAAA,CAAAA,CAAS,YAAY,GAAIZ,CAAAA,CAAI,CAAK,EAAA,EAChD,CAAA,aAAA,CAAe,IAAK,CAAA,yBAAA,CAA0BxmB,CAAQ,CACxD,CAAC,EAEL,CAGA,IAAMunB,EAAe,IAAK,CAAA,sBAAA,CACxBH,CAAS,CAAA,MAAA,CACRl6B,CAAUk6B,EAAAA,CAAAA,CAAS,MAAO,CAAA,GAAA,CAAIl6B,CAAK,CAAA,EAAK,EAC3C,CAGA,CAAA,IAAA,IAAWqF,KAAU+zB,CAAQ,CAAA,aAAA,EAAiB,EAAC,CAAG,CAChD,IAAMK,CAAW,CAAA,CAAA,OAAA,EAAUp0B,CAAO,CAAA,KAAK,CAAIA,CAAAA,EAAAA,CAAAA,CAAO,MAAM,CAAA,CAAA,CAClDk0B,EAAeW,CAAS,CAAA,WAAA,CAAY,GAAIT,CAAAA,CAAQ,CAAK,EAAA,EAE3D,CAAA,IAAA,IAAWrvB,CAAcmvB,IAAAA,CAAAA,CACnBnvB,CAAW,CAAA,UAAA,CAAW,KAAK,CAAA,CAC7B+vB,EAAW,IAAK,CAAA,CACd,IACA,CAAA,iBAAA,CAAA,KAAA,CAAA,wBAAA,CACA,KAAO90B,CAAAA,CAAAA,CAAO,KACd,CAAA,UAAA,CAAY,aACZ,CAAA,IAAA,CAAM,CAAE,IAAA,CAAM,aAAe,CAAA,KAAA,CAAOA,EAAO,KAAM,CAAA,CACjD,YAAc,CAAA,CAACo0B,CAAQ,CAAA,CACvB,aAAe,CAAA,IAAA,CAAK,yBAA0Bp0B,CAAAA,CAAAA,CAAO,KAAK,CAC5D,CAAC,CAAA,CACQ+E,EAAW,UAAW,CAAA,SAAS,CACxC+vB,EAAAA,CAAAA,CAAW,IAAK,CAAA,CACd,IACA,CAAA,iBAAA,CAAA,KAAA,CAAA,wBAAA,CACA,KAAO90B,CAAAA,CAAAA,CAAO,KACd,CAAA,UAAA,CAAY,CAAUA,OAAAA,EAAAA,CAAAA,CAAO,MAAM,CACnC,CAAA,CAAA,IAAA,CAAM,CACJ,IAAA,CAAM,QACN,CAAA,KAAA,CAAOA,CAAO,CAAA,KAAA,CACd,MAAQA,CAAAA,CAAAA,CAAO,MACjB,CAAA,CACA,YAAc,CAAA,CAACo0B,CAAQ,CACvB,CAAA,aAAA,CAAe,IAAK,CAAA,+BAAA,CAClBp0B,CAAO,CAAA,KAAA,CACPA,CAAO,CAAA,MACT,CACF,CAAC,EAGP,CAGA,IAAWA,IAAAA,CAAAA,IAAU+zB,EAAQ,aAAiB,EAAA,EAC5Ce,CAAAA,CAAAA,CAAW,IAAK,CAAA,CACd,IACA,CAAA,aAAA,CAAA,KAAA,CAAA,wBAAA,CACA,KAAO90B,CAAAA,CAAAA,CAAO,KACd,CAAA,MAAA,CAAQA,CAAO,CAAA,MAAA,CACf,KAAMA,CACN,CAAA,YAAA,CAAc,EAAC,CACf,aAAe,CAAA,IAAA,CAAK,qBAAsBA,CAAAA,CAAM,CAClD,CAAC,CAIH,CAAA,IAAA,IAAWm0B,CAAWa,IAAAA,CAAAA,CAAc,CAClC,IAAM3gB,CAAAA,CAAY8f,CAAQ,CAAA,OAAA,CAAQ,QAAU,CAAA,EAAE,CACxCx5B,CAAAA,CAAAA,CAAQo5B,CAAQ,CAAA,YAAA,EAAc,IACjCkB,CAAAA,CAAAA,EAAWA,CAAE,CAAA,KAAA,GAAU5gB,CAC1B,CAEI1Z,CAAAA,CAAAA,EACFm6B,CAAW,CAAA,IAAA,CAAK,CACd,IAAA,CAAA,YAAA,CACA,KACA,CAAA,wBAAA,CAAA,KAAA,CAAOzgB,CACP,CAAA,IAAA,CAAM1Z,CACN,CAAA,YAAA,CAAck6B,CAAS,CAAA,MAAA,CAAO,GAAIV,CAAAA,CAAO,CAAK,EAAA,EAC9C,CAAA,aAAA,CAAe,IAAK,CAAA,oBAAA,CAAqBx5B,CAAK,CAChD,CAAC,EAEL,CAEA,OAAOm6B,CACT,CAKA,wBAAwBf,CAAqC,CAAA,CAC3D,IAAMmB,CAAAA,CAAS,IAAI,GAAA,CAEnB,IAAWl1B,IAAAA,CAAAA,IAAU+zB,CAAQ,CAAA,aAAA,EAAiB,EAAC,CAAG,CAChD,IAAMoB,EAAgC,EAAC,CACjCv1B,CAAQ,CAAA,IAAA,CAAK,MAAO,CAAA,IAAA,CAAMy0B,CAAMA,EAAAA,CAAAA,CAAE,KAAUr0B,GAAAA,CAAAA,CAAO,KAAK,CAAA,CAE9D,GAAIJ,CAAAA,CAAO,CACT,IAAM8L,CAAAA,CAAc9L,CACjB,CAAA,UAAA,EACA,CAAA,IAAA,CAAMK,CAAMA,EAAAA,CAAAA,CAAE,YAAiBD,GAAAA,CAAAA,CAAO,MAAM,CAAA,CAC/C,GAAI0L,CAAAA,CAAa,CAEXA,CAAY,CAAA,SAAA,EACdypB,CAAoB,CAAA,IAAA,CAAK,CAAkBn1B,eAAAA,EAAAA,CAAAA,CAAO,KAAK,CAAA,CAAE,CAI3D,CAAA,IAAM4S,CAAYhT,CAAAA,CAAAA,CAAM,YAAa,EAAA,CACrC,QAAW6N,CAAYmF,IAAAA,CAAAA,CACjBnF,CAAS,CAAA,UAAA,GAAe/B,CAAY,CAAA,UAAA,EACtCypB,CAAoB,CAAA,IAAA,CAClB,CAAe1nB,YAAAA,EAAAA,CAAAA,CAAS,cAAc,CAAA,IAAA,EAAOzN,CAAO,CAAA,KAAK,EAC3D,EAGN,CACF,CAEAk1B,CAAAA,CAAO,GAAI,CAAA,CAAA,EAAGl1B,CAAO,CAAA,KAAK,CAAIA,CAAAA,EAAAA,CAAAA,CAAO,MAAM,CAAA,CAAA,CAAIm1B,CAAmB,EACpE,CAEA,OAAOD,CACT,CAKA,qBAAA,CAAsBnB,CAAqB,CAAA,CACzC,IAAMqB,CAAAA,CAAkB,EAAC,CAGzB,IAAWp1B,IAAAA,CAAAA,IAAU+zB,CAAQ,CAAA,eAAA,EAAmB,EAAI,CAAA,CAClD,IAAMn0B,CAAAA,CAAQ,IAAK,CAAA,MAAA,CAAO,IAAMy0B,CAAAA,CAAAA,EAAMA,CAAE,CAAA,KAAA,GAAUr0B,CAAO,CAAA,KAAK,CAC1DJ,CAAAA,CAAAA,EACkBA,EACjB,UAAW,EAAA,CACX,IAAMK,CAAAA,CAAAA,EAAMA,CAAE,CAAA,YAAA,GAAiBD,CAAO,CAAA,SAAA,CAAU,IAAI,CAAA,EAExB,IAAK,CAAA,oBAAA,CAChCA,CAAO,CAAA,SAAA,CACPA,EAAO,WACT,CAAA,EAEEo1B,CAAS,CAAA,IAAA,CAAK,CACZ,IAAA,CAAM,sCACN,CAAA,KAAA,CAAOp1B,CAAO,CAAA,KAAA,CACd,MAAQA,CAAAA,CAAAA,CAAO,SAAU,CAAA,IAAA,CACzB,YAAa,CAAUA,OAAAA,EAAAA,CAAAA,CAAO,SAAU,CAAA,IAAI,CAC9C,4CAAA,CAAA,CAAC,EAIT,CAGA,IAAWq1B,IAAAA,CAAAA,IAAMtB,CAAQ,CAAA,mBAAA,EAAuB,EAAC,CAC/CqB,EAAS,IAAK,CAAA,CACZ,IAAM,CAAA,0BAAA,CACN,KAAOC,CAAAA,CAAAA,CAAG,KACV,CAAA,WAAA,CAAa,CAA+BA,4BAAAA,EAAAA,CAAAA,CAAG,KAAK,CAAA,uBAAA,CACtD,CAAC,CAAA,CAGH,OAAOD,CACT,CAEQ,oBAAqBE,CAAAA,CAAAA,CAAe5pB,CAA2B,CAAA,CAYrE,OAVI4pB,CAAAA,CAAS,UAAe,GAAA,CAAC5pB,CAAY,CAAA,WAAA,EAAa,QAKlD4pB,EAAAA,CAAAA,CAAS,WAAa,CAAC,CAAC5pB,CAAY,CAAA,WAAA,EAAa,MAKjD4pB,EAAAA,CAAAA,CAAS,YAAiB5pB,GAAAA,CAAAA,CAAY,WAAa,EAAA,OAKzD,CAEQ,yBAAA,CAA0B+B,CAAyB,CAAA,CACzD,OAAI,IAAK,CAAA,GAAA,CAAI,SAAU,EAAA,GAAM,QACpB,CAAA,EAEJA,CAAAA,CAAAA,CAAS,QAAS,CAAA,IAAA,CAGhB,IAAK,CAAA,GAAA,CAAI,UAAWA,CAAAA,CAAAA,CAAS,KAAQwnB,CAAAA,CAAAA,EAAM,CAChDA,CAAAA,CAAE,cAAexnB,CAAAA,CAAAA,CAAS,QAAS,CAAA,IAAI,EACzC,CAAC,CAJQ,CAAA,EAKX,CAEQ,yBAA0B9S,CAAAA,CAAAA,CAAyB,CACzD,OAAI,IAAA,CAAK,GAAI,CAAA,SAAA,EAAgB,GAAA,QAAA,CACpB,EAAC,CAEH,IAAK,CAAA,GAAA,CAAI,UAAWA,CAAAA,CAAAA,CAAQs6B,CAAM,EAAA,CACvCA,EAAE,cAAe,GACnB,CAAC,CACH,CAEQ,+BAAA,CACNt6B,CACAqF,CAAAA,CAAAA,CACU,CACV,OAAI,IAAK,CAAA,GAAA,CAAI,SAAU,EAAA,GAAM,SACpB,EAAC,CAEH,IAAK,CAAA,GAAA,CAAI,UAAWrF,CAAAA,CAAAA,CAAQs6B,CAAM,EAAA,CACvCA,CAAE,CAAA,cAAA,CAAe,CAAUj1B,OAAAA,EAAAA,CAAM,CAAE,CAAA,EACrC,CAAC,CACH,CAEQ,qBAAsBA,CAAAA,CAAAA,CAAuB,CACnD,OAAO,IAAK,CAAA,GAAA,CAAI,UAAWA,CAAAA,CAAAA,CAAO,KAAQi1B,CAAAA,CAAAA,EAAM,CAC9CA,CAAAA,CAAE,WAAWj1B,CAAO,CAAA,MAAM,EAC5B,CAAC,CACH,CAEQ,oBAAqBrF,CAAAA,CAAAA,CAAsB,CACjD,OAAO,CAAC,CAAA,WAAA,EAAcA,CAAM,CAAA,KAAK,EAAE,CACrC,CACF,CDnXO,CAAA,IAAM46B,EAAN,CAAA,KAAkC,CAKvC,WAAA,CAAYx6B,CAAoB,CAAA,CAC9B,IAAK,CAAA,GAAA,CAAMA,CACX,CAAA,IAAA,CAAK,OAAS,MAAO,CAAA,MAAA,CAAO,IAAK,CAAA,GAAA,CAAI,MAAM,CAAA,CAC3C,IAAK,CAAA,YAAA,CAAe,IAAI+4B,EAAAA,CAAkB/4B,CAAG,EAC/C,CAKA,kBAAA,CACEg5B,EACsB,CACtB,IAAMe,CAAmC,CAAA,EAGzCA,CAAAA,CAAAA,CAAW,IAAK,CAAA,GAAG,IAAK,CAAA,mCAAA,CAAoCf,CAAO,CAAC,CAGpEe,CAAAA,CAAAA,CAAW,KAAK,GAAG,IAAA,CAAK,oCAAqCf,CAAAA,CAAO,CAAC,CAAA,CAGrEe,CAAW,CAAA,IAAA,CAAK,GAAG,IAAA,CAAK,6BAA8Bf,CAAAA,CAAO,CAAC,CAAA,CAG9De,EAAW,IAAK,CAAA,GAAG,IAAK,CAAA,oCAAA,CAAqCf,CAAO,CAAC,CAErE,CAAA,IAAMyB,CAASC,CAAAA,CAAAA,EACbA,CAAG,CAAA,KAAA,EAASA,CAAG,CAAA,UAAA,CAAa,GAAGA,CAAG,CAAA,KAAK,CAAKA,EAAAA,EAAAA,CAAAA,CAAG,UAAU,CAAA,CAAA,CAAK,MAC1DC,CAAAA,CAAAA,CAAS,IAAI,GAAA,CACjBZ,CACG,CAAA,MAAA,CAAQa,CAAMA,EAAAA,CAAAA,CAAE,OAAS,iBAA6B,CAAA,CACtD,GAAKA,CAAAA,CAAAA,EAAMH,CAAMG,CAAAA,CAAC,CAAC,CAAA,CACnB,MAAO,CAAA,OAAO,CACnB,CAAA,CACMC,CAAU,CAAA,IAAI,IAClBd,CACG,CAAA,MAAA,CAAQa,CAAMA,EAAAA,CAAAA,CAAE,IAAS,GAAA,kBAA8B,CACvD,CAAA,GAAA,CAAKA,CAAMH,EAAAA,CAAAA,CAAMG,CAAC,CAAC,CACnB,CAAA,MAAA,CAAO,OAAO,CACnB,CAAA,CACME,CAAQ,CAAA,IAAI,GAAY,CAAA,CAAC,GAAGH,CAAM,CAAE,CAAA,MAAA,CAAQI,CAAMF,EAAAA,CAAAA,CAAQ,GAAIE,CAAAA,CAAC,CAAC,CAAC,CAAA,CAgBvE,OAfiBhB,CAAAA,CAAW,MAAQa,CAAAA,CAAAA,EAAM,CACxC,IAAMn+B,CAAMg+B,CAAAA,CAAAA,CAAMG,CAAC,CAAA,CACnB,OAAKn+B,CAAAA,CAIH,EAAAq+B,CAAAA,CAAM,GAAIr+B,CAAAA,CAAG,CACZm+B,GAAAA,CAAAA,CAAE,IAAS,GAAA,iBAAA,EACVA,CAAE,CAAA,IAAA,GAAS,kBALN,CAAA,CAAA,CAAA,IAUX,CAAC,CAGH,CAKQ,mCAAA,CACN5B,EACsB,CACtB,IAAMe,CAAmC,CAAA,EAGzC,CAAA,IAAA,IAAWn6B,CAASo5B,IAAAA,CAAAA,CAAQ,WAAa,CAAA,CACvC,IAAMgC,CAAAA,CAAiB,IAAK,CAAA,GAAA,CAAI,YAAYp7B,CAAM,CAAA,KAAA,CAAQu3B,CAAY,EAAA,CACpE,IAAWlyB,IAAAA,CAAAA,IAAUrF,CAAM,CAAA,OAAA,CAAS,CAClC,GAAI,KAAM,CAAA,OAAA,CAAQqF,CAAO,CAAA,IAAI,EAAG,CAC9BkyB,CAAAA,CAAQ,IAAKlyB,CAAAA,CAAAA,CAAO,YAAcA,CAAAA,CAAAA,CAAO,IAAI,CAAA,CAC7C,QACF,CAEAA,CAAO,CAAA,IAAA,EACL,IAAK,CAAA,oBAAA,CACHrF,EAAM,KACNu3B,CAAAA,CAAAA,CACAlyB,CACA,CAAA,CACEA,CAAO,CAAA,YAAA,CACPA,CAAO,CAAA,MAAA,CACPA,CAAO,CAAA,SAAA,EAAa,CAACA,CAAAA,CAAO,YACxBA,CAAAA,CAAAA,CAAO,UACP,MACJA,CAAAA,CAAAA,CAAO,KACPA,CAAAA,CAAAA,CAAO,YACH,CAAA,CACE,YAAcA,CAAAA,CAAAA,CAAO,YACrB,CAAA,SAAA,CAAWA,CAAO,CAAA,SACpB,CACA,CAAA,MACN,EAAE,MAAO,CAAA,OAAO,CAChB,CAAA,IACF,EACJ,CACF,CAAC,CAAA,CAED80B,CAAW,CAAA,IAAA,CAAK,CACd,IAAA,CAAA,cAAA,CACA,KACA,CAAA,oBAAA,CAAA,KAAA,CAAOn6B,EAAM,KACb,CAAA,IAAA,CAAMA,CACN,CAAA,YAAA,CAAc,EAAC,CACf,aAAe,CAAA,CAACo7B,CAAc,CAChC,CAAC,EACH,CAGA,IAAA,IAAW/1B,KAAU+zB,CAAQ,CAAA,YAAA,CAAc,CACzC,IAAMiC,CAAe,CAAA,IAAA,CAAK,yBAA0Bh2B,CAAAA,CAAM,CAC1D80B,CAAAA,CAAAA,CAAW,IAAK,CAAA,CACd,IACA,CAAA,YAAA,CAAA,KAAA,CAAA,oBAAA,CACA,MAAO90B,CAAO,CAAA,KAAA,CACd,MAAQA,CAAAA,CAAAA,CAAO,MAAO,CAAA,YAAA,CACtB,IAAMA,CAAAA,CAAAA,CACN,YAAc,CAAA,CAAC,CAASA,MAAAA,EAAAA,CAAAA,CAAO,KAAK,CAAA,CAAE,EACtC,aAAeg2B,CAAAA,CACjB,CAAC,EACH,CAEA,OAAOlB,CACT,CAKQ,oCACNf,CAAAA,CAAAA,CACsB,CACtB,IAAMe,CAAmC,CAAA,GAGzC,IAAWmB,IAAAA,CAAAA,IAAMlC,CAAQ,CAAA,aAAA,EAAiB,EAAC,CAAG,CAC5C,IAAMmC,CAAU,CAAA,IAAA,CAAK,GAAI,CAAA,UAAA,CAAWD,CAAG,CAAA,KAAA,CAAQhB,GAAM,CACnDA,CAAAA,CAAE,cAAegB,CAAAA,CAAAA,CAAG,IAAI,EAC1B,CAAC,CAAA,CACDnB,CAAW,CAAA,IAAA,CAAK,CACd,IAAA,CAAA,iBAAA,CACA,KACA,CAAA,qBAAA,CAAA,KAAA,CAAOmB,EAAG,KACV,CAAA,UAAA,CAAYA,CAAG,CAAA,IAAA,CACf,IAAMA,CAAAA,CAAAA,CACN,YAAc,CAAA,CAAC,CAASA,MAAAA,EAAAA,CAAAA,CAAG,KAAK,CAAA,CAAE,CAClC,CAAA,aAAA,CAAeC,CACjB,CAAC,EACH,CAGA,IAAMC,CAAc,CAAA,IAAI,GACrBpC,CAAAA,CAAAA,CAAAA,CAAQ,aAAiB,EAAA,EAAI,EAAA,GAAA,CAAKqC,CAAMA,EAAAA,CAAAA,CAAE,IAAI,CACjD,CAAA,CACA,IAAWjd,IAAAA,CAAAA,IAAO4a,CAAQ,CAAA,aAAA,CAAe,CACvC,GAAIoC,CAAY,CAAA,GAAA,CAAIhd,CAAI,CAAA,KAAK,CAC3B,CAAA,SAGF,IAAMkd,CAAS,CAAA,IAAItD,EAAO,CAAA,IAAA,CAAK,GAAI,CAAA,SAAA,EAAW,CAAA,CAC9CsD,CAAO,CAAA,SAAA,CAAUld,CAAI,CAAA,KAAA,CAAOA,CAAI,CAAA,KAAK,EACrC,IAAMmd,CAAAA,CAAeD,CAAO,CAAA,eAAA,CAAgB,CAAC,CAAA,CAC7CvB,CAAW,CAAA,IAAA,CAAK,CACd,IAAA,CAAA,YAAA,CACA,KACA,CAAA,qBAAA,CAAA,KAAA,CAAO3b,CAAI,CAAA,KAAA,CACX,MAAOA,CAAI,CAAA,KAAA,CACX,IAAMA,CAAAA,CAAAA,CACN,YAAc,CAAA,CAAC,CAASA,MAAAA,EAAAA,CAAAA,CAAI,KAAK,CAAA,CAAE,CACnC,CAAA,aAAA,CAAe,CAACmd,CAAY,CAC9B,CAAC,EACH,CAGA,IAAA,IAAWr1B,CAAc8yB,IAAAA,CAAAA,CAAQ,gBAAkB,CAAA,CAKjD,IAAMjB,CAAAA,CAJQ,IAAK,CAAA,MAAA,CAAO,IAAMuB,CAAAA,CAAAA,EAAMA,EAAE,KAAUpzB,GAAAA,CAAAA,CAAW,KAAK,CAAA,EAE9D,UAAW,EAAA,CACZ,IAAMsJ,CAAAA,CAAAA,EAAQA,CAAI,CAAA,UAAA,GAAetJ,CAAW,CAAA,OAAA,CAAQ,CAAC,CAAC,GAEhC,wBACvBoQ,EAAAA,EAAAA,CACEpQ,CAAW,CAAA,KAAA,CACXA,CAAW,CAAA,OAAA,CAAQ,CAAC,CACtB,CAEIs1B,CAAAA,CAAAA,CAAmB,IAAK,CAAA,GAAA,CAAI,UAAWt1B,CAAAA,CAAAA,CAAW,MAAQg0B,CAAM,EAAA,CACpE,IAAMuB,CAAAA,CACJ1D,CACAzhB,EAAAA,EAAAA,CACEpQ,CAAW,CAAA,KAAA,CACXA,CAAW,CAAA,OAAA,CAAQ,CAAC,CACtB,CACFg0B,CAAAA,CAAAA,CAAE,cAAc,aAAe,CAAA,CAC7B,OAAS,CAAA,CAACh0B,CAAW,CAAA,OAAA,CAAQ,CAAC,CAAC,CAC/B,CAAA,cAAA,CAAgBu1B,CAClB,CAAC,EACH,CAAC,EAED1B,CAAW,CAAA,IAAA,CAAK,CACd,IAAA,CAAA,iBAAA,CACA,KACA,CAAA,qBAAA,CAAA,KAAA,CAAO7zB,CAAW,CAAA,KAAA,CAClB,UAAY6xB,CAAAA,CAAAA,CACZ,IAAM7xB,CAAAA,CAAAA,CACN,YAAc,CAAA,CAAC,SAASA,CAAW,CAAA,KAAK,CAAE,CAAA,CAAA,CAC1C,aAAes1B,CAAAA,CACjB,CAAC,EACH,CAGA,IAAA,IAAW9oB,CAAYsmB,IAAAA,CAAAA,CAAQ,cAAgB,CAAA,CAC7C,GAAItmB,CAAS,CAAA,QAAA,CAAS,IAAS,GAAA,YAAA,CAC7B,SAGF,IAAMgpB,CAAmB,CAAA,IAAA,CAAK,2BAA4BhpB,CAAAA,CAAQ,CAC5DipB,CAAAA,CAAAA,CAA0B,IAAK,CAAA,uBAAA,CAAwBjpB,CAAQ,CAErEqnB,CAAAA,CAAAA,CAAW,IAAK,CAAA,CACd,IACA,CAAA,iBAAA,CAAA,KAAA,CAAA,qBAAA,CACA,KAAOrnB,CAAAA,CAAAA,CAAS,KAChB,CAAA,UAAA,CAAYipB,CACZ,CAAA,IAAA,CAAMjpB,CACN,CAAA,YAAA,CAAc,KAAK,yBAA0BA,CAAAA,CAAQ,CACrD,CAAA,aAAA,CAAegpB,CACjB,CAAC,EACH,CAGA,IAAWR,IAAAA,CAAAA,IAAMlC,CAAQ,CAAA,YAAA,EAAgB,EAAC,CAAG,CAC3C,IAAMn0B,CAAAA,CAAQ,IAAK,CAAA,MAAA,CAAO,IAAMy0B,CAAAA,CAAAA,EAAMA,CAAE,CAAA,KAAA,GAAU4B,CAAG,CAAA,KAAK,CACpDn2B,CAAAA,CAAAA,CAAAA,CAAWm2B,CAAG,CAAA,OAAA,EAAW,EAAI,EAAA,GAAA,CAAK1rB,CAC3B3K,EAAAA,CAAAA,EAAO,UAAW,EAAA,CAAE,IAAMK,CAAAA,CAAAA,EAAMA,CAAE,CAAA,UAAA,GAAesK,CAAG,CAAA,EACpD,YAAgBA,EAAAA,CAC5B,EACKosB,CAAW,CAAA,IAAA,CAAK,GAAI,CAAA,UAAA,CAAWV,CAAG,CAAA,KAAA,CAAQhB,CAAM,EAAA,CACpDA,CAAE,CAAA,aAAA,CAAc,QAAU,CAAA,CACxB,OAAAn1B,CAAAA,CAAAA,CACA,cAAgBm2B,CAAAA,CAAAA,CAAG,IAAQ,EAAA,WAC7B,CAAC,EACH,CAAC,CAAA,CACDnB,CAAW,CAAA,IAAA,CAAK,CACd,IAAA,CAAA,uBAAA,CACA,KACA,CAAA,qBAAA,CAAA,KAAA,CAAOmB,CAAG,CAAA,KAAA,CACV,WAAYA,CAAG,CAAA,IAAA,EAAQ,WACvB,CAAA,IAAA,CAAMA,CACN,CAAA,YAAA,CAAc,CAAC,CAAA,MAAA,EAASA,CAAG,CAAA,KAAK,CAAE,CAAA,CAAA,CAClC,aAAeU,CAAAA,CACjB,CAAC,EACH,CAGA,IAAWvoB,IAAAA,CAAAA,IAAS2lB,CAAQ,CAAA,YAAA,CAAc,CACxC,IAAM6C,CAAiB,CAAA,IAAA,CAAK,sBAAuBxoB,CAAAA,CAAK,CACxD0mB,CAAAA,CAAAA,CAAW,KAAK,CACd,IAAA,CAAA,cAAA,CACA,KACA,CAAA,qBAAA,CAAA,KAAA,CAAO1mB,CAAM,CAAA,KAAA,CACb,KAAOA,CAAAA,CAAAA,CAAM,KACb,CAAA,IAAA,CAAMA,CACN,CAAA,YAAA,CAAc,CAAC,CAAA,MAAA,EAASA,EAAM,KAAK,CAAA,CAAE,CACrC,CAAA,aAAA,CAAe,CAACwoB,CAAc,CAChC,CAAC,EACH,CAEA,OAAO9B,CACT,CAEQ,uBAAA,CAAwB+B,EAGT,CAErB,IAAMC,CAAWtsB,CAAAA,CAAAA,CAAeqsB,CAAa,CAAA,QAAA,CAAS,cAAc,CAAA,CACpE,GAAIC,CAAAA,CACF,OAAOA,CAAAA,CAIT,IAAIC,CAAAA,CAAkBF,EAAa,KAC/BA,CAAAA,CAAAA,CAAa,QAAS,CAAA,IAAA,GAAS,WACjCE,CAAAA,CAAAA,CAAkBF,CAAa,CAAA,QAAA,CAAS,KAAM,EAAA,CAAE,KAEhDA,CAAAA,CAAAA,CAAa,QAAS,CAAA,IAAA,GAAS,cAC/BA,CAAa,CAAA,QAAA,CAAS,iBAEtBE,GAAAA,CAAAA,CAAkBvsB,CAChBqsB,CAAAA,CAAAA,CAAa,QAAS,CAAA,iBAAA,CAAkB,YAC1C,CAAA,CAAA,CAKF,IAAM3rB,CAAAA,CADQ,IAAK,CAAA,MAAA,CAAO,KAAMmpB,CAAMA,EAAAA,CAAAA,CAAE,KAAUwC,GAAAA,CAAAA,CAAa,KAAK,CAAA,EACxC,UAAW,EAAA,EAAK,EAAC,CACzCG,CAAmBH,CAAAA,CAAAA,CAAa,QAAS,CAAA,UAAA,CAC7C,OAAIA,CAAa,CAAA,QAAA,CAAS,IAAS,GAAA,WAAA,CAIjCG,CAHmB9rB,CAAAA,CAAAA,CAAa,IAC7BjL,CAAAA,CAAAA,EAAMA,CAAE,CAAA,UAAA,GAAe42B,CAAa,CAAA,QAAA,CAAS,UAChD,CAAA,EAEc,cACXA,CAAa,CAAA,QAAA,CAAS,UAGzBG,CAAAA,CAAAA,CADW9rB,CAAa,CAAA,IAAA,CAAMjL,CAAMA,EAAAA,CAAAA,CAAE,UAAe+2B,GAAAA,CAAgB,CAC9C,EAAA,YAAA,EAAgBA,CAGlC9lB,CAAAA,CAAAA,CACL2lB,EAAa,KACbG,CAAAA,CAAAA,CACAD,CACF,CACF,CAKQ,6BAAA,CACNhD,CACsB,CAAA,CACtB,OAAO,IAAA,CAAK,YAAa,CAAA,sBAAA,CAAuBA,CAAO,CACzD,CAKQ,oCACNA,CAAAA,CAAAA,CACsB,CACtB,IAAMe,CAAmC,CAAA,EAGzC,CAAA,IAAA,IAAW90B,CAAU+zB,IAAAA,CAAAA,CAAQ,eAAmB,EAAA,EAAI,CAAA,CAClD,IAAMkD,CAAY,CAAA,IAAA,CAAK,4BAA6Bj3B,CAAAA,CAAM,CAC1D80B,CAAAA,CAAAA,CAAW,IAAK,CAAA,CACd,IACA,CAAA,eAAA,CAAA,KAAA,CAAA,wBAAA,CACA,KAAO90B,CAAAA,CAAAA,CAAO,KACd,CAAA,MAAA,CAAQA,EAAO,SAAU,CAAA,IAAA,CACzB,IAAMA,CAAAA,CAAAA,CACN,YAAc,CAAA,EACd,CAAA,aAAA,CAAei3B,CACjB,CAAC,EACH,CAEA,OAAOnC,CACT,CAKQ,yBAA0BrnB,CAAAA,CAAAA,CAGrB,CACX,IAAMymB,CAAyB,CAAA,EAE/B,CAAA,GAAIzmB,CAAS,CAAA,QAAA,CAAS,IAAS,GAAA,WAAA,CAAwB,CACrD,IAAM2C,EAAe3C,CAAS,CAAA,QAAA,CAAS,KAAM,EAAA,CAC7CymB,CAAa,CAAA,IAAA,CAAK,CAAS9jB,MAAAA,EAAAA,CAAAA,CAAa,KAAK,CAAA,CAAE,CAG/C,CAAA,IAAM8mB,CAAS9mB,CAAAA,CAAAA,CAAa,YAAc,IACpC+mB,CAAAA,CAAAA,CAAW/mB,CACd,CAAA,UAAA,EACA,CAAA,IAAA,CAAMnQ,CAAkBA,EAAAA,CAAAA,CAAE,UAAei3B,GAAAA,CAAM,CAC9CC,CAAAA,CAAAA,EACFjD,CAAa,CAAA,IAAA,CACX,UAAU9jB,CAAa,CAAA,KAAK,CAAI+mB,CAAAA,EAAAA,CAAAA,CAAS,YAAY,CAAA,CACvD,EAEJ,CAAA,KAAA,GACE1pB,CAAS,CAAA,QAAA,CAAS,IAAS,GAAA,YAAA,EAC3BA,CAAS,CAAA,QAAA,CAAS,kBAClB,CACA,IAAM2pB,CAAe5sB,CAAAA,CAAAA,CACnBiD,CAAS,CAAA,QAAA,CAAS,iBAAkB,CAAA,YACtC,CACAymB,CAAAA,CAAAA,CAAa,IAAK,CAAA,CAAA,MAAA,EAASkD,CAAY,CAAA,CAAE,EAC3C,CAGAlD,CAAAA,CAAa,IAAK,CAAA,CAAA,MAAA,EAASzmB,CAAS,CAAA,KAAK,CAAE,CAAA,CAAA,CAE3C,IAAM7N,CAAAA,CAAQ,IAAK,CAAA,MAAA,CAAO,IAAMy0B,CAAAA,CAAAA,EAAMA,EAAE,KAAU5mB,GAAAA,CAAAA,CAAS,KAAK,CAAA,CAChE,GAAI7N,CAAAA,CAAO,CACT,IAAMy3B,CAAez3B,CAAAA,CAAAA,CAClB,UAAW,EAAA,CACX,IACEK,CAAAA,CAAAA,EACCA,EAAE,UAAewN,GAAAA,CAAAA,CAAS,QAAS,CAAA,UAAA,EACnCxN,CAAE,CAAA,YAAA,GAAiBwN,CAAS,CAAA,QAAA,CAAS,UACzC,CAAA,CACE4pB,CACFnD,EAAAA,CAAAA,CAAa,IACX,CAAA,CAAA,OAAA,EAAUzmB,EAAS,KAAK,CAAA,CAAA,EAAI4pB,CAAa,CAAA,YAAY,CACvD,CAAA,EAEJ,CAEA,OAAOnD,CACT,CAKQ,oBACNv5B,CAAAA,CAAAA,CACAu3B,CACAlyB,CAAAA,CAAAA,CACAwP,EACA8nB,CAA4B,CAAA,IAAA,CAC5B,CACA,IAAMC,CAAKrF,CAAAA,CAAAA,CAAQlyB,CAAO,CAAA,IAA4B,CAAU,CAAA,GAAGwP,CAAI,CAAA,CACvE,OAAK8nB,CAAAA,GAIDt3B,EAAO,SACTu3B,EAAAA,CAAAA,CAAE,UAAW,CAAA,CACX,cACEv3B,CAAAA,CAAAA,CAAO,wBACPqR,EAAAA,EAAAA,CAAmC1W,CAAOqF,CAAAA,CAAAA,CAAO,UAAU,CAC/D,CAAC,CAAA,CAGCA,EAAO,WAAa,EAAA,OAAA,GAAY,MAClCu3B,EAAAA,CAAAA,CAAE,OAAQv3B,CAAAA,CAAAA,CAAO,WAAY,CAAA,OAAO,CAGlCA,CAAAA,CAAAA,CAAO,WAAa,EAAA,QAAA,GAAa,KACnCu3B,CAAAA,CAAAA,CAAE,aACOv3B,CAAAA,CAAAA,CAAO,WAAa,EAAA,QAAA,GAAa,IAC1Cu3B,EAAAA,CAAAA,CAAE,QAAS,EAAA,CAAA,CAGNA,CACT,CAKQ,yBAA0BC,CAAAA,CAAAA,CAGrB,CACX,IAAMhoB,EAAO,CACXgoB,CAAAA,CAAW,MAAO,CAAA,YAAA,CAClBA,CAAW,CAAA,MAAA,CAAO,MAClBA,CAAAA,CAAAA,CAAW,MAAO,CAAA,SAAA,EAAa,CAACA,CAAAA,CAAW,MAAO,CAAA,YAAA,CAC9CA,EAAW,MAAO,CAAA,SAAA,CAClB,MACJA,CAAAA,CAAAA,CAAW,MAAO,CAAA,KAAA,CAClBA,CAAW,CAAA,MAAA,CAAO,YACd,CAAA,CACE,YAAcA,CAAAA,CAAAA,CAAW,MAAO,CAAA,YAAA,CAChC,UAAWA,CAAW,CAAA,MAAA,CAAO,SAC/B,CAAA,CACA,MACN,CAAA,CAAE,MAAO,CAAA,OAAO,CAEhB,CAAA,OAAO,IAAK,CAAA,GAAA,CAAI,UAAWA,CAAAA,CAAAA,CAAW,MAAQvC,CAAM,EAAA,CAClDA,CAAE,CAAA,SAAA,CAAWsC,CAAM,EAAA,CAEjB,IAAMhF,CAAAA,CAAgB,IAAK,CAAA,oBAAA,CACzBiF,CAAW,CAAA,KAAA,CACXD,CACAC,CAAAA,CAAAA,CAAW,MACXhoB,CAAAA,CAAAA,CACA,KACF,CAAA,CAGA,OAAIgoB,CAAAA,CAAW,MAAO,CAAA,WAAA,EAAa,OAAY,GAAA,MAAA,EAC7CjF,CAAc,CAAA,OAAA,CAAQiF,CAAW,CAAA,MAAA,CAAO,WAAY,CAAA,OAAO,EAGzDA,CAAW,CAAA,MAAA,CAAO,WAAa,EAAA,QAAA,GAAa,KAC9CjF,CAAAA,CAAAA,CAAc,WAAY,EAAA,CACjBiF,CAAW,CAAA,MAAA,CAAO,WAAa,EAAA,QAAA,GAAa,IACrDjF,EAAAA,CAAAA,CAAc,UAGTA,CAAAA,CACT,CAAC,EACH,CAAC,CACH,CAKQ,4BAAA,CAA6BiF,CAIxB,CAAA,CACX,GAAI,IAAA,CAAK,GAAI,CAAA,SAAA,KAAgB,QAC3B,CAAA,OAAO,EAAC,CAIV,IAAMhoB,CAAAA,CAAO,CACXgoB,CAAAA,CAAW,WAAY,CAAA,YAAA,CACvBA,CAAW,CAAA,WAAA,CAAY,MACvBA,CAAAA,CAAAA,CAAW,YAAY,SAAa,EAAA,CAACA,CAAW,CAAA,WAAA,CAAY,YACxDA,CAAAA,CAAAA,CAAW,WAAY,CAAA,SAAA,CACvB,MACJA,CAAAA,CAAAA,CAAW,WAAY,CAAA,KAAA,CACvBA,CAAW,CAAA,WAAA,CAAY,aACnB,CACE,YAAA,CAAcA,CAAW,CAAA,WAAA,CAAY,YACrC,CAAA,SAAA,CAAWA,CAAW,CAAA,WAAA,CAAY,SACpC,CAAA,CACA,MACN,CAAA,CAAE,MAAO,CAAA,OAAO,EA2BhB,OAzBuB,IAAA,CAAK,GAAI,CAAA,UAAA,CAAWA,CAAW,CAAA,KAAA,CAAQvC,CAAM,EAAA,CAClEA,CAAE,CAAA,WAAA,CAAasC,CAAM,EAAA,CACnB,IAAMhF,CAAAA,CAAgB,KAAK,oBACzBiF,CAAAA,CAAAA,CAAW,KACXD,CAAAA,CAAAA,CACAC,CAAW,CAAA,WAAA,CACXhoB,CACA,CAAA,KACF,CAGA,CAAA,OAAIgoB,CAAW,CAAA,WAAA,CAAY,WAAa,EAAA,OAAA,GAAY,QAClDjF,CAAc,CAAA,OAAA,CAAQiF,CAAW,CAAA,WAAA,CAAY,WAAY,CAAA,OAAO,CAG9DA,CAAAA,CAAAA,CAAW,WAAY,CAAA,WAAA,EAAa,QAAa,GAAA,KAAA,CACnDjF,CAAc,CAAA,WAAA,GACLiF,CAAW,CAAA,WAAA,CAAY,WAAa,EAAA,QAAA,GAAa,IAC1DjF,EAAAA,CAAAA,CAAc,QAAS,EAAA,CAGlBA,CACT,CAAC,EACH,CAAC,CAGH,CAKQ,uBAAuBkF,CAGpB,CAAA,CACT,IAAM73B,CAAAA,CAAQ,IAAK,CAAA,MAAA,CAAO,IAAMy0B,CAAAA,CAAAA,EAAMA,CAAE,CAAA,KAAA,GAAUoD,CAAU,CAAA,KAAK,CAI3D1gB,CAAAA,CAAAA,CAAAA,CAHWnX,GACb,UAAW,EAAA,CACZ,IAAMuZ,CAAAA,CAAAA,EAAQA,CAAI,CAAA,IAAA,GAASse,CAAU,CAAA,KAAK,CACrB,EAAA,OAAA,EAAW,EAAC,EAAG,GAAKltB,CAAAA,CAAAA,EAC/B3K,GAAO,UAAW,EAAA,CAAE,IAAMK,CAAAA,CAAAA,EAAMA,CAAE,CAAA,UAAA,GAAesK,CAAG,CAAA,EACpD,YAAgBA,EAAAA,CAC5B,CAEK8rB,CAAAA,CAAAA,CAAS,IAAItD,EAAAA,CAAO,KAAK,GAAI,CAAA,SAAA,EAAW,CAAA,CAC9C,OAAAsD,CAAAA,CAAO,WAAYoB,CAAAA,CAAAA,CAAU,KAAO1gB,CAAAA,CAAAA,CAAM,CACxC,cAAA,CAAgB0gB,CAAU,CAAA,KAC5B,CAAC,CAGMpB,CAAAA,CAAAA,CAAO,eAAgB,CAAA,CAAC,CAAK,EAAA,EACtC,CAKQ,2BAAA,CAA4BQ,CAGvB,CAAA,CACX,IAAIE,CAAAA,CAAkBF,CAAa,CAAA,KAAA,CAC/Ba,EAAmBb,CAAa,CAAA,QAAA,CAAS,UAEzCA,CAAAA,CAAAA,CAAa,QAAS,CAAA,IAAA,GAAS,WACjCE,EAAAA,CAAAA,CAAkBF,CAAa,CAAA,QAAA,CAAS,KAAM,EAAA,CAAE,KAChDa,CAAAA,CAAAA,CAAmBb,EAAa,QAAS,CAAA,KAAA,EAAQ,CAAA,UAAA,EAAc,IAE/DA,EAAAA,CAAAA,CAAa,QAAS,CAAA,IAAA,GAAS,YAC/BA,EAAAA,CAAAA,CAAa,QAAS,CAAA,iBAAA,GAEtBE,CAAkBvsB,CAAAA,CAAAA,CAChBqsB,EAAa,QAAS,CAAA,iBAAA,CAAkB,YAC1C,CAAA,CACAa,CAAmBltB,CAAAA,CAAAA,CACjBqsB,CAAa,CAAA,QAAA,CAAS,iBAAkB,CAAA,eAC1C,CAEI,CAAA,CAAA,CAACa,CAAoBA,EAAAA,CAAAA,GAAqB,eAC5CA,CAAmBb,CAAAA,CAAAA,CAAa,QAAS,CAAA,KAAA,EAAQ,CAAA,UAAA,EAAc,IAInE,CAAA,CAAA,CAAA,IAAM/D,CACJ,CAAA,OAAO+D,CAAa,CAAA,QAAA,CAAS,cAAmB,EAAA,QAAA,CAC3CA,EAAa,QAAS,CAAA,cAAA,CACvB,MACFc,CAAAA,CAAAA,CAAmBntB,CAAektB,CAAAA,CAAgB,CAEtD,CAAA,GAAIb,CAAa,CAAA,QAAA,CAAS,IAAS,GAAA,WAAA,CAAwB,CACzD,IAAMzmB,EAAeymB,CAAa,CAAA,QAAA,CAAS,KAAM,EAAA,CAC3Ce,CAAiBxnB,CAAAA,CAAAA,CAAa,UAE9BynB,CAAAA,CAAAA,CADsBznB,CAAa,CAAA,UAAA,EACQ,CAAA,IAAA,CAC9C7F,CAAQA,EAAAA,CAAAA,CAAI,aAAeqtB,CAC9B,CAAA,CAEA,GAAIC,CAAAA,CACFF,CAAmBE,CAAAA,CAAAA,CAAqB,YACnC,CAAA,KAAA,CACL,IAAMC,CAAAA,CACJ1nB,CAAc,EAAA,sBAAA,EAA0B,UAC1CunB,CAAAA,CAAAA,CAAmBpxB,EAAYqxB,CAAgBE,CAAAA,CAAsB,EACvE,CACF,CACEjB,KAAAA,GAAAA,CAAAA,CAAa,QAAS,CAAA,IAAA,GAAS,YAC/BA,EAAAA,CAAAA,CAAa,QAAS,CAAA,iBAAA,CACtB,CACA,IAAMzmB,EAAeymB,CAAa,CAAA,QAAA,CAAS,KAAM,EAAA,CAEjD,GAAI,OAAOc,CAAqB,EAAA,QAAA,EAAYA,CAAkB,CAAA,CAC5D,IAAMI,CAAAA,CAAsB3nB,CAAa,CAAA,UAAA,GACnC4nB,CAAkBD,CAAAA,CAAAA,CAAoB,IACzCxtB,CAAAA,CAAAA,EAAQA,CAAI,CAAA,UAAA,GAAeotB,CAC9B,CAAA,CAEA,GAAIK,CAAAA,CACFL,CAAmBK,CAAAA,CAAAA,CAAgB,YAC9B,CAAA,KAAA,CACL,IAAMJ,CAAiBxnB,CAAAA,CAAAA,CAAa,UAAc,EAAA,IAAA,CAC5CynB,CAAuBE,CAAAA,CAAAA,CAAoB,IAC9CxtB,CAAAA,CAAAA,EAAQA,CAAI,CAAA,UAAA,GAAeqtB,CAC9B,CAAA,CAEA,GAAIC,CAAAA,CACFF,EAAmBE,CAAqB,CAAA,YAAA,CAAA,KACnC,CACL,IAAMC,CACJ1nB,CAAAA,CAAAA,EAAc,sBAA0B,EAAA,UAAA,CAC1CunB,CAAmBpxB,CAAAA,CAAAA,CACjBoxB,CAAoBC,EAAAA,CAAAA,CACpBE,CACF,EACF,CACF,CACF,CAAA,KAAO,CACL,IAAMF,CAAiBxnB,CAAAA,CAAAA,CAAa,UAAc,EAAA,IAAA,CAE5CynB,CADsBznB,CAAAA,CAAAA,CAAa,UAAW,EAAA,CACH,IAC9C7F,CAAAA,CAAAA,EAAQA,EAAI,UAAeqtB,GAAAA,CAC9B,CAEA,CAAA,GAAIC,CACFF,CAAAA,CAAAA,CAAmBE,CAAqB,CAAA,YAAA,CAAA,KACnC,CACL,IAAMC,CACJ1nB,CAAAA,CAAAA,EAAc,sBAA0B,EAAA,UAAA,CAC1CunB,EAAmBpxB,CACjBqxB,CAAAA,CAAAA,CACAE,CACF,EACF,CACF,CACF,CAEA,IAAMl4B,CAAQ,CAAA,IAAA,CAAK,MAAO,CAAA,IAAA,CAAMy0B,CAAMA,EAAAA,CAAAA,CAAE,QAAUwC,CAAa,CAAA,KAAK,CAC9D3rB,CAAAA,CAAAA,CAAetL,CAAO,EAAA,UAAA,EAAgB,EAAA,EAExCo3B,CAAAA,CAAAA,CAAmBH,CAAa,CAAA,QAAA,CAAS,UAEvCnrB,CAAAA,CAAAA,CAAcR,EAAa,IAC9BX,CAAAA,CAAAA,EAAQA,CAAI,CAAA,UAAA,GAAeysB,CAC9B,CAAA,CAEA,GAAItrB,CAAAA,CACFsrB,CAAmBtrB,CAAAA,CAAAA,CAAY,YAC1B,CAAA,KAAA,CACL,IAAMosB,CAAAA,CACJl4B,CAAO,EAAA,sBAAA,EAA0B,UACnCo3B,CAAAA,CAAAA,CAAmBzwB,CAAYywB,CAAAA,CAAAA,CAAkBc,CAAsB,EACzE,CAEA,GAAIjB,CAAa,CAAA,QAAA,CAAS,IAAS,GAAA,WAAA,CAAwB,CACzD,IAAMc,EAAmBzsB,CAAa,CAAA,IAAA,CACnCX,CAAQA,EAAAA,CAAAA,CAAI,UAAessB,GAAAA,CAAAA,CAAa,QAAS,CAAA,UACpD,CAEA,CAAA,GAAIc,CACFX,CAAAA,CAAAA,CAAmBW,CAAiB,CAAA,YAAA,CAAA,KAC/B,CACL,IAAMG,CAAAA,CACJl4B,CAAO,EAAA,sBAAA,EAA0B,UACnCo3B,CAAAA,CAAAA,CAAmBzwB,CACjBswB,CAAAA,CAAAA,CAAa,QAAS,CAAA,UAAA,CACtBiB,CACF,EACF,CACF,CAAA,KAAA,GACEjB,EAAa,QAAS,CAAA,IAAA,GAAS,YAC/BA,EAAAA,CAAAA,CAAa,QAAS,CAAA,iBAAA,CACtB,CACA,IAAMoB,CAAUpB,CAAAA,CAAAA,CAAa,QAAS,CAAA,iBAAA,CAAkB,cAClDqB,CAAAA,CAAAA,CAAa1tB,EAAeytB,CAAO,CAAA,CAEnCE,CAAgBjtB,CAAAA,CAAAA,CAAa,IAChCX,CAAAA,CAAAA,EAAQA,CAAI,CAAA,UAAA,GAAe2tB,CAC9B,CAAA,CAEA,GAAIC,CAAAA,CACFnB,CAAmBmB,CAAAA,CAAAA,CAAc,kBAC5B,CACL,IAAML,CACJl4B,CAAAA,CAAAA,EAAO,sBAA0B,EAAA,UAAA,CACnCo3B,CAAmBzwB,CAAAA,CAAAA,CAAY2xB,CAAYJ,CAAAA,CAAsB,EACnE,CACF,CAEA,IAAMM,EAAWvB,CAAa,CAAA,QAAA,CAAS,QAAU,EAAA,WAAA,EAG3CwB,CAAAA,CAAAA,CAAWxB,CAAa,CAAA,QAAA,CAAS,QAAU,EAAA,WAAA,EAIjD,CAAA,OAAO,IAAK,CAAA,GAAA,CAAI,WAAWA,CAAa,CAAA,KAAA,CAAQ5B,CAAM,EAAA,CACpD,IAAMqD,CAAAA,CACJxF,CACA5hB,EAAAA,CAAAA,CACE2lB,CAAa,CAAA,KAAA,CACbG,CACAD,CAAAA,CACF,CAEF9B,CAAAA,CAAAA,CAAE,cAAc,aAAe,CAAA,CAC7B,OAAS,CAAA,CAAC+B,CAAgB,CAAA,CAC1B,UAAY,CAAA,CACV,KAAOD,CAAAA,CAAAA,CACP,OAAS,CAAA,CAACY,CAAgB,CAC5B,EACA,cAAgBW,CAAAA,CAAAA,CAChB,QAAAF,CAAAA,CAAAA,CACA,QAAAC,CAAAA,CACF,CAAC,EACH,CAAC,CACH,CAKA,mBAAA,CAAoBvD,CAAwD,CAAA,CAC1E,OAAOA,CAAW,CAAA,GAAA,CAAKyD,CAAe,GAAA,CACpC,GAAGA,CAAAA,CACH,aAAeA,CAAAA,CAAAA,CAAU,aAAc,CAAA,GAAA,CAAKrF,CAC1C3uB,EAAAA,mBAAAA,CAAO2uB,CAAW,CAAA,CAChB,GAAG,IAAK,CAAA,GAAA,CAAI,YAAa,CAAA,kBAC3B,CAAC,CAAA,CACE,OAAQ,CAAA,KAAA,CAAO,GAAG,CAAA,CAClB,OAAQ,CAAA,MAAA,CAAQ,GAAG,CACxB,CACF,CAAE,CAAA,CACJ,CACF,CAAA,CEvxBA,SAASsF,EAAAA,CAAkB/gC,CAAuB,CAAA,CAChD,OAAOA,CAAAA,CAAM,OAAQ,CAAA,MAAA,CAAQ,GAAG,CAAA,CAAE,MACpC,CAEA,SAASghC,EAAAA,CAAkBhhC,CAAuB,CAAA,CAChD,OAAOA,CAAAA,CAAM,OAAQ,CAAA,eAAA,CAAiB,EAAE,CAAA,CAAE,IAAK,EACjD,CAEO,SAASihC,EAAAA,CACdC,CACAC,CAAAA,CAAAA,CACQ,CACR,IAAMC,CAAUL,CAAAA,EAAAA,CAAkBI,CAAQ,CAAA,WAAA,EAAa,CAAA,CACjDE,CAAOL,CAAAA,EAAAA,CAAkBI,CAAO,CAEtC,CAAA,OAAQF,CAAS,EACf,KAAK,QAAA,CAAU,CACb,IAAMI,CACJ,CAAA,CACE,CAAE,IAAA,CAAOC,CAAMA,EAAAA,CAAAA,GAAM,WAAa,CAAA,UAAA,CAAY,SAAU,CAAA,CACxD,CAAE,IAAA,CAAOA,CAAMA,EAAAA,CAAAA,GAAM,cAAgB,CAAA,UAAA,CAAY,SAAU,CAAA,CAC3D,CAAE,IAAA,CAAOA,CAAMA,EAAAA,CAAAA,CAAE,SAAS,KAAK,CAAA,CAAG,UAAY,CAAA,SAAU,CACxD,CAAA,CAAE,IAAOA,CAAAA,CAAAA,EAAMA,CAAE,CAAA,QAAA,CAAS,MAAM,CAAA,CAAG,UAAY,CAAA,SAAU,EACzD,CAAE,IAAA,CAAOA,CAAMA,EAAAA,CAAAA,CAAE,QAAS,CAAA,MAAM,CAAG,CAAA,UAAA,CAAY,MAAO,CAAA,CACtD,CAAE,IAAA,CAAOA,CAAMA,EAAAA,CAAAA,CAAE,SAAS,MAAM,CAAA,CAAG,UAAY,CAAA,MAAO,CACtD,CAAA,CAAE,IAAOA,CAAAA,CAAAA,EAAMA,CAAE,CAAA,QAAA,CAAS,MAAM,CAAA,CAAG,UAAY,CAAA,MAAO,EACtD,CAAE,IAAA,CAAOA,CAAMA,EAAAA,CAAAA,CAAE,QAAS,CAAA,MAAM,CAAG,CAAA,UAAA,CAAY,MAAO,CAAA,CACtD,CAAE,IAAA,CAAOA,CAAMA,EAAAA,CAAAA,CAAE,SAAS,WAAW,CAAA,CAAG,UAAY,CAAA,MAAO,CAC3D,CAAA,CAAE,IAAOA,CAAAA,CAAAA,EAAMA,CAAE,CAAA,QAAA,CAAS,UAAU,CAAA,CAAG,UAAY,CAAA,MAAO,EAC1D,CAAE,IAAA,CAAOA,CAAMA,EAAAA,CAAAA,CAAE,QAAS,CAAA,MAAM,CAAG,CAAA,UAAA,CAAY,MAAO,CAAA,CACtD,CACE,IAAA,CAAOA,CACLA,EAAAA,CAAAA,CAAE,SAAS,MAAM,CAAA,EAAKA,CAAE,CAAA,QAAA,CAAS,MAAM,CAAA,EAAKA,CAAE,CAAA,QAAA,CAAS,MAAM,CAAA,CAC/D,UAAY,CAAA,MACd,CACA,CAAA,CAAE,KAAOA,CAAMA,EAAAA,CAAAA,CAAE,QAAS,CAAA,SAAS,CAAG,CAAA,UAAA,CAAY,SAAU,CAAA,CAC5D,CAAE,IAAA,CAAOA,CAAMA,EAAAA,CAAAA,CAAE,QAAS,CAAA,MAAM,EAAG,UAAY,CAAA,SAAU,CACzD,CAAA,CAAE,IAAOA,CAAAA,CAAAA,EAAMA,CAAE,CAAA,QAAA,CAAS,MAAM,CAAA,CAAG,UAAY,CAAA,SAAU,CACzD,CAAA,CAAE,KAAOA,CAAMA,EAAAA,CAAAA,CAAE,QAAS,CAAA,MAAM,CAAG,CAAA,UAAA,CAAY,SAAU,CAAA,CACzD,CAAE,IAAA,CAAOA,CAAMA,EAAAA,CAAAA,CAAE,QAAS,CAAA,OAAO,EAAG,UAAY,CAAA,MAAO,CACvD,CAAA,CAAE,IAAOA,CAAAA,CAAAA,EAAMA,CAAE,CAAA,QAAA,CAAS,MAAM,CAAA,CAAG,UAAY,CAAA,MAAO,CACxD,CAAA,CAEF,QAAWC,CAAQF,IAAAA,CAAAA,CACjB,GAAIE,CAAAA,CAAK,IAAKH,CAAAA,CAAI,CAChB,CAAA,OAAOG,CAAK,CAAA,UAAA,CAIhB,OAAOH,CACT,CAEA,KAAK,QACL,KAAK,SAAA,CAAW,CACd,GAAIA,CAAK,CAAA,QAAA,CAAS,MAAM,CAAA,EAAKA,CAAS,GAAA,MAAA,CAAQ,OAAO,MAAA,CACrD,OAAQA,CAAAA,EACN,KAAK,KAAA,CACL,KAAK,SAAA,CACL,KAAK,WAAA,CACH,OAAO,SAAA,CACT,KAAK,SAAA,CACH,OAAO,SAAA,CACT,KAAK,UAAA,CACH,OAAO,UACT,CAAA,KAAK,WACH,CAAA,OAAO,WACT,CAAA,KAAK,QACL,CAAA,KAAK,cACH,CAAA,OAAO,QACT,CAAA,KAAK,OACH,CAAA,OAAO,OACT,CAAA,KAAK,QACL,CAAA,KAAK,kBACH,CAAA,OAAO,QACT,CAAA,KAAK,MACH,CAAA,OAAO,QACT,CAAA,KAAK,SACL,CAAA,KAAK,SACH,CAAA,OAAO,UACT,KAAK,SAAA,CACL,KAAK,mBAAA,CACH,OAAO,SAAA,CACT,KAAK,MAAA,CACL,KAAK,WAAA,CACH,OAAO,MAAA,CACT,KAAK,MAAA,CACH,OAAO,SACT,CAAA,KAAK,MACH,CAAA,OAAO,SACT,CAAA,KAAK,MACH,CAAA,OAAO,MACT,CAAA,KAAK,UACH,CAAA,OAAO,UACT,CAAA,KAAK,YACH,OAAO,WAAA,CACT,KAAK,MAAA,CACH,OAAO,MAAA,CACT,KAAK,MAAA,CACH,OAAO,MAAA,CACT,KAAK,OAAA,CACH,OAAO,MAAA,CACT,KAAK,MACH,CAAA,OAAO,MACT,CAAA,KAAK,MACH,CAAA,OAAO,MACT,CAAA,KAAK,QACH,CAAA,OAAO,QACT,CAAA,KAAK,WACH,CAAA,OAAO,YACT,KAAK,UAAA,CACH,OAAO,UAAA,CACT,KAAK,YAAA,CACH,OAAO,YAAA,CACT,KAAK,UAAA,CACH,OAAO,UAAA,CACT,KAAK,MAAA,CACH,OAAO,MACT,CAAA,KAAK,SACL,CAAA,KAAK,MACH,CAAA,OAAO,SACT,CAAA,QACE,OAAOA,CACX,CACF,CAEA,KAAK,UAAA,CACL,KAAK,aAAe,CAAA,CAClB,GAAIA,CAAAA,CAAK,QAAS,CAAA,MAAM,CAAKA,EAAAA,CAAAA,GAAS,MAAQ,CAAA,OAAO,MACrD,CAAA,GAAIA,CAAK,CAAA,UAAA,CAAW,WAAW,CAAG,CAAA,OAAO,WACzC,CAAA,GAAIA,CAAK,CAAA,UAAA,CAAW,MAAM,CAAA,CAAG,OAAO,MAAA,CACpC,GAAIA,CAAAA,GAAS,UAAY,CAAA,OAAO,YAChC,OAAQA,CAAAA,EACN,KAAK,mBACH,CAAA,OAAO,SACT,CAAA,KAAK,WACH,CAAA,OAAO,MACT,CAAA,KAAK,MACH,CAAA,OAAO,UACT,KAAK,kBAAA,CACH,OAAO,QAAA,CACT,KAAK,MAAA,CACH,OAAO,MAAA,CACT,KAAK,OAAA,CACH,OAAO,MAAA,CACT,KAAK,SAAA,CACL,KAAK,MACL,CAAA,KAAK,KACL,CAAA,KAAK,WACL,CAAA,KAAK,QACH,CAAA,OAAO,SACT,CAAA,KAAK,WACH,CAAA,OAAO,SACT,CAAA,KAAK,SACL,KAAK,MAAA,CACL,KAAK,cAAA,CACL,KAAK,WAAA,CACH,OAAO,QAAA,CACT,KAAK,UAAA,CACL,KAAK,MAAA,CACH,OAAO,UAAA,CACT,KAAK,SACH,CAAA,OAAO,UACT,CAAA,KAAK,MACH,CAAA,OAAO,MACT,CAAA,KAAK,MACH,CAAA,OAAO,UACT,CAAA,KAAK,OACH,CAAA,OAAO,QACT,KAAK,QAAA,CACL,KAAK,WAAA,CACL,KAAK,MAAA,CACL,KAAK,UAAA,CACL,KAAK,YAAA,CACL,KAAK,UAAA,CACH,OAAO,OAAA,CACT,KAAK,SACL,CAAA,KAAK,MACH,CAAA,OAAO,SACT,CAAA,KAAK,SACL,CAAA,KAAK,SACH,CAAA,OAAO,SACT,CAAA,KAAK,OACH,CAAA,OAAO,QACT,KAAK,MAAA,CACH,OAAO,MAAA,CACT,KAAK,MAAA,CACH,OAAO,MAAA,CACT,QACE,OAAOA,CACX,CACF,CAEA,KAAK,QAAS,CACZ,GAAIA,CAAK,CAAA,QAAA,CAAS,MAAM,CAAA,EAAKA,CAAS,GAAA,MAAA,EAAUA,CAAS,GAAA,OAAA,CACvD,OAAO,MAAA,CACT,GAAIA,CAAAA,CAAK,WAAW,WAAW,CAAA,CAAG,OAAO,WAAA,CACzC,GAAIA,CAAAA,CAAK,UAAW,CAAA,gBAAgB,CAAG,CAAA,OAAO,gBAC9C,CAAA,OAAQA,CAAM,EACZ,KAAK,KACL,CAAA,KAAK,SACL,CAAA,KAAK,WACH,CAAA,OAAO,KACT,CAAA,KAAK,SACH,CAAA,OAAO,SACT,CAAA,KAAK,UACH,CAAA,OAAO,WACT,KAAK,QAAA,CACL,KAAK,cAAA,CACH,OAAO,QAAA,CACT,KAAK,OAAA,CACH,OAAO,OAAA,CACT,KAAK,MAAA,CACH,OAAO,MAAA,CACT,KAAK,QACL,CAAA,KAAK,kBACH,CAAA,OAAO,OACT,CAAA,KAAK,SACL,CAAA,KAAK,SACH,CAAA,OAAO,SACT,CAAA,KAAK,OACH,CAAA,OAAO,QACT,KAAK,YAAA,CACH,OAAO,YAAA,CACT,KAAK,SAAA,CACL,KAAK,mBAAA,CACH,OAAO,SAAA,CACT,KAAK,UAAA,CACH,OAAO,UAAA,CACT,KAAK,MACL,CAAA,KAAK,WACH,CAAA,OAAO,MACT,CAAA,KAAK,OACH,CAAA,OAAO,OACT,CAAA,KAAK,MACL,CAAA,KAAK,kBACH,CAAA,OAAO,mBACT,KAAK,MAAA,CACH,OAAO,SAAA,CACT,KAAK,MAAA,CACH,OAAO,MAAA,CACT,KAAK,UAAA,CACH,OAAO,UAAA,CACT,KAAK,eAAA,CACH,OAAO,eACT,CAAA,KAAK,MACH,CAAA,OAAO,MACT,CAAA,KAAK,WACH,CAAA,OAAO,WACT,CAAA,KAAK,QACH,CAAA,OAAO,QACT,CAAA,KAAK,YACL,KAAK,MAAA,CACL,KAAK,UAAA,CACL,KAAK,YAAA,CACL,KAAK,UAAA,CACL,KAAK,OAAA,CACH,OAAO,WAAA,CACT,KAAK,OAAA,CACH,OAAO,OACT,CAAA,KAAK,KACL,CAAA,KAAK,SACL,CAAA,KAAK,MACH,CAAA,OAAO,KACT,CAAA,KAAK,MACL,CAAA,KAAK,OACH,CAAA,OAAO,WACT,KAAK,KAAA,CACH,OAAO,KAAA,CACT,KAAK,aAAA,CACH,OAAO,aAAA,CACT,QACE,OAAOA,CACX,CACF,CAEA,KAAK,WAAY,CAEf,GAAIA,CAAK,CAAA,QAAA,CAAS,MAAM,CAAA,EAAKA,CAAS,GAAA,MAAA,EAAUA,CAAS,GAAA,OAAA,CACvD,OAAO,MAAA,CACT,GAAIA,CAAAA,CAAK,WAAW,WAAW,CAAA,CAAG,OAAO,WAAA,CACzC,GAAIA,CAAAA,CAAK,UAAW,CAAA,UAAU,CAAG,CAAA,OAAO,UACxC,CAAA,OAAQA,CAAM,EACZ,KAAK,UACL,CAAA,KAAK,WACL,CAAA,KAAK,mBACH,CAAA,OAAO,UACT,CAAA,KAAK,MACL,CAAA,KAAK,OACL,CAAA,KAAK,WACH,CAAA,OAAO,MACT,CAAA,KAAK,QACL,CAAA,KAAK,SACL,CAAA,KAAK,SACL,CAAA,KAAK,SACL,CAAA,KAAK,KACL,CAAA,KAAK,UACL,CAAA,KAAK,SACL,CAAA,KAAK,YACL,KAAK,QAAA,CACH,OAAO,QAAA,CACT,KAAK,cAAA,CACL,KAAK,OAAA,CACL,KAAK,MAAA,CACH,OAAO,cAAA,CACT,KAAK,eAAA,CACL,KAAK,QACL,CAAA,KAAK,kBACH,CAAA,OAAO,eACT,CAAA,KAAK,MACH,CAAA,OAAO,MACT,CAAA,KAAK,MACL,CAAA,KAAK,KACL,CAAA,KAAK,WACL,KAAK,OAAA,CACL,KAAK,QAAA,CACL,KAAK,WAAA,CACH,OAAO,MAAA,CACT,KAAK,MAAA,CACL,KAAK,OAAA,CACH,OAAO,MAAA,CACT,KAAK,SACL,CAAA,KAAK,MACH,CAAA,OAAO,QACT,CAAA,KAAK,MACL,CAAA,KAAK,MACH,CAAA,OAAO,UACT,CAAA,QACE,OAAOA,CACX,CACF,CACA,QACE,OAAOA,CACX,CACF,CC5TO,IAAMI,EAAAA,CAAN,MAAMC,CAAW,CAMd,WAAA,CAAYp+B,CAAoB,CAAA,CAFxC,KAAiB,eAAkB,CAAA,CAAC,mBAAmB,CAAA,CAGrD,IAAK,CAAA,GAAA,CAAMA,CACX,CAAA,IAAA,CAAK,MAAS,CAAA,MAAA,CAAO,MAAO,CAAA,IAAA,CAAK,GAAI,CAAA,MAAM,EAC3C,IAAK,CAAA,IAAA,CAAO,CACV,YAAA,CAAc,EAAC,CACf,aAAe,CAAA,EACf,CAAA,eAAA,CAAiB,EAAC,CAClB,YAAc,CAAA,GACd,aAAe,CAAA,EACf,CAAA,YAAA,CAAc,EAAC,CACf,aAAe,CAAA,EACf,CAAA,WAAA,CAAa,EAAC,CACd,cAAgB,CAAA,GAChB,eAAiB,CAAA,EACjB,CAAA,iBAAA,CAAmB,EAAC,CACpB,gBAAkB,CAAA,EAClB,CAAA,iBAAA,CAAmB,EAAC,CACpB,mBAAqB,CAAA,EACvB,EACF,CAEA,aAAa,QAAA,CAASA,CAAyC,CAAA,CAC7D,IAAMq+B,CAAAA,CAAO,IAAID,CAAAA,CAAWp+B,CAAG,CAAA,CAC/B,OAAM,MAAA,OAAA,CAAQ,IACZq+B,CAAK,CAAA,MAAA,CAAO,GAAI,CAAA,MAAOx5B,CAAU,EAAA,CAC/B,IAAMy5B,CAAAA,CAAe,MAAMD,CAAAA,CAAK,GAAI,CAAA,cAAA,CAAex5B,CAAM,CAAA,KAAK,EACxD2N,CAAY,CAAA,CAEhB,OAAS3N,CAAAA,CAAAA,CACN,UAAW,EAAA,CACX,MAAQK,CAAAA,CAAAA,EAAMA,CAAG,EAAA,IAAA,GAAS,MAAaA,EAAAA,CAAAA,EAAG,IAAS,GAAA,IAAI,EAC1D,OAASL,CAAAA,CAAAA,CAAM,UAAW,EAAA,CAC1B,SAAWA,CAAAA,CAAAA,CAAM,YAAa,EAChC,CAGA,CAAA,GAAI,CAACy5B,CAAAA,CAAa,OAAQ,CAAA,MAAA,CAAQ,CAChCD,CAAK,CAAA,IAAA,CAAK,WAAY,CAAA,IAAA,CAAK,CACzB,KAAA,CAAOx5B,CAAM,CAAA,KAAA,CACb,OAAS2N,CAAAA,CAAAA,CAAU,OACrB,CAAC,CAED,CAAA,IAAA,IAAWa,KAASb,CAAU,CAAA,OAAA,CAEzB8rB,CAAa,CAAA,OAAA,CACX,GAAKC,CAAAA,CAAAA,EAAYA,CAAQ,CAAA,IAAI,CAC7B,CAAA,QAAA,CAASlrB,CAAM,CAAA,IAAI,CAEtBgrB,EAAAA,CAAAA,CAAK,IAAK,CAAA,YAAA,CAAa,IAAK,CAAA,CAC1B,KAAOx5B,CAAAA,CAAAA,CAAM,KACb,CAAA,KAAA,CAAOwO,CAAM,CAAA,IACf,CAAC,CAAA,CAIL,IAAMmrB,CAAAA,CAAgB35B,CAAuB,CAAA,UAAA,MAAkB,EAAC,CAChE,IAAWq2B,IAAAA,CAAAA,IAAMsD,CACfH,CAAAA,CAAAA,CAAK,IAAK,CAAA,YAAA,CAAc,IAAK,CAAA,CAC3B,KAAOx5B,CAAAA,CAAAA,CAAM,KACb,CAAA,IAAA,CAAMq2B,EAAG,IAAQ,EAAA,WAAA,CACjB,OAASA,CAAAA,CAAAA,CAAG,OACd,CAAC,CAGH,CAAA,IAAA,IAAWxoB,CAAYF,IAAAA,CAAAA,CAAU,SAAW,CAAA,CAC1C,GAAIE,CAAAA,CAAS,OAAS,WACpB,CAAA,SAGF,IAAM+rB,CAAAA,CAAyBhvB,CAC7BiD,CAAAA,CAAAA,CAAS,cACX,CAAA,CAEmB4rB,CAAa,CAAA,WAAA,CAAY,IACzC39B,CAAAA,CAAAA,EAAOA,CAAG,CAAA,IAAA,GAAS89B,CACtB,CAGEJ,EAAAA,CAAAA,CAAK,IAAK,CAAA,cAAA,CAAe,IAAK,CAAA,CAC5B,KAAOx5B,CAAAA,CAAAA,CAAM,KACb,CAAA,QAAA,CAAU6N,CACV,CAAA,QAAA,CAAUA,CAAS,CAAA,QAAA,CACnB,SAAUA,CAAS,CAAA,QACrB,CAAC,EAEL,CAEA,MACF,CAGA,IAAA,IAAWzN,CAAUuN,IAAAA,CAAAA,CAAU,OACV8rB,CAAAA,CAAAA,CAAa,OAAQ,CAAA,IAAA,CACrC/D,GACCA,CAAS,CAAA,IAAA,GAASt1B,CAAO,CAAA,YAAA,EACzBs1B,CAAS,CAAA,IAAA,GAASt1B,CAAO,CAAA,UAC7B,CAEEo5B,EAAAA,CAAAA,CAAK,IAAK,CAAA,YAAA,CAAa,IAAK,CAAA,CAC1B,MAAOx5B,CAAM,CAAA,KAAA,CACb,MAAQI,CAAAA,CACV,CAAC,CAAA,CAKL,IAAWA,IAAAA,CAAAA,IAAUq5B,CAAa,CAAA,OAAA,CACV9rB,CAAU,CAAA,OAAA,CAAQ,IACrC7B,CAAAA,CAAAA,EACCA,EAAY,YAAiB1L,GAAAA,CAAAA,CAAO,IACpC0L,EAAAA,CAAAA,CAAY,UAAe1L,GAAAA,CAAAA,CAAO,IACtC,CAAA,EAEEo5B,CAAK,CAAA,IAAA,CAAK,aAAc,CAAA,IAAA,CAAK,CAC3B,KAAA,CAAOx5B,EAAM,KACb,CAAA,MAAA,CAAQI,CAAO,CAAA,IACjB,CAAC,CAAA,CAKL,IAAWoO,IAAAA,CAAAA,IAASb,CAAU,CAAA,OAAA,CAEzB8rB,CAAa,CAAA,OAAA,CACX,GAAKC,CAAAA,CAAAA,EAAYA,EAAQ,IAAI,CAAA,CAC7B,QAASlrB,CAAAA,CAAAA,CAAM,IAAI,CAAA,EAEtBgrB,CAAK,CAAA,IAAA,CAAK,YAAa,CAAA,IAAA,CAAK,CAC1B,KAAA,CAAOx5B,CAAM,CAAA,KAAA,CACb,MAAOwO,CAAM,CAAA,IACf,CAAC,CAAA,CAKL,IAAMmrB,CAAAA,CAAgB35B,CAAuB,CAAA,UAAA,IAAkB,EAAA,EAC/D,CAAA,IAAA,IAAWq2B,CAAMsD,IAAAA,CAAAA,CACAF,EAAa,OAAQ,CAAA,IAAA,CACjCC,CAAYA,EAAAA,CAAAA,CAAQ,IAASrD,GAAAA,CAAAA,CAAG,IAAQqD,EAAAA,CAAAA,CAAQ,QACnD,CAAA,EAEEF,CAAK,CAAA,IAAA,CAAK,YAAc,CAAA,IAAA,CAAK,CAC3B,KAAOx5B,CAAAA,CAAAA,CAAM,KACb,CAAA,IAAA,CAAMq2B,CAAG,CAAA,IAAA,EAAQ,WACjB,CAAA,OAAA,CAASA,CAAG,CAAA,OACd,CAAC,CAAA,CAKL,IAAW7nB,IAAAA,CAAAA,IAASirB,EAAa,OAC3BjrB,CAAAA,CAAAA,CAAM,QAIYb,EAAAA,CAAAA,CAAU,OAC7B,CAAA,GAAA,CAAKksB,CAAeA,EAAAA,CAAAA,CAAW,IAAI,CAAA,CACnC,QAASrrB,CAAAA,CAAAA,CAAM,IAAI,CAAA,EAKtBgrB,EAAK,IAAK,CAAA,aAAA,CAAc,IAAK,CAAA,CAC3B,KAAOx5B,CAAAA,CAAAA,CAAM,KACb,CAAA,KAAA,CAAOwO,CAAM,CAAA,IACf,CAAC,CAAA,CAIH,IAAWkrB,IAAAA,CAAAA,IAAWD,CAAa,CAAA,OAAA,CAAS,CAC1C,GAAI,CAACC,CAAAA,CAAQ,QACX,CAAA,SAAA,CAEsB15B,CAAuB,CAAA,UAAA,IAAkB,EAAA,EAC9D,EAAA,GAAA,CAAK,CAAM,EAAA,CAAA,CAAE,IAAI,CACjB,CAAA,QAAA,CAAS05B,CAAQ,CAAA,IAAI,CAEtBF,EAAAA,CAAAA,CAAK,IAAK,CAAA,aAAA,CAAe,IAAK,CAAA,CAC5B,KAAOx5B,CAAAA,CAAAA,CAAM,KACb,CAAA,IAAA,CAAM05B,EAAQ,IAChB,CAAC,EAEL,CAGA,IAAWt5B,IAAAA,CAAAA,IAAUuN,CAAU,CAAA,OAAA,CAAS,CACtC,IAAM+nB,CAAW+D,CAAAA,CAAAA,CAAa,OAAQ,CAAA,IAAA,CACnCK,GACCA,CAAM,CAAA,IAAA,GAAS15B,CAAO,CAAA,YAAA,EACtB05B,CAAM,CAAA,IAAA,GAAS15B,CAAO,CAAA,UAC1B,CAEA,CAAA,GAAI,CAACs1B,CAAAA,CACH,SAGF,IAAMqE,EAAkB,CAACP,CAAAA,CAAK,eAC5B9D,CAAAA,CAAAA,CACAt1B,CACAq5B,CAAAA,CAAAA,CAAa,OACf,CAAA,CACMO,CAAgBR,CAAAA,CAAAA,CAAK,gBAAiB,CAAA,CAC1C,KAAOx5B,CAAAA,CAAAA,CAAM,MACb,SAAW01B,CAAAA,CAAAA,CACX,WAAat1B,CAAAA,CACf,CAAC,CAAA,CAAA,CAEG25B,CAAmBC,EAAAA,CAAAA,GACrBR,CAAK,CAAA,IAAA,CAAK,eAAgB,CAAA,IAAA,CAAK,CAC7B,KAAA,CAAOx5B,EAAM,KACb,CAAA,SAAA,CAAW01B,CACX,CAAA,WAAA,CAAat1B,CACf,CAAC,EAEL,CAGA,IAAWyN,IAAAA,CAAAA,IAAYF,CAAU,CAAA,SAAA,CAAW,CAC1C,GACEE,EAAS,IAAS,GAAA,WAAA,EAClBA,CAAS,CAAA,IAAA,GAAS,YAElB,CAAA,SAGF,GACEA,CAAAA,CAAS,IAAS,GAAA,YAAA,EAClBA,CAAS,CAAA,iBAAA,CACT,CACA,IAAM2pB,EAAe5sB,CACnBiD,CAAAA,CAAAA,CAAS,iBAAkB,CAAA,YAC7B,CAGA2rB,CAAAA,CAAAA,CAAK,IAAK,CAAA,cAAA,CAAe,IAAK,CAAA,CAC5B,KAAOhC,CAAAA,CAAAA,CACP,QAAU,CAAA,CACR,iBACA,KAAO,CAAA,IAAMx3B,CACb,CAAA,UAAA,CAAY4K,CACViD,CAAAA,CAAAA,CAAS,iBAAkB,CAAA,cAC7B,CACA,CAAA,UAAA,CAAYA,CAAS,CAAA,iBAAA,CAAkB,cACvC,CAAA,cAAA,CAAgBA,EAAS,cACrBjD,CAAAA,CAAAA,CAAeiD,CAAS,CAAA,cAAc,CACtCyD,CAAAA,CAAAA,CACEkmB,CACA5sB,CAAAA,CAAAA,CACEiD,CAAS,CAAA,iBAAA,CAAkB,cACzBqD,EAAAA,EAAAA,CAAqBlR,CAAM,CAAA,KAAK,CACpC,CACAA,CAAAA,CAAAA,CAAM,KACR,CAAA,CACJ,QAAU6N,CAAAA,CAAAA,CAAS,QACnB,CAAA,QAAA,CAAUA,CAAS,CAAA,QACrB,CACA,CAAA,QAAA,CAAUA,CAAS,CAAA,QAAA,CACnB,SAAUA,CAAS,CAAA,QACrB,CAAC,CAAA,CACD,QACF,CAEA,IAAMosB,CAAAA,CAAervB,CAAeiD,CAAAA,CAAAA,CAAS,cAAc,CAAA,CAC3D,GACEosB,CAAAA,EACAR,EAAa,WAAY,CAAA,IAAA,CAAM39B,CAAOA,EAAAA,CAAAA,CAAG,IAASm+B,GAAAA,CAAY,CAE9D,CAAA,SAGiBR,CAAa,CAAA,WAAA,CAAY,IAAM39B,CAAAA,CAAAA,EAChD09B,CAAK,CAAA,yBAAA,CAA0Bx5B,EAAO6N,CAAU/R,CAAAA,CAAE,CACpD,CAAA,EAGE09B,CAAK,CAAA,IAAA,CAAK,cAAe,CAAA,IAAA,CAAK,CAC5B,KAAA,CAAOx5B,CAAM,CAAA,KAAA,CACb,QAAU6N,CAAAA,CAAAA,CACV,SAAUA,CAAS,CAAA,QAAA,CACnB,QAAUA,CAAAA,CAAAA,CAAS,QACrB,CAAC,EAEL,CAGA,IAAMqsB,CAAAA,CAAuB,IAAI,GAAA,CAC/BvsB,CAAU,CAAA,SAAA,CACP,OAAQwsB,CAAQA,EAAAA,CAAAA,CAAI,IAAS,GAAA,WAAsB,CACnD,CAAA,GAAA,CAAKA,CAAQ,EAAA,CACZ,IAAMC,CAAAA,CAASxvB,CAAeuvB,CAAAA,CAAAA,CAAI,UAAU,CAAA,EAAKA,EAAI,UAI/CE,CAAAA,CAAAA,CAHKr6B,CACR,CAAA,UAAA,EACA,CAAA,IAAA,CAAMK,CAAMA,EAAAA,CAAAA,CAAE,UAAe+5B,GAAAA,CAAM,CACpB,EAAA,YAAA,EAAgBA,CAClC,CAAA,OACExvB,EAAeuvB,CAAI,CAAA,cAAc,CACjC7oB,EAAAA,CAAAA,CACEtR,CAAM,CAAA,KAAA,CACNq6B,CACAF,CAAAA,CAAAA,CAAI,KAAM,EAAA,CAAE,KACd,CAEJ,CAAC,CACL,EAEA,IAAWG,IAAAA,CAAAA,IAAcb,CAAa,CAAA,WAAA,CAAa,CACjD,GAAIa,CAAW,CAAA,IAAA,EAAQJ,CAAqB,CAAA,GAAA,CAAII,CAAW,CAAA,IAAI,CAC7D,CAAA,SAGoB3sB,EAAU,SAAU,CAAA,IAAA,CAAMwsB,CAE5CA,EAAAA,CAAAA,CAAI,IAAS,GAAA,WAAA,EACbA,CAAI,CAAA,IAAA,GAAS,YAEN,CAAA,KAAA,CAEFX,CAAK,CAAA,yBAAA,CACVx5B,CACAm6B,CAAAA,CAAAA,CACAG,CACF,CACD,CAAA,EAGCd,CAAK,CAAA,IAAA,CAAK,eAAgB,CAAA,IAAA,CAAK,CAC7B,KAAA,CAAOx5B,CAAM,CAAA,KAAA,CACb,QAAUs6B,CAAAA,CACZ,CAAC,EAEL,CAGA,IAAWC,IAAAA,CAAAA,IAAiB5sB,CAAU,CAAA,SAAA,CAAW,CAC/C,GACE4sB,CAAc,CAAA,IAAA,GAAS,WACvBA,EAAAA,CAAAA,CAAc,IAAS,GAAA,YAAA,CAEvB,SAGF,IAAMD,EAAab,CAAa,CAAA,WAAA,CAAY,IAAM39B,CAAAA,CAAAA,EAChD09B,CAAK,CAAA,yBAAA,CAA0Bx5B,CAAOu6B,CAAAA,CAAAA,CAAez+B,CAAE,CACzD,CAGEw+B,CAAAA,CAAAA,EACA,CAACd,CAAAA,CAAK,kBAAkBc,CAAYC,CAAAA,CAAa,CAEjDf,EAAAA,CAAAA,CAAK,IAAK,CAAA,iBAAA,CAAkB,IAAK,CAAA,CAC/B,KAAOx5B,CAAAA,CAAAA,CAAM,KACb,CAAA,UAAA,CAAYs6B,CACZ,CAAA,aAAA,CAAeC,EACf,QAAUA,CAAAA,CAAAA,CAAc,QACxB,CAAA,QAAA,CAAUA,CAAc,CAAA,QAC1B,CAAC,EAEL,CAGA,IAAMC,CAAkBx6B,CAAAA,CAAAA,CAAM,UAkB9B,CAAA,GAjBIw6B,GAAmB,CAACf,CAAAA,CAAa,UACnCD,EAAAA,CAAAA,CAAK,IAAK,CAAA,gBAAA,CAAiB,IAAK,CAAA,CAC9B,KAAOx5B,CAAAA,CAAAA,CAAM,KACb,CAAA,OAAA,CAAS,CAACw6B,CAAe,CAC3B,CAAC,CAAA,CAICf,CAAa,CAAA,UAAA,EAAc,CAACe,CAAAA,EAC9BhB,CAAK,CAAA,IAAA,CAAK,iBAAkB,CAAA,IAAA,CAAK,CAC/B,KAAA,CAAOx5B,CAAM,CAAA,KAAA,CACb,QAASy5B,CAAa,CAAA,UAAA,CAAW,OACjC,CAAA,IAAA,CAAMA,CAAa,CAAA,UAAA,CAAW,IAChC,CAAC,CAICe,CAAAA,CAAAA,EAAmBf,CAAa,CAAA,UAAA,CAAY,CAC9C,IAAMgB,EAAwBz6B,CAC3B,CAAA,UAAA,EACA,CAAA,IAAA,CAAM2K,CAAQA,EAAAA,CAAAA,CAAI,UAAe6vB,GAAAA,CAAe,CAGjDC,CAAAA,CAAAA,EACA,CAACjB,CAAAA,CAAK,mBACJC,CAAAA,CAAAA,CAAa,WACbgB,CACF,CAAA,EAEAjB,CAAK,CAAA,IAAA,CAAK,mBAAoB,CAAA,IAAA,CAAK,CACjC,KAAA,CAAOx5B,CAAM,CAAA,KAAA,CACb,YAAcy5B,CAAAA,CAAAA,CAAa,UAC3B,CAAA,eAAA,CAAiBe,CACnB,CAAC,EAEL,CACF,CAAC,CACH,CAAA,CAEA,MAAMhB,CAAAA,CAAK,iBAAkB,EAAA,CAE7B,MAAMA,CAAAA,CAAK,mBAAoB,EAAA,CAExBA,CACT,CAEA,gBAA6B,EAAA,CAC3B,IAAMtE,CAAAA,CAAa,IAAK,CAAA,uBAAA,EACxB,CAAA,OAAO,MAAO,CAAA,MAAA,CAAOA,CAAU,CAAA,CAAE,IAAK,EACxC,CAMQ,uBAA4D,EAAA,CAClE,IAAMwF,CAAAA,CAAqB,IAAI/E,EAAAA,CAA4B,IAAK,CAAA,GAAG,CAC7DT,CAAAA,CAAAA,CAAawF,CAAmB,CAAA,kBAAA,CAAmB,IAAK,CAAA,IAAI,EAC5DC,CACJD,CAAAA,CAAAA,CAAmB,mBAAoBxF,CAAAA,CAAU,CAE7C0F,CAAAA,CAAAA,CAAsD,CACzD,kBAAA,CAAoC,EAAC,CACrC,mBAAqC,CAAA,EACrC,CAAA,sBAAA,CAAwC,EAC3C,CAAA,CAEA,IAAWjC,IAAAA,CAAAA,IAAagC,CACtBC,CAAAA,CAAAA,CAAkBjC,CAAU,CAAA,KAAK,CAAE,CAAA,IAAA,CAAK,GAAGA,CAAAA,CAAU,aAAa,CAAA,CAGpE,OAAOiC,CACT,CAEQ,eACNlF,CAAAA,CAAAA,CACA5pB,CACA+uB,CAAAA,CAAAA,CAA8B,EAAC,CACtB,CAET,IAAIC,CAAgBpF,CAAAA,CAAAA,CAAS,IAAS5pB,GAAAA,CAAAA,CAAY,aAE5CitB,CAAU,CAAA,IAAA,CAAK,GAAI,CAAA,SAAA,EACnBgC,CAAAA,CAAAA,CAAmBjC,EAAoBC,CAAAA,CAAAA,CAASrD,CAAS,CAAA,QAAQ,CACjEsF,CAAAA,CAAAA,CACJ,OAAOlvB,CAAAA,CAAY,MAAS,QACxBgtB,CAAAA,EAAAA,CAAoBC,CAASjtB,CAAAA,CAAAA,CAAY,IAAI,CAAA,CAC7C,MAEFkvB,CAAAA,CAAAA,EACFF,CAAkBC,GAAAA,CAAAA,CAAAA,CAAAA,GAAqBC,CAGrClvB,CAAAA,CAAAA,CAAAA,CAAY,MAAU,EAAA,IAAA,EAAQ4pB,EAAS,MAAU,EAAA,IAAA,EACnDoF,CAAkBpF,GAAAA,CAAAA,CAAAA,CAAAA,CAAS,MAAW5pB,GAAAA,CAAAA,CAAY,MAGpD,CAAA,CAAA,IAAMmvB,CACJD,CAAAA,CAAAA,GAAwB,MACxBA,EAAAA,CAAAA,GAAwB,QACxBA,EAAAA,CAAAA,GAAwB,QAuC1B,GArCIlvB,CAAAA,CAAY,SAAa,EAAA,IAAA,EAAQ4pB,CAAS,CAAA,SAAA,EAAa,IAEtDqD,GAAAA,CAAAA,CAAAA,GAAY,UAAcA,EAAAA,CAAAA,GAAY,aACvCkC,GAAAA,CAAAA,EAIAH,CAAkBpF,GAAAA,CAAAA,CAAAA,CAAAA,CAAS,YAAc5pB,CAAY,CAAA,SAAA,CAAA,CAAA,CAIrDA,CAAY,CAAA,KAAA,EAAS,IAAQ4pB,EAAAA,CAAAA,CAAS,KAAS,EAAA,IAAA,GAAA,CAE9CqD,CAAY,GAAA,UAAA,EAAcA,CAAY,GAAA,aAAA,GACvCkC,CAIAH,EAAAA,CAAAA,GAAAA,CAAAA,CAAkBpF,EAAS,KAAU5pB,GAAAA,CAAAA,CAAY,KAIjD,CAAA,CAAA,CAAA,OAAOA,CAAY,CAAA,IAAA,EAAS,QAE5BkvB,GAAAA,CAAAA,GAAwB,WAAeA,EAAAA,CAAAA,GAAwB,MAG7DlvB,CAAAA,EAAAA,CAAAA,CAAY,YAAiB,GAAA,MAAA,EAC7B4pB,EAAS,YAAiB,GAAA,MAAA,EAE1BoF,CACE,GAAA,CAAA,CAAA,CAAC,CAACpF,CAAAA,CAAS,YAAiB,EAAA,CAAC,CAAC5pB,CAAAA,CAAY,YAM9CA,CAAAA,CAAAA,CAAAA,CAAY,WAAa,EAAA,QAAA,GAAa,OAAW,CACnD,IAAMovB,CAAgBpvB,CAAAA,CAAAA,CAAY,WAAY,CAAA,QAAA,CACxCqvB,CAAazF,CAAAA,CAAAA,CAAS,UAE5BoF,CAAAA,CAAAA,CAAgBA,CADMI,EAAAA,CAAAA,GAAkBC,EAE1C,CAEA,OAAOL,CACT,CAEQ,iBACNR,CAAAA,CAAAA,CACAC,CACS,CAAA,CACT,IAAMX,CAAAA,CAAyBhvB,CAAe2vB,CAAAA,CAAAA,CAAc,cAAc,CAAA,CAEtEO,CAAgBlB,CAAAA,CAAAA,CAChBU,EAAW,IAASV,GAAAA,CAAAA,CACpB,IACJ,CAAA,GAAIW,CAAc,CAAA,IAAA,GAAS,WAAwB,CAAA,CACjD,IAAM/pB,CAAAA,CAAe+pB,CAAc,CAAA,KAAA,EAC7BjD,CAAAA,CAAAA,CAAS9mB,EAAa,UAAc,EAAA,IAAA,CACpC+mB,CAAW/mB,CAAAA,CAAAA,CACd,UAAW,EAAA,CACX,IAAMnQ,CAAAA,CAAAA,EAAMA,CAAE,CAAA,UAAA,GAAei3B,CAAM,CAAA,CAChC8D,CAAmB5qB,CAAAA,CAAAA,CAAa,KAChC6qB,CAAAA,CAAAA,CAAoB9D,CAAU,EAAA,YAAA,EAAgBD,CAEpDwD,CAAAA,CAAAA,CACEA,CACAR,EAAAA,CAAAA,CAAW,eAAoBc,GAAAA,CAAAA,EAC/B,CAAC,CAACd,CAAW,CAAA,iBAAA,EACbA,CAAW,CAAA,iBAAA,CAAkB,SAAW,CACxCA,EAAAA,CAAAA,CAAW,iBAAkB,CAAA,CAAC,CAAMe,GAAAA,EACxC,CACEd,KAAAA,GAAAA,CAAAA,CAAc,IAAS,GAAA,YAAA,EACvBA,CAAc,CAAA,iBAAA,CACd,CACA,IAAMe,EAAuB1wB,CAC3B2vB,CAAAA,CAAAA,CAAc,iBAAkB,CAAA,YAClC,CACAO,CAAAA,CAAAA,CACEA,CAAiBR,EAAAA,CAAAA,CAAW,eAAoBgB,GAAAA,EACpD,CAEA,IAAMC,CAAajB,CAAAA,CAAAA,CAAW,UAAU,WAAY,EAAA,CAC9CkB,CAAalB,CAAAA,CAAAA,CAAW,QAAU,EAAA,WAAA,EAClCmB,CAAAA,CAAAA,CAAgBlB,CAAc,CAAA,QAAA,EAAU,WAAY,EAAA,CACpDmB,CAAgBnB,CAAAA,CAAAA,CAAc,UAAU,WAAY,EAAA,CAE1D,OAAIkB,CAAAA,EACFX,CAAkBS,GAAAA,CAAAA,CAAAA,CAAAA,GAAeE,CAG/BC,CAAAA,CAAAA,CAAAA,EACFZ,CAAkBU,GAAAA,CAAAA,CAAAA,CAAAA,GAAeE,CAG5BZ,CAAAA,CAAAA,CACT,CAEQ,yBAAA,CACN96B,EACAu6B,CACAD,CAAAA,CAAAA,CACS,CACT,IAAI9pB,CACEmrB,CAAAA,CAAAA,CAAUpB,CAChB,CAAA,GAAIoB,CAAMA,EAAAA,CAAAA,CAAG,KACX,CAAA,CAAA,GAAI,OAAOA,CAAAA,CAAG,OAAU,UAAcA,EAAAA,CAAAA,CAAG,KAAM,CAAA,KAAA,CAC7CnrB,CAAemrB,CAAAA,CAAAA,CAAG,KACT,CAAA,KAAA,GAAA,OAAOA,CAAG,CAAA,KAAA,EAAU,UAC7B,CAAA,GAAI,CACF,IAAMzwB,EAAIywB,CAAG,CAAA,KAAA,EACTzwB,CAAAA,CAAAA,EAAKA,CAAE,CAAA,KAAA,GACTsF,CAAetF,CAAAA,CAAAA,EAEnB,CAAY,KAAA,EAIhB,CAAA,GAAI,CAACsF,CAAAA,CACH,OAAO,MAET,CAAA,IAAMorB,CACJrB,CAAAA,CAAAA,CAAc,IAAS,GAAA,WAAA,CACnB/pB,CAAa,CAAA,KAAA,CACb+pB,CAAc,CAAA,IAAA,GAAS,YACrBA,EAAAA,CAAAA,CAAc,iBACd3vB,CAAAA,CAAAA,CAAe2vB,EAAc,iBAAkB,CAAA,YAAY,CAC3D,CAAA,MAAA,CAER,GACEqB,CAAAA,EACAtB,CAAW,CAAA,eAAA,GAAoBsB,CAE/B,CAAA,OAAO,MAGT,CAAA,IAAMC,CAASjxB,CAAAA,CAAAA,CAAe2vB,EAAc,cAAc,CAAA,CAC1D,GAAIsB,CAAAA,EAAUvB,CAAW,CAAA,IAAA,EAAQuB,CAAWvB,GAAAA,CAAAA,CAAW,IACrD,CAAA,OAAO,MAGT,CAAA,IAAMhvB,CAAetL,CAAAA,CAAAA,CAAM,YAEvB87B,CAAAA,CAAAA,CAAAA,CADkBH,CAAG,CAAA,IAAA,EAAyB,WAE/B,IAAA,WAAA,CACb/wB,CAAe+wB,CAAAA,CAAAA,CAAG,UAAU,CAAA,CAC5BA,CAAG,CAAA,UAAA,CACHI,CAAKzwB,CAAAA,CAAAA,CAAa,KAAMjL,CAAMA,EAAAA,CAAAA,CAAE,UAAey7B,GAAAA,CAAW,CAC5DC,CAAAA,CAAAA,GACFD,CAAcC,CAAAA,CAAAA,CAAG,YAGnB,CAAA,CAAA,IAAMC,CAAmBxrB,CAAAA,CAAAA,CAAa,UAAc,EAAA,IAAA,CAI9CyrB,EAHYzrB,CACf,CAAA,UAAA,EACA,CAAA,IAAA,CAAMnQ,CAAMA,EAAAA,CAAAA,CAAE,UAAe27B,GAAAA,CAAgB,CACZ,EAAA,YAAA,EAAgBA,CAEpD,CAAA,OACE1B,CAAW,CAAA,OAAA,CAAQ,SAAW,CAC9BA,EAAAA,CAAAA,CAAW,OAAQ,CAAA,CAAC,CAAMwB,GAAAA,CAAAA,EAC1BxB,CAAW,CAAA,iBAAA,CAAkB,MAAW,GAAA,CAAA,EACxCA,CAAW,CAAA,iBAAA,CAAkB,CAAC,CAAA,GAAM2B,CAExC,CAEQ,mBAAA,CACNC,CACAzB,CAAAA,CAAAA,CACS,CACT,GAAIyB,CAAa,CAAA,OAAA,CAAQ,MAAW,GAAA,CAAA,CAClC,OAAO,MAAA,CAIT,IAAMC,CAAAA,CADqBD,CAAa,CAAA,OAAA,CAAQ,CAAC,CAAA,GAExBzB,CAAsB,CAAA,YAAA,CAEzC2B,CACJ,CAAA,CAACF,CAAa,CAAA,IAAA,EACd,CAACzB,CAAAA,CAAsB,wBACvByB,EAAAA,CAAAA,CAAa,IAASzB,GAAAA,CAAAA,CAAsB,yBAE9C,OAAO0B,CAAAA,EAAgBC,CACzB,CACQ,gBAAiBxE,CAAAA,CAAAA,CAIE,CACzB,IAAMmB,CAAU,CAAA,IAAA,CAAK,GAAI,CAAA,SAAA,EACnBgC,CAAAA,CAAAA,CAAmBjC,GACvBC,CACAnB,CAAAA,CAAAA,CAAW,SAAU,CAAA,QACvB,CACMoD,CAAAA,CAAAA,CACJ,OAAOpD,CAAAA,CAAW,WAAY,CAAA,IAAA,EAAS,QACnCkB,CAAAA,EAAAA,CAAoBC,CAASnB,CAAAA,CAAAA,CAAW,YAAY,IAAI,CAAA,CACxD,MAyBN,CAAA,GAxBIoD,CAAuBD,EAAAA,CAAAA,GAAqBC,CAI9CpD,EAAAA,CAAAA,CAAW,WAAY,CAAA,MAAA,EAAU,IACjCA,EAAAA,CAAAA,CAAW,SAAU,CAAA,MAAA,EAAU,MAC/BA,CAAW,CAAA,SAAA,CAAU,MAAWA,GAAAA,CAAAA,CAAW,WAAY,CAAA,MAAA,EAKvDA,CAAW,CAAA,WAAA,CAAY,SAAa,EAAA,IAAA,EACpCA,CAAW,CAAA,SAAA,CAAU,SAAa,EAAA,IAAA,EAClCA,EAAW,SAAU,CAAA,SAAA,GAAcA,CAAW,CAAA,WAAA,CAAY,SAK1DA,EAAAA,CAAAA,CAAW,WAAY,CAAA,KAAA,EAAS,IAChCA,EAAAA,CAAAA,CAAW,SAAU,CAAA,KAAA,EAAS,IAC9BA,EAAAA,CAAAA,CAAW,UAAU,KAAUA,GAAAA,CAAAA,CAAW,WAAY,CAAA,KAAA,EAKtD,OAAOA,CAAAA,CAAW,WAAY,CAAA,IAAA,EAAS,QACtCoD,GAAAA,CAAAA,GAAwB,WAAeA,EAAAA,CAAAA,GAAwB,MAChEpD,CAAAA,EAAAA,CAAAA,CAAW,YAAY,YAAiB,GAAA,MAAA,EACxCA,CAAW,CAAA,SAAA,CAAU,YAAiB,GAAA,MAAA,EACtC,CAAC,CAACA,CAAW,CAAA,SAAA,CAAU,YACrB,EAAA,CAAC,CAACA,CAAAA,CAAW,YAAY,YAE3B,CAAA,OAAO,MAET,CAAA,IAAMyE,CACJzE,CAAAA,CAAAA,CAAW,WAAY,CAAA,WAAA,EAAa,OAAY,GAAA,MAAA,CAC5C0E,CACJ1E,CAAAA,CAAAA,CAAW,SAAU,CAAA,YAAA,GAAiB,MACtCA,CAAW,CAAA,SAAA,CAAU,YAAiB,GAAA,MAAA,CACxC,GAAIyE,CAAAA,EAAmB,CAACC,CAAAA,CACtB,OAAO,KAAA,CAET,GAAI,CAACD,CAAmBC,EAAAA,CAAAA,CACtB,OAAO,MAET,CAAA,GAAID,CAAmBC,EAAAA,CAAAA,CAAc,CACnC,IAAMC,CAAY,CAAA,MAAA,CAAO3E,CAAW,CAAA,SAAA,CAAU,YAAY,CAAA,CACpD4E,CAAe,CAAA,MAAA,CACnB5E,EAAW,WAAY,CAAA,WAAA,EAAa,OACtC,CAAA,CAEM6E,CAAS,CAAA,IAAA,CAAK,qBAClB1D,CAAAA,CAAAA,CACAgC,CACAwB,CAAAA,CACF,CACMG,CAAAA,CAAAA,CAAY,IAAK,CAAA,qBAAA,CACrB3D,EACAiC,CAAuBD,EAAAA,CAAAA,CACvByB,CACF,CAAA,CACA,OAAOC,CAAAA,GAAWC,CAAY,CAAA,KAAA,CAAQ,KACxC,CACA,OAAO,MACT,CAEQ,qBAAA,CACN3D,EACAhI,CACAl5B,CAAAA,CAAAA,CACQ,CACR,IAAIqT,CAAI,CAAA,MAAA,CAAOrT,CAAK,CAAA,CAAE,IAAK,EAAA,CAC3B,GAAI,CAACqT,CACH,CAAA,OAAOA,EAET,GAAI6tB,CAAAA,GAAY,UAAcA,EAAAA,CAAAA,GAAY,aAAe,CAAA,CAEvD,GAAIhI,CAAAA,GAAa,MAAUA,EAAAA,CAAAA,GAAa,OACtC,CAAA,GAAI,CAEF7lB,CAAAA,CAAIA,EAAE,OAAQ,CAAA,aAAA,CAAe,IAAI,CAAA,CACjCA,CAAIA,CAAAA,CAAAA,CAAE,OAAQ,CAAA,gCAAA,CAAkC,EAAE,CAAA,CAGlD,IAAMyxB,CAAAA,CAAezxB,CAAE,CAAA,KAAA,CAAM,WAAW,CAMxC,CAAA,GALIyxB,CACFzxB,GAAAA,CAAAA,CAAIyxB,CAAa,CAAA,CAAC,CAIhBzxB,CAAAA,CAAAA,CAAAA,GAAM,IAAQA,EAAAA,CAAAA,GAAM,EACtB,CAAA,OAAO,IAIT,CAAA,IAAM1D,EAAS,IAAK,CAAA,KAAA,CAAM0D,CAAC,CAAA,CAC3B,OAAO,IAAA,CAAK,SAAU1D,CAAAA,CAAM,CAC9B,CAAA,KAAY,EAMd0D,CAAIA,CAAAA,CAAAA,CAAE,QAAQ,aAAe,CAAA,IAAI,CACjCA,CAAAA,CAAAA,CAAIA,CAAE,CAAA,OAAA,CAAQ,uBAAyB,CAAA,EAAE,CACzC,CAAA,IAAMyxB,CAAezxB,CAAAA,CAAAA,CAAE,KAAM,CAAA,WAAW,EAIxC,OAHIyxB,CAAAA,GACFzxB,CAAIyxB,CAAAA,CAAAA,CAAa,CAAC,CAAA,CAAA,CAEhB,SAAU,CAAA,IAAA,CAAKzxB,CAAC,CAAA,CACX,MAEL,CAAA,UAAA,CAAW,IAAKA,CAAAA,CAAC,EACZ,OAEL,CAAA,SAAA,CAAU,IAAKA,CAAAA,CAAC,CACX,CAAA,MAAA,EAGAA,CAGX,CAAA,CACA,GAAI6tB,CAAAA,GAAY,SAAWA,CAAY,GAAA,SAAA,CAAW,CAChD7tB,CAAAA,CAAIA,CAAE,CAAA,OAAA,CAAQ,aAAe,CAAA,IAAI,CACjC,CAAA,IAAMyxB,CAAezxB,CAAAA,CAAAA,CAAE,KAAM,CAAA,WAAW,EAIxC,OAHIyxB,CAAAA,GACFzxB,CAAIyxB,CAAAA,CAAAA,CAAa,CAAC,CAAA,CAAA,CAEhB,kCAAmC,CAAA,IAAA,CAAKzxB,CAAC,CAAA,CACpC,mBAEFA,CAAAA,CACT,CACA,GAAI6tB,IAAY,QAAU,CAAA,CACxB7tB,CAAIA,CAAAA,CAAAA,CAAE,OAAQ,CAAA,aAAA,CAAe,IAAI,CAAA,CACjC,IAAMyxB,CAAAA,CAAezxB,CAAE,CAAA,KAAA,CAAM,WAAW,CAAA,CACxC,OAAIyxB,CACFzxB,GAAAA,CAAAA,CAAIyxB,CAAa,CAAA,CAAC,CAEbzxB,CAAAA,CAAAA,CAAAA,CAAE,WAAY,EACvB,CACA,OAAOA,CACT,CAEA,MAAc,iBAAA,EAAmC,CAC/C,IAAM0xB,CAAAA,CAAY,IAAI,GAAA,CACtB,IAAW58B,IAAAA,CAAAA,IAAS,IAAK,CAAA,MAAA,CAAQ,CAC/B,IAAMgT,CAAYhT,CAAAA,CAAAA,CAAM,YAAa,EAAA,CACrC,QAAW6N,CAAYmF,IAAAA,CAAAA,CAAW,CAOhC,GALEnF,CAAS,CAAA,IAAA,GAAS,YAClB,EAAA,CAACA,CAAS,CAAA,iBAAA,EAIRA,CAAS,CAAA,iBAAA,CAAkB,gBAC7B,CAAA,SAGF,IAAM2pB,CAAe5sB,CAAAA,CAAAA,CACnBiD,CAAS,CAAA,iBAAA,CAAkB,YAC7B,CAAA,CACA,GAAI+uB,CAAAA,CAAU,GAAIpF,CAAAA,CAAY,CAC5B,CAAA,SAEFoF,CAAU,CAAA,GAAA,CAAIpF,CAAY,CAE1B,CAAA,IAAM1pB,CAAY,CAAA,IAAA,CAAK,MAAO,CAAA,IAAA,CAC3B2mB,CAAMA,EAAAA,CAAAA,CAAE,KAAU5mB,GAAAA,CAAAA,EAAU,iBAAmB,EAAA,YAClD,CACMU,CAAAA,CAAAA,CAAaV,EAAS,KAAM,EAAA,CAClC,GAAI,CAACC,CAAa,EAAA,CAACS,CACjB,CAAA,SAGF,IAAMsuB,CAAAA,CAAa/uB,CAAU,CAAA,UAAA,EAAc,IACrCgvB,CAAAA,CAAAA,CAAcvuB,EAAW,UAAc,EAAA,IAAA,CACvCwuB,CAASjvB,CAAAA,CAAAA,CACZ,UAAW,EAAA,CACX,IAAMzN,CAAAA,CAAAA,EAAMA,CAAE,CAAA,UAAA,GAAew8B,CAAU,CAAA,CACpCG,CAAUzuB,CAAAA,CAAAA,CACb,YACA,CAAA,IAAA,CAAMlO,CAAMA,EAAAA,CAAAA,CAAE,UAAey8B,GAAAA,CAAW,CAC3C,CAAA,GAAI,CAACC,CAAAA,EAAU,CAACC,CAAAA,CACd,SAGF,IAAMC,CACJryB,CAAAA,CAAAA,CAAeiD,CAAS,CAAA,iBAAA,CAAkB,cAAc,CAAA,EACxDgvB,CACIK,CAAAA,CAAAA,CACJtyB,CAAeiD,CAAAA,CAAAA,CAAS,iBAAkB,CAAA,eAAe,CACzDivB,EAAAA,CAAAA,CAEIK,CAAY,CAAA,MAAM,KAAK,GAAI,CAAA,cAAA,CAAe3F,CAAY,CAAA,CAC5D,GAAI,CAAC2F,CAAU,CAAA,OAAA,CAAQ,MAAQ,CAAA,CAC7B,IAAK,CAAA,IAAA,CAAK,WAAY,CAAA,IAAA,CAAK,CACzB,KAAO3F,CAAAA,CAAAA,CACP,OAAS,CAAA,CACP,IAAK,CAAA,eAAA,CAAgBuF,CAAQE,CAAAA,CAAU,CACvC,CAAA,IAAA,CAAK,eAAgBD,CAAAA,CAAAA,CAASE,CAAW,CAC3C,CACF,CAAC,CAAA,CAED,IAAK,CAAA,kBAAA,CAAmB,CACtB,YAAA,CAAA1F,CACA,CAAA,SAAA,CAAA1pB,CACA,CAAA,UAAA,CAAAS,CACA,CAAA,UAAA,CAAA0uB,CACA,CAAA,WAAA,CAAAC,EACA,QAAUrvB,CAAAA,CAAAA,CAAS,QACnB,CAAA,QAAA,CAAUA,CAAS,CAAA,QAAA,CACnB,cAAgB,CAAA,MAClB,CAAC,CAAA,CACD,QACF,CAEA,IAAMuvB,CAAAA,CAAe,KAAK,eAAgBL,CAAAA,CAAAA,CAAQE,CAAU,CAAA,CACtDI,CAAgB,CAAA,IAAA,CAAK,eAAgBL,CAAAA,CAAAA,CAASE,CAAW,CAAA,CACzDI,CAAYH,CAAAA,CAAAA,CAAU,OAAQ,CAAA,IAAA,CAAM98B,GAAMA,CAAE,CAAA,IAAA,GAAS48B,CAAU,CAAA,CAC/DM,CAAaJ,CAAAA,CAAAA,CAAU,OAAQ,CAAA,IAAA,CAClC98B,CAAMA,EAAAA,CAAAA,CAAE,IAAS68B,GAAAA,CACpB,CACMM,CAAAA,CAAAA,CAAYF,EACd,IAAK,CAAA,eAAA,CAAgBA,CAAWF,CAAAA,CAAAA,CAAcD,CAAU,CAAA,OAAO,CAC/D,CAAA,KAAA,CACEM,CAAaF,CAAAA,CAAAA,CACf,IAAK,CAAA,eAAA,CAAgBA,CAAYF,CAAAA,CAAAA,CAAeF,EAAU,OAAO,CAAA,CACjE,KAGJ,CAAA,IAAA,IAAWrhC,CAAMqhC,IAAAA,CAAAA,CAAU,WAAa,CAAA,CACtC,IAAMO,CAAAA,CAAS5hC,CAAG,CAAA,eAAA,GAAoBgS,CAAU,CAAA,KAAA,CAC1C6vB,GAAU7hC,CAAG,CAAA,eAAA,GAAoByS,CAAW,CAAA,KAAA,CAClD,GAAI,CAACmvB,CAAU,EAAA,CAACC,EACd,CAAA,SAEF,IAAM1D,EAAAA,CAAeyD,CAAST,CAAAA,CAAAA,CAAaC,EACrCU,EAAa9hC,CAAAA,CAAAA,CAAG,OAAQ,CAAA,CAAC,CAC3B8hC,CAAAA,EAAAA,EAAcA,EAAe3D,GAAAA,EAAAA,GAC/B,IAAK,CAAA,IAAA,CAAK,eAAgB,CAAA,IAAA,CAAK,CAC7B,KAAA,CAAOzC,EACP,QAAU17B,CAAAA,CACZ,CAAC,CAAA,CACG8hC,EAAeX,GAAAA,CAAAA,EAAcW,EAAeV,GAAAA,CAAAA,EAC9C,IAAK,CAAA,IAAA,CAAK,aAAc,CAAA,IAAA,CAAK,CAC3B,KAAA,CAAO1F,EACP,MAAQoG,CAAAA,EACV,CAAC,CAAA,EAGP,CAGA,IAAMC,CAAgD,CAAA,EACjDL,CAAAA,CAAAA,GACHK,CAAkBT,CAAAA,CAAAA,CAAa,YAAY,CAAA,CAAIA,GAE5CK,CACHI,GAAAA,CAAAA,CAAkBR,CAAc,CAAA,YAAY,CAC1CQ,CAAAA,CAAAA,CAAkBR,CAAc,CAAA,YAAY,CAAKA,EAAAA,CAAAA,CAAAA,CAErD,IAAWxiC,IAAAA,CAAAA,IAAQ,MAAO,CAAA,IAAA,CAAKgjC,CAAiB,CAC9C,CAAA,IAAA,CAAK,IAAK,CAAA,YAAA,CAAa,IAAK,CAAA,CAC1B,KAAOrG,CAAAA,CAAAA,CACP,MAAQqG,CAAAA,CAAAA,CAAkBhjC,CAAI,CAChC,CAAC,CAAA,CAGH,IAAMijC,CAAkB,CAAA,IAAA,CAAK,sBAC3BtG,CAAAA,CAAAA,CACA,IAAM1pB,CAAAA,CACNmvB,CACAJ,CAAAA,CAAAA,CACA,MACAhvB,CAAAA,CAAAA,CAAS,QACTA,CAAAA,CAAAA,CAAS,QACX,CAAA,CACMkwB,CAAmB,CAAA,IAAA,CAAK,sBAC5BvG,CAAAA,CAAAA,CACA3pB,CAAS,CAAA,KAAA,CACTqvB,CACAJ,CAAAA,CAAAA,CACA,MACAjvB,CAAAA,CAAAA,CAAS,QACTA,CAAAA,CAAAA,CAAS,QACX,CAAA,CAEMmwB,CAAWb,CAAAA,CAAAA,CAAU,YAAY,IACpCrhC,CAAAA,CAAAA,EACCA,CAAG,CAAA,eAAA,GAAoBgS,CAAU,CAAA,KAAA,EACjChS,CAAG,CAAA,OAAA,CAAQ,MAAW,GAAA,CAAA,EACtBA,CAAG,CAAA,OAAA,CAAQ,CAAC,CAAA,GAAMmhC,CACtB,CACMgB,CAAAA,EAAAA,CAAYd,CAAU,CAAA,WAAA,CAAY,IACrCrhC,CAAAA,CAAAA,EACCA,CAAG,CAAA,eAAA,GAAoByS,CAAW,CAAA,KAAA,EAClCzS,CAAG,CAAA,OAAA,CAAQ,MAAW,GAAA,CAAA,EACtBA,EAAG,OAAQ,CAAA,CAAC,CAAMohC,GAAAA,CACtB,CACA,CAAA,GAAI,CAACc,CAAAA,CAAU,CACb,IAAME,CAAef,CAAAA,CAAAA,CAAU,WAAY,CAAA,IAAA,CACxCrhC,GAAOA,CAAG,CAAA,eAAA,GAAoBgS,CAAU,CAAA,KAC3C,CACIowB,CAAAA,CAAAA,EACF,IAAK,CAAA,IAAA,CAAK,eAAgB,CAAA,IAAA,CAAK,CAC7B,KAAA,CAAO1G,CACP,CAAA,QAAA,CAAU0G,CACZ,CAAC,CAAA,CAEH,IAAK,CAAA,IAAA,CAAK,cAAe,CAAA,IAAA,CAAKJ,CAAiC,EACjE,CACA,GAAI,CAACG,EAAAA,CAAW,CACd,IAAME,EAAgBhB,CAAU,CAAA,WAAA,CAAY,IACzCrhC,CAAAA,CAAAA,EAAOA,CAAG,CAAA,eAAA,GAAoByS,CAAW,CAAA,KAC5C,CACI4vB,CAAAA,CAAAA,EACF,IAAK,CAAA,IAAA,CAAK,eAAgB,CAAA,IAAA,CAAK,CAC7B,KAAO3G,CAAAA,CAAAA,CACP,QAAU2G,CAAAA,CACZ,CAAC,CAAA,CAEH,IAAK,CAAA,IAAA,CAAK,cAAe,CAAA,IAAA,CAAKJ,CAAkC,EAClE,CACF,CACF,CACF,CAEA,MAAc,mBAAqC,EAAA,CACjD,IAAMK,CAAAA,CAAqB,IAAI,GAAA,CAC/B,IAAWjE,IAAAA,CAAAA,IAAO,IAAK,CAAA,IAAA,CAAK,cAC1BiE,CAAAA,CAAAA,CAAmB,IAAIjE,CAAI,CAAA,KAAK,CAElC,CAAA,IAAA,IAAWA,CAAO,IAAA,IAAA,CAAK,IAAK,CAAA,eAAA,CAC1BiE,CAAmB,CAAA,GAAA,CAAIjE,CAAI,CAAA,KAAK,CAGlC,CAAA,IAAMkE,EAAe,IAAI,GAAA,CACzB,IAAWtjC,IAAAA,CAAAA,IAASqjC,CAAoB,CAAA,CACtC,IAAM3H,CAAAA,CAAS,MAAM,IAAA,CAAK,GAAI,CAAA,cAAA,CAAe17B,CAAK,CAAA,CAC5CujC,EAAQ,IAAI,GAAA,CAAA,CACf7H,CAAO,CAAA,WAAA,EAAe,EAAC,EACrB,GAAK36B,CAAAA,CAAAA,EAAOA,CAAG,CAAA,IAAI,CACnB,CAAA,MAAA,CAAO,OAAO,CACnB,EACAuiC,CAAa,CAAA,GAAA,CAAItjC,CAAOujC,CAAAA,CAAK,EAC/B,CAEA,IAAMC,CAAAA,CAAuB,IAAI,GAAA,CACjC,IAAWv+B,IAAAA,CAAAA,IAAS,IAAK,CAAA,MAAA,CAAQ,CAC/B,IAAMw+B,CAAAA,CAAOx+B,CAAM,CAAA,YAAA,EACby+B,CAAAA,CAAAA,CAAW,IAAI,GAAA,CACrB,IAAWtE,IAAAA,CAAAA,IAAOqE,CAAM,CAAA,CACtB,GAAIrE,CAAAA,CAAI,OAAS,WACf,CAAA,SAEF,IAAMuE,CAAAA,CAAavE,CAAY,CAAA,UAAA,EAAcA,CAAI,CAAA,UAAA,CAE3CE,CADKr6B,CAAAA,CAAAA,CAAM,UAAW,EAAA,CAAE,IAAM,CAAA,CAAA,EAAM,EAAE,UAAe0+B,GAAAA,CAAS,CAClD,EAAA,YAAA,EAAgBA,CAC5B7jC,CAAAA,CAAAA,CACJ+P,CAAgBuvB,CAAAA,CAAAA,CAAY,cAAc,CAAA,EAC1C7oB,CAA2BtR,CAAAA,CAAAA,CAAM,KAAOq6B,CAAAA,CAAAA,CAAOF,CAAI,CAAA,KAAA,EAAQ,CAAA,KAAK,CAClEsE,CAAAA,CAAAA,CAAS,GAAI5jC,CAAAA,CAAI,EACnB,CACA0jC,CAAqB,CAAA,GAAA,CAAIv+B,CAAM,CAAA,KAAA,CAAOy+B,CAAQ,EAChD,CAEA,IAAK,CAAA,IAAA,CAAK,cAAiB,CAAA,MAAM,OAAQ,CAAA,GAAA,CACvC,IAAK,CAAA,IAAA,CAAK,cAAe,CAAA,GAAA,CAAI,MAAOtwB,CAAAA,EAAM,CACxC,IAAMwwB,EAAW,MAAM,IAAA,CAAK,GAAI,CAAA,cAAA,CAAexwB,CAAE,CAAA,KAAK,CAChDnO,CAAAA,CAAAA,CAAQ,IAAK,CAAA,MAAA,CAAO,IAAMy0B,CAAAA,CAAAA,EAAMA,CAAE,CAAA,KAAA,GAAUtmB,EAAE,KAAK,CAAA,CACnDywB,CAAY5+B,CAAAA,CAAAA,EAAO,UAAW,EAAA,EAAK,EAAC,CAEtC6+B,CAAa1wB,CAAAA,CAAAA,CAAE,QAAiB,CAAA,UAAA,CAChCA,CAAE,CAAA,QAAA,CAAS,OAAS,WAItB0wB,CAAAA,CAAAA,CAHmBD,CAAU,CAAA,IAAA,CAC1Bv+B,CAAMA,EAAAA,CAAAA,CAAE,UAAgB8N,GAAAA,CAAAA,CAAE,QAAiB,CAAA,UAC9C,CAEc,EAAA,YAAA,EAAiBA,CAAE,CAAA,QAAA,CAAiB,WAGlD0wB,CADWD,CAAAA,CAAAA,CAAU,IAAMv+B,CAAAA,CAAAA,EAAMA,CAAE,CAAA,UAAA,GAAew+B,CAAS,CAAA,EAC3C,YAAgBA,EAAAA,CAAAA,CAGlC,IAAIC,CAAAA,CAAkB3wB,CAAE,CAAA,KAAA,CACpB4wB,EAAiB5wB,CAAE,CAAA,QAAA,CAAiB,UACxC,CAAA,GAAIA,CAAE,CAAA,QAAA,CAAS,IAAS,GAAA,WAAA,CAAwB,CAC9C,IAAM6wB,CAAW7wB,CAAAA,CAAAA,CAAE,QAAS,CAAA,KAAA,GAC5B2wB,CAAkBE,CAAAA,CAAAA,CAAS,KAC3B,CAAA,IAAM1H,CAAS0H,CAAAA,CAAAA,CAAS,UAAc,EAAA,IAAA,CAItCD,CAHcC,CAAAA,CAAAA,CACX,UAAW,EAAA,CACX,IAAM3+B,CAAAA,CAAAA,EAAMA,EAAE,UAAei3B,GAAAA,CAAM,CACf,EAAA,YAAA,EAAgBA,EACzC,CAEA,IAAM2H,CAAAA,CAAgB,IAAI,GAAA,CACxB,CAACJ,CAAAA,CAAY1wB,CAAE,CAAA,QAAA,CAAiB,UAAU,CAAE,CAAA,MAAA,CAC1C,OACF,CACF,CACM+wB,CAAAA,CAAAA,CAAqBP,CAAS,CAAA,WAAA,CAAY,IAAM7iC,CAAAA,CAAAA,EAAO,CAC3D,GAAIA,CAAG,CAAA,OAAA,CAAQ,SAAW,CAAKA,EAAAA,CAAAA,CAAG,iBAAkB,CAAA,MAAA,GAAW,CAC7D,CAAA,OAAO,MAET,CAAA,IAAMqjC,CAAWF,CAAAA,CAAAA,CAAc,GAAInjC,CAAAA,CAAAA,CAAG,OAAQ,CAAA,CAAC,CAAC,CAC1CsjC,CAAAA,CAAAA,CAAgBtjC,CAAG,CAAA,eAAA,GAAoBgjC,CACvCO,CAAAA,CAAAA,CAAcvjC,CAAG,CAAA,iBAAA,CAAkB,CAAC,CAAA,GAAMijC,CAChD,CAAA,OAAOI,CAAYC,EAAAA,CAAAA,EAAiBC,CACtC,CAAC,CAAA,CAEKpF,CACJrvB,CAAAA,CAAAA,CAAgBuD,CAAE,CAAA,QAAA,CAAiB,cAAc,CAAA,EACjDmD,CAA2BnD,CAAAA,CAAAA,CAAE,KAAO0wB,CAAAA,CAAAA,CAAWC,CAAe,CAAA,CAC1DQ,EAAQjB,CAAa,CAAA,GAAA,CAAIlwB,CAAE,CAAA,KAAK,CAAK,EAAA,IAAI,GAE/C,CAAA,GAAI+wB,CAAuBjF,EAAAA,CAAAA,EAAgBqF,CAAM,CAAA,GAAA,CAAIrF,CAAY,CAAA,CAC/D,OAAO,IAGT,CAAA,GACE9rB,CAAE,CAAA,QAAA,CAAS,IAAS,GAAA,YAAA,EACpBA,CAAE,CAAA,QAAA,CAAS,iBACX,CAAA,CACA,IAAMoxB,CAAAA,CAAU30B,CACduD,CAAAA,CAAAA,CAAE,SAAS,iBAAkB,CAAA,YAC/B,CACMkqB,CAAAA,CAAAA,CAAUztB,CACduD,CAAAA,CAAAA,CAAE,QAAS,CAAA,iBAAA,CAAkB,cAC/B,CAAA,CACMqxB,CAAW50B,CAAAA,CAAAA,CACfuD,CAAE,CAAA,QAAA,CAAS,kBAAkB,eAC/B,CAAA,CACMsxB,CACJtxB,CAAAA,CAAAA,CAAE,KAAUoxB,GAAAA,CAAAA,EACZpxB,CAAE,CAAA,QAAA,CAAS,UAAekqB,GAAAA,CAAAA,EAC1BlqB,CAAE,CAAA,QAAA,CAAS,KAAM,EAAA,CAAE,QAAUnO,CAAO,EAAA,KAAA,CAChC0/B,CACJvxB,CAAAA,CAAAA,CAAE,KAAUoxB,GAAAA,CAAAA,EACZpxB,CAAE,CAAA,QAAA,CAAS,UAAeqxB,GAAAA,CAAAA,EAC1BrxB,CAAE,CAAA,QAAA,CAAS,KAAM,EAAA,CAAE,QAAUnO,CAAO,EAAA,KAAA,CAEhCm9B,CAAY,CAAA,MAAM,IAAK,CAAA,GAAA,CAAI,cAAeoC,CAAAA,CAAO,CACjDI,CAAAA,CAAAA,CAASxC,CAAU,CAAA,WAAA,CAAY,IAClCrhC,CAAAA,CAAAA,EACCA,EAAG,OAAQ,CAAA,MAAA,GAAW,CACtBA,EAAAA,CAAAA,CAAG,OAAQ,CAAA,CAAC,CAAMu8B,GAAAA,CAAAA,EAClBv8B,CAAG,CAAA,eAAA,IAAqBkE,CAAO,EAAA,KAAA,EAAS,EAC5C,CAAA,CAAA,CACM4/B,EAAUzC,CAAU,CAAA,WAAA,CAAY,IACnCrhC,CAAAA,CAAAA,EACCA,CAAG,CAAA,OAAA,CAAQ,MAAW,GAAA,CAAA,EACtBA,CAAG,CAAA,OAAA,CAAQ,CAAC,CAAA,GAAM0jC,CAClB1jC,EAAAA,CAAAA,CAAG,kBAAoBqS,CAAE,CAAA,QAAA,CAAS,KAAM,EAAA,CAAE,KAC9C,CAAA,CACA,GAAKsxB,CAAAA,EAAaE,CAAYD,EAAAA,CAAAA,EAAcE,CAC1C,CAAA,OAAO,IAEX,CAEA,OAAOzxB,CACT,CAAC,CACH,CAAA,CAAE,IAAMnD,CAAAA,CAAAA,EAAQA,CAAI,CAAA,MAAA,CAAO,OAAO,CAAoC,CAEtE,CAAA,IAAA,CAAK,IAAK,CAAA,eAAA,CAAkB,MAAM,OAAQ,CAAA,GAAA,CACxC,IAAK,CAAA,IAAA,CAAK,eAAgB,CAAA,GAAA,CAAI,MAAOmD,CAAAA,EAAM,CACzC,IAAMnO,CAAQ,CAAA,IAAA,CAAK,MAAO,CAAA,IAAA,CAAMy0B,GAAMA,CAAE,CAAA,KAAA,GAAUtmB,CAAE,CAAA,KAAK,CACzD,CAAA,GAAI,CAACnO,CAAAA,CACH,OAAOmO,CAAAA,CAET,IAAMqwB,CAAAA,CAAOx+B,CAAM,CAAA,YAAA,GACb4+B,CAAY5+B,CAAAA,CAAAA,CAAM,UAAW,EAAA,CAqBnC,OApBgBw+B,CAAAA,CAAK,IAAMrE,CAAAA,CAAAA,EAAa,CACtC,GAAIA,CAAI,CAAA,IAAA,GAAS,WACf,CAAA,OAAO,OAGT,IAAMC,CAAAA,CADKwE,CAAU,CAAA,IAAA,CAAMv+B,CAAMA,EAAAA,CAAAA,CAAE,UAAe85B,GAAAA,CAAAA,CAAI,UAAU,CAAA,EAC7C,YAAgBA,EAAAA,CAAAA,CAAI,UACjC6E,CAAAA,CAAAA,CAAW7E,EAAI,KAAM,EAAA,CACrB7C,CAAS0H,CAAAA,CAAAA,CAAS,UAAc,EAAA,IAAA,CAIhCa,CAHQb,CAAAA,CAAAA,CACX,UAAW,EAAA,CACX,IAAM3+B,CAAAA,CAAAA,EAAWA,CAAE,CAAA,UAAA,GAAei3B,CAAM,CACrB,EAAA,YAAA,EAAgBA,CACtC,CAAA,OACEnpB,CAAE,CAAA,QAAA,CAAS,OAAQ,CAAA,MAAA,GAAW,CAC9BA,EAAAA,CAAAA,CAAE,QAAS,CAAA,OAAA,CAAQ,CAAC,CAAA,GAAMisB,GAC1BjsB,CAAE,CAAA,QAAA,CAAS,eAAoB6wB,GAAAA,CAAAA,CAAS,KACxC7wB,EAAAA,CAAAA,CAAE,QAAS,CAAA,iBAAA,CAAkB,MAAW,GAAA,CAAA,EACxCA,CAAE,CAAA,QAAA,CAAS,iBAAkB,CAAA,CAAC,IAAM0xB,CAExC,CAAC,CACgB,CAAA,IAAA,CAAO1xB,CAC1B,CAAC,CACH,CAAA,CAAE,IAAMnD,CAAAA,CAAAA,EAAQA,CAAI,CAAA,MAAA,CAAO,OAAO,CAAqC,EACzE,CAEQ,eAAA,CAAgByqB,CAAgB9oB,CAAAA,CAAAA,CAAgC,CACtE,OAAO,CACL,UAAA,CAAAA,CACA,CAAA,YAAA,CAAcA,CACd,CAAA,SAAA,CAAW,KACX,CAAA,IAAA,CAAM8oB,CAAG,CAAA,IAAA,CACT,MAAQA,CAAAA,CAAAA,CAAG,MACX,CAAA,SAAA,CAAWA,CAAG,CAAA,SAAA,CACd,KAAOA,CAAAA,CAAAA,CAAG,KACV,CAAA,YAAA,CAAcA,CAAG,CAAA,YAAA,CACjB,WAAa,CAAA,CAAE,SAAU,KAAM,CACjC,CACF,CAEQ,kBAAmBr9B,CAAAA,CAAAA,CASlB,CACP,IAAM0nC,CAAe,CAAA,IAAA,CAAK,sBACxB1nC,CAAAA,CAAAA,CAAM,YACN,CAAA,IAAMA,EAAM,SACZA,CAAAA,CAAAA,CAAM,UACNA,CAAAA,CAAAA,CAAM,SAAU,CAAA,UAAA,EAAc,IAC9BA,CAAAA,CAAAA,CAAM,cACNA,CAAAA,CAAAA,CAAM,QACNA,CAAAA,CAAAA,CAAM,QACR,CAAA,CACM2nC,EAAgB,IAAK,CAAA,sBAAA,CACzB3nC,CAAM,CAAA,YAAA,CACN,IAAMA,CAAAA,CAAM,UACZA,CAAAA,CAAAA,CAAM,WACNA,CAAAA,CAAAA,CAAM,UAAW,CAAA,UAAA,EAAc,IAC/BA,CAAAA,CAAAA,CAAM,eACNA,CAAM,CAAA,QAAA,CACNA,CAAM,CAAA,QACR,CACA,CAAA,IAAA,CAAK,IAAK,CAAA,cAAA,CAAe,IAAK0nC,CAAAA,CAA8B,CAC5D,CAAA,IAAA,CAAK,IAAK,CAAA,cAAA,CAAe,KAAKC,CAA+B,EAC/D,CAEQ,sBAAA,CACNhlC,CACAyV,CAAAA,CAAAA,CACA4mB,CACA4I,CAAAA,CAAAA,CACA9M,CACAsF,CAAAA,CAAAA,CACAC,CACA,CAAA,CACA,IAAMtzB,CAAAA,CAAa+tB,EACftoB,CAAesoB,CAAAA,CAAc,CAC7B5hB,CAAAA,CAAAA,CACEvW,CACAq8B,CAAAA,CAAAA,CACA5mB,CAAa,EAAA,CAAE,KACjB,CAAA,CACJ,OAAO,CACL,KAAAzV,CAAAA,CAAAA,CACA,SAAU,CACR,IAAA,CAAA,WAAA,CACA,KAAOyV,CAAAA,CAAAA,CACP,UAAY4mB,CAAAA,CAAAA,CACZ,UAAYA,CAAAA,CAAAA,CACZ,cAAgBjyB,CAAAA,CAAAA,CAChB,QAAUqzB,CAAAA,CAAAA,CACV,QAAUC,CAAAA,CACZ,EACA,QAAAD,CAAAA,CAAAA,CACA,QAAAC,CAAAA,CACF,CACF,CACF,CCnvCO,CAAA,IAAMwH,EAAN,CAAA,cAAyB/5B,CAAU,CAOxC,WAAYmO,CAAAA,CAAAA,CAAoBjO,EAAsB,KAAO,CAAA,CAC3D,KAAM,CAAA,aAAA,CAAeA,CAAU,CAAA,CANjC,IAAa,CAAA,UAAA,CAAA,GAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,KAAA,CAChC,IAAS,CAAA,MAAA,CAAA,QAAA,CACT,IAAO,CAAA,IAAA,CAAA,QAAA,CAIL,KAAK,QAAWiO,CAAAA,EAClB,CACF,CAAA,CCZO,IAAM6rB,CAAAA,CAAN,cAAuBh6B,CAAU,CAQtC,WAAA,CAAYnL,CAAyCgZ,CAAAA,CAAAA,CAAgB,CACnE,KAAA,CAAM,MAAM,CAPd,CAAA,IAAA,CAAA,UAAA,CAAa,GACb,CAAA,IAAA,CAAA,6BAAA,CAAgC,KAChC,CAAA,IAAA,CAAA,MAAA,CAAS,MACT,CAAA,IAAA,CAAA,IAAA,CAAO,MAKL,CAAA,IAAA,CAAK,KAAQhZ,CAAAA,CAAAA,CACb,IAAK,CAAA,KAAA,CAAQgZ,EACf,CACF,CAAA,CCZO,IAAMosB,CAAAA,CAAN,cAAyBj6B,CAAU,CAUxC,WAAA,CACEmO,CACA+rB,CAAAA,CAAAA,CAAiC,EAAC,CAClCC,CACAC,CAAAA,CAAAA,CAA4B,MAC5Bl6B,CAAsB,CAAA,KAAA,CACtB,CACA,KAAA,CAAM,aAAeA,CAAAA,CAAU,CAZjC,CAAA,IAAA,CAAA,UAAA,CAAa,GACb,CAAA,IAAA,CAAA,6BAAA,CAAgC,KAChC,CAAA,IAAA,CAAA,MAAA,CAAS,QACT,CAAA,IAAA,CAAA,IAAA,CAAO,SAUL,IAAK,CAAA,QAAA,CAAWiO,CAChB,CAAA,IAAA,CAAK,OAAU+rB,CAAAA,CAAAA,CACf,IAAK,CAAA,SAAA,CAAYC,CACjB,CAAA,IAAA,CAAK,gBAAmBC,CAAAA,EAC1B,CACF,CAAA,CCxBO,IAAMC,EAAN,CAAA,cAA8Br6B,CAAU,CAW7C,WACEnL,CAAAA,CAAAA,CACAiU,CACAE,CAAAA,CAAAA,CACA7S,CAA4B,CAAA,QAAA,CAC5BgkC,CACAj6B,CAAAA,CAAAA,CAAsB,KACtB,CAAA,CACA,KAAM,CAAA,cAAA,CAAgBA,CAAU,CAAA,CAblC,IAAa,CAAA,UAAA,CAAA,GAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,KAAA,CAChC,IAAS,CAAA,MAAA,CAAA,cAAA,CACT,IAAO,CAAA,IAAA,CAAA,cAAA,CAWL,IAAK,CAAA,KAAA,CAAQrL,CACb,CAAA,IAAA,CAAK,gBAAkBiU,CACvB,CAAA,IAAA,CAAK,eAAkBE,CAAAA,CAAAA,CACvB,IAAK,CAAA,IAAA,CAAO7S,CACZ,CAAA,IAAA,CAAK,SAAYgkC,CAAAA,EACnB,CACF,CAAA,CCxBO,IAAMG,EAAAA,CAAN,cAAyBt6B,CAAU,CASxC,WACEmO,CAAAA,CAAAA,CACAnU,CAAoB,CAAA,EACpB8T,CAAAA,CAAAA,CAA4B,EAAC,CAC7B5N,CAAsB,CAAA,KAAA,CACtB,CACA,KAAA,CAAM,SAAUA,CAAU,CAAA,CAX5B,IAAa,CAAA,UAAA,CAAA,GAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,KAAA,CAChC,IAAS,CAAA,MAAA,CAAA,QAAA,CACT,IAAO,CAAA,IAAA,CAAA,QAAA,CASL,IAAK,CAAA,QAAA,CAAWiO,CAChB,CAAA,IAAA,CAAK,QAAUnU,CACf,CAAA,IAAA,CAAK,MAAS8T,CAAAA,EAChB,CACF,CAAA,CCIO,IAAMysB,CAAAA,CAAN,cAAwBv6B,CAAU,CAUvC,WAAA,CACE9F,CACAsgC,CAAAA,CAAAA,CACAC,EAAqB,KACrBC,CAAAA,CAAAA,CACA/oC,CACAuO,CAAAA,CAAAA,CAAsB,KACtB,CAAA,CACA,KAAM,CAAA,OAAA,CAASA,CAAU,CAAA,CAb3B,IAA2B,CAAA,UAAA,CAAA,KAAA,CAC3B,IAAgC,CAAA,6BAAA,CAAA,KAAA,CAChC,YAAS,OACT,CAAA,IAAA,CAAA,IAAA,CAAO,OAWL,CAAA,IAAA,CAAK,MAAShG,CAAAA,CAAAA,CACd,IAAK,CAAA,UAAA,CAAa,CAAIsgC,CAAAA,EAAAA,CAAU,CAChC,CAAA,CAAA,IAAA,CAAK,SAAYC,CAAAA,CAAAA,CACjB,KAAK,QAAWC,CAAAA,CAAAA,CAChB,IAAK,CAAA,KAAA,CAAQ/oC,EACf,CACF,CC3CO,CAAA,IAAMgpC,EAAN,CAAA,cAA6B36B,CAAU,CAO5C,WACEyX,CAAAA,CAAAA,CACA+iB,EAA2B,KAC3B,CAAA,CACA,KAAM,CAAA,OAAO,CARf,CAAA,IAAA,CAAA,6BAAA,CAAgC,KAChC,CAAA,IAAA,CAAA,MAAA,CAAS,OACT,CAAA,IAAA,CAAA,IAAA,CAAO,aAOL,CAAA,IAAA,CAAK,KAAQ/iB,CAAAA,CAAAA,CACb,KAAK,UAAa,CAAA,CAAA,CAAA,EAAI+iB,CAAU,CAAA,EAClC,CACF,CAAA,CChBO,IAAMI,EAAAA,CAAN,cAA4BL,CAAU,CAK3C,WAAA,CACErgC,CACAsgC,CAAAA,CAAAA,CACAC,EAAqB,KACrBC,CAAAA,CAAAA,CACA/oC,CACAuO,CAAAA,CAAAA,CAAsB,KACtB,CAAA,CAEA,KAAMhG,CAAAA,CAAAA,CAAQsgC,CAAYC,CAAAA,CAAAA,CAAW,GAAK9oC,CAAAA,CAAAA,CAAcuO,CAAU,CAAA,CAXpE,UAAO,YAYL,CAAA,IAAA,CAAK,YAAew6B,CAAAA,CAAAA,CACpB,IAAK,CAAA,KAAA,CAAQ/oC,EACf,CACF,CCbO,CAAA,IAAMkpC,EAAN,CAAA,cAAgC76B,CAAU,CAS/C,YACE9F,CACAwgC,CAAAA,CAAAA,CACAzhB,CACAuhB,CAAAA,CAAAA,CAA2B,KAC3B,CAAA,CACA,KAAM,CAAA,OAAO,CAVf,CAAA,IAAA,CAAA,6BAAA,CAAgC,KAChC,CAAA,IAAA,CAAA,MAAA,CAAS,OACT,CAAA,IAAA,CAAA,IAAA,CAAO,iBASL,IAAK,CAAA,MAAA,CAAStgC,CACd,CAAA,IAAA,CAAK,QAAWwgC,CAAAA,CAAAA,CAChB,IAAK,CAAA,QAAA,CAAWzhB,CAChB,CAAA,IAAA,CAAK,UAAa,CAAA,CAAA,CAAA,EAAIuhB,CAAU,CAAA,EAClC,CACF,CCnCA,CCYO,IAAMM,EAAN,CAAA,cAA2BC,eAAS,CAYzC,YACEC,CACA9mC,CAAAA,CAAAA,CACAH,CAAgB,CAAA,EAChBknC,CAAAA,CAAAA,CAOA,CACA,KAAA,CAAM,CAAE,UAAA,CAAY,IAAK,CAAC,CAC1B,CAAA,IAAA,CAAK,EAAKD,CAAAA,CAAAA,CACV,IAAK,CAAA,KAAA,CAAQ9mC,CACb,CAAA,IAAA,CAAK,MAASH,CAAAA,CAAAA,CACd,IAAK,CAAA,OAAA,CAAU,KACf,CAAA,IAAA,CAAK,MAASknC,CAAAA,EAChB,CAEA,KAAA,EAAc,CACR,IAAK,CAAA,OAAA,GAIT,IAAK,CAAA,OAAA,CAAU,IACf,CAAA,IAAA,CAAK,QAAS,EAAA,EAChB,CAEQ,QAAA,EAAiB,CACvB,IAAIC,CAAU,CAAA,CAAA,CACVC,EAAQ,KACRC,CAAAA,CAAAA,CAAW,KAEf,CAAA,IAAA,CAAK,EAAG,CAAA,IAAA,CACN,IAAK,CAAA,KAAA,CACL,IAAK,CAAA,MAAA,CACL,CAAC1oC,CAAAA,CAAUgC,CAAa,GAAA,CACtB,GAAIhC,CAAK,CAAA,CACP0oC,CAAW,CAAA,IAAA,CACX,IAAK,CAAA,IAAA,CAAK,OAAS1oC,CAAAA,CAAG,CACtB,CAAA,MACF,CAEAwoC,CAAAA,EAAAA,CAEA,IAAIG,CAAAA,CAAY,MACZC,CAEEC,CAAAA,CAAAA,CAAkB,CACtB,KAAA,CAAQv2B,CAAW,EAAA,CACjBq2B,CAAY,CAAA,IAAA,CACZC,CAAat2B,CAAAA,EACf,CACF,CAAA,CAEA,OAAQ,CAAA,OAAA,CAAQ,KAAK,MAAO,CAAA,MAAA,GAASu2B,CAAiB7mC,CAAAA,CAAG,CAAC,CAAA,CACvD,IAAK,CAAA,IAAM,CACV,GAAI,CAAA0mC,CAAAA,CAIJ,CAAIC,GAAAA,CAAAA,CAAW,CACb,IAAK,CAAA,IAAA,CAAKC,CAAU,CAAA,CACpB,MACF,CAEA,IAAK,CAAA,IAAA,CAAK5mC,CAAG,EAAA,CACf,CAAC,CAAA,CACA,KAAOhC,CAAAA,CAAAA,EAAa,CACnB0oC,CAAW,CAAA,IAAA,CACX,IAAK,CAAA,IAAA,CAAK,OAAS1oC,CAAAA,CAAG,EACxB,CAAC,CACA,CAAA,OAAA,CAAQ,IAAM,CACbwoC,CACIC,EAAAA,CAAAA,CAAAA,EAASD,IAAY,CAAK,EAAA,CAACE,CAC7B,EAAA,IAAA,CAAK,IAAK,CAAA,IAAI,EAElB,CAAC,EACL,CAAA,CACC1oC,CAAa,EAAA,CACZ,GAAIA,CAAAA,CAAK,CACP0oC,CAAW,CAAA,IAAA,CACX,IAAK,CAAA,IAAA,CAAK,OAAS1oC,CAAAA,CAAG,CACtB,CAAA,MACF,CAEAyoC,CAAAA,CAAQ,IACJD,CAAAA,CAAAA,GAAY,CAAK,EAAA,CAACE,GACpB,IAAK,CAAA,IAAA,CAAK,IAAI,EAElB,CACF,EACF,CACF,CAAA,CAEa5jC,EAAuB,CAAA,CAClCtD,CACAH,CAAAA,CAAAA,CACA+H,CACAjJ,CAAAA,CAAAA,GAC8B,CAC9B,IAAM2oC,CAAAA,CAAkB,CACtB,OAAA,CACA,mBACA,CAAA,QAAA,CACA,UACF,CAAA,CAAE,QAAStnC,CAAAA,CAAAA,CAAM,IAAK,EAAA,CAAE,WAAY,EAAC,EAE/B3B,CACJM,CAAAA,CAAAA,CAAQ,gBACPiJ,EAAAA,CAAAA,CAAc,OAAQ,EAAA,CAEzB,GAAI0/B,CAAAA,CACF,OAAO,IAAI,OAAgB,CAAA,CAACziC,CAASC,CAAAA,CAAAA,GAAW,CAC9CzG,CAAa,CAAA,GAAA,CAAI2B,CAAOH,CAAAA,CAAAA,CAAQ,SAAqBrB,CAAAA,CAAK,CACpDA,CAAAA,EACFsG,CAAOtG,CAAAA,CAAG,CAEZqG,CAAAA,CAAAA,CAAQ,IAAK,CAAA,OAAO,EACtB,CAAC,EACH,CAAC,CAAA,CAGH,GAAIlG,CAAAA,CAAQ,IAAS,GAAA,OAAA,CACnB,OAAO,IAAI,OAAa,CAAA,CAACkG,CAASC,CAAAA,CAAAA,GAAW,CAC3CzG,CAAa,CAAA,GAAA,CAAI2B,CAAOH,CAAAA,CAAAA,CAAQ,CAACrB,CAAAA,CAAK+oC,CAAS,GAAA,CACzC/oC,CACFsG,EAAAA,CAAAA,CAAOtG,CAAG,CAAA,CAAA,CAGR,CAAC+oC,CAAAA,EAAQ,CAACA,CAAK,CAAA,MAAA,GACjB1iC,CAAQ,CAAA,EAAS,CAAA,CAGnBA,CAAQ0iC,CAAAA,CAAW,EACrB,CAAC,EACH,CAAC,CAGH,CAAA,IAAMt2B,EAActS,CAAS,EAAA,WAAA,CAC7B,GAAI,CAACsS,CACH,CAAA,OAAO,IAAI,OAAA,CAAgB,CAACpM,CAAAA,CAASC,CAAW,GAAA,CAC9CzG,CAAa,CAAA,GAAA,CAAI2B,EAAOH,CAAQ,CAAA,SAAqBrB,CAAK,CAAA,CACpDA,CACFsG,CAAAA,CAAAA,CAAO,IAAI,KAAA,CAAMtG,CAAI,CAAA,OAAO,CAAC,CAAA,CAE7BqG,CAAQ,CAAA,IAAA,CAAK,OAAiB,EAElC,CAAC,EACH,CAAC,CAGH,CAAA,IAAM+4B,CAAiB3sB,CAAAA,CAAAA,CAAY,UAC7BtQ,CAAAA,CAAAA,CAAQsQ,CAAY,CAAA,KAAA,CAC1B,GAAItS,CAAAA,CAAQ,OAAS,WAAeA,EAAAA,CAAAA,CAAQ,IAAS,GAAA,YAAA,CAAc,CACjE,GAAIA,CAAQ,CAAA,IAAA,GAAS,WACnB,CAAA,OAAO,IAAI,OAAA,CAAa,CAACkG,CAAAA,CAASC,IAAW,CAC3CzG,CAAAA,CAAa,GAAI2B,CAAAA,CAAAA,CAAOH,CAAQ,CAAA,SAAqBrB,CAAU,CAAA,CAC7D,GAAIA,CAAAA,CACF,OAAOsG,CAAAA,CAAOtG,CAAG,CAAA,CAGnB,IAAMgpC,CACJ7oC,CAAAA,CAAAA,CAAQ,MACR,EAAA,KAAA,CAAM,OAAQA,CAAAA,CAAAA,CAAQ,MAAM,CAAA,EAC5BA,CAAQ,CAAA,MAAA,CAAO,MACXA,CAAAA,CAAAA,CAAQ,MAAO,CAAA,CAAC,EAChB,IAEN,CAAA,GAAI,CAACi/B,CAAAA,CAAgB,CACnB/4B,CAAAA,CAAQ,CAAC2iC,CAAU,CAAQ,CAAA,CAC3B,MACF,CAEA,IAAMC,CAAAA,CAASD,IAAa5J,CAAyB,CAAA,EAAK,IAAK,CAAA,MAAA,CAE/D,GAAI,CAAC6J,CACH,CAAA,OAAO3iC,CACL,CAAA,IAAIxJ,CACF,CAAA,sCAAA,CACA,0BACF,CACF,EAGF,IAAMosC,CAAAA,CAAc,CAAiB/mC,cAAAA,EAAAA,CAAK,CAAUi9B,OAAAA,EAAAA,CAAc,CAClEv/B,IAAAA,CAAAA,CAAAA,CAAAA,CAAa,GAAIqpC,CAAAA,CAAAA,CAAa,CAACD,CAAM,CAAG,CAAA,CAACjpC,EAAUgC,CAAW,GAAA,CAC5D,GAAIhC,CAAAA,CACF,OAAOsG,CAAAA,CAAOtG,CAAG,CAAA,CAGnBqG,CAAQ,CAAA,CAACrE,CAAG,CAAQ,EACtB,CAAC,EACH,CAAC,EACH,CAAC,CAAA,CAGH,GAAI,CAAC,KAAM,CAAA,OAAA,CAAQ7B,CAAQ,CAAA,MAAM,CAC/B,CAAA,MAAM,IAAIrD,CAAAA,CACR,sFACA,mBACF,CAAA,CAGF,IAAMuM,CAAAA,CAASlJ,CAAQ,CAAA,MAAA,CAEvB,GAAI,CAACi/B,CACH,CAAA,OAAO,IAAI,OAAA,CAAa,CAAC/4B,CAAAA,CAASC,IAAW,CAC3CzG,CAAAA,CAAa,GAAI2B,CAAAA,CAAAA,CAAOH,CAAQ,CAAA,SAAUrB,CAAU,CAAA,CAClD,GAAIA,CAAAA,CACF,OAAOsG,CAAAA,CAAOtG,CAAG,CAAA,CAEnBqG,EAAQgD,CAAa,EACvB,CAAC,EACH,CAAC,CAAA,CAGH,IAAI8/B,CAAAA,CAAmB,EAAC,CACxB,OAAO,IAAI,OAAa,CAAA,MAAO9iC,EAASC,CAAW,GAAA,CACjD,GAAI,CACF,IAAM8iC,CAAAA,CAAiB//B,CAAO,CAAA,GAAA,CAAI,MAAOjC,CAAAA,EAAU,CACjD,IAAM8Y,CAAmB,CAAA,IAAIlF,CAAiBvI,CAAAA,CAAW,CAEnD,CAAA,CAAE,OAAS42B,CAAAA,CAAAA,CAAiB,MAAQC,CAAAA,CAAe,CACvD,CAAA,MAAMppB,CAAiB,CAAA,cAAA,CACrB,MAAO,CAAA,IAAA,CAAK9Y,CAAK,CAAA,CACjB,OAAO,MAAOA,CAAAA,CAAK,CACnB,CAAA,QACF,CAEImiC,CAAAA,CAAAA,CAAgB,MAAO,CAAA,WAAA,CAC3BF,CAAgB,CAAA,GAAA,CAAI,CAAC7hC,CAAAA,CAAQoO,CAAU,GAAA,CACrCpO,EACA8hC,CAAe1zB,CAAAA,CAAK,CACtB,CAAC,CACH,CAAA,CAEM8F,CAAY,CAAA,IAAItP,CACpBqG,CAAAA,CAAAA,CACArJ,CAAc,CAAA,SAAA,EAChB,CAAA,CAEM,CAAE,GAAK5H,CAAAA,CAAAA,CAAO,QAAUH,CAAAA,CAAO,CAAIqa,CAAAA,CAAAA,CAAU,KAAM,CAAA,CACvD,IAAI6rB,CAAAA,CAAW,IAAID,CAAAA,CAAS70B,CAAY,CAAA,KAAK,EAAG,CAAC82B,CAAa,CAAC,CACjE,CAAC,CAAA,CAED,OAAO,IAAI,OAAW,CAAA,CAACljC,CAASC,CAAAA,CAAAA,GAAW,CACzCzG,CAAAA,CAAa,IAAI2B,CAAOH,CAAAA,CAAAA,CAAQ,SAAUrB,CAAAA,CAAU,CAClD,GAAIA,CACF,CAAA,OAAOsG,CAAOtG,CAAAA,CAAG,CAGnB,CAAA,IAAMipC,EAAS7hC,CAAAA,CAAAA,CAAMg4B,CAAyB,CAAK,EAAA,IAAA,CAAK,MAExD,CAAA,GAAI,CAAC6J,EAAAA,CACH,OAAO3iC,CAAAA,CACL,IAAIxJ,CAAAA,CACF,sCACA,CAAA,0BACF,CACF,CAAA,CAGF,IAAMosC,CAAc,CAAA,CAAA,cAAA,EAAiB/mC,CAAK,CAAA,OAAA,EAAUi9B,CAAc,CAAA,IAAA,CAAA,CAClEv/B,CAAa,CAAA,GAAA,CAAIqpC,CAAa,CAAA,CAACD,EAAM,CAAA,CAAG,CAACjpC,CAAAA,CAAUgC,KAAW,CAC5D,GAAIhC,CACF,CAAA,OAAOsG,CAAOtG,CAAAA,CAAG,CAGnBqG,CAAAA,CAAAA,CAAQrE,EAAQ,EAClB,CAAC,EACH,CAAC,EACH,CAAC,CACH,CAAC,CAEDmnC,CAAAA,CAAAA,CAAc,MAAM,OAAA,CAAQ,GAAIC,CAAAA,CAAc,CAC9C/iC,CAAAA,CAAAA,CAAQ8iC,CAAW,EACrB,CAASnpC,MAAAA,CAAAA,CAAK,CACZsG,CAAOtG,CAAAA,CAAG,EACZ,CACF,CAAC,CACH,CAEA,OAAO,IAAI,OAAA,CAAgB,CAACqG,CAAAA,CAASC,CAAW,GAAA,CAC7CzG,EAA0C,GACzC2B,CAAAA,CAAAA,CACAH,CACA,CAAA,SAAqCrB,CAAmB,CAAA,CAClDA,CACFsG,CAAAA,CAAAA,CAAO,IAAI,KAAA,CAAMtG,CAAI,CAAA,OAAO,CAAC,CAAA,CAE7BqG,EAAQ,IAAK,CAAA,OAAiB,EAElC,CACF,EACF,CAAC,CACH,CAAA,CCjUA,IAAMmjC,EAAAA,CAAiB,uCACjBC,CAAAA,EAAAA,CAAkB,qBAEXC,CAAAA,EAAAA,CAAoCzqC,GAC3C,OAAOA,CAAAA,EAAU,QACZA,CAAAA,CAAAA,CAGLuqC,EAAe,CAAA,IAAA,CAAKvqC,CAAK,CAAA,CACpB,IAAI,IAAA,CAAKA,CAAM,CAAA,OAAA,CAAQ,GAAK,CAAA,GAAG,EAAI,GAAG,CAAA,CAG3CwqC,EAAgB,CAAA,IAAA,CAAKxqC,CAAK,CAAA,CACrB,IAAI,IAAA,CAAKA,CAAQ,CAAA,YAAY,CAG/BA,CAAAA,CAAAA,CAQH0qC,EAA0B,CAAA,MAAOC,GAC9B,IAAI,OAAA,CAAQ,CAACvjC,CAAAA,CAASC,CAAW,GAAA,CAEtC,GADesjC,CAAAA,CAAI,IAAS,GAAA,IAAA,CAChB,CACV,IAAI3/B,CAAO,CAAA,EAAA,CACX2/B,CAAI,CAAA,WAAA,CAAY,MAAM,CAAA,CACtBA,CAAI,CAAA,EAAA,CAAG,MAASC,CAAAA,CAAAA,EAAkB,CAChC5/B,CAAAA,EAAQ4/B,EACV,CAAC,CACDD,CAAAA,CAAAA,CAAI,EAAG,CAAA,KAAA,CAAO,IAAMvjC,CAAQ4D,CAAAA,CAAI,CAAC,CAAA,CACjC2/B,CAAI,CAAA,EAAA,CAAG,OAAStjC,CAAAA,CAAM,EACxB,CAAA,KAAO,CACL,IAAMwjC,CAAmB,CAAA,GACzBF,CAAI,CAAA,EAAA,CAAG,MAASC,CAAAA,CAAAA,EAAkB,CAChCC,CAAAA,CAAO,IAAKD,CAAAA,CAAK,EACnB,CAAC,CACDD,CAAAA,CAAAA,CAAI,EAAG,CAAA,KAAA,CAAO,IAAMvjC,CAAQ,CAAA,MAAA,CAAO,MAAOyjC,CAAAA,CAAM,CAAC,CAAC,CAClDF,CAAAA,CAAAA,CAAI,EAAG,CAAA,OAAA,CAAStjC,CAAM,EACxB,CACF,CAAC,EAMUyjC,EAAmB,CAAA,MAC9B/nC,CACiC,EAAA,CACjC,IAAMgoC,CAAAA,CAAoC,EAAC,CAC3C,IAAWhrC,IAAAA,CAAAA,IAAOgD,CAAK,CAAA,CACrB,IAAM/C,CAAAA,CAAQ+C,EAAIhD,CAAG,CAAA,CAEnBC,CACA,EAAA,OAAOA,CAAU,EAAA,QAAA,EACjBA,CAAM,CAAA,WAAA,EAAa,IAAS,GAAA,KAAA,CAE5B+qC,CAAahrC,CAAAA,CAAG,CAAI,CAAA,MAAM2qC,GAAwB1qC,CAAK,CAAA,CAEvD+qC,CAAahrC,CAAAA,CAAG,CAAIC,CAAAA,EAExB,CACA,OAAO+qC,CACT,CAAA,CFvCO,IAAMC,CAAAA,CAAU,MAMrBzoC,CAAAA,CACAH,EACA+H,CACAiC,CAAAA,CAAAA,CACAo8B,CAAe,CAAA,MAAA,CACftnC,CAIuC,GAAA,CAKvC,OAJKA,CAAAA,EAAS,YACZoB,EAAAA,CAAAA,CAAIC,CAAO4H,CAAAA,CAAAA,CAAc,IAAM/H,CAAAA,CAAM,EAG/BgK,CAAS,EACf,KAAK,OAAA,CACL,KAAK,SAAA,CACH,IAAM6+B,CAAAA,CACH9gC,CAAc,CAAA,aAAA,EACfA,CAAc,CAAA,OAAA,EAEV+gC,CAAAA,CAAAA,CAAc,MAAMC,EACxB,CAAA,IAAMF,CAAY,CAAA,KAAA,CAAM1oC,CAAOH,CAAAA,CAAM,CACrC+H,CAAAA,CAAAA,CAAc,YAAa,CAAA,kBAAA,EAAoB,KAC/CA,CAAAA,CAAAA,CAAc,IAChB,CAAA,CAEA,OAAIq+B,CAAc,GAAA,cAAA,CACR0C,CAAY,CAAA,CAAC,CAClB,CAAA,YAAA,CAGD1C,CAAc,GAAA,KAAA,CACT0C,CAGFA,CAAAA,CAAAA,CAAY,CAAC,CAAA,CACtB,KAAK,UAAA,CACL,KAAK,aACH,CAAA,IAAMvqC,CACHwJ,CAAAA,CAAAA,CAAc,aACfA,EAAAA,CAAAA,CAAc,OAAQ,EAAA,CAElBihC,CAAW,CAAA,MAAMD,EACrB,CAAA,IAAMxqC,CAAS,CAAA,KAAA,CAAM4B,EAAOH,CAAM,CAAA,CAClC+H,CAAc,CAAA,YAAA,CAAa,kBAAoB,EAAA,KAAA,CAC/CA,CAAc,CAAA,IAChB,CAEA,CAAA,OAAIq+B,CAAc,GAAA,MAAA,CACT4C,CAAS,CAAA,IAAA,CAGd5C,IAAc,KACT4C,CAAAA,CAAAA,CAGFA,CAAS,CAAA,QAAA,CAClB,KAAK,QAAA,CACH,IAAMC,CAAAA,CAAe,MAAMF,EAAAA,CACzB,IACEtlC,EAAAA,CAAwBtD,CAAOH,CAAAA,CAAAA,CAAQ+H,EAAe,CACpD,WAAA,CAAajJ,CAAS,EAAA,cAAA,EAAgB,WACtC,CAAA,IAAA,CAAMA,CAAS,EAAA,cAAA,EAAgB,IAAQ,EAAA,OAAA,CACvC,MAAQA,CAAAA,CAAAA,EAAS,cAAgB,EAAA,MACnC,CAAC,CACHiJ,CAAAA,CAAAA,CAAc,YAAa,CAAA,kBAAA,EAAoB,KAC/CA,CAAAA,CAAAA,CAAc,IAChB,CAAA,CAEA,OAAIq+B,CAAAA,GAAc,KACR,CAAA,KAAA,CAAM,OAAQ6C,CAAAA,CAAY,CAE7BA,CAAAA,CAAAA,CADA,CAACA,CAAY,CAIbA,CAAAA,CAAAA,CACT,KAAK,OAAA,CACH,IAAMC,CAAAA,CAAYnhC,CAAc,CAAA,OAAA,EAC1BohC,CAAAA,CAAAA,CAAephC,CAAc,CAAA,aAAA,CAE7BA,EAAc,aACd,CAAA,OAAA,EACFmhC,CAAAA,CAAAA,CAAU,OAAQ,EAAA,CAEtBlpC,CAAO,CAAA,OAAA,CAAQ,CAACC,CAAAA,CAAOsU,CAAU,GAAA,CAC/B40B,CAAa,CAAA,KAAA,CAAM,IAAI50B,CAAK,CAAA,CAAA,CAAItU,CAAK,EACvC,CAAC,CAAA,CAED,IAAImpC,CAAAA,CAAgB,CACdC,CAAAA,CAAAA,CAAalpC,CAAM,CAAA,OAAA,CACvB,YACA,CAAA,IAAM,KAAKipC,CAAe,EAAA,CAAA,CAC5B,CAEME,CAAAA,CAAAA,CAAc,MAAMP,EAAAA,CACxB,IAAMI,CAAAA,CAAa,KAAME,CAAAA,CAAU,CACnCthC,CAAAA,CAAAA,CAAc,YAAa,CAAA,kBAAA,EAAoB,MAC/CA,CAAc,CAAA,IAChB,CAEA,CAAA,OAAIq+B,CAAc,GAAA,cAAA,CACTkD,CAAY,CAAA,YAAA,CAAa,CAAC,CAAA,CAG/BlD,CAAc,GAAA,KAAA,CACTkD,CAGFA,CAAAA,CAAAA,CAAY,UACrB,KAAK,UAAA,CACH,IAAMC,CAAAA,CAA2B,IAE7BC,CAAAA,CAAAA,CAAiE,IAC/DC,CAAAA,CAAAA,CAAkB,CAAC,CAAC1hC,CAAc,CAAA,aAAA,CACxC,GAAI,CACFyhC,EAAqBzhC,CAAc,CAAA,aAAA,CAC9BA,CAAc,CAAA,aAAA,CACb,MAAMA,CAAAA,CAAc,aAAc,EAAA,CAExC,IAAM2hC,CAAAA,CAAe1pC,CAAO,CAAA,GAAA,CAAIqoC,EAAgC,CAAA,CAE1DsB,EAAiB,MAAMZ,EAAAA,CAC3B,IACGS,CAAAA,CAA2D,OAC1DrpC,CAAAA,CAAAA,CACAupC,CACA,CAAA,CACE,SAAWH,CAAAA,CAAAA,CACX,UAAY,CAAA,CAACE,CACf,CACF,EACF1hC,CAAc,CAAA,YAAA,CAAa,kBAAoB,EAAA,KAAA,CAC/CA,CAAc,CAAA,IAChB,CAEA,CAAA,OAAIq+B,CAAc,GAAA,cAAA,CACTuD,CAAe,CAAA,YAAA,CAGpBvD,CAAc,GAAA,KAAA,CACTuD,EAKc,MAAM,OAAA,CAAQ,GAClCA,CAAAA,CAAAA,CAAe,IAAgB,EAAA,GAAA,CAAI,MAAOhpC,CAAAA,EAAQ,CACjD,IAAMgoC,CAAe,CAAA,MAAMD,EAAiB/nC,CAAAA,CAAG,EACzCipC,CAAqC,CAAA,EAC3C,CAAA,IAAA,IAAWjsC,EAAOgrC,IAAAA,CAAAA,CAChBiB,CAAcjsC,CAAAA,EAAAA,CAAI,WAAY,EAAC,CAAIgrC,CAAAA,CAAAA,CAAahrC,EAAG,CAAA,CAErD,OAAOisC,CACT,CAAC,CAAK,EAAA,EACR,CAGF,CAAE,OAAA,CACIJ,CAAsB,EAAA,CAACC,CACzB,EAAA,MAAMD,CAAmB,CAAA,KAAA,GAE7B,CACF,QACE,MAAM,IAAI/tC,CACR,CAAA,SAAA,CACA,CAA6BuO,0BAAAA,EAAAA,CAAO,CACtC,CAAA,CACJ,CACF,CAAA,CAEa6/B,EAAmB,CAAA,MAM9B1pC,EACAH,CACA+H,CAAAA,CAAAA,CACAjJ,CAAyB,CAAA,EACzBooC,CAAAA,CAAAA,GAMmE,CACnE,IAAMl9B,CAAUjC,CAAAA,CAAAA,CAAc,IAE9B,CAAA,OAAQiC,CAAS,EACf,KAAK,SACL,CAAA,KAAK,OAAS,CAAA,CACZ,IAAM8/B,CAAAA,CAAO/hC,CAAc,CAAA,OAAA,EACrBgiC,CAAAA,CAAAA,CACHhiC,CAAc,CAAA,aAAA,EACd,MAAM+hC,CAAAA,CAAK,eACRE,CAAAA,CAAAA,CAAc,IAAIC,kBAAAA,CAAY,CAClC,UAAA,CAAYnrC,CAAQ,CAAA,UAAA,EAAc,IAClC,CAAA,aAAA,CAAeA,CAAQ,CAAA,aACzB,CAAC,CAAA,CAGKorC,EADUH,CAAK,CAAA,UAAA,CACO,KAAM5pC,CAAAA,CAAAA,CAAOH,CAAM,CAAA,CAAE,MAAO,CAAA,CACtD,aAAelB,CAAAA,CAAAA,CAAQ,aACvB,CAAA,UAAA,CAAYA,CAAQ,CAAA,UAAA,EAAc,IACpC,CAAC,CAAA,CAEGqoC,CAAU,CAAA,CAAA,CACVC,CAAQ,CAAA,KAAA,CACRC,CAAW,CAAA,KAAA,CAET8C,CAAa,CAAA,IAAM,CACvB,GAAI,CACFJ,CAAAA,CAAK,UACP,CAAA,KAAQ,EACV,CAEA,CAAA,OAAAG,CAAY,CAAA,EAAA,CAAG,MAASvpC,CAAAA,CAAAA,EAAa,CACnC,GAAIumC,CAAO,CAAA,MAAA,CAAQ,CACjBC,CACA,EAAA,CAAA,OAAA,CAAQ,OAAQD,CAAAA,CAAAA,CAAO,MAAO8C,CAAAA,CAAAA,CAAarpC,CAAG,CAAC,CAC5C,CAAA,IAAA,CAAK,IAAM,CACVwmC,CACIC,EAAAA,CAAAA,CAAAA,EAASD,IAAY,CAAK,EAAA,CAACE,CAC7B8C,GAAAA,CAAAA,EACAH,CAAAA,CAAAA,CAAY,GAAI,EAAA,EAEpB,CAAC,CAAA,CACA,KAAOrrC,CAAAA,CAAAA,EAAa,CACnB0oC,CAAAA,CAAW,KACX8C,CAAW,EAAA,CACXH,CAAY,CAAA,OAAA,CAAQrrC,CAAG,EACzB,CAAC,CAAA,CACH,MACF,CAEAqrC,CAAY,CAAA,KAAA,CAAMrpC,CAAG,EACvB,CAAC,CAEDupC,CAAAA,CAAAA,CAAY,EAAG,CAAA,KAAA,CAAO,IAAM,CAC1B9C,CAAQ,CAAA,IAAA,CACJD,CAAY,GAAA,CAAA,EAAK,CAACE,CAAAA,GACpB8C,CAAW,EAAA,CACXH,EAAY,GAAI,EAAA,EAEpB,CAAC,CAAA,CAEDE,CAAY,CAAA,EAAA,CAAG,OAAUvrC,CAAAA,CAAAA,EAAa,CACpC0oC,CAAAA,CAAW,IACX8C,CAAAA,CAAAA,EACAH,CAAAA,CAAAA,CAAY,QAAQrrC,CAAG,EACzB,CAAC,CAAA,CAEDqrC,CAAY,CAAA,EAAA,CAAG,OAAS,CAAA,IAAM,CAC5BG,CAAAA,GACF,CAAC,CAEMH,CAAAA,CACT,CAEA,KAAK,aAAA,CACL,KAAK,UAAA,CAAY,CACf,IAAMI,CAASriC,CAAAA,CAAAA,CAAc,OAAQ,EAAA,CAC/BxJ,CACHwJ,CAAAA,CAAAA,CAAc,aACd,EAAA,MAAMqiC,EAAO,OAAQ,EAAA,CAElBC,CAAsB,CAAA,MAAa,OAAA,iBAAiB,CAAE,CAAA,KAAA,CAAM,IAAM,CACtE,MAAM,IAAIruC,CAAoB,CAAA,iBAAiB,CACjD,CAAC,CAAA,CAEKguC,CAAc,CAAA,IAAIC,kBAAY,CAAA,CAClC,UAAYnrC,CAAAA,CAAAA,CAAQ,UAAc,EAAA,IAAA,CAClC,aAAeA,CAAAA,CAAAA,CAAQ,aACzB,CAAC,EAEKwrC,CAAc,CAAA,IAAID,CAAoB,CAAA,OAAA,CAAQlqC,CAAOH,CAAAA,CAAAA,CAAQ,CACjE,aAAA,CAAelB,CAAQ,CAAA,aAAA,CACvB,OAASA,CAAAA,CAAAA,CAAQ,OACjB,CAAA,SAAA,CAAWA,EAAQ,SACnB,CAAA,KAAA,CAAOA,CAAQ,CAAA,KACjB,CAAC,CAAA,CAEKyrC,CAAWhsC,CAAAA,CAAAA,CAAS,KAAM+rC,CAAAA,CAAW,CAEvCnD,CAAAA,CAAAA,CAAU,CACVC,CAAAA,CAAAA,CAAQ,MACRC,CAAW,CAAA,KAAA,CAET8C,CAAcxrC,CAAAA,CAAAA,EAAc,CAChC,GAAI,CACFJ,CAAAA,CAAS,OAAQI,CAAAA,CAAG,EACtB,CAAA,KAAQ,EACV,EAEA,OAAA4rC,CAAAA,CAAS,EAAG,CAAA,MAAA,CAAS5pC,CAAa,EAAA,CAChC,GAAIumC,CAAAA,CAAO,MAAQ,CAAA,CACjBC,CACA,EAAA,CAAA,OAAA,CAAQ,OAAQD,CAAAA,CAAAA,CAAO,MAAO8C,CAAAA,CAAAA,CAAarpC,CAAG,CAAC,CAC5C,CAAA,IAAA,CAAK,IAAM,CACVwmC,CACIC,EAAAA,CAAAA,CAAAA,EAASD,CAAY,GAAA,CAAA,EAAK,CAACE,CAAAA,GAC7B8C,CAAW,EAAA,CACXH,EAAY,GAAI,EAAA,EAEpB,CAAC,CAAA,CACA,KAAOrrC,CAAAA,CAAAA,EAAa,CACnB0oC,CAAAA,CAAW,IACX8C,CAAAA,CAAAA,CAAWxrC,CAAG,CAAA,CACdqrC,CAAY,CAAA,OAAA,CAAQrrC,CAAG,EACzB,CAAC,CACH,CAAA,MACF,CAEAqrC,CAAAA,CAAY,KAAMrpC,CAAAA,CAAG,EACvB,CAAC,CAED4pC,CAAAA,CAAAA,CAAS,EAAG,CAAA,KAAA,CAAO,IAAM,CACvBnD,CAAAA,CAAQ,IACJD,CAAAA,CAAAA,GAAY,CAAK,EAAA,CAACE,CACpB8C,GAAAA,CAAAA,EACAH,CAAAA,CAAAA,CAAY,GAAI,EAAA,EAEpB,CAAC,CAAA,CAEDO,EAAS,EAAG,CAAA,OAAA,CAAU5rC,CAAa,EAAA,CACjC0oC,CAAW,CAAA,IAAA,CACX8C,CAAWxrC,CAAAA,CAAG,CACdqrC,CAAAA,CAAAA,CAAY,OAAQrrC,CAAAA,CAAG,EACzB,CAAC,EAEMqrC,CACT,CAEA,KAAK,QAAA,CAAU,CACb,IAAMxrC,CACHuJ,CAAAA,CAAAA,CAAc,aACfA,EAAAA,CAAAA,CAAc,OAAQ,EAAA,CAQxB,OAPe,IAAIg/B,GAAavoC,CAAc2B,CAAAA,CAAAA,CAAOH,CAAQ,CAAA,CAC3D,MAAQknC,CAAAA,CAAAA,CAAO,MAIjB,CAAC,CAIH,CAEA,KAAK,OAAA,CAAS,CACZ,IAAMtoC,EACHmJ,CAAc,CAAA,aAAA,EACfA,CAAc,CAAA,OAAA,EACViiC,CAAAA,CAAAA,CAAc,IAAIC,kBAAAA,CAAY,CAClC,UAAA,CAAYnrC,CAAQ,CAAA,UAAA,EAAc,IAClC,CAAA,aAAA,CAAeA,EAAQ,aACzB,CAAC,CAEKqqC,CAAAA,CAAAA,CAAevqC,CAAY,CAAA,OAAA,EACjCuqC,CAAAA,CAAAA,CAAa,MAAS,CAAA,IAAA,CAEtBnpC,CAAO,CAAA,OAAA,CAAQ,CAACC,CAAAA,CAAOsU,IAAU,CAC/B40B,CAAAA,CAAa,KAAM,CAAA,CAAA,CAAA,EAAI50B,CAAK,CAAA,CAAA,CAAItU,CAAK,EACvC,CAAC,CAAA,CAED,IAAImpC,CAAAA,CAAgB,CACdC,CAAAA,CAAAA,CAAalpC,EAAM,OACvB,CAAA,YAAA,CACA,IAAM,CAAA,EAAA,EAAKipC,CAAe,EAAA,CAAA,CAC5B,CAEIjC,CAAAA,CAAAA,CAAU,CACVC,CAAAA,CAAAA,CAAQ,KACRC,CAAAA,CAAAA,CAAW,KAEf,CAAA,OAAA8B,EAAa,EAAG,CAAA,KAAA,CAAQxoC,CAAa,EAAA,CACnC,GAAI,CAAA0mC,CAEJ,CAAA,CAAA,GAAIH,CAAO,CAAA,MAAA,CAAQ,CACjBC,CAAAA,EAAAA,CACA,OAAQ,CAAA,OAAA,CAAQD,EAAO,MAAO8C,CAAAA,CAAAA,CAAarpC,CAAG,CAAC,CAC5C,CAAA,IAAA,CAAK,IAAM,CACVwmC,CACIC,EAAAA,CAAAA,CAAAA,EAASD,CAAY,GAAA,CAAA,EAAK,CAACE,CAAAA,EAC7B2C,EAAY,GAAI,GAEpB,CAAC,CAAA,CACA,KAAOrrC,CAAAA,CAAAA,EAAa,CACnB0oC,CAAAA,CAAW,IACX2C,CAAAA,CAAAA,CAAY,OAAQrrC,CAAAA,CAAG,EACzB,CAAC,EACH,MACF,CAEAqrC,CAAY,CAAA,KAAA,CAAMrpC,CAAG,EAAA,CACvB,CAAC,CAAA,CAEDwoC,CAAa,CAAA,EAAA,CAAG,OAAUxqC,CAAAA,CAAAA,EAAa,CACrC0oC,CAAAA,CAAW,KACX2C,CAAY,CAAA,OAAA,CAAQrrC,CAAG,EACzB,CAAC,CAAA,CAEDwqC,CAAa,CAAA,EAAA,CAAG,MAAQ,CAAA,IAAM,CAC5B/B,CAAAA,CAAQ,IACJD,CAAAA,CAAAA,GAAY,CAAK,EAAA,CAACE,CACpB2C,EAAAA,CAAAA,CAAY,GAAI,GAEpB,CAAC,CAAA,CAEDb,CAAa,CAAA,KAAA,CAAME,CAAU,CAAA,CAEtBW,CACT,CAEA,KAAK,UAAA,CAAY,CAEf,IAAMQ,CAAAA,CAAaziC,CAAc,CAAA,OAAA,EAC3BpE,CAAAA,CAAAA,CACHoE,CAAc,CAAA,aAAA,EACd,MAAOyiC,CAAAA,CAAmB,aAAc,EAAA,CAErCR,CAAc,CAAA,IAAIC,mBAAY,CAClC,UAAA,CAAYnrC,CAAQ,CAAA,UAAA,EAAc,IAClC,CAAA,aAAA,CAAeA,CAAQ,CAAA,aACzB,CAAC,CAAA,CAEK2rC,CAAkC,CAAA,IAAA,CAElCC,CAAqB1qC,CAAAA,CAAAA,CAAO,IAAIqoC,EAAgC,CAAA,CAChEsC,CAAehnC,CAAAA,CAAAA,CAAiB,WACpCxD,CAAAA,CAAAA,CACAuqC,CACA,CAAA,CACE,SAAWD,CAAAA,CACb,CACF,CAAA,CAEItD,CAAU,CAAA,CAAA,CACVC,EAAQ,KACRC,CAAAA,CAAAA,CAAW,KAET8C,CAAAA,CAAAA,CAAa,SAAY,CAC7B,GAAI,CACF,MAAMxmC,CAAAA,CAAiB,KAAM,GAC/B,CAAQ,KAAA,EACV,CAEA,CAAA,OAAAgnC,CAAa,CAAA,EAAA,CAAG,MAAShqC,CAAAA,CAAAA,EAAa,CACpC,GAAI0mC,CAAU,CAAA,OAGd,IAAMuC,CAAAA,CAAqC,EAAC,CAC5C,QAAWjsC,CAAOgD,IAAAA,CAAAA,CAChBipC,CAAcjsC,CAAAA,CAAAA,CAAI,WAAY,EAAC,CAAIgD,CAAAA,CAAAA,CAAIhD,CAAG,CAAA,CAG5C,GAAIupC,CAAAA,CAAO,MAAQ,CAAA,CACjBC,IACA,OAAQ,CAAA,OAAA,CAAQD,CAAO,CAAA,MAAA,CAAO8C,CAAaJ,CAAAA,CAAa,CAAC,CAAA,CACtD,IAAK,CAAA,IAAM,CACVzC,CAAAA,EAAAA,CACIC,CAASD,EAAAA,CAAAA,GAAY,GAAK,CAACE,CAAAA,GAC7B8C,CAAW,EAAA,CACXH,CAAY,CAAA,GAAA,EAEhB,EAAA,CAAC,CACA,CAAA,KAAA,CAAOrrC,CAAa,EAAA,CACnB0oC,CAAW,CAAA,IAAA,CACX8C,GACAH,CAAAA,CAAAA,CAAY,OAAQrrC,CAAAA,CAAG,EACzB,CAAC,CACH,CAAA,MACF,CAEAqrC,CAAAA,CAAY,KAAMJ,CAAAA,CAAa,EACjC,CAAC,EAEDe,CAAa,CAAA,EAAA,CAAG,KAAO,CAAA,IAAM,CAC3BvD,CAAAA,CAAQ,IACJD,CAAAA,CAAAA,GAAY,CAAK,EAAA,CAACE,CACpB8C,GAAAA,CAAAA,EACAH,CAAAA,CAAAA,CAAY,KAEhB,EAAA,CAAC,CAEDW,CAAAA,CAAAA,CAAa,EAAG,CAAA,OAAA,CAAUhsC,CAAa,EAAA,CACrC0oC,CAAW,CAAA,IAAA,CACX8C,CAAW,EAAA,CACXH,CAAY,CAAA,OAAA,CAAQrrC,CAAG,EACzB,CAAC,CAEMqrC,CAAAA,CACT,CAEA,QACE,MAAM,IAAIvuC,CACR,CAAA,kBAAA,CACA,CAA6BuO,0BAAAA,EAAAA,CAAO,CACtC,CAAA,CACJ,CACF,CAEA,CAAA,eAAe++B,EACb6B,CAAAA,CAAAA,CACAC,CAA2C,CAAA,CAAE,UAAY,CAAA,CAAA,CAAG,KAAO,CAAA,CAAE,CACrEzqC,CAAAA,CAAAA,CAAgB,KACJ,CAAA,CACZ,IAAI0qC,CAAU,CAAA,CAAA,CACRC,CAAaF,CAAAA,CAAAA,CAAY,UAAc,EAAA,CAAA,CACvCG,CAAQH,CAAAA,CAAAA,CAAY,KAAS,EAAA,CAAA,CAEnC,eAAeI,CAAAA,EAAsB,CACnC,GAAI,CACF,OAAOL,CAAAA,EACT,CAAA,MAASjsC,CAAU,CAAA,CACjB,GACE,CAAC,MAAO,CAAA,SAAA,CAAU,cAAe,CAAA,IAAA,CAAKA,CAAK,CAAA,MAAM,CACjDA,EAAAA,CAAAA,CAAI,IAAS,GAAA,cAAA,CAEb,MAAMA,CAAAA,CAGR,GAAImsC,CAAAA,CAAUC,CACZ,CAAA,OAAAD,CACAxqC,EAAAA,CAAAA,EAAAA,CACE,CAAmB0qC,gBAAAA,EAAAA,CAAK,CAAeF,YAAAA,EAAAA,CAAO,IAAIC,CAAU,CAAA,CAAA,CAAA,CAC5D,MACA3qC,CAAAA,CACF,CAEA,CAAA,MAAM,IAAI,OAAA,CAAS4E,CAAY,EAAA,UAAA,CAAWA,CAASgmC,CAAAA,CAAK,CAAC,CAAA,CAClDC,GAGT,CAAA,MAAMtsC,CACR,CACF,CAEA,OAAOssC,CAAQ,EACjB,CGrjBO,IAAMC,CAAAA,CACX,CACEN,CACAO,CAAAA,CAAAA,CAAmC,QACnCC,CAAAA,CAAAA,CAAM,CAER,GAAA,MAAA,GAAUz1B,CAA+C,GAAA,CACvD,IAAM01B,CAAAA,CAAQ,WAAY,CAAA,GAAA,EACpBC,CAAAA,CAAAA,CAAM,MAAMV,CAAG,CAAA,GAAGj1B,CAAI,CAAA,CACtB41B,CAAU,CAAA,WAAA,CAAY,GAAI,EAAA,CAAIF,CAGpC,CAAA,OAAO,CADOF,CAAAA,CAAAA,GAAe,QAAWI,CAAAA,CAAAA,CAAUA,EAAU,GAC9C,EAAA,OAAA,CAAQH,CAAG,CAAA,CAAGE,CAAG,CACjC,CCnBK,CAAA,IAAME,CAAN,CAAA,cAAyBv/B,CAAU,CASxC,WACE9F,CAAAA,CAAAA,CACA2T,EACAmJ,CACAwoB,CAAAA,CAAAA,CACA,CACA,KAAA,CAAM,QAAQ,CAAA,CAXhB,IAAa,CAAA,UAAA,CAAA,IAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,KAAA,CAChC,IAAS,CAAA,MAAA,CAAA,QAAA,CACT,IAAO,CAAA,IAAA,CAAA,QAAA,CASL,KAAK,MAAStlC,CAAAA,CAAAA,CACd,IAAK,CAAA,KAAA,CAAQ2T,CACb,CAAA,IAAA,CAAK,WAAcmJ,CAAAA,CAAAA,CACnB,IAAK,CAAA,UAAA,CAAawoB,CAAS,EAAA,MAC7B,CACF,CAAA,CCfA,IAAqBC,EAArB,CAAA,KAA2D,CAMzD,WAAA,CACEt6B,CACA3Q,CAAAA,CAAAA,CACAsH,CACA,CAAA,CACA,IAAK,CAAA,MAAA,CAAStH,CACd,CAAA,IAAA,CAAK,aAAgBsH,CAAAA,CAAAA,CACrB,KAAK,cAAiBkM,CAAAA,EAAAA,CAAa7C,CAAW,CAAA,CAC9C,IAAK,CAAA,iBAAA,CAAoB,IAAI,GAAA,CAC3B,IAAK,CAAA,cAAA,CAAe,GAAKwC,CAAAA,CAAAA,EAAa,CAACA,CAAAA,CAAS,WAAYA,CAAQ,CAAC,CACvE,EACF,CAEA,oBAAA,CAAqBA,CAAsC,CAAA,CACzD,IAAM0sB,CAAAA,CAAgB,IAAK,CAAA,iBAAA,CAAkB,GAAI1sB,CAAAA,CAAAA,CAAS,UAAU,CAAA,CACpE,GAAI,CAAC0sB,CACH,CAAA,MAAM,IAAI7kC,CAAAA,CACR,4CACA,CAAA,CAAA,4BAAA,EAA+BmY,CAAS,CAAA,QAAA,EAAU,CAAA,CACpD,EAGF,OAAO0sB,CACT,CACF,CAAA,CCCO,SAASqL,EAAAA,CACdtjC,CACAujC,CAAAA,CAAAA,CACAC,CACoB,CAAA,CACpB,OAAO,CACL,KAAOA,CAAAA,CAAAA,CACP,QAASD,CACT,CAAA,WAAA,CAAavjC,CACb,CAAA,SAAA,CAAW,CACX,CAAA,OAAA,CAASwjC,CAAU,GAAA,CAAA,CACnB,QAAU,CAAA,IAAA,CAAK,GAAI,CAAA,CAAA,CAAG,IAAK,CAAA,IAAA,CAAKA,EAAQD,CAAK,CAAC,CAC9C,CAAA,YAAA,CAAcvjC,CAAO,CAAA,IAAA,CAAK,GAAI,CAAA,CAAA,CAAG,IAAK,CAAA,IAAA,CAAKwjC,CAAQD,CAAAA,CAAK,CAAC,CAAA,CACzD,SAAUC,CAAQD,CAAAA,CACpB,CACF,CAEO,SAASE,EAAAA,CACdF,CACAC,CAAAA,CAAAA,CAC0B,CAC1B,OAAO,CACL,OAAA,CAASD,CACT,CAAA,KAAA,CAAOC,EACP,SAAW,CAAA,CAAA,CACX,OAASA,CAAAA,CAAAA,GAAU,CACrB,CACF,CC9DO,IAAME,EAAkBnuC,CAAAA,CAAAA,EACzB,OAAOA,CAAAA,EAAU,QACZA,CAAAA,CAAAA,CAGF,WAAWA,CAAK,CAAA,CCOlB,IAAMouC,EAAAA,CAAN,cAAyB//B,CAAU,CAUxC,WAAA,CACE9F,CACAsgC,CAAAA,CAAAA,CACAC,CAAqB,CAAA,KAAA,CACrBC,CACA/oC,CAAAA,CAAAA,CACAuO,EAAsB,KACtB,CAAA,CACA,KAAM,CAAA,QAAA,CAAUA,CAAU,CAAA,CAb5B,IAA2B,CAAA,UAAA,CAAA,KAAA,CAC3B,IAAgC,CAAA,6BAAA,CAAA,KAAA,CAChC,IAAS,CAAA,MAAA,CAAA,QAAA,CACT,IAAO,CAAA,IAAA,CAAA,QAAA,CAWL,KAAK,MAAShG,CAAAA,CAAAA,CACd,IAAK,CAAA,UAAA,CAAa,CAAGsgC,EAAAA,CAAU,CAC/B,CAAA,CAAA,CAAA,IAAA,CAAK,SAAYC,CAAAA,CAAAA,CACjB,IAAK,CAAA,QAAA,CAAWC,CAChB,CAAA,IAAA,CAAK,MAAQ/oC,EACf,CACF,CCvCO,CAAA,IAAMquC,EAAN,CAAA,cAA2BhgC,CAAU,CAM1C,WAAc,EAAA,CACZ,KAAM,CAAA,UAAU,CANlB,CAAA,IAAA,CAAA,UAAA,CAAa,IACb,IAAgC,CAAA,6BAAA,CAAA,KAAA,CAChC,IAAS,CAAA,MAAA,CAAA,UAAA,CACT,IAAO,CAAA,IAAA,CAAA,WAIP,CACF,CAAA,CCTO,IAAMigC,EAAAA,CAAN,cAA6BjgC,CAAU,CAO5C,WAAA,CAAYhG,EAAmB,CAC7B,KAAA,CAAM,QAAQ,CAAA,CANhB,IAAa,CAAA,UAAA,CAAA,GAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,KAAA,CAChC,IAAS,CAAA,MAAA,CAAA,YAAA,CACT,IAAO,CAAA,IAAA,CAAA,aAAA,CAIL,IAAK,CAAA,OAAA,CAAUA,EACjB,CACF,CAAA,CCXO,IAAMkmC,EAAAA,CAAN,cAAuBlgC,CAAU,CAWtC,WAAA,CACEnL,CACAsrC,CAAAA,CAAAA,CACAC,CACApuC,CAAAA,CAAAA,CAAkE,OAClEquC,CAAAA,CAAAA,CACAngC,EAAsB,KACtB,CAAA,CACA,KAAM,CAAA,CAAA,EAAGlO,CAAI,CAAA,KAAA,CAAA,CAASkO,CAAU,CAAA,CAdlC,IAAa,CAAA,UAAA,CAAA,GAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,IAAA,CAChC,IAAS,CAAA,MAAA,CAAA,MAAA,CACT,UAAO,MACP,CAAA,IAAA,CAAA,IAAA,CAAkE,OAWhE,CAAA,IAAA,CAAK,KAAQrL,CAAAA,CAAAA,CACb,IAAK,CAAA,IAAA,CAAOsrC,CACZ,CAAA,IAAA,CAAK,KAAQC,CAAAA,CAAAA,CACb,IAAK,CAAA,EAAA,CAAKC,EACZ,CACF,CAAA,CCzBO,IAAMC,EAAAA,CAAN,cAA0BtgC,CAAU,CAOzC,WAAA,CAAY9F,CAAgBgG,CAAAA,CAAAA,CAAsB,KAAO,CAAA,CACvD,KAAM,CAAA,UAAA,CAAYA,CAAU,CAN9B,CAAA,IAAA,CAAA,UAAA,CAAa,IACb,CAAA,IAAA,CAAA,6BAAA,CAAgC,KAChC,CAAA,IAAA,CAAA,MAAA,CAAS,UACT,CAAA,IAAA,CAAA,IAAA,CAAO,UAIL,CAAA,IAAA,CAAK,MAAShG,CAAAA,EAChB,CACF,CAAA,CCXO,IAAMqmC,EAAN,CAAA,cAAwBvgC,CAAU,CAOvC,WAAY2/B,CAAAA,CAAAA,CAAe,CACzB,KAAA,CAAM,OAAO,CAAA,CANf,IAAa,CAAA,UAAA,CAAA,GAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,KAAA,CAChC,YAAS,OACT,CAAA,IAAA,CAAA,IAAA,CAAO,OAIL,CAAA,IAAA,CAAK,KAAQA,CAAAA,EACf,CACF,CAAA,CCXO,IAAMa,EAAAA,CAAN,cAAyBxgC,CAAU,CAOxC,WAAA,CAAYygC,EAAgB,CAC1B,KAAA,CAAM,QAAQ,CAAA,CANhB,IAAa,CAAA,UAAA,CAAA,GAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,KAAA,CAChC,IAAS,CAAA,MAAA,CAAA,QAAA,CACT,IAAO,CAAA,IAAA,CAAA,QAAA,CAIL,IAAK,CAAA,MAAA,CAASA,EAChB,CACF,CAAA,CCXO,IAAMC,EAAAA,CAAN,cAA0B1gC,CAAU,CAQzC,WAAA,CACE9F,CACAymC,CAAAA,CAAAA,CAA4B,KAC5BzgC,CAAAA,CAAAA,CAAsB,KACtB,CAAA,CACA,KAAM,CAAA,UAAA,CAAYA,CAAU,CAAA,CAV9B,IAAa,CAAA,UAAA,CAAA,IAAA,CACb,IAAgC,CAAA,6BAAA,CAAA,KAAA,CAChC,IAAS,CAAA,MAAA,CAAA,UAAA,CACT,IAAO,CAAA,IAAA,CAAA,UAAA,CAQL,IAAK,CAAA,MAAA,CAAShG,CACd,CAAA,IAAA,CAAK,UAAYymC,EACnB,CACF,CCLO,CAAA,IAAeC,EAAf,CAAA,KAAmD,CAW9C,WAAA,CAAY9mC,CAAqBgC,CAAAA,CAAAA,CAA8B,CACvE,IAAA,CAAK,KAAQhC,CAAAA,CAAAA,CACb,KAAK,aAAgBgC,CAAAA,CAAAA,CACrB,IAAK,CAAA,YAAA,CAAe,EAAC,CACrB,IAAK,CAAA,YAAA,CAAe,EAAC,CACrB,IAAK,CAAA,SAAA,CAAY,IACjB,CAAA,IAAA,CAAK,WAAa,IAClB,CAAA,IAAA,CAAK,IAAO,CAAA,IAAA,CAAK,aAAc,CAAA,IAAA,CAC/B,IAAM+kC,CAAAA,CAAgB,IAAK,CAAA,KAAA,EAAe,UAC1C,CAAA,IAAA,CAAK,YACH,CAAA,OAAOA,GAAiB,UAAaA,CAAAA,CAAAA,CAAa,IAAK,CAAA,IAAA,CAAK,KAAK,CAAA,CAAI,EAAC,CACxE,IAAK,CAAA,eAAA,CAAkB,IAAI,GAAA,CACzB,IAAK,CAAA,YAAA,CAAa,IAAKj7B,CAAgB,EAAA,CACrCA,CAAY,CAAA,UAAA,CACZA,CACF,CAAC,CACH,EACF,CAKA,YAAA,EAAqB,CACnB,OAAA,IAAA,CAAK,YAAe,CAAA,GACb,IACT,CAKA,YAAqB,EAAA,CACnB,OAAK,IAAA,CAAA,YAAA,CAAe,EAAC,CACd,IACT,CAKA,UAAmB,EAAA,CACjB,OAAK,IAAA,CAAA,SAAA,CAAY,KACV,IACT,CAKA,WAAoB,EAAA,CAClB,OAAK,IAAA,CAAA,UAAA,CAAa,IACX,CAAA,IACT,CAOA,OAAA,CAAA,GAAW5L,CAA2D,CAAA,CACpE,OAAAA,CAAAA,CAAQ,QAASE,CAAW,EAAA,CAC1B,IAAK,CAAA,YAAA,CAAa,IAAK,CAAA,IAAIomC,EAAYpmC,CAAAA,CAAgB,CAAC,EAC1D,CAAC,CAAA,CAEM,IACT,CAKA,WAAWhG,CAAqB,CAAA,CAC9B,OAAK,IAAA,CAAA,YAAA,CAAa,IAAK,CAAA,IAAIosC,EAAYpsC,CAAAA,CAAAA,CAAO,IAAI,CAAC,CAC5C,CAAA,IACT,CAUA,OAAA,CACEgG,EACA4mC,CACM,CAAA,CACN,OAAK,IAAA,CAAA,YAAA,CAAa,IAAK,CAAA,IAAIJ,EAAYxmC,CAAAA,CAAAA,CAAkB4mC,CAAK,CAAC,CACxD,CAAA,IACT,CAKA,UAAA,CAAW5sC,EAAqB,CAC9B,OAAA,IAAA,CAAK,YAAa,CAAA,IAAA,CAAK,IAAIwsC,EAAAA,CAAYxsC,CAAO,CAAA,KAAA,CAAO,IAAI,CAAC,CACnD,CAAA,IACT,CAKA,KAAA,CAAMyrC,EAAqB,CACzB,OAAI,OAAOA,CAAAA,EAAU,QACnBrrC,EAAAA,CAAAA,CAAO,IACL,CAAA,CAAA,EAAG,IAAK,CAAA,KAAA,CAAM,IAAI,CAAA,+CAAA,CACpB,CAGF,CAAA,IAAA,CAAK,UAAY,IAAIisC,EAAAA,CAAUZ,CAAK,CAAA,CAC7B,IACT,CAKA,MAAOc,CAAAA,CAAAA,CAAsB,CAC3B,OAAI,OAAOA,CAAAA,EAAW,QACpBnsC,EAAAA,CAAAA,CAAO,KACL,CAAG,EAAA,IAAA,CAAK,KAAM,CAAA,IAAI,CACpB,iDAAA,CAAA,CAAA,CAGF,IAAK,CAAA,UAAA,CAAa,IAAIksC,EAAAA,CAAWC,CAAM,CAAA,CAChC,IACT,CACF,EC3IO,IAAeM,EAAAA,CAAf,cAEGH,EAAsB,CAEpB,WAAA,CAAY9mC,CAAqBgC,CAAAA,CAAAA,CAA8B,CACvE,KAAA,CAAMhC,CAAOgC,CAAAA,CAAa,CAC1B,CAAA,IAAA,CAAK,UAAY,GACnB,CAKA,SAAA,EAAkB,CAChB,OAAA,IAAA,CAAK,SAAY,CAAA,EACV,CAAA,IACT,CAKA,OAAA,CAAQ5H,CAAqB,CAAA,CAC3B,YAAK,SAAU,CAAA,IAAA,CACb,IAAIgsC,EAAAA,CACFhsC,CACA,CAAA,EAAA,CACA,EACA,CAAA,OAAA,CACA,CACE,QAAA,CAAU,GACZ,CAAA,CACA,IACF,CACF,EACO,IACT,CAKA,WAAYA,CAAAA,CAAAA,CAAqB,CAC/B,OAAA,IAAA,CAAK,SAAU,CAAA,IAAA,CACb,IAAIgsC,EAAAA,CACFhsC,CACA,CAAA,EAAA,CACA,EACA,CAAA,MAAA,CACA,CACE,QAAU,CAAA,GACZ,CACA,CAAA,IACF,CACF,CAAA,CACO,IACT,CAKA,YAAaA,CAAAA,CAAAA,CAAqB,CAChC,OAAA,IAAA,CAAK,SAAU,CAAA,IAAA,CACb,IAAIgsC,EACFhsC,CAAAA,CAAAA,CACA,EACA,CAAA,EAAA,CACA,OACA,CAAA,CACE,QAAU,CAAA,GACZ,CACA,CAAA,IACF,CACF,CAAA,CACO,IACT,CAKA,YAAYA,CAAqB,CAAA,CAC/B,OAAK,IAAA,CAAA,SAAA,CAAU,IACb,CAAA,IAAIgsC,EAAShsC,CAAAA,CAAAA,CAAO,EAAI,CAAA,EAAA,CAAI,MAAQ,CAAA,CAAE,QAAU,CAAA,GAAI,EAAG,IAAI,CAC7D,CAEO,CAAA,IACT,CAKA,YAAA,CAAaA,CAAqB,CAAA,CAChC,OAAK,IAAA,CAAA,SAAA,CAAU,IACb,CAAA,IAAIgsC,EAAShsC,CAAAA,CAAAA,CAAO,GAAI,EAAI,CAAA,OAAA,CAAS,CAAE,QAAA,CAAU,GAAI,CAAA,CAAG,IAAI,CAC9D,CAEO,CAAA,IACT,CAKA,cAAA,CAAeA,CAAqB,CAAA,CAClC,YAAK,SAAU,CAAA,IAAA,CACb,IAAIgsC,EAAAA,CAAShsC,CAAO,CAAA,EAAA,CAAI,EAAI,CAAA,SAAA,CAAW,CAAE,QAAA,CAAU,GAAI,CAAA,CAAG,IAAI,CAChE,EAEO,IACT,CAiCA,SACE8sC,CAAAA,CAAAA,CACAC,CAIAC,CAAAA,CAAAA,CACAxG,CACM,CAAA,CACN,IAAIyG,CAAAA,CAAuDD,CACrDvR,CAAAA,CAAAA,CAAqC+K,CAE3C,CAAA,GAAI,CAACyG,CAAoB,CAAA,CACvB,GAAI,CAAC,IAAK,CAAA,KAAA,CAAM,UACd,CAAA,MAAM,IAAI3xC,CAAAA,CACR,wBACA,CAAA,0BACF,CAGF2xC,CAAAA,CAAAA,CAAqB,GAAG,IAAK,CAAA,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,IAAK,CAAA,KAAA,CAAM,UAAU,CAAA,EACnE,CAEA,OAAA,IAAA,CAAK,IACH,CAAA,OAAOH,CAAkB,EAAA,QAAA,CAAWA,EAAgBA,CAAc,CAAA,KAAA,CAClEC,CACAE,CAAAA,CAAAA,CACAxR,CACF,CAAA,CAEO,IACT,CAiCA,IACEqR,CAAAA,CAAAA,CACAC,CAIAC,CAAAA,CAAAA,CACAxG,CACM,CAAA,CACN,IAAIyG,CAAuDD,CAAAA,CAAAA,CACrDvR,CAAqC+K,CAAAA,CAAAA,CAE3C,GAAI,CAACyG,CAAoB,CAAA,CACvB,GAAI,CAAC,IAAK,CAAA,KAAA,CAAM,UACd,CAAA,MAAM,IAAI3xC,CACR,CAAA,wBAAA,CACA,0BACF,CAAA,CAEF2xC,CAAqB,CAAA,CAAA,EAAG,IAAK,CAAA,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,IAAK,CAAA,KAAA,CAAM,UAAU,CAAA,EACnE,CAEA,OAAK,IAAA,CAAA,SAAA,CAAU,IACb,CAAA,IAAIjB,EACF,CAAA,OAAOc,CAAkB,EAAA,QAAA,CAAWA,CAAgBA,CAAAA,CAAAA,CAAc,KAClEC,CAAAA,CAAAA,CACAE,CACA,CAAA,OAAA,CACA,CACE,QAAA,CAAUxR,CAAM,EAAA,GAClB,CACF,CACF,CACO,CAAA,IACT,CAiCA,QAAA,CACEqR,CACAC,CAAAA,CAAAA,CAIAC,CACAxG,CAAAA,CAAAA,CACM,CACN,IAAIyG,EAAuDD,CACrDvR,CAAAA,CAAAA,CAAqC+K,CAE3C,CAAA,GAAI,CAACyG,CAAAA,CAAoB,CACvB,GAAI,CAAC,IAAA,CAAK,KAAM,CAAA,UAAA,CACd,MAAM,IAAI3xC,EACR,wBACA,CAAA,0BACF,CAEF2xC,CAAAA,CAAAA,CAAqB,CAAG,EAAA,IAAA,CAAK,KAAM,CAAA,KAAK,CAAI,CAAA,EAAA,IAAA,CAAK,KAAM,CAAA,UAAU,CACnE,EAAA,CAEA,YAAK,SAAU,CAAA,IAAA,CACb,IAAIjB,EAAAA,CACF,OAAOc,CAAAA,EAAkB,QAAWA,CAAAA,CAAAA,CAAgBA,CAAc,CAAA,KAAA,CAClEC,CACAE,CAAAA,CAAAA,CACA,MACA,CAAA,CACE,SAAUxR,CAAM,EAAA,GAClB,CACF,CACF,CACO,CAAA,IACT,CAqBA,SAAA,CACEqR,CACAC,CAAAA,CAAAA,CAIAC,CACAxG,CAAAA,CAAAA,CACM,CACN,IAAIyG,EAAuDD,CACrDvR,CAAAA,CAAAA,CAAqC+K,CAE3C,CAAA,GAAI,CAACyG,CAAAA,CAAoB,CACvB,GAAI,CAAC,IAAA,CAAK,KAAM,CAAA,UAAA,CACd,MAAM,IAAI3xC,EACR,wBACA,CAAA,0BACF,CAEF2xC,CAAAA,CAAAA,CAAqB,CAAG,EAAA,IAAA,CAAK,KAAM,CAAA,KAAK,CAAI,CAAA,EAAA,IAAA,CAAK,KAAM,CAAA,UAAU,CACnE,EAAA,CAEA,YAAK,SAAU,CAAA,IAAA,CACb,IAAIjB,EAAAA,CACF,OAAOc,CAAAA,EAAkB,QAAWA,CAAAA,CAAAA,CAAgBA,CAAc,CAAA,KAAA,CAClEC,CACAE,CAAAA,CAAAA,CACA,OACA,CAAA,CACE,SAAUxR,CAAM,EAAA,GAClB,CACF,CACF,CACO,CAAA,IACT,CAqBA,QAAA,CACEqR,CACAC,CAAAA,CAAAA,CAIAC,CACAxG,CAAAA,CAAAA,CACM,CACN,IAAIyG,EAAuDD,CACrDvR,CAAAA,CAAAA,CAAqC+K,CAE3C,CAAA,GAAI,CAACyG,CAAAA,CAAoB,CACvB,GAAI,CAAC,IAAA,CAAK,KAAM,CAAA,UAAA,CACd,MAAM,IAAI3xC,EACR,wBACA,CAAA,0BACF,CAEF2xC,CAAAA,CAAAA,CAAqB,CAAG,EAAA,IAAA,CAAK,KAAM,CAAA,KAAK,CAAI,CAAA,EAAA,IAAA,CAAK,KAAM,CAAA,UAAU,CACnE,EAAA,CAEA,YAAK,SAAU,CAAA,IAAA,CACb,IAAIjB,EAAAA,CACF,OAAOc,CAAAA,EAAkB,QAAWA,CAAAA,CAAAA,CAAgBA,CAAc,CAAA,KAAA,CAClEC,CACAE,CAAAA,CAAAA,CACA,MACA,CAAA,CACE,SAAUxR,CAAM,EAAA,GAClB,CACF,CACF,CACO,CAAA,IACT,CACF,CAAA,CC1ZO,IAAMyR,EAAAA,CAAN,cAAkDL,EAAoB,CAU3E,WAAA,CAAYjnC,EAAqBgC,CAA8B,CAAA,CAC7D,KAAMhC,CAAAA,CAAAA,CAAOgC,CAAa,CAAA,CAT5B,IAAU,CAAA,oBAAA,CAAiC,EAAC,CAC5C,IAAU,CAAA,qBAAA,CAAkC,EAAC,CAS3C,KAAK,MAASA,CAAAA,CAAAA,CAAc,SAAU,EAAA,CACtC,IAAK,CAAA,QAAA,CAAW,IAAIk+B,CAAAA,CAAS,IAAK,CAAA,KAAA,CAAM,KAAS,EAAA,EAAE,CACnD,CAAA,IAAA,CAAK,aAAe,IACpB,CAAA,IAAA,CAAK,cAAiB,CAAA,IAAA,CACtB,IAAK,CAAA,WAAA,CAAc,GACrB,CAcA,MAAA,CAAA,GACKhgC,CACG,CAAA,CACN,OAAK,IAAA,CAAA,oBAAA,CAAuB,CAC1B,GAAG,IAAA,CAAK,oBACR,CAAA,GAAIA,CACN,CAAA,CAEqBA,CAAQ,CAAA,GAAA,CAAKE,CAChCuG,EAAAA,CAAAA,CAAYvG,CAAkB,CAAA,IAAA,CAAK,KAAM,CAAA,sBAAsB,CACjE,CAEa,CAAA,OAAA,CAASA,CAAW,EAAA,CAC/B,IAAK,CAAA,WAAA,CAAY,IAAK,CAAA,IAAIqlC,CAAWrlC,CAAAA,CAAM,CAAC,EAC9C,CAAC,CAAA,CAEM,IACT,CAMA,SAAA,CAAUkzB,CAAyB,CAAA,CACjC,OAAK,IAAA,CAAA,WAAA,CAAY,IACf,CAAA,IAAImS,CAAWnS,CAAAA,CAAAA,CAAW,MAAW,CAAA,MAAA,CAAW,IAAI,CACtD,EACO,IACT,CAKA,WAAoB,EAAA,CAClB,OAAK,IAAA,CAAA,oBAAA,CAAuB,EAAC,CAC7B,IAAK,CAAA,WAAA,CAAc,EAAC,CACb,IACT,CAKA,WAAkB,CAChB,OAAA,IAAA,CAAK,QAAW,CAAA,IAAI4M,CAAS,CAAA,IAAA,CAAK,KAAM,CAAA,KAAA,EAAS,EAAE,CAAA,CAC5C,IACT,CAKA,aAAsB,EAAA,CACpB,YAAK,YAAe,CAAA,IAAA,CACb,IACT,CAKA,eAAwB,EAAA,CACtB,OAAK,IAAA,CAAA,cAAA,CAAiB,IACf,CAAA,IACT,CAeA,QAAA,CACEqH,CACAC,CAAAA,CAAAA,CACAC,EACM,CACN,IAAIC,CACAtnC,CAAAA,CAAAA,CACA2T,CAEJ,CAAA,OAAI0zB,CACFC,EAAAA,CAAAA,CAAYH,CACZnnC,CAAAA,CAAAA,CAASonC,CACTzzB,CAAAA,CAAAA,CAAQ0zB,CAERC,GAAAA,CAAAA,CAAY,OACZtnC,CAASmnC,CAAAA,CAAAA,CACTxzB,CAAQyzB,CAAAA,CAAAA,CAAAA,CAGV,IAAK,CAAA,WAAA,CAAY,IAAK,CAAA,IAAI/B,CAAWrlC,CAAAA,CAAAA,CAAQ2T,CAAO2zB,CAAAA,CAAS,CAAC,CAAA,CAC9D,KAAK,qBAAsB,CAAA,IAAA,CAAK3zB,CAAK,CAAA,CAE9B,IACT,CAOA,IAAuBhZ,CAAAA,CAAAA,CAA6B,CAClD,OAAA,IAAA,CAAK,QAAW,CAAA,IAAImlC,CAASnlC,CAAAA,CAAK,EAC3B,IACT,CAOA,KAAMA,CAAAA,CAAAA,CAAqB,CACzB,OAAA,IAAA,CAAK,QAAW,CAAA,IAAImlC,CAASnlC,CAAAA,CAAK,CAC3B,CAAA,IACT,CAKA,QAAA,EAAiB,CACf,OAAK,IAAA,CAAA,YAAA,CAAe,IAAImrC,EAAAA,CACjB,IACT,CASA,UACKhmC,CAAAA,GAAAA,CAAAA,CACG,CACN,OAAA,IAAA,CAAK,cAAiB,CAAA,IAAIimC,EAAejmC,CAAAA,CAAmB,EACrD,IACT,CACF,CCzKO,CAAA,IAAeynC,EAAf,CAAA,cAEGL,EAAsB,CAK9B,WACEtnC,CAAAA,CAAAA,CACAgC,CACAkrB,CAAAA,CAAAA,CAAoB,KACpB,CAAA,CACA,MAAMltB,CAAOgC,CAAAA,CAAa,CAP5B,CAAA,IAAA,CAAU,iBAAoB,CAAA,KAAA,CAQ5B,IAAK,CAAA,UAAA,CAAa,EAAC,CACnB,IAAK,CAAA,WAAA,CAAc,EAAC,CACpB,KAAK,iBAAoBkrB,CAAAA,EAC3B,CAEA,UAAA,EAAmB,CACjB,OAAA,IAAA,CAAK,UAAa,CAAA,EACX,CAAA,IACT,CAEA,WAAA,EAAoB,CAClB,OAAA,IAAA,CAAK,YAAc,EAAC,CACb,IACT,CAMA,UAAWr1B,CAAAA,CAAAA,CAAYu6B,CAAiC,CAAA,CACtD,OAA2Bv6B,CAAAA,EAAU,IAC5B,CAAA,IAAA,EAGTu6B,CAAG,CAAA,IAAI,EACA,IACT,CAAA,CAMA,IAAKv6B,CAAAA,CAAAA,CAAYu6B,CAAiC,CAAA,CAChD,OAAKv6B,CAAAA,EAILu6B,CAAG,CAAA,IAAI,CACA,CAAA,IAAA,EAJE,IAKX,CA6BA,KACEwV,CAAAA,CAAAA,CAIAC,CAMAhwC,CAAAA,CAAAA,CAIM,CACN,OAAI,OAAO+vC,CAAAA,EAAe,UACjB,CAAA,IAAA,CAAK,aACVA,CAAAA,CACF,CAGE,CAAA,OAAOC,CAAoB,EAAA,UAAA,EAAchwC,IAAU,MAC9C,CAAA,IAAA,CAAK,gBACV+vC,CAAAA,CAAAA,CACA,IACAC,CAAAA,CACF,CAGEA,CAAAA,CAAAA,YAA2BC,CAAgBjwC,EAAAA,CAAAA,GAAU,MAChD,CAAA,IAAA,CAAK,gBACV+vC,CAAAA,CAAAA,CACA,KACAC,CACF,CAAA,CAIA,OAAOA,CAAAA,EAAoB,QAC1BA,EAAAA,CAAAA,GAA+B,GAChChwC,EAAAA,CAAAA,GAAU,MACTA,GAAAA,CAAAA,YAAiBiwC,CAAgB,EAAA,OAAOjwC,CAAU,EAAA,UAAA,CAAA,CAE5C,KAAK,gBACV+vC,CAAAA,CAAAA,CACAC,CACAhwC,CAAAA,CACF,CAGK,CAAA,IAAA,CAAK,QACV+vC,CAAAA,CAAAA,CACAC,CACAhwC,CAAAA,CACF,CACF,CA6BA,QACE+vC,CAAAA,CAAAA,CAIAC,EAMAhwC,CAIM,CAAA,CACN,GAAI,OAAO+vC,CAAe,EAAA,UAAA,CACxB,OAAO,IAAA,CAAK,aACVA,CAAAA,CACF,CAGF,CAAA,GAAI,OAAOC,CAAAA,EAAoB,YAAchwC,CAAU,GAAA,MAAA,CACrD,OAAO,IAAA,CAAK,gBACV+vC,CAAAA,CAAAA,CACA,IACAC,CAAAA,CACF,CAGF,CAAA,GAAIA,CAA2BC,YAAAA,CAAAA,EAAgBjwC,CAAU,GAAA,MAAA,CACvD,OAAO,IAAK,CAAA,gBAAA,CACV+vC,CACA,CAAA,IAAA,CACAC,CACF,CAAA,CAGF,GACE,OAAOA,CAAoB,EAAA,QAAA,EAC1BA,CAA+B,GAAA,GAAA,EAChChwC,CAAU,GAAA,MAAA,GACTA,aAAiBiwC,CAAgB,EAAA,OAAOjwC,CAAU,EAAA,UAAA,CAAA,CAEnD,OAAO,IAAA,CAAK,gBACV+vC,CAAAA,CAAAA,CACAC,CACAhwC,CAAAA,CACF,CAGF,CAAA,IAAI+oC,CAA+B,CAAA,GAAA,CAC/BmH,EAEJ,OACE,OAAOF,CAAoB,EAAA,QAAA,EAC3BhwC,CAAU,GAAA,MAAA,EACV,EAAEA,CAAAA,YAAiBiwC,CACnB,CAAA,EAAA,OAAOjwC,CAAU,EAAA,UAAA,EAEjB+oC,CAAWiH,CAAAA,CAAAA,CACXE,EAAclwC,CAEdkwC,GAAAA,CAAAA,CAAcF,CACdjH,CAAAA,CAAAA,CAAW,GAGb,CAAA,CAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CACd,IAAIH,CAAAA,CAAUmH,CAAsB,CAAA,KAAA,CAAO,KAAOhH,CAAAA,CAAAA,CAAUmH,CAAW,CACzE,CAAA,CACO,IACT,CA6BA,OACEH,CAAAA,CAAAA,CAIAC,CAMAhwC,CAAAA,CAAAA,CAIM,CACN,GAAI,OAAO+vC,CAAAA,EAAe,UACxB,CAAA,OAAO,KAAK,YACVA,CAAAA,CACF,CAGF,CAAA,GAAI,OAAOC,CAAAA,EAAoB,UAAchwC,EAAAA,CAAAA,GAAU,MACrD,CAAA,OAAO,IAAK,CAAA,eAAA,CACV+vC,CACA,CAAA,IAAA,CACAC,CACF,CAGF,CAAA,GAAIA,CAA2BC,YAAAA,CAAAA,EAAgBjwC,CAAU,GAAA,MAAA,CACvD,OAAO,IAAA,CAAK,eACV+vC,CAAAA,CAAAA,CACA,IACAC,CAAAA,CACF,CAGF,CAAA,GACE,OAAOA,CAAoB,EAAA,QAAA,EAC1BA,CAA+B,GAAA,GAAA,EAChChwC,CAAU,GAAA,MAAA,GACTA,CAAiBiwC,YAAAA,CAAAA,EAAgB,OAAOjwC,CAAAA,EAAU,UAEnD,CAAA,CAAA,OAAO,IAAK,CAAA,eAAA,CACV+vC,EACAC,CACAhwC,CAAAA,CACF,CAGF,CAAA,IAAI+oC,CAA+B,CAAA,GAAA,CAC/BmH,CAEJ,CAAA,OACE,OAAOF,CAAAA,EAAoB,QAC3BhwC,EAAAA,CAAAA,GAAU,MACV,EAAA,EAAEA,aAAiBiwC,CACnB,CAAA,EAAA,OAAOjwC,CAAU,EAAA,UAAA,EAEjB+oC,CAAWiH,CAAAA,CAAAA,CACXE,CAAclwC,CAAAA,CAAAA,GAEdkwC,CAAcF,CAAAA,CAAAA,CACdjH,CAAW,CAAA,GAAA,CAAA,CAGb,IAAK,CAAA,UAAA,CAAW,IACd,CAAA,IAAIH,CAAUmH,CAAAA,CAAAA,CAAsB,IAAM,CAAA,KAAA,CAAOhH,CAAUmH,CAAAA,CAAW,CACxE,CAAA,CACO,IACT,CA4BA,QACE3nC,CAAAA,CAAAA,CACAynC,CAMAhwC,CAAAA,CAAAA,CAIM,CACN,GAAI,OAAOgwC,CAAoB,EAAA,UAAA,EAAchwC,CAAU,GAAA,MAAA,CACrD,OAAO,IAAA,CAAK,gBACVuI,CAAAA,CAAAA,CACA,QACAynC,CAAAA,CACF,CAGF,CAAA,GAAIA,aAA2BC,CAAgBjwC,EAAAA,CAAAA,GAAU,MACvD,CAAA,OAAO,IAAK,CAAA,gBAAA,CACVuI,CACA,CAAA,QAAA,CACAynC,CACF,CAAA,CAGF,GACE,OAAOA,CAAoB,EAAA,QAAA,EAC3BhwC,IAAU,MACTA,GAAAA,CAAAA,YAAiBiwC,CAAgB,EAAA,OAAOjwC,CAAU,EAAA,UAAA,CAAA,CAEnD,OAAO,IAAA,CAAK,gBACVuI,CAAAA,CAAAA,CACAynC,CACAhwC,CAAAA,CACF,CAGF,CAAA,IAAI+oC,EAA+B,GAC/BmH,CAAAA,CAAAA,CAEJ,OACE,OAAOF,CAAoB,EAAA,QAAA,EAC3BhwC,CAAU,GAAA,MAAA,EACV,EAAEA,CAAAA,YAAiBiwC,CACnB,CAAA,EAAA,OAAOjwC,CAAU,EAAA,UAAA,EAEjB+oC,EAAWiH,CACXE,CAAAA,CAAAA,CAAclwC,CAEdkwC,GAAAA,CAAAA,CAAcF,CACdjH,CAAAA,CAAAA,CAAW,GAGb,CAAA,CAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CACd,IAAIH,CAAAA,CAAUrgC,CAAkB,CAAA,KAAA,CAAO,KAAMwgC,CAAUmH,CAAAA,CAAW,CACpE,CAAA,CACO,IACT,CA4BA,WACE3nC,CAAAA,CAAAA,CACAynC,CAMAhwC,CAAAA,CAAAA,CAIM,CACN,GAAI,OAAOgwC,CAAAA,EAAoB,YAAchwC,CAAU,GAAA,MAAA,CACrD,OAAO,IAAA,CAAK,gBACVuI,CAAAA,CAAAA,CACA,QACAynC,CAAAA,CACF,CAGF,CAAA,GAAIA,CAA2BC,YAAAA,CAAAA,EAAgBjwC,CAAU,GAAA,MAAA,CACvD,OAAO,IAAK,CAAA,gBAAA,CACVuI,CACA,CAAA,QAAA,CACAynC,CACF,CAAA,CAGF,GACE,OAAOA,CAAoB,EAAA,QAAA,EAC3BhwC,CAAU,GAAA,MAAA,GACTA,CAAiBiwC,YAAAA,CAAAA,EAAgB,OAAOjwC,CAAU,EAAA,UAAA,CAAA,CAEnD,OAAO,IAAA,CAAK,gBACVuI,CAAAA,CAAAA,CACAynC,CACAhwC,CAAAA,CACF,CAGF,CAAA,IAAI+oC,CAA+B,CAAA,GAAA,CAC/BmH,CAEJ,CAAA,OACE,OAAOF,CAAoB,EAAA,QAAA,EAC3BhwC,CAAU,GAAA,MAAA,EACV,EAAEA,CAAAA,YAAiBiwC,CACnB,CAAA,EAAA,OAAOjwC,CAAU,EAAA,UAAA,EAEjB+oC,CAAWiH,CAAAA,CAAAA,CACXE,CAAclwC,CAAAA,CAAAA,GAEdkwC,EAAcF,CACdjH,CAAAA,CAAAA,CAAW,GAGb,CAAA,CAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CACd,IAAIH,CAAAA,CAAUrgC,CAAkB,CAAA,KAAA,CAAO,IAAMwgC,CAAAA,CAAAA,CAAUmH,CAAW,CACpE,EACO,IACT,CA4BA,UACE3nC,CAAAA,CAAAA,CACAynC,CAMAhwC,CAAAA,CAAAA,CAIM,CACN,GAAI,OAAOgwC,CAAAA,EAAoB,UAAchwC,EAAAA,CAAAA,GAAU,MACrD,CAAA,OAAO,KAAK,eACVuI,CAAAA,CAAAA,CACA,QACAynC,CAAAA,CACF,CAGF,CAAA,GAAIA,CAA2BC,YAAAA,CAAAA,EAAgBjwC,CAAU,GAAA,MAAA,CACvD,OAAO,IAAA,CAAK,eACVuI,CAAAA,CAAAA,CACA,SACAynC,CACF,CAAA,CAGF,GACE,OAAOA,CAAoB,EAAA,QAAA,EAC3BhwC,CAAU,GAAA,MAAA,GACTA,CAAiBiwC,YAAAA,CAAAA,EAAgB,OAAOjwC,CAAAA,EAAU,UAEnD,CAAA,CAAA,OAAO,KAAK,eACVuI,CAAAA,CAAAA,CACAynC,CACAhwC,CAAAA,CACF,CAGF,CAAA,IAAI+oC,CAA+B,CAAA,GAAA,CAC/BmH,CAEJ,CAAA,OACE,OAAOF,CAAAA,EAAoB,QAC3BhwC,EAAAA,CAAAA,GAAU,MACV,EAAA,EAAEA,CAAiBiwC,YAAAA,CAAAA,CAAAA,EACnB,OAAOjwC,CAAAA,EAAU,UAEjB+oC,EAAAA,CAAAA,CAAWiH,CACXE,CAAAA,CAAAA,CAAclwC,CAEdkwC,GAAAA,CAAAA,CAAcF,CACdjH,CAAAA,CAAAA,CAAW,GAGb,CAAA,CAAA,IAAA,CAAK,WAAW,IACd,CAAA,IAAIH,CAAUrgC,CAAAA,CAAAA,CAAkB,IAAM,CAAA,IAAA,CAAMwgC,CAAUmH,CAAAA,CAAW,CACnE,CAAA,CACO,IACT,CAWA,YACE3nC,CAAAA,CAAAA,CACA4nC,EACAC,CACM,CAAA,CACN,OAAO,IAAA,CAAK,eAAgB7nC,CAAAA,CAAAA,CAAuB4nC,CAAKC,CAAAA,CAAG,CAC7D,CAWA,eACE7nC,CAAAA,CAAAA,CACA4nC,CACAC,CAAAA,CAAAA,CACM,CACN,OAAK,IAAA,CAAA,UAAA,CAAW,IACd,CAAA,IAAIxH,CAAUrgC,CAAAA,CAAAA,CAAkB,KAAO,CAAA,KAAA,CAAO,SAAW,CAAA,CAAC4nC,CAAKC,CAAAA,CAAG,CAAC,CACrE,EACO,IACT,CAWA,cACE7nC,CAAAA,CAAAA,CACA4nC,CACAC,CAAAA,CAAAA,CACM,CACN,OAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CACd,IAAIxH,CAAAA,CAAUrgC,CAAkB,CAAA,IAAA,CAAM,MAAO,SAAW,CAAA,CAAC4nC,CAAKC,CAAAA,CAAG,CAAC,CACpE,CACO,CAAA,IACT,CAWA,eAAA,CACE7nC,CACA4nC,CAAAA,CAAAA,CACAC,CACM,CAAA,CACN,OAAO,IAAK,CAAA,kBAAA,CAAmB7nC,CAAuB4nC,CAAAA,CAAAA,CAAKC,CAAG,CAChE,CAeA,kBAAA,CACE7nC,CACA4nC,CAAAA,CAAAA,CACAC,CACM,CAAA,CACN,OAAK,IAAA,CAAA,UAAA,CAAW,KACd,IAAIxH,CAAAA,CAAUrgC,CAAkB,CAAA,KAAA,CAAO,IAAM,CAAA,SAAA,CAAW,CAAC4nC,CAAAA,CAAKC,CAAG,CAAC,CACpE,CAAA,CACO,IACT,CAeA,kBACE7nC,CACA4nC,CAAAA,CAAAA,CACAC,CACM,CAAA,CACN,OAAK,IAAA,CAAA,UAAA,CAAW,IACd,CAAA,IAAIxH,CAAUrgC,CAAAA,CAAAA,CAAkB,IAAM,CAAA,IAAA,CAAM,SAAW,CAAA,CAAC4nC,EAAKC,CAAG,CAAC,CACnE,CAAA,CACO,IACT,CAOA,SACE7nC,CAAAA,CAAAA,CACAvI,CACM,CAAA,CACN,OAAO,IAAA,CAAK,YAAauI,CAAAA,CAAAA,CAAuBvI,CAAK,CACvD,CAUA,YACEuI,CAAAA,CAAAA,CACAvI,CACM,CAAA,CACN,OAAK,IAAA,CAAA,KAAA,CAAMuI,CAAkB,CAAA,MAAA,CAAQvI,CAAK,CAAA,CACnC,IACT,CAUA,YACEuI,CACAvI,CAAAA,CAAAA,CACM,CACN,OAAA,IAAA,CAAK,OAAQuI,CAAAA,CAAAA,CAAkB,MAAQvI,CAAAA,CAAK,CACrC,CAAA,IACT,CAUA,UAAA,CACEuI,CACAvI,CAAAA,CAAAA,CACM,CACN,OAAO,IAAA,CAAK,aAAcuI,CAAAA,CAAAA,CAAuBvI,CAAK,CACxD,CAUA,aAAA,CACEuI,CACAvI,CAAAA,CAAAA,CACM,CACN,OAAA,IAAA,CAAK,KAAMuI,CAAAA,CAAAA,CAAkB,QAASvI,CAAK,CAAA,CACpC,IACT,CAUA,YACEuI,CAAAA,CAAAA,CACAvI,CACM,CAAA,CACN,OAAK,IAAA,CAAA,OAAA,CAAQuI,CAAkB,CAAA,OAAA,CAASvI,CAAK,CAAA,CACtC,IACT,CAUA,YAAA,CACEuI,CACAvI,CAAAA,CAAAA,CACM,CACN,OAAO,IAAK,CAAA,eAAA,CAAgBuI,CAAuBvI,CAAAA,CAAK,CAC1D,CAUA,eACEuI,CAAAA,CAAAA,CACAvI,EACM,CACN,OAAA,IAAA,CAAK,KAAMuI,CAAAA,CAAAA,CAAkB,UAAYvI,CAAAA,CAAK,CACvC,CAAA,IACT,CAUA,cAAA,CACEuI,CACAvI,CAAAA,CAAAA,CACM,CACN,OAAA,IAAA,CAAK,QAAQuI,CAAkB,CAAA,UAAA,CAAYvI,CAAK,CAAA,CACzC,IACT,CAUA,aACEuI,CAAAA,CAAAA,CACAvI,CACM,CAAA,CACN,OAAO,IAAA,CAAK,gBAAiBuI,CAAAA,CAAAA,CAAuBvI,CAAK,CAC3D,CAUA,gBACEuI,CAAAA,CAAAA,CACAvI,CACM,CAAA,CACN,OAAK,IAAA,CAAA,KAAA,CAAMuI,CAAkB,CAAA,WAAA,CAAavI,CAAK,CAAA,CACxC,IACT,CAUA,gBACEuI,CACAvI,CAAAA,CAAAA,CACM,CACN,OAAA,IAAA,CAAK,OAAQuI,CAAAA,CAAAA,CAAkB,WAAavI,CAAAA,CAAK,CAC1C,CAAA,IACT,CAWA,OAAA,CACEuI,CACA4T,CAAAA,CAAAA,CAIM,CACN,OAAO,IAAA,CAAK,UAAW5T,CAAAA,CAAAA,CAAuB4T,CAAa,CAC7D,CAWA,UAAA,CACE5T,CACA4T,CAAAA,CAAAA,CAIM,CACN,OAAI,KAAM,CAAA,OAAA,CAAQA,CAAM,CACjBA,CAAAA,CAAAA,CAAO,MAOZ,EAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CACd,IAAIysB,CAAAA,CAAUrgC,CAAkB,CAAA,KAAA,CAAO,KAAO,CAAA,IAAA,CAAM4T,CAAM,CAC5D,EACO,IATL,GAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CACd,IAAIysB,CAAAA,CAAU,OAAS,CAAA,KAAA,CAAO,IAAM,CAAA,GAAA,CAAK,EAAC,CAAG,IAAI,CACnD,EACO,IASJ,CAAA,CAAA,IAAA,CAAK,gBACVrgC,CAAAA,CAAAA,CACA,IACA4T,CAAAA,CACF,CACF,CAWA,SACE5T,CAAAA,CAAAA,CACA4T,CAIM,CAAA,CACN,OAAI,KAAA,CAAM,QAAQA,CAAM,CAAA,CACjBA,CAAO,CAAA,MAAA,EAKZ,IAAK,CAAA,UAAA,CAAW,IACd,CAAA,IAAIysB,CAAUrgC,CAAAA,CAAAA,CAAkB,IAAM,CAAA,KAAA,CAAO,IAAM4T,CAAAA,CAAM,CAC3D,CACO,CAAA,IAAA,GAPL,IAAK,CAAA,UAAA,CAAW,IAAK,CAAA,IAAIysB,CAAU,CAAA,OAAA,CAAS,IAAM,CAAA,IAAA,CAAM,GAAK,CAAA,EAAI,CAAA,IAAI,CAAC,CAC/D,CAAA,IAAA,CAAA,CASJ,IAAK,CAAA,eAAA,CACVrgC,CACA,CAAA,IAAA,CACA4T,CACF,CACF,CAWA,UAAA,CACE5T,CACA4T,CAAAA,CAAAA,CAIM,CACN,OAAO,KAAK,aAAc5T,CAAAA,CAAAA,CAAuB4T,CAAa,CAChE,CAWA,aAAA,CACE5T,CACA4T,CAAAA,CAAAA,CAIM,CACN,OAAI,KAAM,CAAA,OAAA,CAAQA,CAAM,CAAA,CACjBA,EAAO,MAKZ,EAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CACd,IAAIysB,CAAAA,CAAUrgC,CAAkB,CAAA,KAAA,CAAO,IAAM,CAAA,IAAA,CAAM4T,CAAM,CAC3D,CACO,CAAA,IAAA,GAPL,KAAK,UAAW,CAAA,IAAA,CAAK,IAAIysB,CAAAA,CAAU,MAAQ,CAAA,KAAA,CAAO,IAAM,CAAA,GAAA,CAAK,EAAC,CAAG,IAAI,CAAC,CAC/D,CAAA,IAAA,CAAA,CASJ,KAAK,gBACVrgC,CAAAA,CAAAA,CACA,QACA4T,CAAAA,CACF,CACF,CAWA,YACE5T,CAAAA,CAAAA,CACA4T,CAIM,CAAA,CACN,OAAI,KAAA,CAAM,OAAQA,CAAAA,CAAM,EACjBA,CAAO,CAAA,MAAA,EAKZ,IAAK,CAAA,UAAA,CAAW,IACd,CAAA,IAAIysB,CAAUrgC,CAAAA,CAAAA,CAAkB,IAAM,CAAA,IAAA,CAAM,IAAM4T,CAAAA,CAAM,CAC1D,CAAA,CACO,OAPL,IAAK,CAAA,UAAA,CAAW,IAAK,CAAA,IAAIysB,CAAU,CAAA,MAAA,CAAQ,IAAM,CAAA,IAAA,CAAM,GAAK,CAAA,EAAI,CAAA,IAAI,CAAC,CAAA,CAC9D,IASJ,CAAA,CAAA,IAAA,CAAK,eACVrgC,CAAAA,CAAAA,CACA,QACA4T,CAAAA,CACF,CACF,CAOA,SAAU5T,CAAAA,CAAAA,CAAsD,CAC9D,OAAO,IAAK,CAAA,YAAA,CAAaA,CAAqB,CAChD,CAOA,YAAaA,CAAAA,CAAAA,CAAsD,CACjE,OAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CACd,IAAIqgC,CAAAA,CAAUrgC,CAAkB,CAAA,KAAA,CAAO,KAAO,CAAA,SAAA,CAAW,MAAS,CACpE,EACO,IACT,CAOA,WAAYA,CAAAA,CAAAA,CAAsD,CAChE,OAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CACd,IAAIqgC,CAAAA,CAAUrgC,CAAkB,CAAA,IAAA,CAAM,KAAO,CAAA,SAAA,CAAW,MAAS,CACnE,CAAA,CACO,IACT,CAOA,YAAaA,CAAAA,CAAAA,CAAsD,CACjE,OAAO,IAAK,CAAA,eAAA,CAAgBA,CAAqB,CACnD,CAOA,eAAA,CAAgBA,EAAsD,CACpE,OAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CACd,IAAIqgC,CAAAA,CAAUrgC,CAAkB,CAAA,KAAA,CAAO,KAAO,CAAA,aAAA,CAAe,MAAS,CACxE,CACO,CAAA,IACT,CAOA,cAAeA,CAAAA,CAAAA,CAAsD,CACnE,OAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CACd,IAAIqgC,CAAAA,CAAUrgC,CAAkB,CAAA,IAAA,CAAM,KAAO,CAAA,aAAA,CAAe,MAAS,CACvE,EACO,IACT,CAYA,WACEA,CAAAA,CAAAA,CACA8nC,CACM,CAAA,CACN,OAAO,IAAA,CAAK,cAAe9nC,CAAAA,CAAAA,CAAuB8nC,CAAM,CAC1D,CAYA,cAAA,CACE9nC,EACA8nC,CACM,CAAA,CACN,IAAMC,CAAAA,CACJ,IAAK,CAAA,aAAA,CAAc,SAAU,EAAA,GAAM,UACnC,EAAA,IAAA,CAAK,aAAc,CAAA,SAAA,EAAgB,GAAA,aAAA,CAErC,YAAK,UAAW,CAAA,IAAA,CACd,IAAI1H,CAAAA,CACFrgC,CACA,CAAA,KAAA,CACA,KACA+nC,CAAAA,CAAAA,CAAQ,GAA6B,CAAA,QAAA,CACrCD,CAAO,CAAA,MACT,CACF,CAAA,CACO,IACT,CAYA,aAAA,CACE9nC,CACA8nC,CAAAA,CAAAA,CACM,CACN,IAAMC,CACJ,CAAA,IAAA,CAAK,aAAc,CAAA,SAAA,EAAgB,GAAA,UAAA,EACnC,IAAK,CAAA,aAAA,CAAc,WAAgB,GAAA,aAAA,CAErC,OAAK,IAAA,CAAA,UAAA,CAAW,IACd,CAAA,IAAI1H,CACFrgC,CAAAA,CAAAA,CACA,IACA,CAAA,KAAA,CACA+nC,CAAQ,CAAA,GAAA,CAA6B,QACrCD,CAAAA,CAAAA,CAAO,MACT,CACF,CAAA,CACO,IACT,CAYA,cACE9nC,CAAAA,CAAAA,CACA8nC,CACM,CAAA,CACN,IAAMC,CAAAA,CAAO,IAAK,CAAA,aAAA,CAAc,SAAU,EAAA,GAAM,WAChD,OAAK,IAAA,CAAA,UAAA,CAAW,IACd,CAAA,IAAI1H,CACFrgC,CAAAA,CAAAA,CACA,KACA,CAAA,IAAA,CACA+nC,CAAQ,CAAA,GAAA,CAA6B,QACrCD,CAAAA,CAAAA,CAAO,MACT,CACF,EACO,IACT,CAYA,iBACE9nC,CAAAA,CAAAA,CACA8nC,CACM,CAAA,CACN,IAAMC,CAAAA,CAAO,IAAK,CAAA,aAAA,CAAc,SAAU,EAAA,GAAM,UAChD,CAAA,OAAA,IAAA,CAAK,WAAW,IACd,CAAA,IAAI1H,CACFrgC,CAAAA,CAAAA,CACA,KACA,CAAA,IAAA,CACA+nC,CAAQ,CAAA,GAAA,CAA6B,QACrCD,CAAAA,CAAAA,CAAO,MACT,CACF,CACO,CAAA,IACT,CAYA,gBACE9nC,CAAAA,CAAAA,CACA8nC,CACM,CAAA,CACN,IAAMC,CAAAA,CAAO,IAAK,CAAA,aAAA,CAAc,SAAU,EAAA,GAAM,UAChD,CAAA,OAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CACd,IAAI1H,CAAAA,CACFrgC,CACA,CAAA,IAAA,CACA,IACA+nC,CAAAA,CAAAA,CAAQ,GAA6B,CAAA,QAAA,CACrCD,CAAO,CAAA,MACT,CACF,CAAA,CACO,IACT,CAKA,WACEE,CAAAA,CAAAA,CACM,CACN,OAAO,IAAA,CAAK,cAAeA,CAAAA,CAAgB,CAC7C,CAKA,cACEA,CAAAA,CAAAA,CACM,CACN,IAAMC,CACJD,CAAAA,CAAAA,YAA4BN,CACxBM,CAAAA,CAAAA,CACA,IAAIN,CAAa,CAAA,IAAA,CAAK,KAAO,CAAA,IAAA,CAAK,aAAa,CAAA,CAErD,OAACO,CAAAA,CAAuC,iBAAoB,CAAA,IAAA,CACxD,OAAOD,CAAAA,EAAqB,UAC9BA,EAAAA,CAAAA,CAAiBC,CAAgC,CAGnD,CAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CACd,IAAItH,EAAAA,CACF,EACA,CAAA,QAAA,CACAsH,CAAc,CAAA,iBAAA,EACd,CAAA,KACF,CACF,CAAA,CAEO,IACT,CAKA,aAAA,CACED,CACM,CAAA,CACN,IAAMC,CAAAA,CACJD,CAA4BN,YAAAA,CAAAA,CACxBM,CACA,CAAA,IAAIN,CAAa,CAAA,IAAA,CAAK,KAAO,CAAA,IAAA,CAAK,aAAa,CAErD,CAAA,OAACO,CAAuC,CAAA,iBAAA,CAAoB,IACxD,CAAA,OAAOD,CAAqB,EAAA,UAAA,EAC9BA,CAAiBC,CAAAA,CAAgC,CAGnD,CAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CACd,IAAItH,EACF,CAAA,EAAA,CACA,QACAsH,CAAAA,CAAAA,CAAc,iBAAkB,EAAA,CAChC,IACF,CACF,CAEO,CAAA,IACT,CAKA,cAAA,CACED,CACM,CAAA,CACN,OAAO,IAAK,CAAA,iBAAA,CAAkBA,CAAgB,CAChD,CAKA,iBAAA,CACEA,CACM,CAAA,CACN,IAAMC,CAAAA,CACJD,CAA4BN,YAAAA,CAAAA,CACxBM,CACA,CAAA,IAAIN,EAAa,IAAK,CAAA,KAAA,CAAO,IAAK,CAAA,aAAa,CAErD,CAAA,OAACO,CAAuC,CAAA,iBAAA,CAAoB,IACxD,CAAA,OAAOD,CAAqB,EAAA,UAAA,EAC9BA,CAAiBC,CAAAA,CAAgC,EAGnD,IAAK,CAAA,UAAA,CAAW,IACd,CAAA,IAAItH,EACF,CAAA,EAAA,CACA,YACAsH,CAAAA,CAAAA,CAAc,iBAAkB,EAAA,CAChC,KACF,CACF,CAEO,CAAA,IACT,CAKA,gBACED,CAAAA,CAAAA,CACM,CACN,IAAMC,CACJD,CAAAA,CAAAA,YAA4BN,CACxBM,CAAAA,CAAAA,CACA,IAAIN,CAAAA,CAAa,IAAK,CAAA,KAAA,CAAO,IAAK,CAAA,aAAa,EAErD,OAACO,CAAAA,CAAuC,iBAAoB,CAAA,IAAA,CACxD,OAAOD,CAAAA,EAAqB,UAC9BA,EAAAA,CAAAA,CAAiBC,CAAgC,CAAA,CAGnD,IAAK,CAAA,UAAA,CAAW,IACd,CAAA,IAAItH,GACF,EACA,CAAA,YAAA,CACAsH,CAAc,CAAA,iBAAA,EACd,CAAA,IACF,CACF,CAAA,CAEO,IACT,CAKA,QAASjuC,CAAAA,CAAAA,CAAekuC,CAAqB,CAAA,GAAI,CAC/C,OAAO,IAAK,CAAA,WAAA,CAAYluC,CAAOkuC,CAAAA,CAAW,CAC5C,CAKA,WAAYluC,CAAAA,CAAAA,CAAekuC,CAAqB,CAAA,EAAI,CAAA,CAClD,YAAK,UAAW,CAAA,IAAA,CACd,IAAI7H,CAAAA,CAAUrmC,CAAO,CAAA,KAAA,CAAO,KAAO,CAAA,GAAA,CAAKkuC,CAAa,CAAA,IAAI,CAC3D,CAAA,CACO,IACT,CAKA,WAAWluC,CAAekuC,CAAAA,CAAAA,CAAqB,EAAC,CAAG,CACjD,OAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CACd,IAAI7H,CAAAA,CAAUrmC,CAAO,CAAA,IAAA,CAAM,KAAO,CAAA,GAAA,CAAKkuC,CAAa,CAAA,IAAI,CAC1D,CAAA,CACO,IACT,CAOA,MACEloC,CAAAA,CAAAA,CACAynC,CACAhwC,CAAAA,CAAAA,CACM,CACN,OAAO,IAAK,CAAA,SAAA,CACVuI,CACAynC,CAAAA,CAAAA,CACAhwC,CACF,CACF,CAWA,SACEuI,CAAAA,CAAAA,CACAynC,CACAhwC,CAAAA,CAAAA,CACM,CACN,IAAI+oC,CAA+B,CAAA,GAAA,CAC/BmH,CAEJ,CAAA,OAAI,OAAOF,CAAAA,EAAoB,UAAYhwC,CACzC+oC,EAAAA,CAAAA,CAAWiH,CACXE,CAAAA,CAAAA,CAAclwC,CAEdkwC,GAAAA,CAAAA,CAAcF,CACdjH,CAAAA,CAAAA,CAAW,GAGb,CAAA,CAAA,IAAA,CAAK,WAAY,CAAA,IAAA,CACf,IAAIqF,EAAAA,CACF7lC,EACA,KACA,CAAA,KAAA,CACAwgC,CACAmH,CAAAA,CACF,CACF,CAAA,CACO,IACT,CAOA,QACE3nC,CAAAA,CAAAA,CACAynC,CACAhwC,CAAAA,CAAAA,CACM,CACN,IAAI+oC,EAA+B,GAC/BmH,CAAAA,CAAAA,CAEJ,OAAI,OAAOF,CAAoB,EAAA,QAAA,EAAYhwC,CACzC+oC,EAAAA,CAAAA,CAAWiH,CACXE,CAAAA,CAAAA,CAAclwC,CAEdkwC,GAAAA,CAAAA,CAAcF,CACdjH,CAAAA,CAAAA,CAAW,KAGb,IAAK,CAAA,WAAA,CAAY,IACf,CAAA,IAAIqF,EACF7lC,CAAAA,CAAAA,CACA,IACA,CAAA,KAAA,CACAwgC,CACAmH,CAAAA,CACF,CACF,CAAA,CACO,IACT,CAKA,UAAU3tC,CAAqB,CAAA,CAC7B,OAAO,IAAA,CAAK,YAAaA,CAAAA,CAAK,CAChC,CAKA,YAAaA,CAAAA,CAAAA,CAAqB,CAChC,OAAA,IAAA,CAAK,WAAY,CAAA,IAAA,CAAK,IAAI6rC,EAAW7rC,CAAAA,CAAAA,CAAO,KAAO,CAAA,KAAA,CAAO,GAAK,CAAA,EAAI,CAAA,IAAI,CAAC,CAAA,CAEjE,IACT,CAKA,WAAYA,CAAAA,CAAAA,CAAqB,CAC/B,OAAK,IAAA,CAAA,WAAA,CAAY,IAAK,CAAA,IAAI6rC,EAAW7rC,CAAAA,CAAAA,CAAO,IAAM,CAAA,KAAA,CAAO,GAAK,CAAA,EAAI,CAAA,IAAI,CAAC,CAAA,CAEhE,IACT,CAEQ,aAAA,CACNmuC,CACiB,CAAA,CACjB,GAAIA,CAAAA,YAAwBT,CAC1B,CAAA,OAAOS,CAET,CAAA,IAAMC,CAAW,CAAA,IAAIV,CAAa,CAAA,IAAA,CAAK,MAAO,IAAK,CAAA,aAAa,CAChE,CAAA,OAACS,CAA+CC,CAAAA,CAAQ,CACjDA,CAAAA,CACT,CAEQ,gBAAA,CACNpoC,CACAwgC,CAAAA,CAAAA,CACA2H,CACM,CAAA,CACN,IAAMC,CAAW,CAAA,IAAA,CAAK,aAAcD,CAAAA,CAAY,CAChD,CAAA,OAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CACd,IAAIxH,EAAAA,CACF3gC,CACAwgC,CAAAA,CAAAA,CACC4H,CAAiB,CAAA,iBAAA,GAClB,KACF,CACF,CACO,CAAA,IACT,CAEQ,eAAA,CACNpoC,CACAwgC,CAAAA,CAAAA,CACA2H,CACM,CAAA,CACN,IAAMC,CAAAA,CAAW,IAAK,CAAA,aAAA,CAAcD,CAAY,CAChD,CAAA,OAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CACd,IAAIxH,EAAAA,CACF3gC,CACAwgC,CAAAA,CAAAA,CACC4H,CAAiB,CAAA,iBAAA,EAClB,CAAA,IACF,CACF,CAAA,CACO,IACT,CAEQ,aAAA,CACNpW,CACM,CAAA,CACN,IAAMiW,CAAAA,CAAgB,IAAIP,CAAAA,CAAa,IAAK,CAAA,KAAA,CAAO,IAAK,CAAA,aAAa,CACpEO,CAAAA,CAAAA,CAAsB,kBAAoB,IAC3CjW,CAAAA,CAAAA,CAAGiW,CAAgD,CAAA,CACnD,IAAMI,CAAAA,CAAiB,IAAI5H,EAAAA,CACxBwH,CAAsB,CAAA,UAAA,CACvB,KACF,CAAA,CACA,OAAK,IAAA,CAAA,UAAA,CAAW,KAAKI,CAAc,CAAA,CAC5B,IACT,CAEQ,YAAarW,CAAAA,CAAAA,CAAwD,CAC3E,IAAMiW,CAAgB,CAAA,IAAIP,CAAa,CAAA,IAAA,CAAK,KAAO,CAAA,IAAA,CAAK,aAAa,CACpEO,CAAAA,CAAAA,CAAsB,iBAAoB,CAAA,IAAA,CAC3CjW,CAAGiW,CAAAA,CAAgD,CACnD,CAAA,IAAMI,CAAiB,CAAA,IAAI5H,EACxBwH,CAAAA,CAAAA,CAAsB,UACvB,CAAA,IACF,EACA,OAAK,IAAA,CAAA,UAAA,CAAW,IAAKI,CAAAA,CAAc,CAC5B,CAAA,IACT,CACF,CAAA,CCloDO,IAAMC,EAAAA,CAAN,cAAgDf,EAAqB,CAM1E,SAAA,CAAUvnC,EAA8BvI,CAAwB,CAAA,CAC9D,OAAO,IAAA,CAAK,YAAauI,CAAAA,CAAAA,CAAkBvI,CAAK,CAClD,CAQA,YAAA,CAAauI,CAA8BvI,CAAAA,CAAAA,CAAwB,CACjE,OAAA,IAAA,CAAK,WAAW,IACd,CAAA,IAAIipC,EACF1gC,CAAAA,CAAAA,CACA,KACA,CAAA,KAAA,CACA,UACAvI,CAAAA,CACF,CACF,CAAA,CACO,IACT,CAQA,WAAYuI,CAAAA,CAAAA,CAA8BvI,EAAwB,CAChE,OAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CACd,IAAIipC,EAAAA,CACF1gC,CACA,CAAA,IAAA,CACA,KACA,CAAA,UAAA,CACAvI,CACF,CACF,CACO,CAAA,IACT,CASA,oBAAqBuI,CAAAA,CAAAA,CAA8BvI,CAAwB,CAAA,CACzE,OAAO,IAAA,CAAK,uBAAwBuI,CAAAA,CAAAA,CAAkBvI,CAAK,CAC7D,CASA,uBAAA,CACEuI,CACAvI,CAAAA,CAAAA,CACM,CACN,OAAK,IAAA,CAAA,UAAA,CAAW,IACd,CAAA,IAAIipC,EACF1gC,CAAAA,CAAAA,CACA,KACA,CAAA,IAAA,CACA,cACAvI,CAAAA,CACF,CACF,CAAA,CACO,IACT,CASA,uBAAuBuI,CAA8BvI,CAAAA,CAAAA,CAAwB,CAC3E,OAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CACd,IAAIipC,EAAAA,CACF1gC,CACA,CAAA,IAAA,CACA,IACA,CAAA,cAAA,CACAvI,CACF,CACF,EACO,IACT,CASA,iBAAkBuI,CAAAA,CAAAA,CAA8BvI,CAAwB,CAAA,CACtE,OAAO,IAAA,CAAK,oBAAqBuI,CAAAA,CAAAA,CAAkBvI,CAAK,CAC1D,CASA,oBAAA,CAAqBuI,EAA8BvI,CAAwB,CAAA,CACzE,OAAK,IAAA,CAAA,UAAA,CAAW,IACd,CAAA,IAAIipC,EACF1gC,CAAAA,CAAAA,CACA,KACA,CAAA,KAAA,CACA,UACAvI,CAAAA,CACF,CACF,CAAA,CACO,IACT,CASA,mBAAA,CAAoBuI,CAA8BvI,CAAAA,CAAAA,CAAwB,CACxE,OAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CACd,IAAIipC,EAAAA,CACF1gC,CACA,CAAA,IAAA,CACA,KACA,CAAA,UAAA,CACAvI,CACF,CACF,CAAA,CACO,IACT,CAOA,YAAauI,CAAAA,CAAAA,CAA8BvI,CAAwB,CAAA,CACjE,OAAO,IAAA,CAAK,eAAgBuI,CAAAA,CAAAA,CAAkBvI,CAAK,CACrD,CAOA,eAAgBuI,CAAAA,CAAAA,CAA8BvI,CAAwB,CAAA,CACpE,OAAK,IAAA,CAAA,UAAA,CAAW,IACd,CAAA,IAAIipC,EACF1gC,CAAAA,CAAAA,CACA,KACA,CAAA,IAAA,CACA,cACAvI,CAAAA,CACF,CACF,CACO,CAAA,IACT,CAOA,cAAA,CAAeuI,CAA8BvI,CAAAA,CAAAA,CAAwB,CACnE,OAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CACd,IAAIipC,EAAAA,CACF1gC,CACA,CAAA,IAAA,CACA,KACA,cACAvI,CAAAA,CACF,CACF,CAAA,CACO,IACT,CAKA,YAAa4mB,CAAAA,CAAAA,CAAaxkB,CAAsB,CAAA,CAC9C,OAAO,IAAA,CAAK,eAAgBwkB,CAAAA,CAAAA,CAAKxkB,CAAM,CACzC,CAKA,eAAA,CAAgBwkB,CAAaxkB,CAAAA,CAAAA,CAAsB,CACjD,OAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CACd,IAAI6mC,EAAAA,CAAcriB,CAAK,CAAA,KAAA,CAAO,KAAO,CAAA,KAAA,CAAOxkB,CAAa,CAC3D,CAAA,CACO,IACT,CAKA,cAAewkB,CAAAA,CAAAA,CAAaxkB,CAAsB,CAAA,CAChD,OAAK,IAAA,CAAA,UAAA,CAAW,IACd,CAAA,IAAI6mC,EAAcriB,CAAAA,CAAAA,CAAK,KAAM,KAAO,CAAA,KAAA,CAAOxkB,CAAa,CAC1D,CACO,CAAA,IACT,CACF,CAAA,CCzLO,IAAM6tC,CAAAA,CAAN,MAAMa,CAAAA,SAA4CD,EAAoB,CAqC3E,YACE1oC,CACAgC,CAAAA,CAAAA,CAA+BiO,EAAc,CAAA,QAAA,CAC7C,CACA,KAAA,CAAMjQ,CAAOgC,CAAAA,CAAa,CAnC5B,CAAA,IAAA,CAAU,iBAAoB,CAAA,KAAA,CAC9B,IAAU,CAAA,qBAAA,CAAiC,MAE3C,IAAU,CAAA,UAAA,CAAgC,IAC1C,CAAA,IAAA,CAAU,eAA0C,CAAA,IAAA,CACpD,IAAU,CAAA,UAAA,CAAgC,IAC1C,CAAA,IAAA,CAAU,UAAgC,CAAA,IAAA,CAC1C,IAAU,CAAA,YAAA,CAAoC,KAC9C,IAAU,CAAA,eAAA,CAA0C,IAKpD,CAAA,IAAA,CAAA,WAAA,CAAc,CACZ,IAAA,CAAM,IAAK,CAAA,mBAAA,CAAoB,IAAK,CAAA,IAAI,CACxC,CAAA,GAAA,CAAK,IAAK,CAAA,kBAAA,CAAmB,KAAK,IAAI,CAAA,CACtC,SAAW,CAAA,IAAA,CAAK,wBAAyB,CAAA,IAAA,CAAK,IAAI,CAAA,CAClD,KAAO,CAAA,IAAA,CAAK,oBAAqB,CAAA,IAAA,CAAK,IAAI,CAAA,CAC1C,YAAa,IAAK,CAAA,0BAAA,CAA2B,IAAK,CAAA,IAAI,CACtD,CAAA,QAAA,CAAU,IAAK,CAAA,uBAAA,CAAwB,IAAK,CAAA,IAAI,CAChD,CAAA,kBAAA,CAAoB,IAAK,CAAA,iCAAA,CAAkC,KAAK,IAAI,CAAA,CACpE,MAAQ,CAAA,IAAA,CAAK,qBAAsB,CAAA,IAAA,CAAK,IAAI,CAAA,CAC5C,QAAU,CAAA,IAAA,CAAK,uBAAwB,CAAA,IAAA,CAAK,IAAI,CAAA,CAChD,OAAQ,IAAK,CAAA,qBAAA,CAAsB,IAAK,CAAA,IAAI,CAC5C,CAAA,MAAA,CAAQ,IAAK,CAAA,qBAAA,CAAsB,IAAK,CAAA,IAAI,CAC5C,CAAA,UAAA,CAAY,IAAK,CAAA,yBAAA,CAA0B,KAAK,IAAI,CAAA,CACpD,MAAQ,CAAA,IAAA,CAAK,qBAAsB,CAAA,IAAA,CAAK,IAAI,CAAA,CAC5C,UAAY,CAAA,IAAA,CAAK,yBAA0B,CAAA,IAAA,CAAK,IAAI,CAAA,CACpD,MAAO,IAAK,CAAA,oBAAA,CAAqB,IAAK,CAAA,IAAI,CAC5C,CAAA,CAOE,IAAK,CAAA,MAAA,CAASA,CAAc,CAAA,SAAA,EAC5B,CAAA,IAAA,CAAK,iBAAoB,CAAA,KAAA,CACzB,KAAK,KAAQhC,CAAAA,CAAAA,CACb,IAAK,CAAA,UAAA,CAAa,EAAC,CACnB,IAAK,CAAA,cAAA,CAAiB,EAAC,CACvB,IAAK,CAAA,SAAA,CAAY,EAAC,CAClB,KAAK,SAAY,CAAA,IAAIgF,CAAU,CAAA,IAAA,CAAK,KAAO,CAAA,IAAA,CAAK,MAAM,CAAA,CACtD,IAAK,CAAA,gBAAA,CAAmB,IAAI4O,CAAAA,CAAiB,IAAK,CAAA,KAAK,EACzD,CASA,kBAAA,CAAmBg1B,CAAwC,CAAA,CACzD,OAAK,IAAA,CAAA,eAAA,CAAkBA,CAChB,CAAA,IACT,CAKA,MAAM,MAA2B,EAAA,CAC/B,OAAO,CAAC,CAAE,MAAM,IAAA,CAAK,GAAI,EAC3B,CAKA,MAAM,IAA+C,EAAA,CACnD,GAAM,CAAE,GAAAztC,CAAAA,CAAAA,CAAK,QAAAyZ,CAAAA,CAAS,CAAI,CAAA,IAAA,CAAK,MAAO,EAAA,CACtC,OAAO,IAAA,CAAK,wBAAyB,CAAA,MAAA,CAASi0B,CAC5ChG,EAAAA,CAAAA,CAAQ1nC,CAAKyZ,CAAAA,CAAAA,CAAUi0B,CAAY,CAAA,IAAA,CAAK,MAAQ,CAAA,MAAA,CAAQ,CACtD,cAAgB,CAAA,CACd,WAAa,CAAA,IAAA,CAAK,KAClB,CAAA,IAAA,CAAM,OACR,CACF,CAAC,CACH,CACF,CAMA,MAAM,KAAA,CAA6BjxC,EAAwC,CAEzE,OAAA,CADgB,MAAM,IAAA,CAAK,IAAK,EAAA,EAClB,GACXm9B,CAAAA,CAAAA,EAASA,CAAKn9B,CAAAA,CAAwB,CACzC,CACF,CAKA,MAAM,KAAmD,CACvD,IAAM+C,CAAU,CAAA,MAAM,IAAK,CAAA,KAAA,CAAM,CAAC,CAAA,CAAE,IAAK,EAAA,CACzC,OAAI,CAACA,CAAU,EAAA,CAACA,EAAO,MACd,CAAA,IAAA,CAGFA,CAAO,CAAA,CAAC,CACjB,CAKA,MAAM,KAAA,EAAqD,CACzD,OAAO,IAAK,CAAA,GAAA,EACd,CAKA,MAAM,SAAkD,EAAA,CACtD,IAAMqF,CAAAA,CAAQ,MAAM,IAAA,CAAK,GAAI,EAAA,CAC7B,GAAI,CAACA,CACH,CAAA,MAAM,IAAItK,CAAAA,CACR,kCACA,eACF,CAAA,CAGF,OAAOsK,CACT,CAKA,MAAM,WAAoD,EAAA,CACxD,OAAO,IAAA,CAAK,SAAU,EACxB,CAQA,MAAM,OACJjH,CAAyB,CAAA,EACyC,CAAA,CAClE,GAAM,CAAE,GAAAoC,CAAAA,CAAAA,CAAK,QAAAyZ,CAAAA,CAAS,CAAI,CAAA,IAAA,CAAK,MAAO,EAAA,CACtC,OAAO,IAAK,CAAA,wBAAA,CAAyB,MAAQ,CAAA,MAAOi0B,CACnC,EAAA,MAAM/E,EACnB3oC,CAAAA,CAAAA,CACAyZ,CACAi0B,CAAAA,CAAAA,CACA9vC,CACA,CAAA,CACE,MAAQ,CAAA,CAACkrC,EAAarpC,CAAQ,GAAA,CAC5BqpC,CAAY,CAAA,KAAA,CAAMrpC,CAAG,EACvB,CACF,CACF,CAGD,CACH,CA+BA,MAAO,KAAMkuC,CAAAA,CAAAA,CAAmB,CAC9B,IAAInC,CAAAA,CAAS,CAEb,CAAA,OAAa,CACX,IAAM1kC,CAAS,CAAA,MAAM,IAAK,CAAA,KAAA,CAAM6mC,CAAS,CAAA,CAAE,MAAOnC,CAAAA,CAAM,EAAE,IAAK,EAAA,CAC/D,GAAI,CAAC1kC,CAAO,CAAA,MAAA,CACV,MAGF0kC,CAAAA,EAAU1kC,CAAO,CAAA,MAAA,CACjB,MAAMA,EACR,CACF,CAeA,MAAM,kBACJ4jC,CAAAA,CAAAA,CACA9sC,CACAgwC,CAAAA,CAAAA,CACiD,CACjD,IAAMC,CAAoB,CAAA,IAAA,CAAK,KAAM,EAAA,CAEhC,IAAK,CAAA,YAAA,CAAa,MACrB,EAAA,IAAA,CAAK,QAAQjwC,CAAQ,CAAA,aAAA,CAAeA,CAAQ,CAAA,OAAA,EAAW,KAAK,CAAA,CAG1DgwC,CACF,EAAA,IAAA,CAAK,KAAMA,CAAAA,CAAAA,CAAO,GAAKhwC,CAAAA,CAAAA,CAAQ,QAAY,EAAA,GAAA,CAAKgwC,EAAO,KAAK,CAAA,CAG9D,IAAK,CAAA,KAAA,CAAMlD,CAAK,CAAA,CAEhB,IAAMhjC,CAAAA,CAAO,MAAM,IAAA,CAAK,IAAK,EAAA,CACvBomC,CAAQ,CAAA,MAAMD,EAAkB,QAAS,EAAA,CAEzCE,CAAWrmC,CAAAA,CAAAA,CAAKA,CAAK,CAAA,MAAA,CAAS,CAAC,CAAA,CAC/BsmC,CAAgBD,CAAAA,CAAAA,CAAWA,CAASnwC,CAAAA,CAAAA,CAAQ,aAAa,CAAA,CAAI,IAGnE,CAAA,OAAO,CACL,CACE,kBAJuBgtC,CAAAA,EAAAA,CAA4BF,CAAOoD,CAAAA,CAAK,CAK/D,CAAA,IAAA,CAAApmC,CACF,CAAA,CACA,CACE,GAAA,CAAK9J,CAAQ,CAAA,aAAA,CACb,MAAOowC,CACT,CACF,CACF,CAKA,cACEf,CAAAA,CAAAA,CACAr0B,CACM,CAAA,CACN,GAAI,OAAOq0B,CAAqB,EAAA,UAAA,CAAY,CAC1C,IAAMI,EAAW,IAAIG,CAAAA,CAAgB,IAAK,CAAA,KAAA,CAAO,IAAK,CAAA,aAAa,CACnE,CAAA,OAAAP,CAAiBI,CAAAA,CAAQ,CACzB,CAAA,IAAA,CAAK,WAAY,CAAA,IAAA,CACf,IAAI/C,CAAW+C,CAAAA,CAAAA,CAAS,iBAAkB,EAAA,CAAGz0B,CAAK,CACpD,CACO,CAAA,IACT,CAEA,OAAA,IAAA,CAAK,WAAY,CAAA,IAAA,CACf,IAAI0xB,CAAAA,CAAW2C,EAAiB,iBAAkB,EAAA,CAAGr0B,CAAK,CAC5D,CACO,CAAA,IACT,CAOA,aAAA,CACEhb,CAAsD,CAAA,EAChD,CAAA,CACN,OAAK,IAAA,CAAA,cAAA,CAAe,KAClB,IAAIk4B,EAAAA,CAAS,YAAcl4B,CAAAA,CAAAA,CAAQ,UAAYA,CAAAA,CAAAA,CAAQ,MAAM,CAC/D,CACO,CAAA,IACT,CAOA,QAAA,CAASA,CAAsD,CAAA,GAAU,CACvE,OAAA,IAAA,CAAK,cAAe,CAAA,IAAA,CAClB,IAAIk4B,EAAAA,CAAS,WAAal4B,CAAAA,CAAAA,CAAQ,UAAYA,CAAAA,CAAAA,CAAQ,MAAM,CAC9D,CACO,CAAA,IACT,CAOA,KAAMqwC,CAAAA,CAAAA,CAAqD,CACzD,GAAI,OAAOA,CAAAA,EAAqB,QAC9B,CAAA,OAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CAAK,IAAI/X,EAAAA,CAAU+X,CAAgB,CAAC,EAC7C,IAQT,CAAA,IAAMzrB,CAJJyrB,CAAAA,CAAAA,CAAAA,YAA4BT,CACxBS,CAAAA,CAAAA,CACAA,CAAiB,CAAA,IAAIT,CAAa,CAAA,IAAA,CAAK,KAAO,CAAA,IAAA,CAAK,aAAa,CAAC,GAE5C,iBAAkB,EAAA,CAC7C,OAAK,IAAA,CAAA,UAAA,CAAW,IAAK,CAAA,IAAItX,EAAU1T,CAAAA,CAAK,CAAC,CAAA,CAClC,IACT,CAQA,QACEyrB,CAAAA,CAAAA,CACM,CACN,GAAI,OAAOA,CAAqB,EAAA,QAAA,CAC9B,OAAK,IAAA,CAAA,UAAA,CAAW,IAAK,CAAA,IAAI/X,EAAU+X,CAAAA,CAAAA,CAAkB,IAAI,CAAC,CACnD,CAAA,IAAA,CAQT,IAAMzrB,CAJJyrB,CAAAA,CAAAA,CAAAA,YAA4BT,CACxBS,CAAAA,CAAAA,CACAA,CAAiB,CAAA,IAAIT,CAAa,CAAA,IAAA,CAAK,KAAO,CAAA,IAAA,CAAK,aAAa,CAAC,CAE5C,EAAA,iBAAA,GAC3B,OAAK,IAAA,CAAA,UAAA,CAAW,IAAK,CAAA,IAAItX,EAAU1T,CAAAA,CAAAA,CAAO,IAAI,CAAC,CACxC,CAAA,IACT,CAUA,MAAM,SACJvd,CAAAA,CAAAA,CACAvI,EAAgB,CACC,CAAA,CACjB,OAAO,IAAA,CAAK,MAAO,CAAA,CACjB,CAACuI,CAAgB,EAAG,IAAA,CAAK,aAAc,CAAA,YAAA,CACrC,CAAGA,EAAAA,CAAgB,MAAMvI,CAAK,CAAA,CAChC,CACF,CAAC,CACH,CAUA,MAAM,SAAA,CACJuI,CACAvI,CAAAA,CAAAA,CAAgB,CACC,CAAA,CACjB,OAAO,IAAA,CAAK,OAAO,CACjB,CAACuI,CAAgB,EAAG,IAAK,CAAA,aAAA,CAAc,YACrC,CAAA,CAAA,EAAGA,CAAgB,CAAA,GAAA,EAAMvI,CAAK,CAAA,CAChC,CACF,CAAC,CACH,CAKA,MAAM,QAASuI,CAAAA,CAAAA,CAAiB,GAAsB,CAAA,CACpD,IAAK,CAAA,iBAAA,EACL,CAAA,IAAA,CAAK,QAAS,CAAA,OAAA,CAASA,CAAQ,CAAA,OAAO,EACtC,IAAMzF,CAAAA,CAAS,MAAM,IAAA,CAAK,GAAI,EAAA,CAC9B,OAAOA,CAAAA,CAASqrC,EAAerrC,CAAAA,CAAAA,CAAO,KAA+B,CAAA,CAAI,CAC3E,CAKA,MAAM,MAAOyF,CAAAA,CAAAA,CAAiC,CAC5C,IAAA,CAAK,iBAAkB,EAAA,CACvB,IAAK,CAAA,QAAA,CAAS,KAAOA,CAAAA,CAAAA,CAAQ,OAAO,CAAA,CACpC,IAAMzF,CAAAA,CAAS,MAAM,IAAK,CAAA,GAAA,EAC1B,CAAA,OAAOA,CAASqrC,CAAAA,EAAAA,CAAerrC,CAAO,CAAA,KAA+B,CAAI,CAAA,CAC3E,CAKA,MAAM,MAAOyF,CAAAA,CAAAA,CAAiC,CAC5C,IAAK,CAAA,iBAAA,EACL,CAAA,IAAA,CAAK,QAAS,CAAA,KAAA,CAAOA,CAAQ,CAAA,OAAO,CACpC,CAAA,IAAMzF,CAAS,CAAA,MAAM,IAAK,CAAA,GAAA,GAC1B,OAAOA,CAAAA,CAASqrC,EAAerrC,CAAAA,CAAAA,CAAO,KAA+B,CAAA,CAAI,CAC3E,CAKA,MAAM,MAAA,CAAOyF,CAAiC,CAAA,CAC5C,IAAK,CAAA,iBAAA,GACL,IAAK,CAAA,QAAA,CAAS,KAAOA,CAAAA,CAAAA,CAAQ,OAAO,CAAA,CACpC,IAAMzF,CAAAA,CAAS,MAAM,IAAA,CAAK,GAAI,EAAA,CAC9B,OAAOA,CAAAA,CAASqrC,GAAerrC,CAAO,CAAA,KAA+B,CAAI,CAAA,CAC3E,CAKA,MAAM,MAAOyF,CAAAA,CAAAA,CAAiC,CAC5C,IAAA,CAAK,iBAAkB,EAAA,CACvB,IAAK,CAAA,QAAA,CAAS,MAAOA,CAAQ,CAAA,OAAO,CACpC,CAAA,IAAMzF,CAAS,CAAA,MAAM,IAAK,CAAA,GAAA,EAC1B,CAAA,OAAOA,CAASqrC,CAAAA,EAAAA,CAAerrC,CAAO,CAAA,KAA+B,EAAI,CAC3E,CAMA,MAAM,QAAA,CAAS2H,CAAc+mC,CAAAA,CAAAA,CAA4C,CACnE,CAAA,OAAO/mC,CAAS,EAAA,QAAA,EAAY,OAAO+mC,CAAAA,EAAY,QACjD7uC,GAAAA,CAAAA,CAAO,KACL,CAAG,EAAA,IAAA,CAAK,KAAM,CAAA,IAAI,CACpB,sDAAA,CAAA,CAAA,CAGF,IAAMwuC,CAAAA,CAAoB,IAAK,CAAA,KAAA,EACzBM,CAAAA,CAAAA,CAAiB,IAAK,CAAA,KAAA,CAAMD,CAAO,CAAE,CAAA,MAAA,CAAA,CAAQ/mC,CAAO,CAAA,CAAA,EAAK+mC,CAAO,CAAA,CAEhE,CAACpnC,CAAAA,CAAQ6jC,CAAK,CAAA,CAAI,MAAM,IAAA,CAAK,sBACjC,CAAA,IAAMwD,EAAe,IAAK,EAAA,CAC1B,IAAMN,CAAAA,CAAkB,QAAS,CAAA,GAAG,CACtC,CAAA,CAIA,OAAO,CACL,kBAHyBpD,CAAAA,EAAAA,CAAsBtjC,CAAM+mC,CAAAA,CAAAA,CAASvD,CAAK,CAInE,CAAA,IAAA,CAAM7jC,CACR,CACF,CAOA,IAAA,CACEsnC,CACA9B,CAAAA,CAAAA,CACM,CACN,GAAI,OAAO8B,CAAAA,EAAc,UAAY,CAAA,CACnC,GAAI,CAAC9B,CAAAA,CACH,MAAM,IAAI/xC,CACR,CAAA,oBAAA,CACA,4BACF,CAAA,CAGF,IAAM8zC,CAAAA,CAAkB,IAAIb,CAAAA,CAC1B,IAAK,CAAA,KAAA,CACL,KAAK,aACP,CAAA,CAEAY,CAAUC,CAAAA,CAAe,CACzB,CAAA,IAAMzwB,CAAgBywB,CAAAA,CAAAA,CAAgB,iBAAkB,EAAA,CACxD,OAAK,IAAA,CAAA,QAAA,CAAW,IAAItJ,CAAAA,CAASnnB,CAAe0uB,CAAAA,CAAU,CAC/C,CAAA,IACT,CAEA,OAAA,IAAA,CAAK,QAAW,CAAA,IAAIvH,CAASqJ,CAAAA,CAAAA,CAAW9B,CAAU,CAAA,CAC3C,IACT,CAKA,IAAK1zB,CAAAA,CAAAA,CAAeqe,EAAyC,CAC3D,IAAMoW,CAAW,CAAA,IAAIG,CAAgB,CAAA,IAAA,CAAK,KAAO,CAAA,IAAA,CAAK,aAAa,CAAA,CACnEvW,CAAGoW,CAAAA,CAAQ,CACX,CAAA,IAAM7qB,EAAQ6qB,CAAS,CAAA,iBAAA,EACvB,CAAA,OAAA,IAAA,CAAK,SAAU,CAAA,IAAA,CAAK,IAAIjX,EAAAA,CAAS,QAAUxd,CAAAA,CAAAA,CAAO4J,CAAK,CAAC,CACjD,CAAA,IACT,CAMA,aAAc5J,CAAAA,CAAAA,CAAeqe,CAAyC,CAAA,CACpE,IAAMoW,CAAAA,CAAW,IAAIG,CAAAA,CAAgB,IAAK,CAAA,KAAA,CAAO,IAAK,CAAA,aAAa,CACnEvW,CAAAA,CAAAA,CAAGoW,CAAQ,CACX,CAAA,IAAM7qB,CAAQ6qB,CAAAA,CAAAA,CAAS,iBAAkB,EAAA,CACzC,OAAK,IAAA,CAAA,SAAA,CAAU,IAAK,CAAA,IAAIjX,EAAS,CAAA,WAAA,CAAaxd,CAAO4J,CAAAA,CAAK,CAAC,CACpD,CAAA,IACT,CAOA,gBAAA,CAAiB5J,CAAeqe,CAAAA,CAAAA,CAAyC,CACvE,GAAI,IAAK,CAAA,MAAA,GAAW,UAAc,EAAA,IAAA,CAAK,MAAW,GAAA,aAAA,CAChD,MAAM,IAAI18B,CAAAA,CACR,gCACA,CAAA,gCAAA,CACA,IAAI,KAAA,CAAM,gDAAgD,CAC5D,CAGF,CAAA,IAAM8yC,CAAW,CAAA,IAAIG,CAAgB,CAAA,IAAA,CAAK,MAAO,IAAK,CAAA,aAAa,CACnEvW,CAAAA,CAAAA,CAAGoW,CAAQ,CAAA,CACX,IAAM7qB,CAAAA,CAAQ6qB,CAAS,CAAA,iBAAA,EACvB,CAAA,OAAA,IAAA,CAAK,SAAU,CAAA,IAAA,CAAK,IAAIjX,EAAS,CAAA,cAAA,CAAgBxd,CAAO4J,CAAAA,CAAK,CAAC,CAAA,CACvD,IACT,CAOA,MAAM,MAAA,CACJ9a,CACAw9B,CAAAA,CAAAA,CACY,CACZ,GAAM,CAAE,OAAS4B,CAAAA,CAAAA,CAAiB,MAAQC,CAAAA,CAAe,CACvD,CAAA,MAAM,IAAK,CAAA,gBAAA,CAAiB,cAC1B,CAAA,MAAA,CAAO,IAAKr/B,CAAAA,CAAI,CAChB,CAAA,MAAA,CAAO,OAAOA,CAAI,CAAA,CAClB,QACF,CAAA,CAEI4mC,CAAe,CAAA,MAAA,CAAO,WAC1BxH,CAAAA,CAAAA,CAAgB,GAAI,CAAA,CAAC7hC,CAAQoO,CAAAA,CAAAA,GAAU,CAACpO,CAAAA,CAAQ8hC,EAAe1zB,CAAK,CAAC,CAAC,CACxE,CAEA,CAAA,IAAA,CAAK,UAAa,CAAA,IAAI2xB,CAAW,CAAA,IAAA,CAAK,QAAU,CAAA,CAACsJ,CAAY,CAAA,CAAGpJ,CAAS,CACzE,CAAA,GAAM,CAAE,GAAA,CAAAllC,CAAK,CAAA,QAAA,CAAAyZ,CAAS,CAAA,CAAI,IAAK,CAAA,SAAA,CAAU,KAAM,CAAA,CAAC,IAAK,CAAA,UAAU,CAAC,CAE1Di0B,CAAAA,CAAAA,CAAa,MAAM,IAAA,CAAK,gBAAiB,CAAA,OAAO,CAChDlH,CAAAA,CAAAA,CAAO,MAAMkB,CAAAA,CAAQ1nC,CAAKyZ,CAAAA,CAAAA,CAAUi0B,CAAY,CAAA,IAAA,CAAK,OAAQ,MAAQ,CAAA,CACzE,cAAgB,CAAA,CACd,WAAa,CAAA,IAAA,CAAK,KAClB,CAAA,IAAA,CAAM,WACN,CAAA,MAAA,CAAQ,CAAChmC,CAAoB,CAC/B,CACF,CAAC,CAED,CAAA,OAAO,KAAM,CAAA,OAAA,CAAQ8+B,CAAI,CAAA,EAAKA,CAAK,CAAA,MAAA,CAASA,CAAK,CAAA,CAAC,CAAIA,CAAAA,CACxD,CAQA,MAAM,UACJ9+B,CAAAA,CAAAA,CACAw9B,CACc,CAAA,CACd,GAAI,CAACx9B,CAAK,CAAA,MAAA,CACR,OAAO,EAGT,CAAA,IAAMZ,CAAS,CAAA,MAAM,OAAQ,CAAA,GAAA,CAC3BY,EAAK,GAAI,CAAA,MAAO7C,CAAU,EAAA,CACxB,GAAM,CAAE,OAASiiC,CAAAA,CAAAA,CAAiB,MAAQC,CAAAA,CAAe,CACvD,CAAA,MAAM,IAAK,CAAA,gBAAA,CAAiB,eAC1B,MAAO,CAAA,IAAA,CAAKliC,CAAK,CAAA,CACjB,MAAO,CAAA,MAAA,CAAOA,CAAK,CAAA,CACnB,QACF,CAAA,CAEF,OAAO,MAAA,CAAO,WACZiiC,CAAAA,CAAAA,CAAgB,IAAI,CAAC7hC,CAAAA,CAAQoO,CAAU,GAAA,CACrCpO,CACA8hC,CAAAA,CAAAA,CAAe1zB,CAAK,CACtB,CAAC,CACH,CACF,CAAC,CACH,CAAA,CAEA,KAAK,UAAa,CAAA,IAAI2xB,CAAW,CAAA,IAAA,CAAK,QAAUl+B,CAAAA,CAAAA,CAAQo+B,CAAS,CAAA,CACjE,GAAM,CAAE,GAAAllC,CAAAA,CAAAA,CAAK,QAAAyZ,CAAAA,CAAS,EAAI,IAAK,CAAA,SAAA,CAAU,KAAM,CAAA,CAAC,IAAK,CAAA,UAAU,CAAC,CAAA,CAE1Di0B,CAAa,CAAA,MAAM,IAAK,CAAA,gBAAA,CAAiB,OAAO,CAAA,CACtD,OAAOhG,CAAQ1nC,CAAAA,CAAAA,CAAKyZ,CAAUi0B,CAAAA,CAAAA,CAAY,IAAK,CAAA,MAAA,CAAQ,MAAQ,CAAA,CAC7D,cAAgB,CAAA,CACd,WAAa,CAAA,IAAA,CAAK,KAClB,CAAA,IAAA,CAAM,aACN,MAAQ5mC,CAAAA,CACV,CACF,CAAC,CACH,CASA,MAAM,MAAA,CACJY,CACA+L,CAAAA,CAAAA,CACA7V,CAAmC,CAAA,CACjC,gBAAkB,CAAA,IACpB,EACc,CACd,IAAMmW,CAAkB,CAAA,MAAA,CAAO,IAAKrM,CAAAA,CAAI,CAClCmM,CAAAA,CAAAA,CAAkB,MAAO,CAAA,IAAA,CAAKJ,CAAc,CAAA,CAC5C,CAAE,OAAA,CAASqzB,EAAiB,MAAQC,CAAAA,CAAe,CACvD,CAAA,MAAM,IAAK,CAAA,gBAAA,CAAiB,cAC1B,CAAA,MAAA,CAAO,IAAKr/B,CAAAA,CAAI,CAChB,CAAA,MAAA,CAAO,MAAOA,CAAAA,CAAI,EAClB,QACF,CAAA,CAEI4mC,CAAe,CAAA,MAAA,CAAO,WAC1BxH,CAAAA,CAAAA,CAAgB,GAAI,CAAA,CAAC7hC,CAAQoO,CAAAA,CAAAA,GAAU,CAACpO,CAAAA,CAAQ8hC,CAAe1zB,CAAAA,CAAK,CAAC,CAAC,CACxE,CAGA,CAAA,GAAI,IAAK,CAAA,aAAA,CAAc,IAAS,GAAA,OAAA,CAC9B,OAAO,IAAA,CAAK,oBACV,CAAA,CAACi7B,CAAY,CAAA,CACbz6B,EACAE,CACAnW,CAAAA,CAAAA,CACA,CAAC8J,CAAI,CACP,CAAA,CAGF,GAAM,CAAE,GAAA1H,CAAAA,CAAAA,CAAK,QAAAyZ,CAAAA,CAAS,CAAI,CAAA,IAAA,CAAK,UAAU,KAAM,CAAA,CAC7C,IAAIurB,CAAAA,CACF,IAAID,CAAAA,CAAS,IAAK,CAAA,KAAA,CAAM,KAAK,CAAA,CAC7B,CAACuJ,CAAY,CACb,CAAA,MAAA,CACA,IACF,CACA,CAAA,IAAIlJ,EACF,CAAA,IAAA,CAAK,KAAM,CAAA,KAAA,CACXvxB,CACAE,CAAAA,CAAAA,CACCnW,CAAQ,CAAA,gBAAA,EAAoB,IAAQ,CAAA,QAAA,CAAW,QAChDA,CAAAA,CAAAA,CAAQ,SACV,CACF,CAAC,CAEK8vC,CAAAA,CAAAA,CAAa,MAAM,IAAA,CAAK,gBAAiB,CAAA,OAAO,CAChDa,CAAAA,CAAAA,CAAY,MAAM7G,CAAAA,CACtB1nC,CACAyZ,CAAAA,CAAAA,CACAi0B,CACA,CAAA,IAAA,CAAK,MACL,CAAA,MAAA,CACA,CACE,cAAA,CAAgB,CACd,WAAA,CAAa,IAAK,CAAA,KAAA,CAClB,IAAM,CAAA,KAAA,CACN,MAAQ,CAAA,CAAChmC,CAAoB,CAC/B,CACF,CACF,CAAA,CAEA,OAAQ,KAAA,CAAM,OAAQ6mC,CAAAA,CAAS,CAAIA,CAAAA,CAAAA,CAAY,CAACA,CAAS,CAC3D,CASA,MAAM,UAAA,CACJ16B,EACAE,CACArM,CAAAA,CAAAA,CACA9J,CAAmC,CAAA,CACjC,gBAAkB,CAAA,IACpB,CACc,CAAA,CACd,IAAM4wC,CAAAA,CAAuC,EAAC,CAuB9C,GArBA,MAAM,QAAQ,GACZ9mC,CAAAA,CAAAA,CAAK,GAAI,CAAA,MAAOnC,CAAW,EAAA,CACzB,GAAM,CAAE,OAASuhC,CAAAA,CAAAA,CAAiB,MAAQC,CAAAA,CAAe,CACvD,CAAA,MAAM,KAAK,gBAAiB,CAAA,cAAA,CAC1B,MAAO,CAAA,IAAA,CAAKxhC,CAAM,CAAA,CAClB,MAAO,CAAA,MAAA,CAAOA,CAAM,CAAA,CACpB,QACF,CAAA,CAEI+oC,CAAe,CAAA,MAAA,CAAO,YAC1BxH,CAAgB,CAAA,GAAA,CAAI,CAAC7hC,CAAAA,CAAQoO,CAAU,GAAA,CACrCpO,CACA8hC,CAAAA,CAAAA,CAAe1zB,CAAK,CACtB,CAAC,CACH,CAEAm7B,CAAAA,CAAAA,CAAc,KAAKF,CAAY,EACjC,CAAC,CACH,CAGI,CAAA,IAAA,CAAK,aAAc,CAAA,IAAA,GAAS,OAC9B,CAAA,OAAO,IAAK,CAAA,oBAAA,CACVE,CACA36B,CAAAA,CAAAA,CACAE,EACAnW,CACA8J,CAAAA,CACF,CAGF,CAAA,GAAM,CAAE,GAAA,CAAA1H,CAAK,CAAA,QAAA,CAAAyZ,CAAS,CAAA,CAAI,IAAK,CAAA,SAAA,CAAU,KAAM,CAAA,CAC7C,IAAIurB,CACF,CAAA,IAAID,CAAS,CAAA,IAAA,CAAK,KAAM,CAAA,KAAK,CAC7ByJ,CAAAA,CAAAA,CACA,MACA,CAAA,IACF,CACA,CAAA,IAAIpJ,EACF,CAAA,IAAA,CAAK,MAAM,KACXvxB,CAAAA,CAAAA,CACAE,CACCnW,CAAAA,CAAAA,CAAQ,gBAAoB,EAAA,IAAA,CAAQ,QAAW,CAAA,QAAA,CAChDA,CAAQ,CAAA,SACV,CACF,CAAC,CAEK8vC,CAAAA,CAAAA,CAAa,MAAM,IAAK,CAAA,gBAAA,CAAiB,OAAO,CAAA,CAChDa,CAAY,CAAA,MAAM7G,CACtB1nC,CAAAA,CAAAA,CACAyZ,CACAi0B,CAAAA,CAAAA,CACA,IAAK,CAAA,MAAA,CACL,MACA,CAAA,CACE,eAAgB,CACd,WAAA,CAAa,IAAK,CAAA,KAAA,CAClB,IAAM,CAAA,KAAA,CACN,MAAQhmC,CAAAA,CACV,CACF,CACF,CACA,CAAA,OAAQ,KAAM,CAAA,OAAA,CAAQ6mC,CAAS,CAC3BA,CAAAA,CAAAA,CACA,CAACA,CAAS,CAChB,CAKA,MAAc,oBAAA,CACZC,CACA36B,CAAAA,CAAAA,CACAE,CACAnW,CAAAA,CAAAA,CACA8J,CACc,CAAA,CACd,GAAI,CAAC8mC,CAAAA,CAAc,MACjB,CAAA,OAAO,EAAC,CAGV,IAAMzpC,CAAAA,CAAU,MAAO,CAAA,IAAA,CAAKypC,CAAc,CAAA,CAAC,CAAC,CAAA,CACtCzvB,EAAiB,IAAK,CAAA,gBAAA,CAAiB,kBAC3C,CAAA,OAAA,CACA,IAAK,CAAA,KAAA,CAAM,KACb,CAAA,CAEM0vB,CAAaj/B,CAAAA,CAAAA,EACjB,IAAK,CAAA,gBAAA,CAAiB,kBAAmB,CAAA,OAAA,CAASA,CAAG,CAGjDiK,CAAAA,CAAAA,CAAkB,EAAC,CACnBi1B,CAAaF,CAAAA,CAAAA,CAAc,GAAKG,CAAAA,CAAAA,EAK7B,CAJW5pC,OAAAA,EAAAA,CAAAA,CAAQ,GAAKyK,CAAAA,CAAAA,GAC7BiK,CAAS,CAAA,IAAA,CAAKk1B,EAAIn/B,CAAG,CAAC,CACf,CAAA,CAAA,CAAA,EAAIiK,CAAS,CAAA,MAAM,CAC3B,CAAA,CAAA,CAAA,CAC0B,IAAK,CAAA,IAAI,CAAC,CAAA,CACtC,CAEKm1B,CAAAA,CAAAA,CAAgB7pC,EAAQ,GAAI0pC,CAAAA,CAAS,CAAE,CAAA,IAAA,CAAK,IAAI,CAAA,CAChDI,CAAcH,CAAAA,CAAAA,CAAW,IAAK,CAAA,aAAa,CAG3CI,CAAAA,CAAAA,CAAcj7B,CACjB,CAAA,GAAA,CAAKrE,GAAQ,CAAUi/B,OAAAA,EAAAA,CAAAA,CAAUj/B,CAAG,CAAC,CAAai/B,UAAAA,EAAAA,CAAAA,CAAUj/B,CAAG,CAAC,CAAE,CAAA,CAAA,CAClE,IAAK,CAAA,OAAO,CAGT+a,CAAAA,CAAAA,CAAYxW,EACf,MAAQvE,CAAAA,CAAAA,EAAQ,CAACqE,CAAAA,CAAgB,QAASrE,CAAAA,CAAG,CAAC,CAAA,CAC9C,GAAKA,CAAAA,CAAAA,EAAQ,CAAUi/B,OAAAA,EAAAA,CAAAA,CAAUj/B,CAAG,CAAC,aAAai/B,CAAUj/B,CAAAA,CAAG,CAAC,CAAA,CAAE,CAClE,CAAA,IAAA,CAAK,IAAI,CAAA,CAGNu/B,CAAahqC,CAAAA,CAAAA,CAAQ,GAAI0pC,CAAAA,CAAS,CAAE,CAAA,IAAA,CAAK,IAAI,CAC7CO,CAAAA,CAAAA,CAAajqC,CAChB,CAAA,GAAA,CAAKyK,CAAQ,EAAA,CAAA,OAAA,EAAUi/B,CAAUj/B,CAAAA,CAAG,CAAC,CAAA,CAAE,CACvC,CAAA,IAAA,CAAK,IAAI,CAAA,CAGN+P,EACJ3hB,CAAQ,CAAA,SAAA,EAAaA,CAAQ,CAAA,SAAA,CAAU,MACnCA,CAAAA,CAAAA,CAAQ,SACL,CAAA,GAAA,CAAK4R,CAAQ,EAAA,CAAA,SAAA,EAAYi/B,CAAUj/B,CAAAA,CAAG,CAAC,CAAA,CAAE,EACzC,IAAK,CAAA,IAAI,CACZzK,CAAAA,CAAAA,CAAQ,GAAKyK,CAAAA,CAAAA,EAAQ,CAAYi/B,SAAAA,EAAAA,CAAAA,CAAUj/B,CAAG,CAAC,CAAE,CAAA,CAAA,CAAE,IAAK,CAAA,IAAI,EAI5Dy/B,CADmBrxC,CAAAA,CAAAA,CAAAA,CAAQ,gBAAoB,EAAA,IAAA,GAE/B2sB,CAChB,CAAA,CAAA,6BAAA,EAAgCA,CAAS,CAAA,CAAA,CACzC,EAEAvqB,CAAAA,CAAAA,CACJ,CAAc+e,WAAAA,EAAAA,CAAc,CAClB8vB,kBAAAA,EAAAA,CAAW,gBAAgBD,CAAa,CAAA,KAAA,EAC5CE,CAAW,CAAA,CAAA,EACdG,CAAiB,CAAA,+BAAA,EACaF,CAAU,CAAA,UAAA,EAAaC,CAAU,CAAA,SAAA,EACxDzvB,CAAU,CAAA,CAAA,CAAA,CAEhBmuB,CAAa,CAAA,MAAM,KAAK,gBAAiB,CAAA,OAAO,CAChDa,CAAAA,CAAAA,CAAY,MAAM7G,CAAAA,CACtB1nC,CACAyZ,CAAAA,CAAAA,CACAi0B,CACA,CAAA,IAAA,CAAK,MACL,CAAA,MAAA,CACA,CACE,cAAA,CAAgB,CACd,WAAa,CAAA,IAAA,CAAK,KAClB,CAAA,IAAA,CAAM,KACN,CAAA,MAAA,CAAQhmC,CACV,CACF,CACF,CAAA,CAEA,OAAQ,KAAA,CAAM,OAAQ6mC,CAAAA,CAAS,EAC3BA,CACA,CAAA,CAACA,CAAS,CAChB,CAMA,MAAM,MAAO7mC,CAAAA,CAAAA,CAAwD,CACnE,IAAMwnC,CAAa,CAAA,MAAA,CAAO,IAAKxnC,CAAAA,CAAI,EAC7BynC,CAAY,CAAA,MAAA,CAAO,MAAOznC,CAAAA,CAAI,CAE9B,CAAA,CAAE,OAAA3C,CAAAA,CAAAA,CAAS,MAAA8T,CAAAA,CAAO,CAAI,CAAA,MAAM,IAAK,CAAA,gBAAA,CAAiB,eACtDq2B,CACAC,CAAAA,CAAAA,CACA,QACF,CAAA,CAEA,IAAK,CAAA,UAAA,CAAa,IAAI9J,EAAAA,CAAW,IAAK,CAAA,QAAA,CAAUtgC,CAAS8T,CAAAA,CAAM,CAC/D,CAAA,GAAM,CAAE,GAAA7Y,CAAAA,CAAAA,CAAK,QAAAyZ,CAAAA,CAAS,CAAI,CAAA,IAAA,CAAK,SAAU,CAAA,KAAA,CAAM,CAC7C,IAAA,CAAK,UACL,CAAA,GAAG,IAAK,CAAA,UAAA,CACR,GAAG,IAAA,CAAK,SACV,CAAC,CAEKi0B,CAAAA,CAAAA,CAAa,MAAM,IAAA,CAAK,gBAAiB,CAAA,OAAO,CACtD,CAAA,OAAOhG,CAAQ1nC,CAAAA,CAAAA,CAAKyZ,CAAUi0B,CAAAA,CAAAA,CAAY,KAAK,MAAQ,CAAA,cAAA,CAAgB,CACrE,cAAA,CAAgB,CAAE,WAAA,CAAa,IAAK,CAAA,KAAA,CAAO,IAAM,CAAA,cAAe,CAClE,CAAC,CACH,CAMA,MAAM,QAA0B,EAAA,CAC9B,IAAK,CAAA,YAAA,CAAe,IAAIhY,EAAAA,CAAa,IAAK,CAAA,QAAQ,CAClD,CAAA,GAAM,CAAE,GAAA,CAAA11B,CAAK,CAAA,QAAA,CAAAyZ,CAAS,CAAI,CAAA,IAAA,CAAK,SAAU,CAAA,KAAA,CAAM,CAAC,IAAA,CAAK,YAAY,CAAC,CAC5Di0B,CAAAA,CAAAA,CAAa,MAAM,IAAA,CAAK,gBAAiB,CAAA,OAAO,EACtD,MAAMhG,CAAAA,CAAQ1nC,CAAKyZ,CAAAA,CAAAA,CAAUi0B,CAAY,CAAA,IAAA,CAAK,MAAQ,CAAA,MAAM,EAC9D,CAMA,MAAM,MAAA,EAA0B,CAC9B,IAAA,CAAK,WAAa,IAAI5I,EAAAA,CAAW,IAAK,CAAA,QAAQ,CAC9C,CAAA,GAAM,CAAE,GAAA,CAAA9kC,CAAK,CAAA,QAAA,CAAAyZ,CAAS,CAAA,CAAI,IAAK,CAAA,SAAA,CAAU,MAAM,CAC7C,IAAA,CAAK,UACL,CAAA,GAAG,IAAK,CAAA,UAAA,CACR,GAAG,IAAA,CAAK,SACV,CAAC,CAEKi0B,CAAAA,CAAAA,CAAa,MAAM,IAAA,CAAK,iBAAiB,OAAO,CAAA,CACtD,OAAOhG,CAAAA,CAAQ1nC,CAAKyZ,CAAAA,CAAAA,CAAUi0B,CAAY,CAAA,IAAA,CAAK,MAAQ,CAAA,cAAA,CAAgB,CACrE,cAAA,CAAgB,CACd,WAAA,CAAa,KAAK,KAClB,CAAA,IAAA,CAAM,cACR,CACF,CAAC,CACH,CAQA,MAAM,UACJ9vC,CAAAA,CAAAA,CAAgE,EAAC,CAChD,CACjB,GAAM,CAAE,MAAAqH,CAAAA,CAAAA,CAAS,WAAa,CAAA,KAAA,CAAAvI,CAAQ4P,CAAAA,EAAAA,EAAqB,CAAA,CACzD1O,CAAW,EAAA,EAEP,CAAA,CAAE,OAAAmH,CAAAA,CAAAA,CAAS,OAAA8T,CAAO,CAAA,CAAI,MAAM,IAAA,CAAK,gBAAiB,CAAA,cAAA,CACtD,CAAC5T,CAAgB,CACjB,CAAA,CAACvI,CAAK,CAAA,CACN,QACF,CAAA,CAEA,KAAK,UAAa,CAAA,IAAI2oC,EAAW,CAAA,IAAA,CAAK,QAAUtgC,CAAAA,CAAAA,CAAS8T,CAAM,CAAA,CAC/D,GAAM,CAAE,GAAA7Y,CAAAA,CAAAA,CAAK,QAAAyZ,CAAAA,CAAS,EAAI,IAAK,CAAA,SAAA,CAAU,KAAM,CAAA,CAC7C,IAAK,CAAA,UAAA,CACL,GAAG,IAAA,CAAK,UACR,CAAA,GAAG,IAAK,CAAA,SACV,CAAC,CAAA,CAEKi0B,EAAa,MAAM,IAAA,CAAK,gBAAiB,CAAA,OAAO,CACtD,CAAA,OAAOhG,CAAQ1nC,CAAAA,CAAAA,CAAKyZ,CAAUi0B,CAAAA,CAAAA,CAAY,IAAK,CAAA,MAAA,CAAQ,cAAgB,CAAA,CACrE,eAAgB,CACd,WAAA,CAAa,IAAK,CAAA,KAAA,CAClB,IAAM,CAAA,cACR,CACF,CAAC,CACH,CAKA,OAAkB,EAAA,CAChB,GAAM,CAAE,IAAA1tC,CAAK,CAAA,QAAA,CAAAyZ,CAAS,CAAA,CAAI,IAAK,CAAA,MAAA,EAC/B,CAAA,OAAOzQ,EAAoBhJ,CAAAA,CAAAA,CAAKyZ,CAAQ,CAC1C,CAKA,MAAA,EAAuD,CAChD,IAAA,CAAK,WAAY,CAAA,MAAA,GACpB,IAAK,CAAA,WAAA,CAAc,CAAC,IAAI6wB,CAAW,CAAA,GAAG,CAAC,CAAA,CAAA,CAGzC,GAAM,CAAE,GAAAtqC,CAAAA,CAAAA,CAAK,SAAAyZ,CAAS,CAAA,CAAI,IAAK,CAAA,SAAA,CAAU,KAAM,CAAA,IAAA,CAAK,iBAAkB,EAAC,CAEjElQ,CAAAA,CAAAA,CAAiBD,EAAY,CAAA,IAAA,CAAK,aAAetJ,CAAAA,CAAG,EAM1D,OAAO,CACL,GALiB,CAAA,IAAA,CAAK,SACpB,CAAA,CAAA,EAAG,IAAK,CAAA,SAAS,CAAIuJ,CAAAA,EAAAA,CAAc,CACnCA,CAAAA,CAAAA,CAAAA,CAIF,QAAU,CAAA,CAAC,GAAIkQ,CAAY,EAAA,EAAG,CAChC,CACF,CAKA,KAAc,EAAA,CACZ,IAAM21B,CAAAA,CAAK,IAAI5B,CAAAA,CAAgB,IAAK,CAAA,KAAA,CAAO,KAAK,aAAa,CAAA,CAG7D,OAAA4B,CAAAA,CAAG,MAAS,CAAA,IAAA,CAAK,MACjBA,CAAAA,CAAAA,CAAG,oBAAuB1/B,CAAAA,CAAAA,CAAc,IAAK,CAAA,oBAAoB,CACjE0/B,CAAAA,CAAAA,CAAG,sBAAwB1/B,CAAc,CAAA,IAAA,CAAK,qBAAqB,CAAA,CACnE0/B,CAAG,CAAA,YAAA,CAAe1/B,CAAc,CAAA,IAAA,CAAK,YAAY,CAAA,CACjD0/B,CAAG,CAAA,cAAA,CAAiB1/B,CAAc,CAAA,IAAA,CAAK,cAAc,CACrD0/B,CAAAA,CAAAA,CAAG,WAAc1/B,CAAAA,CAAAA,CAAc,IAAK,CAAA,WAAW,CAC/C0/B,CAAAA,CAAAA,CAAG,SAAY1/B,CAAAA,CAAAA,CAAc,IAAK,CAAA,SAAS,CAG3C0/B,CAAAA,CAAAA,CAAG,UAAY1/B,CAAc,CAAA,IAAA,CAAK,SAAS,CAAA,CAC3C0/B,CAAG,CAAA,UAAA,CAAa1/B,CAAc,CAAA,IAAA,CAAK,UAAU,CAAA,CAC7C0/B,CAAG,CAAA,YAAA,CAAe1/B,CAAc,CAAA,IAAA,CAAK,YAAY,CACjD0/B,CAAAA,CAAAA,CAAG,WAAc1/B,CAAAA,CAAAA,CAAc,IAAK,CAAA,WAAW,CAC/C0/B,CAAAA,CAAAA,CAAG,YAAe1/B,CAAAA,CAAAA,CAAc,IAAK,CAAA,YAAY,CAGjD0/B,CAAAA,CAAAA,CAAG,eAAiB1/B,CAAc,CAAA,IAAA,CAAK,cAAc,CAAA,CACrD0/B,CAAG,CAAA,UAAA,CAAa1/B,CAAc,CAAA,IAAA,CAAK,UAAU,CAAA,CAC7C0/B,CAAG,CAAA,SAAA,CAAY1/B,CAAc,CAAA,IAAA,CAAK,SAAS,CAG3C0/B,CAAAA,CAAAA,CAAG,QAAW1/B,CAAAA,CAAAA,CAAc,IAAK,CAAA,QAAQ,CACzC0/B,CAAAA,CAAAA,CAAG,SAAY1/B,CAAAA,CAAAA,CAAc,IAAK,CAAA,SAAS,CAC3C0/B,CAAAA,CAAAA,CAAG,WAAa1/B,CAAc,CAAA,IAAA,CAAK,UAAU,CAAA,CAG7C0/B,CAAG,CAAA,iBAAA,CAAoB,IAAK,CAAA,iBAAA,CAC5BA,CAAG,CAAA,qBAAA,CAAwB,IAAK,CAAA,qBAAA,CAEzBA,CACT,CAKA,OAAQ,CACN,IAAMA,CAAK,CAAA,IAAI5B,CAAa,CAAA,IAAA,CAAK,KAAO,CAAA,IAAA,CAAK,aAAa,CAAA,CAC1D,OAAI,IAAA,CAAK,QAAS,CAAA,KAAA,EAChB4B,EAAG,IAAKA,CAAAA,CAAAA,CAAG,KAAM,CAAA,KAAA,CAAO,IAAK,CAAA,QAAA,CAAS,KAAK,CAAA,CAGtCA,CACT,CAKA,cAAuB,EAAA,CACrB,OAAK,IAAA,CAAA,cAAA,CAAiB,EACf,CAAA,IACT,CAKA,eAAA,EAAwB,CACtB,OAAA,IAAA,CAAK,UAAa,CAAA,EACX,CAAA,IACT,CAKA,cAAA,EAAuB,CACrB,OAAA,IAAA,CAAK,UAAY,EAAC,CACX,IACT,CAEA,iBAAiC,EAAA,CAK/B,OAJK,IAAA,CAAK,WAAY,CAAA,MAAA,GACpB,IAAK,CAAA,WAAA,CAAc,CAAC,IAAI9E,CAAW,CAAA,GAAG,CAAC,CAAA,CAAA,CAGrC,IAAK,CAAA,UAAA,CACA,CAAC,IAAA,CAAK,UAAY,CAAA,IAAA,CAAK,eAAe,CAAA,CAAE,MAC7C,CAAA,OACF,CAGE,CAAA,IAAA,CAAK,WACA,CACL,IAAA,CAAK,UACL,CAAA,GAAG,IAAK,CAAA,UAAA,CACR,GAAG,IAAA,CAAK,SACR,CAAA,GAAG,IAAK,CAAA,YAAA,CACR,IAAK,CAAA,SACP,EAAE,MAAO,CAAA,OAAO,CAGd,CAAA,IAAA,CAAK,UACA,CAAA,CACL,IAAK,CAAA,UAAA,CACL,GAAG,IAAA,CAAK,UACR,CAAA,GAAG,IAAK,CAAA,SAAA,CACR,GAAG,IAAK,CAAA,YAAA,CACR,IAAK,CAAA,SACP,CAAE,CAAA,MAAA,CAAO,OAAO,CAAA,CAGd,IAAK,CAAA,YAAA,CACA,CAAC,IAAA,CAAK,YAAY,CAAA,CAIpB,CACL,GAAG,IAAA,CAAK,SACR,CAAA,IAAA,CAAK,YACL,CAAA,IAAA,CAAK,cACL,CAAA,GAAG,IAAK,CAAA,WAAA,CACR,IAAK,CAAA,QAAA,CACL,GAAG,IAAA,CAAK,UACR,GAAG,IAAA,CAAK,UACR,CAAA,GAAG,IAAK,CAAA,YAAA,CACR,GAAG,IAAA,CAAK,WACR,CAAA,GAAG,IAAK,CAAA,YAAA,CACR,IAAK,CAAA,SAAA,CACL,KAAK,UACL,CAAA,GAAG,IAAK,CAAA,cAAA,CACR,GAAG,IAAA,CAAK,UACV,CAAA,CAAE,MAAO,CAAA,OAAO,CAClB,CAEU,iBAA0B,EAAA,CAClC,YAAK,WAAY,EAAA,CACjB,IAAK,CAAA,YAAA,EACL,CAAA,IAAA,CAAK,YAAa,EAAA,CAClB,IAAK,CAAA,UAAA,EACL,CAAA,IAAA,CAAK,WAAY,EAAA,CACV,IACT,CAKA,MAAc,mBACZL,CAAAA,CAAAA,CAAmC,QAIlC,CAAA,CACD,GAAM,CAACj7B,CAAMtH,CAAAA,CAAI,CAAI,CAAA,MAAMsiC,CACzB,CAAA,IAAA,CAAK,KAAK,IAAK,CAAA,IAAI,CACnBC,CAAAA,CACF,CAAE,EAAA,CAEF,OAAO,CACL,IAAAviC,CAAAA,CAAAA,CACA,IAAM,CAAA,MAAA,CAAOsH,CAAI,CACnB,CACF,CAKA,MAAc,kBACZi7B,CAAAA,CAAAA,CAAmC,QAIlC,CAAA,CACD,GAAM,CAACj7B,CAAMtH,CAAAA,CAAI,CAAI,CAAA,MAAMsiC,CACzB,CAAA,IAAA,CAAK,IAAI,IAAK,CAAA,IAAI,CAClBC,CAAAA,CACF,CAAE,EAAA,CAEF,OAAO,CACL,IAAAviC,CAAAA,CAAAA,CACA,IAAM,CAAA,MAAA,CAAOsH,CAAI,CACnB,CACF,CAKA,MAAc,oBACZi7B,CAAAA,CAAAA,CAAmC,QACnC,CAAA,CACA,OAAO,IAAA,CAAK,kBAAmBA,CAAAA,CAAU,CAC3C,CAKA,MAAc,0BAAA,CACZA,EAAmC,QACnC,CAAA,CACA,OAAO,IAAA,CAAK,wBAAyBA,CAAAA,CAAU,CACjD,CAEA,MAAc,uBAAA,CACZ9iC,CACA+mC,CAAAA,CAAAA,CACAjE,CAAmC,CAAA,QAAA,CACnC,CACA,GAAM,CAACj7B,CAAMtH,CAAAA,CAAI,CAAI,CAAA,MAAMsiC,CACzB,CAAA,IAAA,CAAK,QAAS,CAAA,IAAA,CAAK,IAAM7iC,CAAAA,CAAAA,CAAM+mC,CAAO,CAAA,CACtCjE,CACF,CAAE,EAAA,CAEF,OAAO,CACL,IAAAviC,CAAAA,CAAAA,CACA,IAAM,CAAA,MAAA,CAAOsH,CAAI,CACnB,CACF,CAEA,MAAc,iCAAA,CACZ7H,EACAvJ,CACAgwC,CAAAA,CAAAA,CACA3D,CAAmC,CAAA,QAAA,CACnC,CACA,GAAM,CAACj7B,CAAAA,CAAMtH,CAAI,CAAA,CAAI,MAAMsiC,CAAAA,CACzB,IAAK,CAAA,kBAAA,CAAmB,KAAK,IAAM7iC,CAAAA,CAAAA,CAAMvJ,CAASgwC,CAAAA,CAAM,CACxD3D,CAAAA,CACF,CAAE,EAAA,CAEF,OAAO,CACL,IAAAviC,CAAAA,CAAAA,CACA,IAAM,CAAA,MAAA,CAAOsH,CAAI,CACnB,CACF,CAKA,MAAc,wBACZi7B,CAAAA,CAAAA,CAAmC,QACnC,CAAA,CACA,GAAM,CAACj7B,CAAMtH,CAAAA,CAAI,CAAI,CAAA,MAAMsiC,EACzB,IAAK,CAAA,SAAA,CAAU,IAAK,CAAA,IAAI,CACxBC,CAAAA,CACF,CAAE,EAAA,CAEF,OAAO,CACL,IAAAviC,CAAAA,CAAAA,CACA,IAAM,CAAA,MAAA,CAAOsH,CAAI,CACnB,CACF,CAMA,MAAc,qBACZi7B,CAAAA,CAAAA,CAAmC,QAIlC,CAAA,CACD,GAAM,CAACj7B,CAAMtH,CAAAA,CAAI,CAAI,CAAA,MAAMsiC,EACzB,IAAK,CAAA,MAAA,CAAO,IAAK,CAAA,IAAI,CACrBC,CAAAA,CACF,CAAE,EAAA,CACF,OAAO,CAAE,IAAAviC,CAAAA,CAAAA,CAAM,IAAM,CAAA,MAAA,CAAOsH,CAAI,CAAE,CACpC,CAEA,MAAc,oBACZvS,CAAAA,CAAAA,CACAwtC,CAAmC,CAAA,QAAA,CACnC,CACA,GAAM,CAACj7B,CAAAA,CAAMtH,CAAI,CAAA,CAAI,MAAMsiC,CACzB,CAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,IAAMvtC,CAAAA,CAAG,CACzBwtC,CAAAA,CACF,CAAE,EAAA,CAEF,OAAO,CACL,IAAAviC,CAAAA,CAAAA,CACA,KAAM,MAAOsH,CAAAA,CAAI,CACnB,CACF,CAEA,MAAc,qBACZtH,CAAAA,CAAAA,CACAuiC,CAAmC,CAAA,QAAA,CACnC,CACA,GAAM,CAACj7B,CAAAA,CAAMxP,CAAM,CAAI,CAAA,MAAMwqC,CAC3B,CAAA,IAAA,CAAK,MAAO,CAAA,IAAA,CAAK,IAAMtiC,CAAAA,CAAI,CAC3BuiC,CAAAA,CACF,CAAE,EAAA,CAEF,OAAO,CACL,KAAMzqC,CACN,CAAA,IAAA,CAAM,MAAOwP,CAAAA,CAAI,CACnB,CACF,CAEA,MAAc,qBACZtH,CAAAA,CAAAA,CACAuiC,CAAmC,CAAA,QAAA,CACnC,CACA,GAAM,CAACj7B,CAAMxP,CAAAA,CAAM,CAAI,CAAA,MAAMwqC,CAC3B,CAAA,IAAA,CAAK,MAAO,CAAA,IAAA,CAAK,IAAMtiC,CAAAA,CAAI,CAC3BuiC,CAAAA,CACF,CAAE,EAAA,CAEF,OAAO,CACL,IAAA,CAAMzqC,CACN,CAAA,IAAA,CAAM,MAAOwP,CAAAA,CAAI,CACnB,CACF,CAEA,MAAc,yBACZtH,CAAAA,CAAAA,CACAuiC,CAAmC,CAAA,QAAA,CACnC,CACA,GAAM,CAACj7B,CAAMxP,CAAAA,CAAM,CAAI,CAAA,MAAMwqC,CAC3B,CAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CAAK,IAAMtiC,CAAAA,CAAI,CAC/BuiC,CAAAA,CACF,GAEA,CAAA,OAAO,CACL,IAAA,CAAMzqC,CACN,CAAA,IAAA,CAAM,MAAOwP,CAAAA,CAAI,CACnB,CACF,CAEA,MAAc,yBACZpR,CAAAA,CAAAA,CAAgE,EAChEqsC,CAAAA,CAAAA,CAAmC,QACnC,CAAA,CACA,GAAM,CAACj7B,CAAMtH,CAAAA,CAAI,CAAI,CAAA,MAAMsiC,CACzB,CAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CAAK,IAAMpsC,CAAAA,CAAO,CAClCqsC,CAAAA,CACF,CAAE,EAAA,CAEF,OAAO,CACL,IAAAviC,CAAAA,CAAAA,CACA,IAAM,CAAA,MAAA,CAAOsH,CAAI,CACnB,CACF,CAEA,MAAc,qBACZi7B,CAAAA,CAAAA,CAAmC,QACnC,CAAA,CACA,GAAM,CAACj7B,CAAMtH,CAAAA,CAAI,CAAI,CAAA,MAAMsiC,CACzB,CAAA,IAAA,CAAK,MAAO,CAAA,IAAA,CAAK,IAAI,CACrBC,CAAAA,CACF,CAAE,EAAA,CAEF,OAAO,CACL,IAAAviC,CAAAA,CAAAA,CACA,IAAM,CAAA,MAAA,CAAOsH,CAAI,CACnB,CACF,CAEA,MAAc,uBACZi7B,CAAAA,CAAAA,CAAmC,QACnC,CAAA,CACA,GAAM,CAACj7B,CAAMxP,CAAAA,CAAM,CAAI,CAAA,MAAMwqC,CAC3B,CAAA,IAAA,CAAK,QAAS,CAAA,IAAA,CAAK,IAAI,CACvBC,CAAAA,CACF,CAAE,EAAA,CAEF,OAAO,CACL,IAAMzqC,CAAAA,CAAAA,CACN,IAAM,CAAA,MAAA,CAAOwP,CAAI,CACnB,CACF,CAMU,oBAA8B,CACtC,OACE,IAAK,CAAA,aAAA,CAAc,IAAS,GAAA,OAAA,EAAW,CAAC,CAAC,IAAK,CAAA,aAAA,CAAc,aAEhE,CAKA,MAAgB,sBAAA,CACdqgC,EACAC,CACiB,CAAA,CACjB,GAAI,IAAA,CAAK,kBAAmB,EAAA,CAAG,CAC7B,IAAMxoC,CAAS,CAAA,MAAMuoC,CAAY,EAAA,CAC3BvB,CAAQ,CAAA,MAAMwB,GACpB,CAAA,OAAO,CAACxoC,CAAAA,CAAQgnC,CAAK,CACvB,CAEA,OAAO,OAAQ,CAAA,GAAA,CAAI,CAACuB,CAAAA,EAAeC,CAAAA,CAAAA,EAAY,CAAC,CAClD,CAEA,MAAgB,gBACdpuC,CAAAA,CAAAA,CACwB,CACxB,OAAK,IAAK,CAAA,eAAA,CASN,IAAK,CAAA,eAAA,GAAoB,QACpB,CAAA,IAAA,CAAK,cAGVA,CAAS,GAAA,OAAA,CACJ,IAAK,CAAA,aAAA,CAGA,IAAK,CAAA,aAAA,CAAc,QAAS,EAAA,EAC1B,IAAK,CAAA,aAAA,CAjBfA,CAAS,GAAA,MAAA,CACG,IAAK,CAAA,aAAA,CAAc,UACjB,EAAA,IAAA,CAAK,aAGhB,CAAA,IAAA,CAAK,aAahB,CAQA,MAAgB,wBAAA,CACdA,CACAs8B,CAAAA,CAAAA,CACY,CACZ,IAAMkQ,CAAa,CAAA,MAAM,KAAK,gBAAiBxsC,CAAAA,CAAI,CAGnD,CAAA,GAAI,EAFYwsC,CAAAA,GAAe,IAAK,CAAA,aAAA,CAAA,CAGlC,OAAOlQ,CAAAA,CAAUkQ,CAAU,CAAA,CAG7B,GAAI,CACF,OAAO,MAAMlQ,CAAAA,CAAUkQ,CAAU,CACnC,CAAShzC,MAAAA,CAAAA,CAAO,CACd,IAAM+C,CAAM/C,CAAAA,CAAAA,YAAiB,KAAQA,CAAAA,CAAAA,CAAQ,IAAI,KAAA,CAAM,OAAOA,CAAK,CAAC,CAC9D60C,CAAAA,CAAAA,CAAiB,IAAK,CAAA,aAAA,CAAc,uBAAwB,EAAA,CAElE,GAAIA,CAAAA,CACF,OAAMA,MAAAA,CAAAA,CAAe9xC,CAAK,CAAA,CACxB,KAAMiwC,CAAW,CAAA,IAAA,CACjB,IAAMA,CAAAA,CAAAA,CAAW,IACjB,CAAA,QAAA,CAAUA,CAAW,CAAA,QAAA,CACrB,QAAUA,CAAAA,CAAAA,CAAW,QACrB,CAAA,QAAA,CAAUA,CAAW,CAAA,QAAA,CACrB,KAAMA,CAAW,CAAA,SAAA,EACnB,CAAC,CACM,CAAA,MAAMlQ,CAAU,CAAA,IAAA,CAAK,aAAa,CAAA,CAG3C,MAAM//B,CACR,CACF,CACF,CCn6CO,CAAA,IAAM+xC,EAAN,CAAA,MAAMC,CAIH9C,SAAAA,CAAgB,CA2BxB,WAAA,CAAY9nC,CAAqBgC,CAAAA,CAAAA,CAA8B,CAC7D,KAAA,CAAMhC,CAAOgC,CAAAA,CAAa,CAjB5B,CAAA,IAAA,CAAS,YAAc,CACrB,IAAA,CAAM,IAAK,CAAA,mBAAA,CAAoB,IAAK,CAAA,IAAI,CACxC,CAAA,GAAA,CAAK,IAAK,CAAA,kBAAA,CAAmB,IAAK,CAAA,IAAI,CACtC,CAAA,SAAA,CAAW,KAAK,wBAAyB,CAAA,IAAA,CAAK,IAAI,CAAA,CAClD,KAAO,CAAA,IAAA,CAAK,oBAAqB,CAAA,IAAA,CAAK,IAAI,CAAA,CAC1C,WAAa,CAAA,IAAA,CAAK,0BAA2B,CAAA,IAAA,CAAK,IAAI,CACtD,CAAA,QAAA,CAAU,IAAK,CAAA,uBAAA,CAAwB,IAAK,CAAA,IAAI,CAChD,CAAA,MAAA,CAAQ,IAAK,CAAA,qBAAA,CAAsB,IAAK,CAAA,IAAI,CAC5C,CAAA,kBAAA,CAAoB,KAAK,iCAAkC,CAAA,IAAA,CAAK,IAAI,CAAA,CACpE,QAAU,CAAA,IAAA,CAAK,uBAAwB,CAAA,IAAA,CAAK,IAAI,CAAA,CAChD,MAAQ,CAAA,IAAA,CAAK,qBAAsB,CAAA,IAAA,CAAK,IAAI,CAC5C,CAAA,MAAA,CAAQ,IAAK,CAAA,qBAAA,CAAsB,IAAK,CAAA,IAAI,CAC5C,CAAA,UAAA,CAAY,IAAK,CAAA,yBAAA,CAA0B,IAAK,CAAA,IAAI,CACpD,CAAA,KAAA,CAAO,KAAK,oBAAqB,CAAA,IAAA,CAAK,IAAI,CAC5C,CAIE,CAAA,IAAA,CAAK,oBAAuB,CAAA,IAAI2jC,EAC9B3lC,CAAAA,CAAAA,CACA,IAAK,CAAA,MAAA,CACLgC,CACF,CAAA,CAEA,KAAK,qBAAwB,CAAA,EAC7B,CAAA,IAAA,CAAK,oBAAuB,CAAA,EAC5B,CAAA,IAAA,CAAK,eAAkB,CAAA,IAAI,GAC3B,CAAA,IAAA,CAAK,yBAA4B,CAAA,IAAI,IAChB,IAAK,CAAA,KAAA,CAAM,UAAW,EAAA,CAC9B,OAAS5B,CAAAA,CAAAA,EAAW,CAC/B,IAAA,CAAK,eAAgB,CAAA,GAAA,CAAIA,CAAO,CAAA,YAAA,CAAcA,CAAM,CAAA,CACpD,KAAK,yBAA0B,CAAA,GAAA,CAC7BA,CAAO,CAAA,YAAA,CACPA,CAAO,CAAA,UACT,EACF,CAAC,EACH,CAMA,IAAc,sBAAA,EAAkC,CAC9C,OAAO,CAAC,CAAC,IAAA,CAAK,QAChB,CAKA,OAAO,IAAA,CACLJ,CACAjH,CAAAA,CAAAA,CAAkC,EAAC,CACY,CAC/C,OAAIA,CAAQ,CAAA,UAAA,CACH,IAAI6xC,CAAkB5qC,CAAAA,CAAAA,CAAOjH,CAAQ,CAAA,UAA2B,CAGrEA,CAAAA,CAAAA,CAAQ,GACH,CAAA,IAAI6xC,CAAkB5qC,CAAAA,CAAAA,CAAOjH,CAAQ,CAAA,GAAA,CAAI,GAAoB,CAAA,CAG/D,IAAI6xC,CAAkB5qC,CAAAA,CAAAA,CAAOA,CAAM,CAAA,WAAW,CACvD,CAEA,MAAM,GAAA,CAAIjH,CAAsB,CAAA,EAA6C,CAAA,CAC3E,IAAM4B,CAAAA,CAAS,MAAM,IAAK,CAAA,KAAA,CAAM,CAAC,CAAA,CAAE,IAAK5B,CAAAA,CAAO,CAC/C,CAAA,OAAI,CAAC4B,CAAAA,EAAU,CAACA,CAAAA,CAAO,MACd,CAAA,IAAA,CAGFA,EAAO,CAAC,CACjB,CAEA,MAAM,KAAM5B,CAAAA,CAAAA,CAA+D,CACzE,OAAO,IAAK,CAAA,GAAA,CAAIA,CAAO,CACzB,CAEA,MAAM,UAAUA,CAEqB,CAAA,CACnC,IAAMiH,CAAAA,CAAQ,MAAM,IAAA,CAAK,GAAIjH,CAAAA,CAAO,CACpC,CAAA,GAAI,CAACiH,CAAAA,CACH,MAAM,IAAItK,CAAc,CAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAO,aAAe,CAAA,eAAe,CAG1E,CAAA,OAAOsK,CACT,CAEA,MAAM,WAAA,CAAYjH,CAEmB,CAAA,CACnC,OAAO,IAAA,CAAK,UAAUA,CAAO,CAC/B,CAEA,MAAe,IACbA,CAAAA,CAAAA,CAAuB,EAAC,CACY,CACpC,CAAEA,CAAQ,CAAA,WAAA,EAA0B,QAAS,CAAA,aAAa,GACvD,MAAM,IAAA,CAAK,KAAM,CAAA,WAAA,GAAc,IAAI,CAAA,CAEtC,IAAMkJ,CAAAA,CAAAA,CADO,MAAM,KAAA,CAAM,IAAK,EAAA,EACV,GAAKrH,CAAAA,CAAAA,EAChB,KAAK,2BAA4BA,CAAAA,CAAAA,CAAK,IAAK,CAAA,KAAK,CACxD,CAAA,CAED,GAAI,CAACqH,CAAO,CAAA,MAAA,CACV,OAAO,EAGT,CAAA,IAAM2K,EAAmB,MAAML,EAAAA,CAC7BtK,CACA,CAAA,IAAA,CAAK,KACL,CAAA,IAAA,CAAK,oBACL,CAAA,IAAA,CAAK,qBACL,CAAA,IAAA,CAAK,qBACP,CAAA,CAEA,GAAI,CAAC2K,EACH,OAAO,EAGT,CAAA,IAAMi+B,CAAwB,CAAA,KAAA,CAAM,OAAQj+B,CAAAA,CAAgB,CACxDA,CAAAA,CAAAA,CACA,CAACA,CAAgB,CAErB,CAAA,OAAM7T,EAAQ,WAA0B,EAAA,QAAA,CAAS,YAAY,CAAA,EAC3D,MAAM,IAAA,CAAK,KAAM,CAAA,UAAA,GAAa8xC,CAAqB,CAAA,CAGjD,IAAK,CAAA,qBAAA,CAAsB,MAC7B,EAAA,MAAM,KAAK,2BAA4BA,CAAAA,CAAqB,CAGvDA,CAAAA,CACT,CAEA,MAAgB,KACd/B,CAAAA,CAAAA,CACA/vC,CAAuB,CAAA,EACoB,CAAA,CAC3C,IAAI4tC,CAAAA,CAAS,EAEb,OAAa,CACX,IAAM1kC,CAAAA,CAAS,MAAM,IAAA,CAAK,KAAM6mC,CAAAA,CAAS,CAAE,CAAA,MAAA,CAAOnC,CAAM,CAAA,CAAE,IAAK5tC,CAAAA,CAAO,EACtE,GAAI,CAACkJ,CAAO,CAAA,MAAA,CACV,MAGF,MAAMA,CACN0kC,CAAAA,CAAAA,EAAU1kC,CAAO,CAAA,OACnB,CACF,CAGA,MAAe,MAAA,CACblJ,EAAuC,EAAC,CACwB,CAChE,CAAEA,CAAQ,CAAA,WAAA,EAA0B,QAAS,CAAA,aAAa,CACvD,EAAA,MAAM,IAAK,CAAA,KAAA,CAAM,WAAc,GAAA,IAAI,EAEtC,GAAM,CAAE,GAAAoC,CAAAA,CAAAA,CAAK,QAAAyZ,CAAAA,CAAS,CAAI,CAAA,IAAA,CAAK,MAAO,EAAA,CAChCi0B,CAAa,CAAA,MAAM,IAAK,CAAA,gBAAA,CAAiB,MAAM,CA4BrD,CAAA,OA3Be,MAAM/E,EAAAA,CAAiB3oC,CAAKyZ,CAAAA,CAAAA,CAAUi0B,CAAY9vC,CAAAA,CAAAA,CAAS,CACxE,MAAA,CAAQ,MAAOkrC,CAAAA,CAAarpC,CAAQ,GAAA,CAClC,IAAMoF,CAAQ,CAAA,IAAA,CAAK,2BAA4BpF,CAAAA,CAAAA,CAAK,IAAK,CAAA,KAAK,CACxDkwC,CAAAA,CAAAA,CAAkB,MAAMv+B,EAAAA,CAC5B,CAACvM,CAAK,CACN,CAAA,IAAA,CAAK,MACL,IAAK,CAAA,oBAAA,CACL,IAAK,CAAA,qBAAA,CACL,IAAK,CAAA,qBACP,CAEK8qC,CAAAA,CAAAA,GAIC/xC,CAAQ,CAAA,WAAA,EAA0B,QAAS,CAAA,YAAY,CAC3D,EAAA,MAAM,KAAK,KAAM,CAAA,UAAA,GAAa,CAAC+xC,CAAe,CAAmB,CAAA,CAG/D,IAAK,CAAA,qBAAA,CAAsB,MAC7B,EAAA,MAAM,IAAK,CAAA,2BAAA,CAA4B,CAACA,CAAoB,CAAC,CAG/D7G,CAAAA,CAAAA,CAAY,KAAM6G,CAAAA,CAAe,CACnC,EAAA,CACF,CAAC,CAGH,CAEA,MAAe,kBACbxoC,CAAAA,CAAAA,CACAvJ,CACAgwC,CAAAA,CAAAA,CACuD,CACvD,GAAI,CAAChwC,CAAS,CAAA,CACZ,GAAI,CAAC,IAAK,CAAA,KAAA,CAAM,UACd,CAAA,MAAM,IAAIrD,CAAAA,CACR,IAAK,CAAA,KAAA,CAAM,KAAO,sBAClB,CAAA,uBACF,CAGFqD,CAAAA,CAAAA,CAAU,CACR,aAAA,CAAe,IAAK,CAAA,KAAA,CAAM,UAC5B,EACF,CAEA,OAAO,KAAM,CAAA,kBAAA,CAAmBuJ,EAAMvJ,CAASgwC,CAAAA,CAAM,CAGvD,CAMA,MAAe,MAAA,CAAA,GACVn5B,CACmC,CAAA,CACtC,OAAQ,IAAA,CAAK,KAAc,CAAA,MAAA,CAAO,GAAGA,CAAI,CAC3C,CAMA,MAAe,UACVA,CAAAA,GAAAA,CAAAA,CACuC,CAC1C,OAAQ,IAAK,CAAA,KAAA,CAAc,UAAW,CAAA,GAAGA,CAAI,CAC/C,CAGA,MAAe,OACb/M,CACA9J,CAAAA,CAAAA,CAAyB,EAAC,CACT,CACjB,OAAKA,CAAQ,CAAA,sBAAA,EACX,MAAM,IAAA,CAAK,KAAM,CAAA,YAAA,GAAe,IAAI,CAAA,CAE/B,MAAM,MAAO8J,CAAAA,CAAuC,CAC7D,CAEA,MAAe,UAAA,CACb9J,CAAgC,CAAA,EACf,CAAA,CACjB,GAAM,CAAE,sBAAAgyC,CAAAA,CAAAA,CAAyB,KAAM,CAAIhyC,CAAAA,CAAAA,EAAW,EAAC,CACvD,OAACgyC,CAAAA,CAAAA,EAA2B,MAAM,IAAA,CAAK,KAAM,CAAA,YAAA,GAAe,IAAI,CAAA,CACzD,KAAM,CAAA,UAAA,CAAWhyC,CAAO,CACjC,CAEA,MAAM,MAAA,CAAOA,CAAyB,CAAA,EAAqB,CAAA,CACzD,OAAKA,CAAAA,CAAQ,sBACX,EAAA,MAAM,IAAK,CAAA,KAAA,CAAM,eAAe,IAAI,CAAA,CAE/B,KAAM,CAAA,MAAA,EACf,CAEA,MAAe,QAAA,CACbqH,CAAiB,CAAA,GAAA,CACjBrH,CAAoC,CAAA,CAAE,WAAa,CAAA,KAAM,EACxC,CACjB,IAAA,CAAK,iBAAkB,EAAA,CACvB,IAAK,CAAA,QAAA,CAAS,OAASqH,CAAAA,CAAAA,CAAQ,OAAO,CAAA,CACtC,IAAM4qC,CAAAA,CAAyBjyC,CAAQ,CAAA,WAAA,CAAc,CAAC,aAAa,CAAA,CAAI,EAAC,CAElE4B,CAAU,CAAA,MAAM,IAAK,CAAA,GAAA,CAAI,CAC7B,WAAA,CAAaqwC,CACf,CAAC,CAED,CAAA,OAAKrwC,EAIE,CAACA,CAAAA,CAAO,YAAa,CAAA,KAAA,CAHnB,CAIX,CAEA,MAAe,MAAA,CACbyF,CACArH,CAAAA,CAAAA,CAAoC,CAAE,WAAA,CAAa,KAAM,CAAA,CACxC,CACjB,IAAK,CAAA,iBAAA,EACL,CAAA,IAAA,CAAK,QAAS,CAAA,KAAA,CAAOqH,CAAQ,CAAA,OAAO,CACpC,CAAA,IAAM4qC,CAAyBjyC,CAAAA,CAAAA,CAAQ,WACnC,CAAA,CAAC,cAAe,YAAY,CAAA,CAC5B,EAAC,CAEC4B,CAAU,CAAA,MAAM,IAAK,CAAA,GAAA,CAAI,CAC7B,WAAA,CAAaqwC,CACf,CAAC,CAID,CAAA,OAAKrwC,EAIE,CAACA,CAAAA,CAAO,YAAa,CAAA,KAAA,CAHnB,CAIX,CAEA,MAAe,MAAA,CACbyF,CACArH,CAAAA,CAAAA,CAAoC,CAAE,WAAA,CAAa,KAAM,CAAA,CACxC,CACjB,IAAA,CAAK,iBAAkB,EAAA,CACvB,IAAK,CAAA,QAAA,CAAS,KAAOqH,CAAAA,CAAAA,CAAQ,OAAO,CAAA,CACpC,IAAM4qC,CAAAA,CAAyBjyC,CAAQ,CAAA,WAAA,CACnC,CAAC,aAAA,CAAe,YAAY,CAC5B,CAAA,EAEE4B,CAAAA,CAAAA,CAAU,MAAM,IAAA,CAAK,GAAI,CAAA,CAC7B,WAAaqwC,CAAAA,CACf,CAAC,CAAA,CAID,OAAKrwC,CAAAA,CAIE,CAACA,CAAO,CAAA,YAAA,CAAa,KAHnB,CAAA,CAIX,CAEA,MAAe,MACbyF,CAAAA,CAAAA,CACArH,CAAoC,CAAA,CAAE,WAAa,CAAA,KAAM,CACxC,CAAA,CACjB,KAAK,iBAAkB,EAAA,CACvB,IAAK,CAAA,QAAA,CAAS,KAAOqH,CAAAA,CAAAA,CAAQ,OAAO,CAAA,CACpC,IAAM4qC,CAAAA,CAAyBjyC,CAAQ,CAAA,WAAA,CACnC,CAAC,aAAA,CAAe,YAAY,CAC5B,CAAA,EAEE4B,CAAAA,CAAAA,CAAU,MAAM,IAAA,CAAK,GAAI,CAAA,CAC7B,WAAaqwC,CAAAA,CACf,CAAC,CAAA,CAID,OAAKrwC,CAAAA,CAIE,CAACA,CAAO,CAAA,YAAA,CAAa,KAHnB,CAAA,CAIX,CAEA,MAAe,MACbyF,CAAAA,CAAAA,CACArH,CAAoC,CAAA,CAAE,WAAa,CAAA,KAAM,CACxC,CAAA,CACjB,KAAK,iBAAkB,EAAA,CACvB,IAAK,CAAA,QAAA,CAAS,KAAOqH,CAAAA,CAAAA,CAAQ,OAAO,CAAA,CACpC,IAAM4qC,CAAAA,CAAyBjyC,CAAQ,CAAA,WAAA,CACnC,CAAC,aAAA,CAAe,YAAY,CAC5B,CAAA,EAEE4B,CAAAA,CAAAA,CAAU,MAAM,IAAA,CAAK,GAAI,CAAA,CAC7B,WAAaqwC,CAAAA,CACf,CAAC,CAAA,CAID,OAAKrwC,CAAAA,CAIE,CAACA,CAAO,CAAA,YAAA,CAAa,KAHnB,CAAA,CAIX,CAEA,MAAe,QACb2H,CAAAA,CAAAA,CACA+mC,CACAtwC,CAAAA,CAAAA,CAAoC,CAAE,WAAA,CAAa,KAAM,CAAA,CACxB,CACjC,IAAMkyC,CAAAA,CAAc,IAAK,CAAA,KAAA,EACnB3B,CAAAA,CAAAA,CAAiB,IAAK,CAAA,KAAA,CAAMD,CAAO,CAAA,CAAE,MAAQ/mC,CAAAA,CAAAA,CAAAA,CAAO,CAAK+mC,EAAAA,CAAO,EAChE6B,CACJnyC,CAAAA,CAAAA,CAAQ,WAAc,CAAA,CAAC,aAAe,CAAA,YAAY,CAAI,CAAA,EAElD,CAAA,CAACkJ,CAAQ6jC,CAAAA,CAAK,CAAI,CAAA,MAAM,KAAK,sBACjC,CAAA,IAAMwD,CAAe,CAAA,IAAA,CAAK,CAAE,WAAA,CAAa4B,CAAc,CAAC,CACxD,CAAA,IAAMD,CAAY,CAAA,QAAA,CAAS,GAAK,CAAA,CAAE,YAAalyC,CAAQ,CAAA,WAAY,CAAC,CACtE,CAIA,CAAA,OAAO,CACL,kBAAA,CAHyB6sC,EAAsBtjC,CAAAA,CAAAA,CAAM+mC,CAASvD,CAAAA,CAAK,CAInE,CAAA,IAAA,CAAM7jC,CACR,CACF,CAIS,MACJ/B,CAAAA,GAAAA,CAAAA,CACG,CACN,OAAA,IAAA,CAAK,oBAAuB,CAAA,CAC1B,GAAG,IAAA,CAAK,oBACR,CAAA,GAAIA,CACN,CAAA,CAEA,KAAK,WAAc,CAAA,IAAA,CAAK,WAAY,CAAA,MAAA,CAClCA,CAAQ,CAAA,GAAA,CAAKE,CAAW,EAAA,IAAIqlC,CAAWrlC,CAAAA,CAAgB,CAAC,CAC1D,CAEO,CAAA,IACT,CAgDS,QAKPmnC,CAAAA,CAAAA,CACAC,CACAC,CAAAA,CAAAA,CAC8C,CAC9C,IAAIC,CACAtnC,CAAAA,CAAAA,CACA2T,CAEJ,CAAA,OAAI0zB,CACFC,EAAAA,CAAAA,CAAYH,CACZnnC,CAAAA,CAAAA,CAASonC,CACTzzB,CAAAA,CAAAA,CAAQ0zB,CAERC,GAAAA,CAAAA,CAAY,MACZtnC,CAAAA,CAAAA,CAASmnC,CACTxzB,CAAAA,CAAAA,CAAQyzB,CAGV,CAAA,CAAA,IAAA,CAAK,WAAc,CAAA,IAAA,CAAK,WAAY,CAAA,MAAA,CAClC,IAAI/B,CAAAA,CAAWrlC,EAAQ2T,CAAO2zB,CAAAA,CAAS,CACzC,CAAA,CACA,IAAK,CAAA,qBAAA,CAAsB,IAAK3zB,CAAAA,CAAK,CAE9B,CAAA,IACT,CAKA,iBAAA,EAA8C,CAC5C,OAAA,IAAA,CAAK,sBAAwB,IAC7B,CAAA,IAAA,CAAK,qBAAwB,CAAA,EACtB,CAAA,IACT,CAsDA,IAAA,CAKElG,CACAukB,CAAAA,CAAAA,CAqBA,CACA,IAAMmI,CACJ,CAAA,IAAA,CAAK,qBAAqB,oBAAqB1sB,CAAAA,CAAQ,CAEnDs9B,CAAAA,CAAAA,CAAuB,IAAIP,CAAAA,CAE/BrQ,CAAc,CAAA,KAAA,CAAO,IAAK,CAAA,aAAa,CAEzC,CAAA,OAAA4Q,CAAqB,CAAA,QAAA,CAAW5Q,EAChCnI,CACE+Y,GAAAA,CAGF,CACA,CAAA,IAAA,CAAK,qBAAsB,CAAA,IAAA,CAAKA,CAAoB,CAAA,CAE7C,IAeT,CAKA,cAAuB,EAAA,CACrB,OAAK,IAAA,CAAA,qBAAA,CAAwB,EACtB,CAAA,IACT,CAmBA,aAAA,CACEt9B,CACAu9B,CAAAA,CAAAA,CAMAC,CACM,CAAA,CACN,OAAO,IAAA,CAAK,gBACVx9B,CAAAA,CAAAA,CACAu9B,CACAC,CAAAA,CACF,CACF,CAiBA,gBAAA,CACEx9B,CACAu9B,CAAAA,CAAAA,CAMAC,CACM,CAAA,CACN,IAAItD,CAAAA,CACAuD,CACAlZ,CAAAA,CAAAA,CAMA,OAAOgZ,CAAAA,EAAwB,UACjChZ,CAAAA,CAAAA,CAAKgZ,EAIL,OAAOA,CAAAA,EAAwB,QAC/BC,EAAAA,CAAAA,GAAe,MAEfC,EAAAA,CAAAA,CAAiBF,CACjBrD,CAAAA,CAAAA,CAAcsD,CACLD,EAAAA,CAAAA,GAAwB,MACjCrD,GAAAA,CAAAA,CAAcqD,CACdE,CAAAA,CAAAA,CAAiB,KAGnB,IAAM/Q,CAAAA,CACJ,IAAK,CAAA,oBAAA,CAAqB,oBAAqB1sB,CAAAA,CAAQ,CACnD09B,CAAAA,CAAAA,CAAoB,IAAIX,CAAAA,CAE5BrQ,CAAc,CAAA,KAAA,CAAO,IAAK,CAAA,aAAa,EACzCgR,CAAkB,CAAA,QAAA,CAAWhR,CAE7B,CAAA,IAAM4Q,CAAuB,CAAA,IAAA,CAAK,gCAChCI,CAAAA,CAAAA,CACAhR,CACA,CAAA,EACF,CAAA,CAGA,OAAA4Q,CAAAA,CAAqB,YACrBA,CAAAA,CAAAA,CAAqB,WAAY,EAAA,CACjCA,CAAqB,CAAA,SAAA,CAAU,GAAG,CAAA,CAElC/Y,CACE+Y,GAAAA,CAGF,CAEA,CAAA,IAAA,CAAK,wBACHA,CAAAA,CAAAA,CACA5Q,EACA+Q,CACAvD,CAAAA,CACF,CAEA,CAAA,IAAA,CAAK,WACHoD,CAAAA,CAGF,CAEO,CAAA,IACT,CAiBA,eAAA,CACEt9B,CACAu9B,CAAAA,CAAAA,CAMAC,CACM,CAAA,CACN,IAAItD,CACAuD,CAAAA,CAAAA,CACAlZ,CAMA,CAAA,OAAOgZ,CAAwB,EAAA,UAAA,CACjChZ,CAAKgZ,CAAAA,CAAAA,CAIL,OAAOA,CAAAA,EAAwB,QAC/BC,EAAAA,CAAAA,GAAe,MAEfC,EAAAA,CAAAA,CAAiBF,EACjBrD,CAAcsD,CAAAA,CAAAA,EACLD,CAAwB,GAAA,MAAA,GACjCrD,CAAcqD,CAAAA,CAAAA,CACdE,CAAiB,CAAA,GAAA,CAAA,CAGnB,IAAM/Q,CAAAA,CACJ,IAAK,CAAA,oBAAA,CAAqB,oBAAqB1sB,CAAAA,CAAQ,EACnD09B,CAAoB,CAAA,IAAIX,CAE5BrQ,CAAAA,CAAAA,CAAc,KAAO,CAAA,IAAA,CAAK,aAAa,CAAA,CACzCgR,CAAkB,CAAA,QAAA,CAAWhR,CAE7B,CAAA,IAAM4Q,CAAuB,CAAA,IAAA,CAAK,iCAChCI,CACAhR,CAAAA,CAAAA,CACA,EACF,CAGA,CAAA,OAAA4Q,CAAqB,CAAA,UAAA,EACrBA,CAAAA,CAAAA,CAAqB,WAAY,EAAA,CACjCA,CAAqB,CAAA,SAAA,CAAU,GAAG,CAAA,CAElC/Y,CACE+Y,GAAAA,CAGF,CAEA,CAAA,IAAA,CAAK,wBACHA,CAAAA,CAAAA,CACA5Q,CACA+Q,CAAAA,CAAAA,CACAvD,CACF,CAAA,CAEA,IAAK,CAAA,aAAA,CACHoD,CAGF,CAAA,CAEO,IACT,CAiBA,gBAAA,CACEt9B,CACAu9B,CAAAA,CAAAA,CAMAC,CACM,CAAA,CACN,OAAO,IAAA,CAAK,mBACVx9B,CAAAA,CAAAA,CACAu9B,CACAC,CAAAA,CACF,CACF,CAiBA,oBACEx9B,CACAu9B,CAAAA,CAAAA,CAMAC,CACM,CAAA,CACN,IAAItD,CAAAA,CACAuD,CACAlZ,CAAAA,CAAAA,CAMA,OAAOgZ,CAAAA,EAAwB,UACjChZ,CAAAA,CAAAA,CAAKgZ,CAIL,CAAA,OAAOA,GAAwB,QAC/BC,EAAAA,CAAAA,GAAe,MAEfC,EAAAA,CAAAA,CAAiBF,CACjBrD,CAAAA,CAAAA,CAAcsD,CACLD,EAAAA,CAAAA,GAAwB,MACjCrD,GAAAA,CAAAA,CAAcqD,CACdE,CAAAA,CAAAA,CAAiB,GAGnB,CAAA,CAAA,IAAM/Q,EACJ,IAAK,CAAA,oBAAA,CAAqB,oBAAqB1sB,CAAAA,CAAQ,CACnD09B,CAAAA,CAAAA,CAAoB,IAAIX,CAAAA,CAE5BrQ,CAAc,CAAA,KAAA,CAAO,IAAK,CAAA,aAAa,CACzCgR,CAAAA,CAAAA,CAAkB,SAAWhR,CAE7B,CAAA,IAAM4Q,CAAuB,CAAA,IAAA,CAAK,gCAChCI,CAAAA,CAAAA,CACAhR,CACA,CAAA,EACF,CAAA,CAGA,OAAA4Q,CAAAA,CAAqB,UAAW,EAAA,CAChCA,EAAqB,WAAY,EAAA,CACjCA,CAAqB,CAAA,SAAA,CAAU,GAAG,CAAA,CAElC/Y,CACE+Y,GAAAA,CAGF,CAEA,CAAA,IAAA,CAAK,wBACHA,CAAAA,CAAAA,CACA5Q,CACA+Q,CAAAA,CAAAA,CACAvD,CACF,CAEA,CAAA,IAAA,CAAK,cACHoD,CAAAA,CAGF,CAEO,CAAA,IACT,CAiBA,kBAAA,CACEt9B,CACAu9B,CAAAA,CAAAA,CAMAC,CACM,CAAA,CACN,IAAItD,CAAAA,CACAuD,EACAlZ,CAMA,CAAA,OAAOgZ,CAAwB,EAAA,UAAA,CACjChZ,CAAKgZ,CAAAA,CAAAA,CAIL,OAAOA,CAAAA,EAAwB,QAC/BC,EAAAA,CAAAA,GAAe,MAEfC,EAAAA,CAAAA,CAAiBF,CACjBrD,CAAAA,CAAAA,CAAcsD,GACLD,CAAwB,GAAA,MAAA,GACjCrD,CAAcqD,CAAAA,CAAAA,CACdE,CAAiB,CAAA,GAAA,CAAA,CAGnB,IAAM/Q,CAAAA,CACJ,IAAK,CAAA,oBAAA,CAAqB,oBAAqB1sB,CAAAA,CAAQ,CACnD09B,CAAAA,CAAAA,CAAoB,IAAIX,CAE5BrQ,CAAAA,CAAAA,CAAc,KAAO,CAAA,IAAA,CAAK,aAAa,CAAA,CACzCgR,CAAkB,CAAA,QAAA,CAAWhR,CAE7B,CAAA,IAAM4Q,CAAuB,CAAA,IAAA,CAAK,gCAChCI,CAAAA,CAAAA,CACAhR,EACA,EACF,CAGA,CAAA,OAAA4Q,CAAqB,CAAA,UAAA,EACrBA,CAAAA,CAAAA,CAAqB,WAAY,EAAA,CACjCA,CAAqB,CAAA,SAAA,CAAU,GAAG,CAAA,CAElC/Y,IACE+Y,CAGF,CAAA,CAEA,IAAK,CAAA,wBAAA,CACHA,CACA5Q,CAAAA,CAAAA,CACA+Q,CACAvD,CAAAA,CACF,CAEA,CAAA,IAAA,CAAK,gBACHoD,CAAAA,CAGF,CAEO,CAAA,IACT,CAOS,KAAc,EAAA,CACrB,IAAMK,CAAAA,CAAe,KAAM,CAAA,KAAA,EAC3B,CAAA,OAAAA,CAAa,CAAA,qBAAA,CAAwB3gC,CACnC,CAAA,IAAA,CAAK,qBACP,CAAA,CACO2gC,CACT,CAKA,MAAgB,2BAA4BvpC,CAAAA,CAAAA,CAA4B,CACtE,MAAM,OAAQ,CAAA,GAAA,CACZ,IAAK,CAAA,qBAAA,CACF,MACEkpC,CAAAA,CAAAA,EAAyBA,CAAqB,CAAA,sBACjD,EACC,GAAI,CAAA,MAAOA,CAAyB,EAAA,CACnC,IAAMM,CAAAA,CAAgB,MAAM,IAAA,CAAK,2BAC/BN,CAAAA,CAAAA,CACAA,CAAqB,CAAA,QAAA,CACrBlpC,CACF,CAAA,CAEA,KAAK,wBACHkpC,CAAAA,CAAAA,CAAqB,QACrBlpC,CAAAA,CAAAA,CACAwpC,CACF,EACF,CAAC,CACL,EACF,CAEU,wBACR59B,CAAAA,CAAAA,CACA69B,CACAD,CAAAA,CAAAA,CACM,CACN,OAAQ59B,CAAAA,CAAS,IAAM,EACrB,KACE,QAAA,CAAA,GAAI,CAAC,IAAA,CAAK,KAAM,CAAA,UAAA,CACd,MAAM,IAAInY,CACR,CAAA,IAAA,CAAK,MAAM,IAAO,CAAA,oCAAA,CAClB,0BACF,CAAA,CAGF,IAAMi2C,CAAAA,CAAmB,IAAI,GAAA,CAE7BF,CAAc,CAAA,OAAA,CAASj7B,CAAiB,EAAA,CACtC,IAAMo7B,CAAAA,CAAkBp7B,EAAa3C,CAAS,CAAA,UAAqB,CAC/D+9B,CAAAA,CAAAA,EACFD,CAAiB,CAAA,GAAA,CAAI,MAAOC,CAAAA,CAAe,CAAGp7B,CAAAA,CAAY,EAE9D,CAAC,CAEDk7B,CAAAA,CAAAA,CAA0B,QAASG,CAA4B,EAAA,CAC7D,IAAMp+B,CAAAA,CACJo+B,CAAwB,CAAA,IAAA,CAAK,KAAM,CAAA,UAAqB,CAC1D,CAAA,GAAI,CAACp+B,CAAAA,CAAiB,CACpBo+B,CAAAA,CAAwBh+B,EAAS,UAAqB,CAAA,CACpD,IACF,CAAA,MACF,CAEA,IAAM2C,CAAem7B,CAAAA,CAAAA,CAAiB,GAAI,CAAA,MAAA,CAAOl+B,CAAe,CAAC,CACjEo+B,CAAAA,CAAAA,CAAwBh+B,EAAS,UAAqB,CAAA,CACnD2C,CAAgB,EAAA,KACrB,CAAC,CAAA,CAED,MACF,KAAA,WAAA,CACE,IAAMs7B,CAAAA,CAAqB,IAAI,GAAA,CAE/BL,CAAc,CAAA,OAAA,CAASj7B,GAAiB,CACtC,GAAI,CAAC3C,CAAAA,CAAS,KAAM,CAAA,UAAA,CAClB,MAAM,IAAInY,CACR,CAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAO,uCAClB,CAAA,CAAA,0CAAA,EAA6CmY,EAAS,KAAM,CAAA,IAAI,CAClE,CAAA,CAAA,CAGF,IAAMJ,CAAAA,CACJ+C,CAAa3C,CAAAA,CAAAA,CAAS,KAAM,CAAA,UAAqB,CAC/CJ,CAAAA,CAAAA,EACFq+B,CAAmB,CAAA,GAAA,CAAI,OAAOr+B,CAAe,CAAA,CAAG+C,CAAY,EAEhE,CAAC,CAAA,CAEDk7B,CAA0B,CAAA,OAAA,CAASG,CAA4B,EAAA,CAC7D,IAAMD,CAAAA,CACJC,CAAwBh+B,CAAAA,CAAAA,CAAS,UAAqB,CACxD,CAAA,GAAI,CAAC+9B,CAAAA,CAAiB,CACpBC,CAAAA,CAAwBh+B,CAAS,CAAA,UAAqB,CACpD,CAAA,IAAA,CACF,MACF,CAEA,IAAM2C,CAAAA,CAAes7B,EAAmB,GAAI,CAAA,MAAA,CAAOF,CAAe,CAAC,CACnEC,CAAAA,CAAAA,CAAwBh+B,CAAS,CAAA,UAAqB,CACnD2C,CAAAA,CAAAA,EAAgB,KACrB,CAAC,CAED,CAAA,MACF,eACE,GAAI,CAAC,IAAK,CAAA,KAAA,CAAM,UACd,CAAA,MAAM,IAAI9a,CAAAA,CACR,IAAK,CAAA,KAAA,CAAM,IAAO,CAAA,qCAAA,CAClB,0BACF,CAAA,CAGF,IAAMq2C,CAAmC,CAAA,IAAI,GAE7CN,CAAAA,CAAAA,CAAc,OAASj7B,CAAAA,CAAAA,EAAiB,CACtC,IAAMo7B,CAAkBp7B,CAAAA,CAAAA,CAAa3C,CAAS,CAAA,UAAqB,CACnE,CAAA,GAAI,CAAC+9B,CAAiB,CAAA,OAEtB,IAAMI,CAAAA,CAAgB,MAAOJ,CAAAA,CAAe,CACvCG,CAAAA,CAAAA,CAAiC,GAAIC,CAAAA,CAAa,CACrDD,EAAAA,CAAAA,CAAiC,GAAIC,CAAAA,CAAAA,CAAe,EAAE,CAAA,CAGxDD,CACG,CAAA,GAAA,CAAIC,CAAa,CAAA,CACjB,IAAKx7B,CAAAA,CAAY,EACtB,CAAC,CAEDk7B,CAAAA,CAAAA,CAA0B,OAASG,CAAAA,CAAAA,EAA4B,CAC7D,IAAMp+B,CACJo+B,CAAAA,CAAAA,CAAwB,IAAK,CAAA,KAAA,CAAM,UAAqB,CAAA,CAC1D,GAAI,CAACp+B,CAAiB,CAAA,CACpBo+B,CAAwBh+B,CAAAA,CAAAA,CAAS,UAAqB,CAAA,CACpD,EACF,CAAA,MACF,CAEA,IAAMo+B,CACJF,CAAAA,CAAAA,CAAiC,GAAI,CAAA,MAAA,CAAOt+B,CAAe,CAAC,CAAK,EAAA,EACnEo+B,CAAAA,CAAAA,CAAwBh+B,EAAS,UAAqB,CAAA,CACpDo+B,EACJ,CAAC,CAED,CAAA,MACF,KACE,YAAA,CAAA,GAAI,CAAC,IAAA,CAAK,KAAM,CAAA,UAAA,EAAc,CAACp+B,CAAAA,CAAS,MAAM,UAC5C,CAAA,MAAM,IAAInY,CAAAA,CACR,IAAK,CAAA,KAAA,CAAM,IAAO,CAAA,wCAAA,CAClB,0BACF,CAAA,CAGF,IAAMw2C,CAAAA,CAAqBr+B,CACrBs+B,CAAAA,CAAAA,CAA6B,IAAI,GACjCC,CAAAA,CAAAA,CAAoBF,CAAmB,CAAA,cAAA,CACvCG,CACJ,CAAA,IAAA,CAAK,eAAgB,CAAA,GAAA,CAAID,CAAiB,CAAA,EAC1C,IAAK,CAAA,yBAAA,CAA0B,GAAIA,CAAAA,CAAiB,GACpDzlC,CAAYylC,CAAAA,CAAAA,CAAmB,IAAK,CAAA,KAAA,CAAM,mBAAmB,CAAA,CAE/DX,CAAc,CAAA,OAAA,CAASj7B,CAAiB,EAAA,CACtC,IAAM87B,CAAAA,CAAe97B,CAAqB,CAAA,YAAA,EAAgB,EACpDo7B,CAAAA,CAAAA,CAAkBU,CAAYD,CAAAA,CAAsB,CAC1D,CAAA,GAAqCT,CAAoB,EAAA,IAAA,CACvD,OAGF,IAAMI,CAAgB,CAAA,MAAA,CAAOJ,CAAe,CAAA,CACvCO,EAA2B,GAAIH,CAAAA,CAAa,CAC/CG,EAAAA,CAAAA,CAA2B,GAAIH,CAAAA,CAAAA,CAAe,EAAE,CAG7C,CAAA,IAAA,CAAK,qBAAsB,CAAA,QAAA,CAASK,CAAsB,CAAA,GAC7D,OAAOC,CAAYD,CAAAA,CAAsB,CACpC,CAAA,MAAA,CAAO,IAAKC,CAAAA,CAAW,CAAE,CAAA,MAAA,EAC5B,OAAQ97B,CAAAA,CAAqB,YAIjC27B,CAAAA,CAAAA,CAAAA,CAA2B,GAAIH,CAAAA,CAAa,EAAG,IAAKx7B,CAAAA,CAAY,EAClE,CAAC,CAEDk7B,CAAAA,CAAAA,CAA0B,OAASG,CAAAA,CAAAA,EAA4B,CAC7D,IAAMp+B,CACJo+B,CAAAA,CAAAA,CAAwB,IAAK,CAAA,KAAA,CAAM,UAAqB,CAC1D,CAAA,GAAI,CAACp+B,CAAAA,CAAiB,CACpBo+B,CAAAA,CAAwBh+B,CAAS,CAAA,UAAqB,CACpD,CAAA,EACF,CAAA,MACF,CAEA,IAAMo+B,EACJE,CAA2B,CAAA,GAAA,CAAI,MAAO1+B,CAAAA,CAAe,CAAC,CAAA,EAAK,EAAC,CAC9Do+B,CAAwBh+B,CAAAA,CAAAA,CAAS,UAAqB,CAAA,CACpDo+B,EACJ,CAAC,EAED,MACF,QACE,MAAM,IAAIv2C,CACR,CAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAO,4BAClB,CAAA,2BACF,CACJ,CACF,CAEA,MAAgB,4BACdy1C,CACAt9B,CAAAA,CAAAA,CACA5L,CACqC,CAAA,CACrC,OAAO,IAAA,CAAK,gCACVkpC,CAAAA,CAAAA,CACAt9B,CACA5L,CAAAA,CACF,CAAE,CAAA,IAAA,EACJ,CAEU,iCACRkpC,CACAt9B,CAAAA,CAAAA,CACA5L,CACsB,CAAA,CACtB,IAAMsqC,CAAAA,CAAe,IAAK,CAAA,oCAAA,CACxB1+B,CACA5L,CAAAA,CACF,CAEA,CAAA,OAAQ4L,CAAS,CAAA,IAAA,EACf,KACA,WAAA,CAAA,KAAA,QAAA,CACE,OAAOs9B,CAAAA,CAAqB,OAC1BA,CAAAA,CAAAA,CAAqB,QAAS,CAAA,IAAA,GAAS,WACnCt9B,CAAAA,CAAAA,CAAS,KAAM,CAAA,UAAA,CACdA,CAAS,CAAA,UAAA,CACd0+B,CACF,CAAA,CACF,KACE,SAAA,CAAA,IAAM1G,CAAQsF,CAAAA,CAAAA,CAAqB,SAAW,EAAA,KAAA,CACxCxE,CAASwE,CAAAA,CAAAA,CAAqB,UAAY,EAAA,MAAA,CAChD,GAAI,CAACtF,CAAS,EAAA,CAACc,EACb,OAAOwE,CAAAA,CAAqB,OAC1BA,CAAAA,CAAAA,CAAqB,QAAS,CAAA,IAAA,GAAS,WACnCt9B,CAAAA,CAAAA,CAAS,KAAM,CAAA,UAAA,CACdA,CAAS,CAAA,UAAA,CACd0+B,CACF,CAAA,CAGF,IAAMC,CAAK1oC,CAAAA,mBAAAA,CAAO,WAAY,CAAA,CAAC,CAAE,CAAA,QAAA,CAAS,KAAK,CAAA,CACzC2oC,CAAgB,CAAA,CAAA,EAAG5+B,CAAS,CAAA,KAAA,CAAM,KAAK,CAAA,KAAA,EAAQ2+B,CAAE,CACjDE,CAAAA,CAAAA,CAAAA,CAAgBvB,CAAqB,CAAA,YAAA,CACxC,GAAKlvB,CAAAA,CAAAA,EACAA,CAAY,CAAA,UAAA,CACPA,CAAY,CAAA,MAAA,CAGd,CAAG,EAAA,IAAA,CAAK,gBAAiB,CAAA,kBAAA,CAAmB,KAAK,MAAQA,CAAAA,CAAAA,CAAY,MAAM,CAAC,CAAIA,CAAAA,EAAAA,CAAAA,CAAY,SAAS,CAAA,CAC7G,CACA,CAAA,IAAA,CAAK,IAAI,CAAA,EAAK,CAAC,GAAG,EAErBkvB,CAAqB,CAAA,UAAA,EACrBA,CAAAA,CAAAA,CAAqB,WAAY,EAAA,CAEjC,IAAMZ,CAAAA,CAAKY,CAAqB,CAAA,IAAA,CAAKsB,CAAgBE,CAAAA,CAAAA,EACnDA,CACG,CAAA,MAAA,CAAO,GAAGxB,CAAqB,CAAA,oBAAoB,CACnD,CAAA,SAAA,CACC,CAAmC,gCAAA,EAAA,IAAA,CAAK,gBAAiB,CAAA,kBAAA,CAAmB,IAAK,CAAA,MAAA,CAAQt9B,CAAS,CAAA,UAAW,CAAC,CAAA,UAAA,EAAa6+B,CAAa,CAAWF,QAAAA,EAAAA,CAAE,CACvJ,CAAA,CAAA,CACC,OAAQ3+B,CAAAA,CAAAA,CAAS,UAAsB0+B,CAAAA,CAAY,CACxD,CAAA,CAEI1G,CACF0E,EAAAA,CAAAA,CAAG,QAAS,CAAA,CAAA,GAAA,EAAMiC,CAAE,CAAO3G,IAAAA,EAAAA,CAAAA,EAASc,CAAU,EAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAGhDA,CACF4D,EAAAA,CAAAA,CAAG,QAAS,CAAA,CAAA,GAAA,EAAMiC,CAAE,CAAA,GAAA,EAAM7F,CAAM,CAAA,CAAE,EAGpC,IAAMiG,CAAAA,CACJzB,CAAqB,CAAA,oBAAA,CAAqB,GAAK/qC,CAAAA,CAAAA,EAC7CmK,EACEnK,CAAAA,CAAAA,CACAqsC,CACAtB,CAAAA,CAAAA,CAAqB,KAAM,CAAA,KAC7B,CACF,CAAA,CAEF,OAAOZ,CAAG,CAAA,MAAA,CAAO,GAAGqC,CAA2B,CAAE,CAAA,IAAA,CAAKH,CAAa,CAAA,CACrE,KACE,YAAA,CAAA,GAAI,CAAC,IAAA,CAAK,KAAM,CAAA,UAAA,EAAc,CAAC5+B,CAAS,CAAA,KAAA,CAAM,UAC5C,CAAA,MAAM,IAAInY,CAAAA,CACR,IAAK,CAAA,KAAA,CAAM,IAAO,CAAA,+BAAA,CAClB,0BACF,CAAA,CAGF,IAAMw2C,CAAAA,CAAqBr+B,EAC3B,GAAI,CAAC5L,CAAO,CAAA,MAAA,CACV,OAAOkpC,CAAAA,CAGT,IAAM0B,CAAAA,CAAW1B,CAAqB,CAAA,SAAA,EAAW,KAC3C2B,CAAAA,CAAAA,CAAY3B,CAAqB,CAAA,UAAA,EAAY,OAC7C4B,CAAqB5B,CAAAA,CAAAA,CAAqB,oBAC7C,CAAA,MAAA,CACCA,CAAqB,CAAA,oBAAA,CAAqB,GAAK/qC,CAAAA,CAAAA,EAC7CA,CAAO,CAAA,QAAA,CAAS,GAAG,CAAA,CACfA,CACA,CAAA,CAAA,EAAGyN,EAAS,KAAM,CAAA,KAAK,CAAIzN,CAAAA,EAAAA,CAAM,CACvC,CAAA,CAAA,CACA,CAAC,CAAA,EAAGyN,CAAS,CAAA,KAAA,CAAM,KAAK,CAAA,EAAA,CAAI,CAEhC,CAAA,GAAI,CAACg/B,CAAY,EAAA,CAACC,CAChB,CAAA,OAAO3B,CACJ,CAAA,MAAA,CAAO,GAAG4B,CAAkB,CAC5B,CAAA,QAAA,CACC,CAAGb,EAAAA,CAAAA,CAAmB,YAAY,CAAA,CAAA,EAAIA,CAAmB,CAAA,cAAc,CACvEA,CAAAA,CAAAA,CAAAA,CAAmB,cACrB,CAAA,CACC,QACCA,CAAAA,CAAAA,CAAmB,YACnB,CAAA,CAAA,EAAGA,CAAmB,CAAA,YAAY,CAAIA,CAAAA,EAAAA,CAAAA,CAAmB,KAAM,CAAA,UAAU,GACzE,CAAGA,EAAAA,CAAAA,CAAmB,YAAY,CAAA,CAAA,EAAIA,CAAmB,CAAA,eAAe,CAC1E,CAAA,CAAA,CACC,OACC,CAAA,CAAA,EAAGA,CAAmB,CAAA,YAAY,CAAIA,CAAAA,EAAAA,CAAAA,CAAmB,cAAc,CACvEK,CAAAA,CAAAA,CACF,CAGJ,CAAA,IAAMS,CAAQlpC,CAAAA,mBAAAA,CAAO,WAAY,CAAA,CAAC,CAAE,CAAA,QAAA,CAAS,KAAK,CAAA,CAC5CmpC,CAAmB,CAAA,CAAA,EAAGp/B,EAAS,KAAM,CAAA,KAAK,CAAQm/B,KAAAA,EAAAA,CAAK,CACvDE,CAAAA,CAAAA,CAAAA,CAAmB/B,CAAqB,CAAA,YAAA,CAC3C,GAAKlvB,CAAAA,CAAAA,EAAgB,CACpB,GAAIA,CAAY,CAAA,UAAA,CACd,OAAOA,CAAY,CAAA,MAAA,CAGrB,IAAM7b,CAAAA,CAAS6b,CAAY,CAAA,MAAA,CAAO,QAAS,CAAA,GAAG,CAC1CA,CAAAA,CAAAA,CAAY,MACZ,CAAA,CAAA,EAAGpO,CAAS,CAAA,KAAA,CAAM,KAAK,CAAIoO,CAAAA,EAAAA,CAAAA,CAAY,MAAM,CAAA,CAAA,CACjD,OAAO,CAAA,EAAG,IAAK,CAAA,gBAAA,CAAiB,kBAAmB,CAAA,IAAA,CAAK,MAAQ7b,CAAAA,CAAM,CAAC,CAAA,CAAA,EAAI6b,EAAY,SAAS,CAAA,CAClG,CAAC,CAAA,CACA,IAAK,CAAA,IAAI,CAAK,EAAA,CAAC,GAAG,CAAA,CAErBkvB,CAAqB,CAAA,UAAA,EACrBA,CAAAA,CAAAA,CAAqB,aACrBA,CAAAA,CAAAA,CAAqB,YAAa,EAAA,CAElC,IAAMgC,CAAAA,CAAoB,CAAGrpC,EAAAA,mBAAAA,CAAO,WAAY,CAAA,CAAC,CAAE,CAAA,QAAA,CAAS,KAAK,CAAC,oBAC5DspC,CAAQjC,CAAAA,CAAAA,CAAqB,IAAK8B,CAAAA,CAAAA,CAAmBI,CACzDA,EAAAA,CAAAA,CACG,MAAO,CAAA,GAAGN,CAAkB,CAAA,CAC5B,QACC,CAAA,CAAA,EAAGb,CAAmB,CAAA,YAAY,IAAIA,CAAmB,CAAA,cAAc,CACvEiB,CAAAA,CAAAA,CACF,CACC,CAAA,SAAA,CACC,CAAmCjB,gCAAAA,EAAAA,CAAAA,CAAmB,YAAY,CAAA,CAAA,EAAI,IAAK,CAAA,gBAAA,CAAiB,kBAAmB,CAAA,IAAA,CAAK,OAAQA,CAAmB,CAAA,cAAc,CAAC,CAAA,UAAA,EAAagB,CAAgB,CAAA,QAAA,EAAWF,CAAK,CAAA,CAC7M,CACC,CAAA,QAAA,CACCd,CAAmB,CAAA,YAAA,CACnB,CAAGA,EAAAA,CAAAA,CAAmB,YAAY,CAAIA,CAAAA,EAAAA,CAAAA,CAAmB,KAAM,CAAA,UAAU,CACzE,CAAA,CAAA,CAAA,EAAGA,CAAmB,CAAA,YAAY,CAAIA,CAAAA,EAAAA,CAAAA,CAAmB,eAAe,CAAA,CAC1E,CACC,CAAA,OAAA,CACC,GAAGA,CAAmB,CAAA,YAAY,CAAIA,CAAAA,EAAAA,CAAAA,CAAmB,cAAc,CAAA,CAAA,CACvEK,CACF,CACJ,CAEIM,CAAAA,CAAAA,EACFO,CAAM,CAAA,QAAA,CAAS,CAAMJ,GAAAA,EAAAA,CAAK,OAAOH,CAAYC,EAAAA,CAAAA,EAAa,CAAE,CAAA,CAAA,CAAE,CAG5DA,CAAAA,CAAAA,EACFM,CAAM,CAAA,QAAA,CAAS,CAAMJ,GAAAA,EAAAA,CAAK,CAAMF,GAAAA,EAAAA,CAAS,CAAE,CAAA,CAAA,CAG7C,IAAMQ,CAAuBP,CAAAA,CAAAA,CAAmB,GAAK3sC,CAAAA,CAAAA,EACnDmK,EACEnK,CAAAA,CAAAA,CACA6sC,CACA9B,CAAAA,CAAAA,CAAqB,KAAM,CAAA,KAC7B,CACF,CAAA,CAEA,OAAOiC,CAAAA,CACJ,OAAO,GAAGE,CAAoB,CAC9B,CAAA,QAAA,CACC,CAAGL,EAAAA,CAAgB,CAAIE,CAAAA,EAAAA,CAAiB,CACxCjB,CAAAA,CAAAA,CAAAA,CAAmB,cACrB,CAAA,CACC,IAAKe,CAAAA,CAAgB,EAC1B,QACE,MAAM,IAAIv3C,CAAAA,CACR,IAAK,CAAA,KAAA,CAAM,IAAO,CAAA,+BAAA,CAClB,2BACF,CACJ,CACF,CAEU,oCACRmY,CAAAA,CAAAA,CACA5L,EACO,CACP,OAAQ4L,CAAS,CAAA,IAAA,EACf,KAAA,SAAA,CACA,KACE,QAAA,CAAA,GAAI,CAAC,IAAA,CAAK,KAAM,CAAA,UAAA,CACd,MAAM,IAAInY,EACR,IAAK,CAAA,KAAA,CAAM,IAAO,CAAA,wCAAA,CAClB,0BACF,CAAA,CAGF,OAAOuM,CAAAA,CAAO,GAAKjC,CAAAA,CAAAA,EAAUA,CAAM,CAAA,IAAA,CAAK,KAAM,CAAA,UAAqB,CAAC,CACtE,CAAA,KAAA,WAAA,CACE,OAAOiC,CAAAA,CAAO,GAAKjC,CAAAA,CAAAA,EAAUA,CAAM6N,CAAAA,CAAAA,CAAS,UAAqB,CAAC,CACpE,CAAA,KAAA,YAAA,CACE,GAAI,CAAC,KAAK,KAAM,CAAA,UAAA,CACd,MAAM,IAAInY,CACR,CAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAO,wCAClB,CAAA,0BACF,CAGF,CAAA,OAAOuM,CAAO,CAAA,GAAA,CAAKjC,GAAUA,CAAM,CAAA,IAAA,CAAK,KAAM,CAAA,UAAqB,CAAC,CAAA,CACtE,QACE,MAAM,IAAItK,CAAAA,CACR,IAAK,CAAA,KAAA,CAAM,IAAO,CAAA,wCAAA,CAClB,2BACF,CACJ,CACF,CAEU,wBAAA,CACRy1C,CACAt9B,CAAAA,CAAAA,CACA+yB,CACA/oC,CAAAA,CAAAA,CACM,CACN,IAAM01C,CAAqB,CAAA,IAAI35B,CAAiB/F,CAAAA,CAAAA,CAAS,KAAK,CACxD2/B,CAAAA,CAAAA,CAAmB,IAAI55B,CAAAA,CAAiB,IAAK,CAAA,KAAK,CAClDlZ,CAAAA,CAAAA,CAAS,IAAK,CAAA,MAAA,CAEpB,OAAQmT,CAAAA,CAAS,IAAM,EACrB,cACA,KAA2B,SAAA,CAAA,CACzB,GAAI,CAAC,IAAK,CAAA,KAAA,CAAM,UAAc,EAAA,CAACA,CAAS,CAAA,UAAA,CACtC,MAAM,IAAInY,CACR,CAAA,IAAA,CAAK,MAAM,IAAO,CAAA,4BAAA,CAClB,0BACF,CAAA,CAGF,IAAM2wC,CAAAA,CAAOkH,CAAmB,CAAA,kBAAA,CAC9B7yC,CACA,CAAA,CAAA,EAAGmT,CAAS,CAAA,KAAA,CAAM,KAAK,CAAA,CAAA,EAAIA,EAAS,UAAU,CAAA,CAChD,CAEMy4B,CAAAA,CAAAA,CAAQkH,CAAiB,CAAA,kBAAA,CAC7B9yC,CACA,CAAA,CAAA,EAAG,IAAK,CAAA,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,IAAK,CAAA,KAAA,CAAM,UAAU,CAC9C,CAAA,CAAA,CAEAywC,CAAqB,CAAA,QAAA,CAAS,CAAG9E,EAAAA,CAAI,CAAMC,GAAAA,EAAAA,CAAK,CAAE,CAAA,CAAA,CAE9C1F,CAAY,EAAA,OAAO/oC,CAAU,EAAA,QAAA,EAC/BszC,EACG,UAAW9E,CAAAA,CAAI,CACf,CAAA,YAAA,CAAa,CAAYzF,SAAAA,EAAAA,CAAQ,CAAI/oC,CAAAA,EAAAA,CAAK,CAAE,CAAA,CAAA,CAEjD,MACF,CACA,KAA6B,WAAA,CAAA,CAC3B,GAAI,CAACgW,CAAAA,CAAS,KAAM,CAAA,UAAA,EAAc,CAACA,CAAAA,CAAS,UAC1C,CAAA,MAAM,IAAInY,CAAAA,CACR,IAAK,CAAA,KAAA,CAAM,IAAO,CAAA,4BAAA,CAClB,6CAA6CmY,CAAS,CAAA,KAAA,CAAM,IAAI,CAAA,CAClE,CAGF,CAAA,IAAMw4B,CAAOkH,CAAAA,CAAAA,CAAmB,kBAC9B7yC,CAAAA,CAAAA,CACA,CAAGmT,EAAAA,CAAAA,CAAS,KAAM,CAAA,KAAK,IAAIA,CAAS,CAAA,KAAA,CAAM,UAAU,CAAA,CACtD,CACMy4B,CAAAA,CAAAA,CAAQkH,CAAiB,CAAA,kBAAA,CAC7B9yC,CACA,CAAA,CAAA,EAAG,IAAK,CAAA,KAAA,CAAM,KAAK,CAAA,CAAA,EAAImT,CAAS,CAAA,UAAU,CAC5C,CAAA,CAAA,CAEAs9B,CAAqB,CAAA,QAAA,CAAS,CAAG9E,EAAAA,CAAI,CAAMC,GAAAA,EAAAA,CAAK,CAAE,CAAA,CAAA,CAE9C1F,CAAY,EAAA,OAAO/oC,CAAU,EAAA,QAAA,EAC/BszC,EACG,UAAW9E,CAAAA,CAAI,CACf,CAAA,YAAA,CAAa,CAAYzF,SAAAA,EAAAA,CAAQ,CAAI/oC,CAAAA,EAAAA,CAAK,CAAE,CAAA,CAAA,CAEjD,MACF,CACA,KAA8B,YAAA,CAAA,CAC5B,IAAM41C,CAAM5/B,CAAAA,CAAAA,CACZ,GAAI,CAAC,IAAK,CAAA,KAAA,CAAM,UAAc,EAAA,CAACA,CAAS,CAAA,KAAA,CAAM,UAC5C,CAAA,MAAM,IAAInY,CAAAA,CACR,KAAK,KAAM,CAAA,IAAA,CAAO,4BAClB,CAAA,0BACF,CAGqBy1C,CAAAA,CAAAA,CAAqB,SAAW,EAAA,IAAA,CACpDuC,CACC,EAAA,CAACA,CAAG,CAAA,UAAA,EACJA,CAAG,CAAA,KAAA,GAAUD,EAAI,YACjBC,EAAAA,CAAAA,CAAG,IAAS,GAAA,MAChB,CAGEvC,EAAAA,CAAAA,CAAqB,QACnBsC,CAAAA,CAAAA,CAAI,YACJ,CAAA,CAAA,EAAGA,CAAI,CAAA,YAAY,CAAI5/B,CAAAA,EAAAA,CAAAA,CAAS,MAAM,UAAU,CAAA,CAAA,CAChD,CAAG4/B,EAAAA,CAAAA,CAAI,YAAY,CAAA,CAAA,EAAIA,CAAI,CAAA,eAAe,CAC5C,CAAA,CAAA,CAGF,IAAME,CAAAA,CAAcH,CAAiB,CAAA,kBAAA,CACnC9yC,EACA,CAAG+yC,EAAAA,CAAAA,CAAI,YAAY,CAAA,CAAA,EAAIA,CAAI,CAAA,cAAc,CAC3C,CAAA,CAAA,CACMG,CAAUJ,CAAAA,CAAAA,CAAiB,kBAC/B9yC,CAAAA,CAAAA,CACA,CAAG,EAAA,IAAA,CAAK,MAAM,KAAK,CAAA,CAAA,EAAI,IAAK,CAAA,KAAA,CAAM,UAAU,CAAA,CAC9C,CAEAywC,CAAAA,CAAAA,CAAqB,QAAS,CAAA,CAAA,EAAGwC,CAAW,CAAA,GAAA,EAAMC,CAAO,CAAA,CAAE,EAEvDhN,CAAY,EAAA,OAAO/oC,CAAU,EAAA,QAAA,EAC/BszC,CACG,CAAA,UAAA,CAAWwC,CAAW,CAAA,CACtB,YAAa,CAAA,CAAA,SAAA,EAAY/M,CAAQ,CAAA,CAAA,EAAI/oC,CAAK,CAAA,CAAE,EAEjD,MACF,CACA,QACE,MAAM,IAAInC,CAAAA,CACR,IAAK,CAAA,KAAA,CAAM,IAAO,CAAA,4BAAA,CAClB,2BACF,CACJ,CACF,CAEU,4BACRkF,CACAyQ,CAAAA,CAAAA,CACqB,CACrB,IAAMrL,CAA6B,CAAA,EAC7BqM,CAAAA,CAAAA,CAAoC,EAAC,CAC3C,OAAO,MAAA,CAAA,OAAA,CAAQzR,CAAG,CAAA,CAAE,QAAQ,CAAC,CAAChD,CAAKC,CAAAA,CAAK,CAAM,GAAA,CAC5C,GAAID,CAAAA,GAAQ,cAAkB,EAAA,IAAA,CAAK,yBAA0B,CAAA,GAAA,CAAIA,CAAG,CAAA,CAAG,CACrEoI,CAAMpI,CAAAA,CAAG,CAAIC,CAAAA,CAAAA,CACb,MACF,CAEAwU,CAAa1F,CAAAA,CAAAA,CAAY/O,CAAKyT,CAAAA,CAAAA,CAAY,mBAAmB,CAAC,CAAIxT,CAAAA,EACpE,CAAC,CAEDmI,CAAAA,CAAAA,CAAM,YAAeqM,CAAAA,CAAAA,CACdrM,CACT,CAGA,MAAc,mBAAA,CACZjH,CAAuB,CAAA,EACvBqsC,CAAAA,CAAAA,CAAmC,QAIlC,CAAA,CACD,GAAM,CAACj7B,CAAAA,CAAMtH,CAAI,CAAA,CAAI,MAAMsiC,CAAAA,CACzB,IAAK,CAAA,IAAA,CAAK,IAAK,CAAA,IAAA,CAAMpsC,CAAO,CAAA,CAC5BqsC,CACF,CAAA,GAEA,OAAO,CAAE,IAAAviC,CAAAA,CAAAA,CAAM,IAAM,CAAA,MAAA,CAAOsH,CAAI,CAAE,CACpC,CAGA,MAAc,kBAAA,CACZpR,CAAsB,CAAA,EACtBqsC,CAAAA,CAAAA,CAAmC,QAIlC,CAAA,CACD,GAAM,CAACj7B,CAAMtH,CAAAA,CAAI,CAAI,CAAA,MAAMsiC,CACzB,CAAA,IAAA,CAAK,GAAI,CAAA,IAAA,CAAK,IAAMpsC,CAAAA,CAAO,EAC3BqsC,CACF,CAAA,EAEA,CAAA,OAAO,CAAE,IAAA,CAAAviC,CAAM,CAAA,IAAA,CAAM,MAAOsH,CAAAA,CAAI,CAAE,CACpC,CAGA,MAAc,yBACZpR,CAAsB,CAAA,EACtBqsC,CAAAA,CAAAA,CAAmC,QAIlC,CAAA,CACD,GAAM,CAACj7B,CAAMtH,CAAAA,CAAI,CAAI,CAAA,MAAMsiC,CACzB,CAAA,IAAA,CAAK,UAAU,IAAK,CAAA,IAAA,CAAMpsC,CAAO,CAAA,CACjCqsC,CACF,CAAA,EAEA,CAAA,OAAO,CAAE,IAAA,CAAAviC,CAAM,CAAA,IAAA,CAAM,MAAOsH,CAAAA,CAAI,CAAE,CACpC,CAGA,MAAc,0BAAA,CACZpR,CAAsB,CAAA,EACtBqsC,CAAAA,CAAAA,CAAmC,QAIlC,CAAA,CACD,OAAO,IAAA,CAAK,wBAAyBrsC,CAAAA,CAAAA,CAASqsC,CAAU,CAC1D,CAGA,MAAc,oBAAA,CACZrsC,CAAsB,CAAA,EACtBqsC,CAAAA,CAAAA,CAAmC,QAIlC,CAAA,CACD,OAAO,IAAA,CAAK,kBAAmBrsC,CAAAA,CAAAA,CAASqsC,CAAU,CACpD,CAGA,MAAc,uBAAA,CACZ9iC,CACA+mC,CAAAA,CAAAA,CACAtwC,CACAqsC,CAAAA,CAAAA,CAAmC,QAIlC,CAAA,CACD,GAAM,CAAE,WAAAyI,CAAAA,CAAAA,CAAc,KAAM,CAAI90C,CAAAA,CAAAA,EAAW,EAAC,CACtC,CAACoR,CAAAA,CAAMtH,CAAI,CAAA,CAAI,MAAMsiC,CAAAA,CACzB,IAAK,CAAA,QAAA,CAAS,IAAK,CAAA,IAAA,CAAM7iC,EAAM+mC,CAAS,CAAA,CAAE,WAAAwE,CAAAA,CAAY,CAAC,CAAA,CACvDzI,CACF,CAAA,EAEA,CAAA,OAAO,CACL,IAAA,CAAM,CACJ,kBAAA,CAAoBviC,EAAK,kBACzB,CAAA,IAAA,CAAMA,CAAK,CAAA,IACb,CACA,CAAA,IAAA,CAAM,MAAOsH,CAAAA,CAAI,CACnB,CACF,CAEA,MAAc,iCACZ7H,CAAAA,CAAAA,CACAvJ,EACAgwC,CACA3D,CAAAA,CAAAA,CAAmC,QAIlC,CAAA,CACD,GAAM,CAACj7B,CAAMtH,CAAAA,CAAI,CAAI,CAAA,MAAMsiC,CACzB,CAAA,IAAA,CAAK,kBAAmB,CAAA,IAAA,CAAK,KAAM7iC,CAAMvJ,CAAAA,CAAAA,CAASgwC,CAAM,CAAA,CACxD3D,CACF,CAAA,EAEA,CAAA,OAAO,CACL,IAAA,CAAMviC,CACN,CAAA,IAAA,CAAM,MAAOsH,CAAAA,CAAI,CACnB,CACF,CAEA,MAAc,qBAAA,CACZi7B,CAAmC,CAAA,QAAA,CACnC,CACA,GAAM,CAACj7B,CAAAA,CAAMtH,CAAI,CAAA,CAAI,MAAMsiC,CAAAA,CACzB,KAAK,MAAO,CAAA,IAAA,CAAK,IAAI,CAAA,CACrBC,CACF,CAAA,EAEA,CAAA,OAAO,CACL,IAAA,CAAAviC,CACA,CAAA,IAAA,CAAM,MAAOsH,CAAAA,CAAI,CACnB,CACF,CAEA,MAAc,oBAAA,CACZvS,CACAwtC,CAAAA,CAAAA,CAAmC,QACnC,CAAA,CACA,GAAM,CAACj7B,CAAMtH,CAAAA,CAAI,CAAI,CAAA,MAAMsiC,EACzB,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,IAAA,CAAMvtC,CAAG,CAAA,CACzBwtC,CACF,CAAA,EAEA,CAAA,OAAO,CACL,IAAA,CAAAviC,CACA,CAAA,IAAA,CAAM,MAAOsH,CAAAA,CAAI,CACnB,CACF,CAEA,MAAc,yBACZpR,CAAAA,CAAAA,CAAgE,EAAC,CACjEqsC,CAAmC,CAAA,QAAA,CACnC,CACA,GAAM,CAACj7B,CAAAA,CAAMtH,CAAI,CAAI,CAAA,MAAMsiC,CACzB,CAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CAAK,IAAMpsC,CAAAA,CAAO,CAClCqsC,CAAAA,CACF,CAAE,EAAA,CAEF,OAAO,CACL,KAAAviC,CACA,CAAA,IAAA,CAAM,MAAOsH,CAAAA,CAAI,CACnB,CACF,CAGA,MAAc,qBACZtH,CAAAA,CAAAA,CACA9J,CAAyB,CAAA,EACzBqsC,CAAAA,CAAAA,CAAmC,SACnC,CACA,GAAM,CAACj7B,CAAAA,CAAMxP,CAAM,CAAA,CAAI,MAAMwqC,CAAAA,CAC3B,IAAK,CAAA,MAAA,CAAO,IAAK,CAAA,IAAA,CAAMtiC,CAAM9J,CAAAA,CAAO,EACpCqsC,CACF,CAAA,EAEA,CAAA,OAAO,CACL,IAAA,CAAMzqC,CACN,CAAA,IAAA,CAAM,MAAOwP,CAAAA,CAAI,CACnB,CACF,CAEA,MAAc,sBACZi7B,CAAmC,CAAA,QAAA,CACnC,CACA,GAAM,CAACj7B,CAAAA,CAAMxP,CAAM,CAAA,CAAI,MAAMwqC,CAAAA,CAC3B,IAAK,CAAA,MAAA,CAAO,IAAK,CAAA,IAAI,EACrBC,CACF,CAAA,EAEA,CAAA,OAAO,CACL,IAAA,CAAMzqC,CACN,CAAA,IAAA,CAAM,MAAOwP,CAAAA,CAAI,CACnB,CACF,CAEA,MAAc,wBACZi7B,CAAmC,CAAA,QAAA,CACnC,CACA,GAAM,CAACj7B,CAAAA,CAAMxP,CAAM,CAAA,CAAI,MAAMwqC,CAAAA,CAC3B,IAAK,CAAA,QAAA,CAAS,IAAK,CAAA,IAAI,EACvBC,CACF,CAAA,EAEA,CAAA,OAAO,CACL,IAAA,CAAMzqC,CACN,CAAA,IAAA,CAAM,MAAOwP,CAAAA,CAAI,CACnB,CACF,CACF,CAAA,CCl1DO,IAAM2jC,EAAN,CAAA,cAIGnD,EAA2B,CACnC,WAAY3qC,CAAAA,CAAAA,CAAqBgC,CAA8B,CAAA,CAC7D,KAAMhC,CAAAA,CAAAA,CAAOgC,CAAa,EAC5B,CAGS,IAAA,EAAa,CACpB,OAAO,IACT,CASS,MAAA,CAAA,GAAU4N,CAAqD,CAAA,CACtE,GAAM,CAAC/M,CAAM9J,CAAAA,CAAO,CAAI6W,CAAAA,CAAAA,CAClB65B,CAAe,CAAA,MAAA,CAAO,YAC1B,MAAO,CAAA,IAAA,CAAK5mC,CAAI,CAAA,CAAE,GAAKzC,CAAAA,CAAAA,EAAW,CAChCA,CAAAA,CACAyC,CAAKzC,CAAAA,CAA2B,CAClC,CAAC,CACH,CAAA,CAEA,YAAK,UAAa,CAAA,IAAI+/B,CACpB,CAAA,IAAA,CAAK,QACL,CAAA,CAACsJ,CAAY,CAAA,CACb1wC,CAAS,EAAA,SACX,CACO,CAAA,IACT,CASS,UAAA,CAAA,GACJ6W,EACG,CACN,GAAM,CAAC/M,CAAAA,CAAM9J,CAAO,CAAA,CAAI6W,CACxB,CAAA,GAAI,CAAC/M,CAAAA,CAAK,MACR,CAAA,OAAO,IAGT,CAAA,IAAMZ,EAASY,CAAK,CAAA,GAAA,CAAK7C,CAChB,EAAA,MAAA,CAAO,WACZ,CAAA,MAAA,CAAO,IAAKA,CAAAA,CAAK,CAAE,CAAA,GAAA,CAAKI,CAAW,EAAA,CACjCA,CACAJ,CAAAA,CAAAA,CAAMI,CAA4B,CACpC,CAAC,CACH,CACD,CAED,CAAA,OAAA,IAAA,CAAK,UAAa,CAAA,IAAI+/B,CACpB,CAAA,IAAA,CAAK,QACLl+B,CAAAA,CAAAA,CACAlJ,CAAS,EAAA,SACX,EACO,IACT,CASS,MACJ6W,CAAAA,GAAAA,CAAAA,CACG,CACN,GAAM,CAAC/M,CAAI,CAAI+M,CAAAA,CAAAA,CACf,OAAK,IAAA,CAAA,UAAA,CAAa,IAAI4wB,EAAAA,CACpB,KAAK,QACL,CAAA,MAAA,CAAO,IAAK39B,CAAAA,CAAI,CAChB,CAAA,MAAA,CAAO,MAAOA,CAAAA,CAAI,CACpB,CAAA,CACO,IACT,CAQS,MACJ+M,CAAAA,GAAAA,CAAAA,CACG,CACN,GAAM,CAAC7W,CAAO,CAAA,CAAI6W,CAElB,CAAA,OAAK7W,CAAS,EAAA,sBAAA,EACZ,IAAK,CAAA,KAAA,CAAM,YAAe,GAAA,IAAW,CAGvC,CAAA,IAAA,CAAK,WAAa,IAAIknC,EAAAA,CAAW,IAAK,CAAA,QAAQ,CACvC,CAAA,IACT,CAOS,QAAA,EAAiB,CACxB,OAAA,IAAA,CAAK,YAAe,CAAA,IAAIpP,EAAa,CAAA,IAAA,CAAK,QAAQ,CAC3C,CAAA,IACT,CASS,UAAA,CAAA,GACJjhB,CACG,CAAA,CACN,GAAM,CAAC7W,CAAO,CAAA,CAAI6W,CAEZ,CAAA,CAAE,MAAAxP,CAAAA,CAAAA,CAAS,YAAa,KAAAvI,CAAAA,CAAAA,CAAQ4P,EAAmB,EAAE,CACzD1O,CAAAA,CAAAA,EAAW,EAAC,CAEd,OAAK,IAAA,CAAA,UAAA,CAAa,IAAIynC,EAAAA,CACpB,IAAK,CAAA,QAAA,CACL,CAACpgC,CAAgB,CAAA,CACjB,CAACvI,CAAK,CACR,CAAA,CACO,IACT,CACF,CCzHO,CAAA,IAAMk2C,EAAN,CAAA,KAAoC,CAazC,WAAA,CAAY/tC,EAAqBgC,CAA8B,CAAA,CAL/D,IAAU,CAAA,eAAA,CAA6C,IAMrD,CAAA,IAAA,CAAK,KAAQhC,CAAAA,CAAAA,CACb,IAAK,CAAA,aAAA,CAAgBkN,EAAwB,EAAA,CAC7C,IAAK,CAAA,aAAA,CAAgBlL,EACrB,IAAK,CAAA,IAAA,CAAO,IAAK,CAAA,aAAA,CAAc,IAC/B,CAAA,IAAA,CAAK,OAAU,CAAA,IAAA,CAAK,aAAc,CAAA,SAAA,EAClC,CAAA,IAAA,CAAK,SAAY,CAAA,IAAIgD,EAAU,IAAK,CAAA,KAAA,CAAO,IAAK,CAAA,OAAO,CACvD,CAAA,IAAA,CAAK,gBAAmB,CAAA,IAAI4O,CAAiB,CAAA,IAAA,CAAK,KAAK,EACzD,CAKA,kBAAA,CAAmBvX,EAAgC,CACjD,OAAA,IAAA,CAAK,eAAkBA,CAAAA,CAAAA,CAChB,IACT,CAaA,MAAM,IAAA,CAIJjE,CACkC,CAAA,CAClC,GAAI,CAACA,CACH,CAAA,OAAO,KAAK,KAAM,EAAA,CAAE,IAAK,EAAA,CAG3B,IAAMgC,CAAAA,CAAQ,IAAK,CAAA,KAAA,EACnB,CAAA,OAAIhC,CAAM,CAAA,MAAA,EACRgC,CAAM,CAAA,MAAA,CAAO,GAAIhC,CAAM,CAAA,MAAmB,CAGxCA,CAAAA,CAAAA,CAAM,SACRA,EAAAA,CAAAA,CAAM,SAAU,CAAA,OAAA,CAASyV,CAAa,EAAA,CACpCzT,CAAM,CAAA,IAAA,CAAKyT,CAAQ,EACrB,CAAC,CAGCzV,CAAAA,CAAAA,CAAM,KACR,EAAA,MAAA,CAAO,OAAQA,CAAAA,CAAAA,CAAM,KAAK,CAAA,CAAE,OAAQ,CAAA,CAAC,CAACR,CAAAA,CAAKC,CAAK,CAAA,GAAM,CACpD,GAAI,KAAA,CAAM,OAAQA,CAAAA,CAAK,CAAG,CAAA,CACxBuC,CAAM,CAAA,OAAA,CAAQxC,CAAKC,CAAAA,CAAK,CACxB,CAAA,MACF,CAEAuC,CAAAA,CAAM,MAAMxC,CAAKC,CAAAA,CAAK,EACxB,CAAC,CAGCO,CAAAA,CAAAA,CAAM,OACR,EAAA,MAAA,CAAO,OAAQA,CAAAA,CAAAA,CAAM,OAAO,CAAA,CAAE,OAAQ,CAAA,CAAC,CAACR,CAAAA,CAAKC,CAAK,CAAA,GAAM,CACtDuC,CAAAA,CAAM,OAAQxC,CAAAA,CAAAA,CAAoBC,CAAuB,EAC3D,CAAC,CAAA,CAGCO,CAAM,CAAA,KAAA,EACRgC,CAAM,CAAA,KAAA,CAAMhC,EAAM,KAAK,CAAA,CAGrBA,CAAM,CAAA,MAAA,EACRgC,CAAM,CAAA,MAAA,CAAOhC,CAAM,CAAA,MAAM,CAGvBA,CAAAA,CAAAA,CAAM,OACRgC,EAAAA,CAAAA,CAAM,OAAQ,CAAA,GAAIhC,EAAM,OAAoB,CAAA,CAGvCgC,CAAM,CAAA,IAAA,CAAK,CAAE,WAAA,CAAahC,CAAM,CAAA,WAAA,EAAe,EAAG,CAAC,CAC5D,CAeA,MAAM,QAIJA,CACuC,CAAA,CACvC,IAAM+G,CAAAA,CAAU,MAAM,IAAA,CAAK,IAAK,CAAA,CAC9B,OAAS/G,CAAAA,CAAAA,CAAM,OACf,CAAA,OAAA,CAASA,CAAM,CAAA,OAAA,CACf,UAAWA,CAAM,CAAA,SAAA,CACjB,MAAQA,CAAAA,CAAAA,CAAM,MACd,CAAA,KAAA,CAAOA,CAAM,CAAA,KAAA,CACb,WAAaA,CAAAA,CAAAA,CAAM,WACnB,CAAA,MAAA,CAAQA,CAAM,CAAA,MAAA,CACd,MAAO,CACT,CAAsB,CAEtB,CAAA,OAAK+G,CAAQ,CAAA,MAAA,CAINA,CAAQ,CAAA,CAAC,CAHP,CAAA,IAIX,CAaA,MAAM,aAIJ/G,CAAAA,CAAAA,CAGgC,CAChC,IAAMuC,CAAAA,CAAS,MAAM,IAAA,CAAK,OAAQ,CAAA,CAChC,OAASvC,CAAAA,CAAAA,CAAM,OACf,CAAA,OAAA,CAASA,CAAM,CAAA,OAAA,CACf,SAAWA,CAAAA,CAAAA,CAAM,UACjB,MAAQA,CAAAA,CAAAA,CAAM,MACd,CAAA,KAAA,CAAOA,CAAM,CAAA,KAAA,CACb,WAAaA,CAAAA,CAAAA,CAAM,WACnB,CAAA,MAAA,CAAQA,CAAM,CAAA,MAChB,CAAyB,CAAA,CAEzB,GAAIuC,CAAW,GAAA,IAAA,CACb,MAAIvC,CAAAA,CAAM,WACFA,CAAAA,CAAAA,CAAM,WAGR,CAAA,IAAI1C,CACR,CAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAO,iBAClB,CAAA,eACF,EAGF,OAAOiF,CACT,CAOA,MAAM,mBACJ9C,CAAAA,CAAAA,CACAwoC,CACuC,CAAA,CACvC,GAAI,CAAC,IAAK,CAAA,KAAA,CAAM,UACd,CAAA,MAAM,IAAI3qC,CACR,CAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAO,uBAClB,CAAA,0BACF,CAGF,CAAA,OAAO,IAAK,CAAA,KAAA,EACT,CAAA,MAAA,CAAO,GAAI2qC,CAAAA,EAAa,EAAG,CAAA,CAC3B,KAAM,CAAA,IAAA,CAAK,KAAM,CAAA,UAAA,CAAsBxoC,CAAK,CAAA,CAC5C,GAAI,CAAA,CAAE,WAAa,CAAA,CAAC,YAAc,CAAA,aAAa,CAAE,CAAC,CACvD,CAKA,MAAM,MACJmI,CAAAA,CAAAA,CACAjH,CAA4B,CAAA,EACI,CAAA,CAChC,CAACA,CAAAA,CAAQ,WAAgB,EAAA,MAAM,KAAK,KAAM,CAAA,YAAA,GAAeiH,CAAU,CAAA,CACnE,GAAM,CAAE,OAASiiC,CAAAA,CAAAA,CAAiB,MAAQC,CAAAA,CAAe,CACvD,CAAA,MAAM,IAAK,CAAA,gBAAA,CAAiB,eAC1B,MAAO,CAAA,IAAA,CAAKliC,CAAK,CAAA,CACjB,MAAO,CAAA,MAAA,CAAOA,CAAK,CAAA,CACnB,QACF,CAAA,CAEIypC,CAAoC,CAAA,EAC1CxH,CAAAA,CAAAA,CAAgB,QAAQ,CAAC7hC,CAAAA,CAAQoO,CAAU,GAAA,CACzC,IAAM3W,CAAAA,CAAQqqC,CAAe1zB,CAAAA,CAAK,CAClCi7B,CAAAA,CAAAA,CAAarpC,CAAM,CAAA,CAAIvI,CACtBmI,CAAAA,CAAAA,CAAAI,CAAAJ,CAAAA,GAAAA,CAAAA,CAAAI,CAA0BvI,CAAAA,CAAAA,CAAAA,EAC7B,CAAC,CAAA,CAED,GAAM,CAAE,GAAAsD,CAAAA,CAAAA,CAAK,QAAAyZ,CAAAA,CAAS,CAAI,CAAA,IAAA,CAAK,SAAU,CAAA,KAAA,CAAM,CAC7C,IAAIurB,CAAAA,CACF,IAAID,CAAAA,CAAS,IAAK,CAAA,KAAA,CAAM,KAAK,CAAA,CAC7B,CAACuJ,CAAY,CACb1wC,CAAAA,CAAAA,CAAQ,SACV,CACF,CAAC,CAEK4oC,CAAAA,CAAAA,CAAO,MAAMkB,CAAAA,CACjB1nC,CACAyZ,CAAAA,CAAAA,CACA,IAAK,CAAA,aAAA,CACL,IAAK,CAAA,OAAA,CACL,MACA,CAAA,CACE,cAAgB,CAAA,CACd,YAAa,IAAK,CAAA,KAAA,CAClB,IAAM,CAAA,WAAA,CACN,MAAQ,CAAA,CAAC5U,CAAU,CACrB,CACF,CACF,CAEA,CAAA,GAAI,IAAK,CAAA,OAAA,GAAY,SAAW,IAAK,CAAA,OAAA,GAAY,SAC/C,CAAA,OAAO,IAAK,CAAA,iBAAA,CACV2hC,CACA,CAAA,CAAC3hC,CAAU,CAAA,CACX,KACAjH,CAAAA,CAAAA,CAAQ,SACV,CAAA,CAGF,IAAMi1C,CAAiBrM,CAAAA,CAAAA,CAAa,CAAC,CAAA,CACrC,OAAKqM,CAAAA,EAIL,MAAM,IAAA,CAAK,KAAM,CAAA,UAAA,GAAa,CAACA,CAAa,CAAC,CAAA,CAC7B,MAAMzhC,EAAe,CAAA,CAACyhC,CAAa,CAAA,CAAG,IAAK,CAAA,KAAK,CAJvDhuC,EAAAA,CAMX,CAKA,MAAM,UACJiC,CAAAA,CAAAA,CACAlJ,CAA4B,CAAA,GACM,CAKlC,GAJA,MAAM,IAAA,CAAK,KAAM,CAAA,gBAAA,GAAmBkJ,CAAa,CAAA,CAI7C,IAAK,CAAA,OAAA,GAAY,UAAY,CAAA,CAC/B,IAAMZ,CAAAA,CAAa,KAAK,KAAM,CAAA,UAAA,CACxB4sC,CAAiB,CAAA,MAAA,CAAO,IAAKhsC,CAAAA,CAAAA,CAAO,CAAC,CAAA,EAAK,EAAE,CAIlD,CAAA,GAFEZ,CAAc,EAAA,CAAC4sC,EAAe,QAAS5sC,CAAAA,CAAU,CAGjD,CAAA,OAAO,IAAK,CAAA,0BAAA,CAA2BY,CAAelJ,CAAAA,CAAO,CAEjE,CAEA,IAAM4wC,CAAAA,CAAuC,EAAC,CAC9C,QAAW3pC,CAASiC,IAAAA,CAAAA,CAAQ,CAC1B,GAAM,CAAE,OAAA,CAASggC,CAAiB,CAAA,MAAA,CAAQC,CAAe,CAAA,CACvD,MAAM,IAAA,CAAK,gBAAiB,CAAA,cAAA,CAC1B,OAAO,IAAKliC,CAAAA,CAAK,CACjB,CAAA,MAAA,CAAO,MAAOA,CAAAA,CAAK,CACnB,CAAA,QACF,CAEIypC,CAAAA,CAAAA,CAAoC,EAAC,CAC3CxH,CAAgB,CAAA,OAAA,CAAQ,CAAC7hC,CAAQoO,CAAAA,CAAAA,GAAU,CACzC,IAAM3W,CAAQqqC,CAAAA,CAAAA,CAAe1zB,CAAK,CAAA,CAClCi7B,CAAarpC,CAAAA,CAAM,CAAIvI,CAAAA,CAAAA,CACtBmI,CAAAI,CAAAA,CAAAA,CAAAA,GAAAJ,EAAAI,CAA0BvI,CAAAA,CAAAA,CAAAA,EAC7B,CAAC,CAAA,CAED8xC,CAAc,CAAA,IAAA,CAAKF,CAAY,EACjC,CAEA,GAAM,CAAE,GAAA,CAAAtuC,CAAK,CAAA,QAAA,CAAAyZ,CAAS,CAAI,CAAA,IAAA,CAAK,SAAU,CAAA,KAAA,CAAM,CAC7C,IAAIurB,CACF,CAAA,IAAID,CAAS,CAAA,IAAA,CAAK,KAAM,CAAA,KAAK,CAC7ByJ,CAAAA,CAAAA,CACA5wC,EAAQ,SACV,CACF,CAAC,CAAA,CAEK4oC,CAAO,CAAA,MAAMkB,CACjB1nC,CAAAA,CAAAA,CACAyZ,CACA,CAAA,IAAA,CAAK,aACL,CAAA,IAAA,CAAK,OACL,CAAA,MAAA,CACA,CACE,cAAA,CAAgB,CACd,WAAA,CAAa,IAAK,CAAA,KAAA,CAClB,IAAM,CAAA,YAAA,CACN,MAAQ3S,CAAAA,CACV,CACF,CACF,CAEA,CAAA,GAAI,IAAK,CAAA,OAAA,GAAY,SAAW,IAAK,CAAA,OAAA,GAAY,SAC/C,CAAA,OACG,MAAM,IAAA,CAAK,iBACV0/B,CAAAA,CAAAA,CACA1/B,CACA,CAAA,MAAA,CACAlJ,CAAQ,CAAA,SACV,CAAM,EAAA,GAIV,IAAMm1C,CAAAA,CAAiBvM,CACvB,CAAA,OAAKuM,CAAe,CAAA,MAAA,EAIpB,MAAM,IAAA,CAAK,KAAM,CAAA,UAAA,GAAaA,CAAc,CAAA,CAE5B,MAAM3hC,EAAAA,CAAe2hC,EAAgB,IAAK,CAAA,KAAK,CAC5C,EAAA,EANV,EAAA,EAOX,CAEA,MAAM,UAAA,CACJl/B,CACAE,CAAAA,CAAAA,CACArM,CACA9J,CAAAA,CAAAA,CAA4B,CAC1B,gBAAkB,CAAA,IACpB,CACkC,CAAA,CAClC,IAAM4wC,CAAAA,CAAuC,EAAC,CAuB9C,GAtBA,MAAM,IAAK,CAAA,KAAA,CAAM,gBAAmB9mC,GAAAA,CAAW,EAC/C,MAAM,OAAA,CAAQ,GACZA,CAAAA,CAAAA,CAAK,GAAI,CAAA,MAAO7C,CAAU,EAAA,CACxB,GAAM,CAAE,OAASiiC,CAAAA,CAAAA,CAAiB,MAAQC,CAAAA,CAAe,EACvD,MAAM,IAAA,CAAK,gBAAiB,CAAA,cAAA,CAC1B,MAAO,CAAA,IAAA,CAAKliC,CAAK,CAAA,CACjB,MAAO,CAAA,MAAA,CAAOA,CAAK,CAAA,CACnB,QACF,CAAA,CAEIypC,EAAe,MAAO,CAAA,WAAA,CAC1BxH,CAAgB,CAAA,GAAA,CAAI,CAAC7hC,CAAAA,CAAQoO,CAAU,GAAA,CACrCpO,CACA8hC,CAAAA,CAAAA,CAAe1zB,CAAK,CACtB,CAAC,CACH,EAEAm7B,CAAc,CAAA,IAAA,CAAKF,CAAY,EACjC,CAAC,CACH,CAGI,CAAA,IAAA,CAAK,OAAY,GAAA,OAAA,CACnB,OAAO,IAAA,CAAK,iBACVE,CAAAA,CAAAA,CACA36B,EACAE,CACAnW,CAAAA,CAAAA,CACA8J,CACF,CAAA,CAGF,GAAM,CAAE,GAAA1H,CAAAA,CAAAA,CAAK,QAAAyZ,CAAAA,CAAS,CAAI,CAAA,IAAA,CAAK,SAAU,CAAA,KAAA,CAAM,CAC7C,IAAIurB,CAAAA,CACF,IAAID,CAAAA,CAAS,IAAK,CAAA,KAAA,CAAM,KAAK,CAAA,CAC7ByJ,CACA,CAAA,MAAA,CACA,IACF,CAAA,CACA,IAAIpJ,EAAAA,CACF,KAAK,KAAM,CAAA,KAAA,CACXvxB,CACAE,CAAAA,CAAAA,CACCnW,CAAQ,CAAA,gBAAA,EAAoB,IAAQ,CAAA,QAAA,CAAW,QAChDA,CAAAA,CAAAA,CAAQ,SACV,CACF,CAAC,CAAA,CAiBD,OAfa,MAAM8pC,CAAAA,CACjB1nC,CACAyZ,CAAAA,CAAAA,CACA,IAAK,CAAA,aAAA,CACL,IAAK,CAAA,OAAA,CACL,MACA,CAAA,CACE,cAAgB,CAAA,CACd,WAAa,CAAA,IAAA,CAAK,MAClB,IAAM,CAAA,KAAA,CACN,MAAQ/R,CAAAA,CACV,CACF,CACF,CAGF,CAKA,MAAc,iBAAA,CACZ8mC,CACA36B,CAAAA,CAAAA,CACAE,CACAnW,CAAAA,CAAAA,CACA8J,EACkC,CAClC,GAAI,CAAC8mC,CAAAA,CAAc,MACjB,CAAA,OAAO,EAAC,CAGV,IAAMzpC,CAAAA,CAAU,MAAO,CAAA,IAAA,CAAKypC,CAAc,CAAA,CAAC,CAAC,CACtCzvB,CAAAA,CAAAA,CAAiB,IAAK,CAAA,gBAAA,CAAiB,kBAC3C,CAAA,OAAA,CACA,IAAK,CAAA,KAAA,CAAM,KACb,CAAA,CAEM0vB,CAAaj/B,CAAAA,CAAAA,EACjB,IAAK,CAAA,gBAAA,CAAiB,mBAAmB,OAASA,CAAAA,CAAG,CAGjDiK,CAAAA,CAAAA,CAAkB,EAAC,CACnBi1B,CAAaF,CAAAA,CAAAA,CAAc,GAAKG,CAAAA,CAAAA,EAK7B,CAJW5pC,OAAAA,EAAAA,CAAAA,CAAQ,GAAKyK,CAAAA,CAAAA,GAC7BiK,EAAS,IAAKk1B,CAAAA,CAAAA,CAAIn/B,CAAG,CAAC,CACf,CAAA,CAAA,CAAA,EAAIiK,CAAS,CAAA,MAAM,CAC3B,CAAA,CAAA,CAAA,CAC0B,IAAK,CAAA,IAAI,CAAC,CAAA,CACtC,EAEKm1B,CAAgB7pC,CAAAA,CAAAA,CAAQ,GAAI0pC,CAAAA,CAAS,CAAE,CAAA,IAAA,CAAK,IAAI,CAAA,CAChDI,CAAcH,CAAAA,CAAAA,CAAW,IAAK,CAAA,aAAa,CAG3CI,CAAAA,CAAAA,CAAcj7B,EACjB,GAAKrE,CAAAA,CAAAA,EAAQ,CAAUi/B,OAAAA,EAAAA,CAAAA,CAAUj/B,CAAG,CAAC,CAAai/B,UAAAA,EAAAA,CAAAA,CAAUj/B,CAAG,CAAC,CAAE,CAAA,CAAA,CAClE,IAAK,CAAA,OAAO,EAGT+a,CAAYxW,CAAAA,CAAAA,CACf,MAAQvE,CAAAA,CAAAA,EAAQ,CAACqE,CAAAA,CAAgB,QAASrE,CAAAA,CAAG,CAAC,CAAA,CAC9C,GAAKA,CAAAA,CAAAA,EAAQ,CAAUi/B,OAAAA,EAAAA,CAAAA,CAAUj/B,CAAG,CAAC,CAAA,UAAA,EAAai/B,CAAUj/B,CAAAA,CAAG,CAAC,CAAA,CAAE,CAClE,CAAA,IAAA,CAAK,IAAI,CAAA,CAGNu/B,CAAahqC,CAAAA,CAAAA,CAAQ,GAAI0pC,CAAAA,CAAS,EAAE,IAAK,CAAA,IAAI,CAC7CO,CAAAA,CAAAA,CAAajqC,CAChB,CAAA,GAAA,CAAKyK,CAAQ,EAAA,CAAA,OAAA,EAAUi/B,CAAUj/B,CAAAA,CAAG,CAAC,CAAA,CAAE,CACvC,CAAA,IAAA,CAAK,IAAI,CAGN+P,CAAAA,CAAAA,CACJ3hB,CAAQ,CAAA,SAAA,EAAaA,CAAQ,CAAA,SAAA,CAAU,MACnCA,CAAAA,CAAAA,CAAQ,SACL,CAAA,GAAA,CAAK4R,CAAQ,EAAA,CAAA,SAAA,EAAYi/B,CAAUj/B,CAAAA,CAAa,CAAC,CAAE,CAAA,CAAA,CACnD,IAAK,CAAA,IAAI,CACZzK,CAAAA,CAAAA,CAAQ,GAAKyK,CAAAA,CAAAA,EAAQ,CAAYi/B,SAAAA,EAAAA,CAAAA,CAAUj/B,CAAG,CAAC,CAAE,CAAA,CAAA,CAAE,KAAK,IAAI,CAAA,CAI5Dy/B,CADmBrxC,CAAAA,CAAAA,CAAAA,CAAQ,gBAAoB,EAAA,IAAA,GAE/B2sB,CAChB,CAAA,CAAA,6BAAA,EAAgCA,CAAS,CAAA,CAAA,CACzC,EAEAvqB,CAAAA,CAAAA,CACJ,CAAc+e,WAAAA,EAAAA,CAAc,qBAClB8vB,CAAW,CAAA,aAAA,EAAgBD,CAAa,CAAA,KAAA,EAC5CE,CAAW,CAAA,CAAA,EACdG,CAAiB,CAAA,+BAAA,EACaF,CAAU,CAAA,UAAA,EAAaC,CAAU,CAAA,SAAA,EACxDzvB,CAAU,CAAA,CAAA,CAAA,CAiBtB,OAfa,MAAMmoB,CAAAA,CACjB1nC,CACAyZ,CAAAA,CAAAA,CACA,IAAK,CAAA,aAAA,CACL,IAAK,CAAA,OAAA,CACL,MACA,CAAA,CACE,cAAgB,CAAA,CACd,WAAa,CAAA,IAAA,CAAK,MAClB,IAAM,CAAA,KAAA,CACN,MAAQ/R,CAAAA,CACV,CACF,CACF,CAGF,CAOA,MAAM,YAAA,CACJ7C,CACAjH,CAAAA,CAAAA,CACgC,CAChC,GAAI,CAAE,OAASkpC,CAAAA,CAAAA,CAAiB,MAAQC,CAAAA,CAAe,CACrD,CAAA,MAAM,IAAK,CAAA,gBAAA,CAAiB,cAC1B,CAAA,MAAA,CAAO,IAAKliC,CAAAA,CAAK,CACjB,CAAA,MAAA,CAAO,OAAOA,CAAK,CAAA,CACnB,QACF,CAAA,CAEI,CAAE,UAAA,CAAAqB,CAAW,CAAA,CAAI,IAAK,CAAA,KAAA,CAC5B,GAAI,CAACA,CACH,CAAA,MAAM,IAAI3L,CACR,CAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAO,gBAClB,CAAA,0BACF,CAIF,CAAA,IAAMy4C,CAAkBlM,CAAAA,CAAAA,CAAgB,OAAQ5gC,CAAAA,CAAU,CACtD8sC,CAAAA,CAAAA,GAAoB,EACtBlM,GAAAA,CAAAA,CAAgB,MAAOkM,CAAAA,CAAAA,CAAiB,CAAC,CAAA,CACzCjM,CAAe,CAAA,MAAA,CAAOiM,CAAiB,CAAA,CAAC,CAG1C,CAAA,CAAA,GAAM,CAAE,GAAA,CAAAhzC,CAAK,CAAA,QAAA,CAAAyZ,CAAS,CAAI,CAAA,IAAA,CAAK,SAAU,CAAA,KAAA,CAAM,CAC7C,IAAI4rB,EACF,CAAA,IAAIN,CAAS,CAAA,IAAA,CAAK,KAAM,CAAA,KAAK,CAC7B+B,CAAAA,CAAAA,CACAC,CACF,CACA,CAAA,IAAIzB,CACFp/B,CAAAA,CAAAA,CACA,KACA,CAAA,KAAA,CACA,GACArB,CAAAA,CAAAA,CAAMqB,CAAqB,CAC7B,CACF,CAAC,CAED,CAAA,MAAMwhC,EACJ1nC,CACAyZ,CAAAA,CAAAA,CACA,IAAK,CAAA,aAAA,CACL,IAAK,CAAA,OAAA,CACL,cACF,CAAA,CACA,IAAMw5B,CAAAA,CAAe,MAAM,IAAA,CAAK,mBAC9BpuC,CAAAA,CAAAA,CAAM,KAAK,KAAM,CAAA,UAAqB,CACtCjH,CAAAA,CAAAA,EAAS,SAAa,EAAA,MACxB,CAEA,CAAA,GAAI,CAACq1C,CAAAA,CACH,MAAM,IAAI14C,CACR,CAAA,IAAA,CAAK,MAAM,IAAO,CAAA,gBAAA,CAClB,eACF,CAAA,CAGF,OAAO04C,CACT,CAMA,MAAM,YAAapuC,CAAAA,CAAAA,CAAyB,CAC1C,GAAI,CAAC,IAAA,CAAK,MAAM,UACd,CAAA,MAAM,IAAItK,CAAAA,CACR,IAAK,CAAA,KAAA,CAAM,IAAO,CAAA,gBAAA,CAClB,0BACF,CAAA,CAGF,IAAM0oB,CAAAA,CAAY,IAAIqiB,CAAAA,CACpB,KAAK,KAAM,CAAA,UAAA,CACX,KACA,CAAA,KAAA,CACA,GACAzgC,CAAAA,CAAAA,CAAM,IAAK,CAAA,KAAA,CAAM,UAAqB,CACxC,CAEM,CAAA,CAAE,GAAA7E,CAAAA,CAAAA,CAAK,SAAAyZ,CAAS,CAAA,CAAI,IAAK,CAAA,SAAA,CAAU,KAAM,CAAA,CAC7C,IAAIqrB,EAAAA,CAAW,IAAIC,CAAAA,CAAS,IAAK,CAAA,KAAA,CAAM,KAAK,CAAC,EAC7C9hB,CACF,CAAC,CAED,CAAA,MAAMykB,CACJ1nC,CAAAA,CAAAA,CACAyZ,CACA,CAAA,IAAA,CAAK,aACL,CAAA,IAAA,CAAK,OACL,CAAA,cACF,EACF,CAKA,OAA6D,CAC3D,IAAM42B,CAAe,CAAA,IAAIb,EACvB,CAAA,IAAA,CAAK,KACL,CAAA,IAAA,CAAK,aACP,CAAA,CACA,OAAI,IAAA,CAAK,eACPa,EAAAA,CAAAA,CAAa,mBAAmB,IAAK,CAAA,eAAe,CAE/CA,CAAAA,CACT,CAMA,QAAA,EAAmE,CACjE,OAAO,IAAIsC,EAAAA,CAAwB,IAAK,CAAA,KAAA,CAAO,IAAK,CAAA,aAAa,CACnE,CAKA,MAAc,iBACZnM,CAAAA,CAAAA,CACA1/B,CACAmjC,CAAAA,CAAAA,CACAiJ,CAC2C,CAAA,CAC3C,GAAI,CAAC,IAAK,CAAA,KAAA,CAAM,UAAY,CAAA,CAC1B,GAAIjJ,CAAe,GAAA,KAAA,CAAO,CACxB,IAAMkJ,CAAcrsC,CAAAA,CAAAA,CAAO,MAASA,CAAAA,CAAAA,CAAO,CAAC,CAAA,CAAI,IAChD,CAAA,OAAKqsC,CAIG,CAAA,MAAM/hC,GACZ,CAAC+hC,CAAW,CACZ,CAAA,IAAA,CAAK,KACP,CAAA,CANS,IAOX,CAEA,OAAQ,MAAM/hC,EAAetK,CAAAA,CAAAA,CAAQ,IAAK,CAAA,KAAK,CAGjD,CAGA,GAAI,IAAK,CAAA,KAAA,CAAM,UAAcA,EAAAA,CAAAA,CAAO,CAAC,CAAA,CAAE,IAAK,CAAA,KAAA,CAAM,UAAqB,CAAA,CAAG,CACxE,IAAMssC,CAAiBtsC,CAAAA,CAAAA,CAAO,GAC3BjC,CAAAA,CAAAA,EAAUA,CAAM,CAAA,IAAA,CAAK,KAAM,CAAA,UAAqB,CACnD,CAAA,CAEMwuC,CAAiBD,CAAAA,CAAAA,CAAe,GAAK32C,CAAAA,CAAAA,EAAQ,CAAIA,CAAAA,EAAAA,CAAG,GAAG,CAAE,CAAA,IAAA,CAAK,GAAG,CAAA,CACjE62C,CAAgB,CAAA,MAAM,IAAK,CAAA,KAAA,EAC9B,CAAA,MAAA,CAAO,GAAIJ,CAAAA,EAAY,GAAI,CAAA,CAC3B,QAAQ,IAAK,CAAA,KAAA,CAAM,UAAsBE,CAAAA,CAAc,CACvD,CAAA,UAAA,CAAW,CAAS,MAAA,EAAA,IAAA,CAAK,KAAM,CAAA,UAAU,CAAKC,EAAAA,EAAAA,CAAc,CAAG,CAAA,CAAA,CAAA,CAC/D,MAEH,CAAA,OAAIpJ,CAAe,GAAA,KAAA,CAEfqJ,CAAc,CAAA,MAAA,CAASA,CAAc,CAAA,CAAC,CAAI,CAAA,IAAA,CAIvCA,CACT,CAGA,IAAMF,CAAAA,CAAiB,MAAM,IAC3B,CAAA,CAAE,MAAQ5M,CAAAA,CAAAA,CAAK,YAAa,CAAA,CAC5B,CAACxtB,CAAAA,CAAG/P,CAAMA,GAAAA,CAAAA,CAAIu9B,CAAK,CAAA,QACrB,CAEM8M,CAAAA,CAAAA,CAAgB,MAAM,IAAK,CAAA,KAAA,EAC9B,CAAA,MAAA,CAAO,GAAIJ,CAAAA,EAAY,GAAI,CAAA,CAC3B,OAAQ,CAAA,IAAA,CAAK,KAAM,CAAA,UAAA,CAAsBE,CAAc,CAAA,CACvD,MAEH,CAAA,OAAInJ,CAAe,GAAA,KAAA,CACTqJ,CAAc,CAAA,MAAA,CAASA,CAAc,CAAA,CAAC,CAAI,CAAA,IAAA,CAK7CA,CACT,CAOA,MAAc,0BAAA,CACZxsC,EACAlJ,CACkC,CAAA,CAClC,IAAMoG,CAAAA,CAAe,EAAC,CAChBkC,CAAa,CAAA,IAAA,CAAK,KAAM,CAAA,UAAA,CAE9B,IAAWrB,IAAAA,CAAAA,IAASiC,CAAQ,CAAA,CAE1B,GAAM,CAAE,OAAA,CAASggC,CAAiB,CAAA,MAAA,CAAQC,CAAe,CAAA,CACvD,MAAM,IAAA,CAAK,gBAAiB,CAAA,cAAA,CAC1B,MAAO,CAAA,IAAA,CAAKliC,CAAK,CAAA,CACjB,OAAO,MAAOA,CAAAA,CAAK,CACnB,CAAA,QACF,CAEIypC,CAAAA,CAAAA,CAAoC,EAAC,CAC3CxH,CAAgB,CAAA,OAAA,CAAQ,CAAC7hC,CAAAA,CAAQoO,CAAU,GAAA,CACzC,IAAM3W,CAAQqqC,CAAAA,CAAAA,CAAe1zB,CAAK,CAAA,CAClCi7B,CAAarpC,CAAAA,CAAM,CAAIvI,CAAAA,CAAAA,CACtBmI,CAAAI,CAAAA,CAAAA,CAAAA,GAAAJ,CAAAI,CAAAA,CAAAA,CAAAA,CAA0BvI,CAC7B,EAAA,CAAC,EAGD,GAAM,CAAE,GAAAsD,CAAAA,CAAAA,CAAK,QAAAyZ,CAAAA,CAAS,CAAI,CAAA,IAAA,CAAK,SAAU,CAAA,KAAA,CAAM,CAC7C,IAAIurB,CACF,CAAA,IAAID,EAAS,IAAK,CAAA,KAAA,CAAM,KAAK,CAAA,CAC7B,CAACuJ,CAAY,CACb1wC,CAAAA,CAAAA,CAAQ,SACV,CACF,CAAC,CAAA,CAED,MAAM8pC,CAAAA,CACJ1nC,EACAyZ,CACA,CAAA,IAAA,CAAK,aACL,CAAA,IAAA,CAAK,OACL,CAAA,MACF,CAGA,CAAA,IAAM42B,CAAe,CAAA,IAAA,CAAK,KAAM,EAAA,CAAE,MAChC,CAAA,GAAKzyC,EAAQ,SAA0B,EAAA,CAAC,GAAG,CAC7C,CAEA,CAAA,IAAA,GAAW,CAACqH,CAAAA,CAAQvI,CAAK,CAAA,GAAK,MAAO,CAAA,OAAA,CAAQ4xC,CAAY,CAAA,CACnD5xC,GAAU,IAA+BuI,EAAAA,CAAAA,GAAWiB,CACtDmqC,EAAAA,CAAAA,CAAa,KAAMprC,CAAAA,CAAAA,CAAQ,GAAKvI,CAAAA,CAAK,CAKrCwJ,CAAAA,CAAAA,EACFmqC,CAAa,CAAA,OAAA,CAAQnqC,CAAY,CAAA,MAAM,CAGzC,CAAA,IAAMqtC,CAAc,CAAA,MAAMlD,CAAa,CAAA,GAAA,CAAI,CACzC,WAAA,CAAa,CAAC,aAAa,CAC7B,CAAC,CAEGkD,CAAAA,CAAAA,EAEArtC,CACAqtC,EAAAA,CAAAA,CAAYrtC,CAA4C,CAEvDrB,GAAAA,CAAAA,CAAcqB,CAAU,CAAA,CACvBqtC,CAAYrtC,CAAAA,CAA4C,CAE5DlC,CAAAA,CAAAA,CAAAA,CAAQ,IAAKuvC,CAAAA,CAAgB,CAE7BvvC,EAAAA,CAAAA,CAAQ,IAAKa,CAAAA,CAAU,EAE3B,CAEA,OAAA,MAAM,IAAK,CAAA,KAAA,CAAM,UAAab,GAAAA,CAAO,CAC9BA,CAAAA,CACT,CACF,CAAA,CCvyBO,IAAMwvC,EAAAA,CAAN,cAA8B7G,CAAa,CAChD,WAAY9nC,CAAAA,CAAAA,CAAqBgC,CAA8B,CAAA,CAC7D,KAAMhC,CAAAA,CAAAA,CAAOgC,CAAa,EAC5B,CAGS,IAAA,EAAa,CACpB,OAAO,IACT,CASS,UACJ4N,CACG,CAAA,CACN,GAAM,CAAC/M,CAAM9J,CAAAA,CAAO,CAAI6W,CAAAA,CAAAA,CAClB65B,CAAe,CAAA,MAAA,CAAO,WAC1B,CAAA,MAAA,CAAO,IAAK5mC,CAAAA,CAAI,EAAE,GAAKzC,CAAAA,CAAAA,EAAW,CAChCA,CAAAA,CACAyC,CAAKzC,CAAAA,CAA2B,CAClC,CAAC,CACH,CAAA,CAEA,OAAK,IAAA,CAAA,UAAA,CAAa,IAAI+/B,CAAAA,CAAW,KAAK,QAAU,CAAA,CAACsJ,CAAY,CAAA,CAAG1wC,CAAO,CAAA,CAChE,IACT,CASS,UACJ6W,CAAAA,GAAAA,CAAAA,CACG,CACN,GAAM,CAAC/M,CAAAA,CAAM9J,CAAO,CAAI6W,CAAAA,CAAAA,CACxB,GAAI,CAAC/M,CAAK,CAAA,MAAA,CACR,OAAO,IAAA,CAGT,IAAMZ,CAAAA,CAASY,CAAK,CAAA,GAAA,CAAK7C,CAChB,EAAA,MAAA,CAAO,YACZ,MAAO,CAAA,IAAA,CAAKA,CAAK,CAAA,CAAE,GAAKI,CAAAA,CAAAA,EAAW,CACjCA,CAAAA,CACAJ,CAAMI,CAAAA,CAA4B,CACpC,CAAC,CACH,CACD,EAED,OAAK,IAAA,CAAA,UAAA,CAAa,IAAI+/B,CAAAA,CAAW,IAAK,CAAA,QAAA,CAAUl+B,CAAQlJ,CAAAA,CAAO,CACxD,CAAA,IACT,CASS,MAAA,CAAA,GACJ6W,CACG,CAAA,CACN,GAAM,CAAC/M,CAAAA,CAAM+L,CAAgB7V,CAAAA,CAAO,CAAI6W,CAAAA,CAAAA,CAClCV,CAAkB,CAAA,MAAA,CAAO,IAAKrM,CAAAA,CAAI,CAClCmM,CAAAA,CAAAA,CAAkB,MAAO,CAAA,IAAA,CAAKJ,CAAc,CAElD,CAAA,OAAA,IAAA,CAAK,UAAa,CAAA,IAAIuxB,CACpB,CAAA,IAAID,CAAS,CAAA,IAAA,CAAK,KAAM,CAAA,KAAK,CAC7B,CAAA,CAACr9B,CAAI,CAAA,CACL,OACA,IACF,CAAA,CAEA,IAAK,CAAA,eAAA,CAAkB,IAAI09B,EAAAA,CACzB,IAAK,CAAA,KAAA,CAAM,KACXvxB,CAAAA,CAAAA,CACAE,CACCnW,CAAAA,CAAAA,EAAS,gBAAoB,EAAA,IAAA,CAAQ,SAAW,QACjDA,CAAAA,CAAAA,EAAS,SACX,CAAA,CAEO,IACT,CAGS,UACJ6W,CAAAA,GAAAA,CAAAA,CACG,CACN,GAAM,CAACZ,CAAAA,CAAiBE,CAAiBrM,CAAAA,CAAAA,CAAM9J,CAAO,CAAI6W,CAAAA,CAAAA,CACpD+5B,CAAuC9mC,CAAAA,CAAAA,CAAK,GAAKnC,CAAAA,CAAAA,EAC9C,MAAO,CAAA,WAAA,CACZ,MAAO,CAAA,IAAA,CAAKA,CAAM,CAAA,CAAE,GAAKN,CAAAA,CAAAA,EAAW,CAClCA,CACAM,CAAAA,CAAAA,CAAON,CAA6B,CACtC,CAAC,CACH,CACD,CAAA,CAED,OAAK,IAAA,CAAA,UAAA,CAAa,IAAI+/B,CAAAA,CACpB,IAAID,CAAAA,CAAS,KAAK,KAAM,CAAA,KAAK,CAC7ByJ,CAAAA,CAAAA,CACA,MACA,CAAA,IACF,CAEA,CAAA,IAAA,CAAK,eAAkB,CAAA,IAAIpJ,EACzB,CAAA,IAAA,CAAK,KAAM,CAAA,KAAA,CACXvxB,EACAE,CACCnW,CAAAA,CAAAA,EAAS,gBAAoB,EAAA,IAAA,CAAQ,QAAW,CAAA,QAAA,CACjDA,CAAS,EAAA,SACX,CAEO,CAAA,IACT,CASS,MAAA,CAAO8J,CAA6C,CAAA,CAC3D,YAAK,UAAa,CAAA,IAAI29B,EACpB,CAAA,IAAA,CAAK,QACL,CAAA,MAAA,CAAO,IAAK39B,CAAAA,CAAI,CAChB,CAAA,MAAA,CAAO,MAAOA,CAAAA,CAAI,CACpB,CAAA,CACO,IACT,CAQS,MAAA,EAAe,CACtB,OAAA,IAAA,CAAK,UAAa,CAAA,IAAIo9B,EAAW,CAAA,IAAA,CAAK,QAAQ,CAAA,CACvC,IACT,CAQS,QAAiB,EAAA,CACxB,YAAK,YAAe,CAAA,IAAIpP,EAAa,CAAA,IAAA,CAAK,QAAQ,CAAA,CAC3C,IACT,CASS,UACP93B,CAAAA,CAAAA,CAAkE,EAAC,CAC7D,CACN,GAAM,CAAE,MAAAqH,CAAAA,CAAAA,CAAS,WAAa,CAAA,KAAA,CAAAvI,CAAQ4P,CAAAA,EAAAA,EAAqB,CAAA,CACzD1O,CAAW,EAAA,EAEb,CAAA,OAAA,IAAA,CAAK,UAAa,CAAA,IAAIynC,GACpB,IAAK,CAAA,QAAA,CACL,CAACpgC,CAAgB,CACjB,CAAA,CAACvI,CAAK,CACR,CACO,CAAA,IACT,CACF,CAAA,CCjMO,IAAM+2C,EAAAA,CAA0B,CACrC7zC,CACAhC,CAAAA,CAAAA,IAEO,CACL,KAAA,CAAAgC,CACA,CAAA,mBAAA,CAAqB,UACrB,CAAA,sBAAA,CAAwBhC,CAAS,EAAA,sBAAA,EAA0B,UAC3D,CAAA,gBAAA,CAAkBA,CAAS,EAAA,gBAAA,EAAoB,aAC/C,eAAiBA,CAAAA,CAAAA,EAAS,eAAmB0O,EAAAA,EAAAA,EAC/C,CAAA,CAAA,CCKK,IAAMonC,EAAN,CAAA,MAAMC,CAAY,CAwCvB,YACE3zC,CACA4zC,CAAAA,CAAAA,CACAC,CAAW,CAAA,KAAA,CACXC,CAAe,CAAA,CAAA,CACf,CAVF,IAAA,CAAQ,kBAAqB,CAAA,KAAA,CAW3B,IAAK,CAAA,GAAA,CAAM9zC,CACX,CAAA,IAAA,CAAK,SAAW,KAChB,CAAA,IAAA,CAAK,aAAgB2I,CAAAA,mBAAAA,CAAO,WAAY,CAAA,EAAE,CAAE,CAAA,QAAA,CAAS,KAAK,CAAA,CAC1D,IAAK,CAAA,cAAA,CAAiBirC,CACtB,CAAA,IAAA,CAAK,SAAWC,CAChB,CAAA,IAAA,CAAK,YAAeC,CAAAA,EACtB,CAUA,MAAM,iBACJ7c,CAAAA,CAAAA,CACyC,CACzC,IAAM72B,CAAM,CAAA,IAAIuzC,CACd,CAAA,IAAA,CAAK,IACL,IAAK,CAAA,cAAA,CACL,IACA,CAAA,IAAA,CAAK,YAAe,CAAA,CACtB,CAIA,CAAA,GAFA,MAAMvzC,CAAAA,CAAI,gBAAiB,EAAA,CAEvB62B,CACF,CAAA,GAAI,CACF,MAAMA,CAAAA,CAAG72B,CAAG,CAAA,CACZ,MAAMA,CAAAA,CAAI,MAAO,GACnB,CAAS1F,MAAAA,CAAAA,CAAO,CACd,MAAA,MAAM0F,CAAI,CAAA,QAAA,GACJ1F,CACR,CAGF,OAAO0F,CACT,CAKA,MAAM,gBAAkC,EAAA,CACtC,IAAM2zC,CAAAA,CAAa,IAAK,CAAA,sBAAA,EAExB,CAAA,GAAI,KAAK,QAAU,CAAA,CACjB,IAAMC,CAAAA,CAAY,IAAK,CAAA,gBAAA,EACvB,CAAA,OAAQ,IAAK,CAAA,GAAA,CAAI,IAAM,EACrB,KAAK,OAAA,CACH,MAAM,IAAA,CAAK,GAAI,CAAA,QAAA,CAAS,CAAoBA,iBAAAA,EAAAA,CAAS,CAAE,CAAA,CAAA,CACvD,IAAK,CAAA,QAAA,CAAW,IAChB,CAAA,OACF,KAAK,OAAA,CACL,KAAK,SAAA,CACL,KAAK,UACL,CAAA,KAAK,aACL,CAAA,KAAK,UACH,CAAA,MAAM,IAAK,CAAA,GAAA,CAAI,QAAS,CAAA,CAAA,UAAA,EAAaA,CAAS,CAAA,CAAE,CAChD,CAAA,IAAA,CAAK,SAAW,IAChB,CAAA,OACF,KAAK,QAAA,CACH,MAAM,IAAA,CAAK,GAAI,CAAA,QAAA,CAAS,CAAaA,UAAAA,EAAAA,CAAS,CAAE,CAAA,CAAA,CAChD,IAAK,CAAA,QAAA,CAAW,KAChB,MACJ,CACF,CAGA,OAAQ,IAAK,CAAA,GAAA,CAAI,IAAM,EACrB,KAAK,OAAA,CACCD,CACF,EAAA,MAAM,IAAK,CAAA,GAAA,CAAI,SAASA,CAAU,CAAA,CAGpC/0C,CAAI,CAAA,mBAAA,CAAqB,IAAK,CAAA,GAAA,CAAI,IAAI,CAAA,CACtC,IAAMi1C,CAAAA,CAAwB,MAAM,IAAA,CAAK,wBAAyB,EAAA,CAClE,MACE,IAAK,CAAA,GAAA,CAAI,aACT,CAAA,KAAA,CAAMA,CAAqB,CAAA,CAC7B,IAAK,CAAA,QAAA,CAAW,IAChB,CAAA,MACF,KAAK,OAAA,CACL,KAAK,SAAA,CACCF,GACF,MAAM,IAAA,CAAK,GAAI,CAAA,QAAA,CAASA,CAAU,CAAA,CAGpC,IAAM1xC,CAAAA,CAAkB,IAAK,CAAA,GAAA,CAC1B,aACHrD,CAAAA,CAAAA,CAAI,mBAAqB,CAAA,IAAA,CAAK,IAAI,IAAI,CAAA,CACtC,MAAMqD,CAAAA,CAAgB,gBAAiB,EAAA,CAEvC,IAAK,CAAA,QAAA,CAAW,IAChB,CAAA,MACF,KAAK,UAAA,CACL,KAAK,aAAA,CACH,MAAM,IAAK,CAAA,GAAA,CAAI,QAAS,CAAA,mBAAmB,CACvC0xC,CAAAA,CAAAA,EACF,MAAM,IAAA,CAAK,GAAI,CAAA,QAAA,CAASA,CAAU,CAAA,CAGpC,IAAK,CAAA,QAAA,CAAW,KAChB,MACF,KAAK,QACCA,CAAAA,CAAAA,EACF,MAAM,IAAA,CAAK,GAAI,CAAA,QAAA,CAASA,CAAU,CAAA,CAGpC,MAAM,IAAA,CAAK,GAAI,CAAA,QAAA,CAAS,mBAAmB,CAC3C,CAAA,IAAA,CAAK,QAAW,CAAA,IAAA,CAChB,MACF,KAAK,UAECA,CAAAA,CAAAA,EACF,MAAM,IAAA,CAAK,GAAI,CAAA,QAAA,CAASA,CAAU,CAAA,CAEpC,KAAK,QAAW,CAAA,IAAA,CAChB,KACJ,CACF,CAOA,MAAM,MAAOn2C,CAAAA,CAAAA,CAAsD,CACjE,GAAI,CAAC,IAAA,CAAK,QAAU,CAAA,CAClB,GAAIA,CAAS,EAAA,+BAAA,CACX,MAAM,IAAIrD,CACR,CAAA,qBAAA,CACA,wBACF,CAAA,CAEF8E,CAAO,CAAA,IAAA,CAAK,8CAA8C,CAAA,CAC1D,MACF,CAEA,GAAI,CAEF,GAAI,IAAK,CAAA,QAAA,CAAU,CACjB,IAAM20C,CAAY,CAAA,IAAA,CAAK,gBAAiB,EAAA,CACxC,OAAQ,IAAA,CAAK,GAAI,CAAA,IAAA,EACf,KAAK,OAAA,CACL,KAAK,UAAA,CAEH,MACF,KAAK,OACL,CAAA,KAAK,SACL,CAAA,KAAK,UACL,CAAA,KAAK,aACL,CAAA,KAAK,SACH,MAAM,IAAA,CAAK,GAAI,CAAA,QAAA,CAAS,CAAqBA,kBAAAA,EAAAA,CAAS,CAAE,CAAA,CAAA,CACxD,KACJ,CACA,IAAK,CAAA,QAAA,CAAW,CAChB,CAAA,CAAA,MACF,CAEA,OAAQ,IAAK,CAAA,GAAA,CAAI,IAAM,EACrB,KAAK,OAAA,CACHh1C,CAAI,CAAA,QAAA,CAAU,IAAK,CAAA,GAAA,CAAI,IAAI,CAAA,CAC3B,MACE,IAAA,CAAK,IAAI,aACT,CAAA,MAAA,EACF,CAAA,MACF,KAAK,OAAA,CACL,KAAK,SAAA,CACH,IAAMqD,CAAAA,CAAkB,IAAK,CAAA,GAAA,CAC1B,aACHrD,CAAAA,CAAAA,CAAI,SAAU,IAAK,CAAA,GAAA,CAAI,IAAI,CAAA,CAC3B,MAAMqD,CAAAA,CAAgB,MAAO,EAAA,CAC7B,MACF,KAAK,UACL,CAAA,KAAK,aACH,CAAA,MAAM,KAAK,GAAI,CAAA,QAAA,CAAS,QAAQ,CAAA,CAChC,MACF,KAAK,QACH,CAAA,MAAM,IAAK,CAAA,GAAA,CAAI,QAAS,CAAA,QAAQ,CAChC,CAAA,MACF,KAAK,UACHrD,CAAAA,CAAAA,CAAI,QAAU,CAAA,IAAA,CAAK,GAAI,CAAA,IAAI,CAC3B,CAAA,MACE,IAAK,CAAA,GAAA,CAAI,aACT,CAAA,MAAA,EACF,CAAA,KACJ,CACF,CAAStE,MAAAA,CAAAA,CAAY,CACnB,MAAA2E,CAAO,CAAA,KAAA,CAAM3E,CAAK,CAAA,CACZA,CACR,CAEA,MAAM,IAAA,CAAK,iBAAkB,EAAA,CAC7B,KAAK,QAAW,CAAA,MAClB,CAOA,MAAM,QAASkD,CAAAA,CAAAA,CAAsD,CACnE,GAAI,CAAC,IAAA,CAAK,QAAU,CAAA,CAClB,GAAIA,CAAAA,EAAS,gCACX,MAAM,IAAIrD,CACR,CAAA,uBAAA,CACA,wBACF,CAAA,CAGF8E,CAAO,CAAA,IAAA,CAAK,gDAAgD,CAAA,CAC5D,MACF,CAEA,GAAI,CAEF,GAAI,IAAK,CAAA,QAAA,CAAU,CACjB,IAAM20C,CAAY,CAAA,IAAA,CAAK,gBAAiB,EAAA,CACxC,OAAQ,IAAA,CAAK,GAAI,CAAA,IAAA,EACf,KAAK,QACH,MAAM,IAAA,CAAK,GAAI,CAAA,QAAA,CAAS,CAAwBA,qBAAAA,EAAAA,CAAS,CAAE,CAAA,CAAA,CAC3D,MACF,KAAK,OACL,CAAA,KAAK,SACL,CAAA,KAAK,WACL,KAAK,aAAA,CACL,KAAK,UAAA,CACH,MAAM,IAAA,CAAK,GAAI,CAAA,QAAA,CAAS,CAAyBA,sBAAAA,EAAAA,CAAS,CAAE,CAAA,CAAA,CAC5D,MACF,KAAK,SACH,MAAM,IAAA,CAAK,GAAI,CAAA,QAAA,CAAS,CAAeA,YAAAA,EAAAA,CAAS,CAAE,CAAA,CAAA,CAClD,MACF,QACE,MAAM,IAAIz5C,CACR,CAAA,uBAAA,CACA,6BAA6B,IAAK,CAAA,GAAA,CAAI,IAAI,CAAA,CAC5C,CACJ,CACA,IAAK,CAAA,QAAA,CAAW,CAChB,CAAA,CAAA,MACF,CAEA,OAAQ,IAAK,CAAA,GAAA,CAAI,MACf,KAAK,OACHyE,CAAAA,CAAAA,CAAI,UAAY,CAAA,IAAA,CAAK,GAAI,CAAA,IAAI,CAC7B,CAAA,MACE,IAAK,CAAA,GAAA,CAAI,aACT,CAAA,QAAA,GACF,MACF,KAAK,OACL,CAAA,KAAK,SACH,CAAA,IAAMqD,CAAkB,CAAA,IAAA,CAAK,GAC1B,CAAA,aAAA,CACHrD,CAAI,CAAA,UAAA,CAAY,IAAK,CAAA,GAAA,CAAI,IAAI,CAC7B,CAAA,MAAMqD,CAAgB,CAAA,QAAA,EACtB,CAAA,MACF,KAAK,UAAA,CACL,KAAK,aAAA,CACH,MAAM,IAAA,CAAK,GAAI,CAAA,QAAA,CAAS,UAAU,CAAA,CAClC,MACF,KAAK,QACH,CAAA,MAAM,IAAK,CAAA,GAAA,CAAI,QAAS,CAAA,UAAU,CAClC,CAAA,MACF,KAAK,UAAA,CACHrD,CAAI,CAAA,UAAA,CAAY,KAAK,GAAI,CAAA,IAAI,CAC7B,CAAA,MACE,IAAK,CAAA,GAAA,CAAI,aACT,CAAA,QAAA,EACF,CAAA,MACF,QACE,MAAM,IAAIzE,CAAAA,CACR,wBACA,CAA6B,0BAAA,EAAA,IAAA,CAAK,GAAI,CAAA,IAAI,CAC5C,CAAA,CACJ,CACF,CAAA,MAASG,CAAY,CAAA,CACnB,MAAA2E,CAAAA,CAAO,KAAM3E,CAAAA,CAAK,EACZA,CACR,CAEA,MAAM,IAAA,CAAK,iBAAkB,EAAA,CAC7B,IAAK,CAAA,QAAA,CAAW,MAClB,CAKA,MAAc,iBAAA,EAAmC,CAC/C,GAAI,MAAK,kBAIT,CAAA,CAAA,GAAI,CACF,OAAQ,IAAK,CAAA,GAAA,CAAI,IAAM,EACrB,KAAK,OAAA,CAEH,MACF,KAAK,OACL,CAAA,KAAK,UAED,IAAK,CAAA,GAAA,CAAI,aACT,CAAA,OAAA,EACF,CAAA,MACF,KAAK,UAAA,CACL,KAAK,aAAA,CAED,IAAK,CAAA,GAAA,CAAI,aACT,CAAA,OAAA,GACF,MACF,KAAK,QAEH,CAAA,MACF,KAAK,UAAA,CACH,MACE,IAAA,CAAK,GAAI,CAAA,aAAA,CACT,KAAM,EAAA,CACR,MACF,QACE,MAAM,IAAIH,CAAAA,CACR,gCACA,CAAA,CAAA,0BAAA,EAA6B,IAAK,CAAA,GAAA,CAAI,IAAI,CAAA,CAC5C,CACJ,CACF,CAASG,MAAAA,CAAAA,CAAY,CACnB2E,CAAAA,CAAO,MAAM3E,CAAK,EACpB,CAEA,MAAM,IAAK,CAAA,GAAA,CAAI,eAAgB,EAAA,CAC/B,IAAK,CAAA,GAAA,CAAI,aAAgB,CAAA,IAAA,CACzB,IAAK,CAAA,kBAAA,CAAqB,MAC5B,CAEQ,sBAAA,EAAiC,CAEvC,GAAI,CAAC,IAAA,CAAK,cAAkB,EAAA,IAAA,CAAK,GAAI,CAAA,IAAA,GAAS,OAC5C,CAAA,OAAO,EAGT,CAAA,GAAI,KAAK,GAAI,CAAA,IAAA,GAAS,QAAY,EAAA,IAAA,CAAK,cAAmB,GAAA,cAAA,CACxD,MAAM,IAAIH,CACR,CAAA,qCAAA,CACA,mDACF,CAAA,CAGF,GAAI,IAAA,CAAK,IAAI,IAAS,GAAA,OAAA,EAAW,IAAK,CAAA,GAAA,CAAI,IAAS,GAAA,SAAA,CACjD,OAAO,CAAA,gCAAA,EAAmC,IAAK,CAAA,cAAc,CAG/D,CAAA,CAAA,GAAI,IAAK,CAAA,GAAA,CAAI,OAAS,UAAc,EAAA,IAAA,CAAK,GAAI,CAAA,IAAA,GAAS,aACpD,CAAA,OAAO,CAAmC,gCAAA,EAAA,IAAA,CAAK,cAAc,CAAA,CAAA,CAG/D,GAAI,IAAA,CAAK,GAAI,CAAA,IAAA,GAAS,WAEpB,OAAO,CAAA,gCAAA,EAAmC,IAAK,CAAA,cAAc,CAG/D,CAAA,CAAA,GAAI,IAAK,CAAA,GAAA,CAAI,IAAS,GAAA,QAAA,CACpB,OAAO,EAAA,CAGT,MAAM,IAAIA,EACR,qCACA,CAAA,CAAA,0BAAA,EAA6B,IAAK,CAAA,GAAA,CAAI,IAAI,CAAA,CAC5C,CACF,CAEQ,gBAA2B,EAAA,CACjC,IAAM25C,CAAAA,CAAU,IAAK,CAAA,aAAA,CAAc,MAAM,CAAG,CAAA,CAAC,CAAE,CAAA,WAAA,EAC/C,CAAA,OAAO,CAAM,GAAA,EAAA,IAAA,CAAK,YAAY,CAAA,CAAA,EAAIA,CAAO,CAAA,CAC3C,CAEA,MAAc,0BAEZ,CACA,GAAI,CAAC,IAAA,CAAK,cACR,CAAA,OAGF,IAAMC,CAAAA,CAAyB,MAAM,OAAO,OAAO,CAAA,CAChD,IAAMjyC,CAAAA,CAAAA,EAAWA,EAAO,OAAQ,CAAA,eAAe,CAC/C,CAAA,KAAA,CAAOxH,CAAU,EAAA,CAChB,MAAA2E,CAAAA,CAAO,KAAM3E,CAAAA,CAAK,CACZ,CAAA,IAAII,CAAoB,CAAA,OAAO,CACvC,CAAC,CAAA,CAEH,OAAQ,IAAA,CAAK,cAAgB,EAC3B,KAAK,kBAAA,CACH,OAAOq5C,CAAAA,CAAuB,gBAChC,CAAA,KAAK,gBACH,CAAA,OAAOA,EAAuB,cAChC,CAAA,KAAK,iBACH,CAAA,OAAOA,CAAuB,CAAA,eAAA,CAChC,KAAK,cAAA,CACH,OAAOA,CAAAA,CAAuB,YAChC,CAAA,QACE,MAAM,IAAI55C,EACR,uCACA,CAAA,CAAA,4BAAA,EAA+B,IAAK,CAAA,cAAc,CACpD,CAAA,CACJ,CACF,CACF,CCtdA,CAAA,IAAA65C,EAgGaC,CAAAA,EAAAA,CAAN,MAAMA,EAAAA,SAIHvsC,EAAW,CA+QnB,WAAA,CAAY7K,CAAqC,CAAA,CAC/C,KAAMA,CAAAA,CAA2B,CA9QnC,CAAA,IAAA,CAAQ,iBAAwC,CAAA,IAAA,CAGhD,IAAQ,CAAA,QAAA,CAAoB,KAkB5B,CAAA,IAAA,CAAQ,gBAA0B,CAWlC,CAAA,IAAA,CAAA,aAAA,CAAmD,IAUnD,CAAA,IAAA,CAAA,YAAA,CAA6B,IAAIwK,EAAAA,CAUjC,IAMI,CAAA,eAAA,CAAA,CACF,IAAM5K,CAAAA,CAAAA,CAAI,cAAkB,EAAA,qBAAA,CAC5B,IAAM,CAAA,IAAA,CACN,cAAe,IACf,CAAA,WAAA,CAAa,GACf,CAAA,CAKA,IAGI,CAAA,YAAA,CAAA,CACF,IAAM,CAAA,kBACR,CAsME,CAAA,IAAA,CAAK,OAAWI,CAAAA,CAAAA,EAAO,IAAQ,EAAA,IAAA,CAAK,KAGpC,IAAMq3C,CAAAA,CAAWr3C,CAIjB,CAAA,IAAA,CAAK,YAAe,CAAA,CAClB,GAAGA,CAAAA,CACH,IAAM,CAAA,IAAA,CAAK,OACX,CAAA,IAAA,CAAMq3C,CAAU,EAAA,IAAA,EAAQ,KAAK,IAC7B,CAAA,IAAA,CAAMA,CAAU,EAAA,IAAA,EAAQ,IAAK,CAAA,IAAA,CAC7B,QAAUA,CAAAA,CAAAA,EAAU,QAAY,EAAA,IAAA,CAAK,QACrC,CAAA,QAAA,CAAUA,CAAU,EAAA,QAAA,EAAY,KAAK,QACrC,CAAA,QAAA,CAAUA,CAAU,EAAA,QAAA,EAAY,IAAK,CAAA,QAAA,CACrC,IAAMA,CAAAA,CAAAA,EAAU,IAAQ,EAAA,IAAA,CAAK,IAC/B,CAAA,CAGA,IAAK,CAAA,YAAA,CAAa,mBAAqBr3C,CAAO,EAAA,kBAAA,EAAsB,CAClE,KAAA,CAAO,CACL,UAAA,CAAY,CACZ,CAAA,KAAA,CAAO,CACT,CACF,CAGA,CAAA,IAAA,CAAK,YAAa,CAAA,kBAAA,CAAqBA,GAAO,kBAAsB,EAAA,CAClE,QAAU4L,CAAAA,EAAAA,CAAc,IAAK,CAAA,OAAO,CACpC,CAAA,WAAA,CAAa,OACb,CAAA,YAAA,CAAc,OACd,CAAA,YAAA,CAAc,OAChB,CAAA,CAGA,KAAK,SAAa5L,CAAAA,CAAAA,EAAO,aAAe,EAAA,IAAA,EAAQ,EAAC,CACjD,IAAK,CAAA,YAAA,CAAeA,CAAO,EAAA,aAAA,EAAe,YAAgB,EAAA,IAAA,CAAK,YAG/D,CAAA,IAAA,CAAK,eAAiBA,CAAO,EAAA,OAAA,CAGzBA,CAAO,EAAA,UAAA,GACT,IAAK,CAAA,eAAA,CAAkB,CACrB,IAAA,CAAMA,CAAM,CAAA,UAAA,CAAW,IAAQ,EAAA,IAAA,CAAK,eAAgB,CAAA,IAAA,CACpD,SAAUA,CAAM,CAAA,UAAA,CAAW,QAC3B,CAAA,IAAA,CAAMA,CAAM,CAAA,UAAA,CAAW,IAAQ,EAAA,IAAA,CAAK,eAAgB,CAAA,IAAA,CACpD,aACE,CAAA,eAAA,GAAmBA,CAAM,CAAA,UAAA,CACnBA,CAAM,CAAA,UAAA,CACL,aAAiB,EAAA,IAAA,CAAK,eAAgB,CAAA,aAAA,CACzC,IAAK,CAAA,eAAA,CAAgB,aAC7B,CAAA,CAAA,CAIEA,CAAO,EAAA,OAAA,GACT,IAAK,CAAA,YAAA,CAAe,CAClB,IAAA,CAAMA,EAAM,OAAQ,CAAA,IAAA,EAAQ,IAAK,CAAA,YAAA,CAAa,IAC9C,CAAA,QAAA,CAAUA,CAAM,CAAA,OAAA,CAAQ,QAC1B,CAAA,CAAA,CAIF,IAAK,CAAA,OAAA,CAAWA,CAAO,EAAA,MAAA,EAAU,EAGjC,CAAA,IAAA,CAAK,MAAUA,CAAAA,CAAAA,CAAAA,EAAO,WAAa,EAAA,MAAA,EAAU,EAAC,EAAG,GAC9Cs3C,CAAAA,CAAAA,EAAU,IAAIF,EAAAA,CAAcE,CAAoC,CACnE,EAGA,IAAK,CAAA,cAAA,CAAiBt3C,CAAO,EAAA,WAAA,EAAa,cAAkB,EAAA,YAAA,CAG5D,IAAK,CAAA,oBAAA,CAAuBA,CAAO,EAAA,WAAA,EAAa,qBAClD,CA3PA,uBAA0B,EAAA,CACxB,OAAO,IAAK,CAAA,oBACd,CAUA,WAAW,QAA0B,EAAA,CACnC,GAAI,CAACu3C,EAAA,CAAA,IAAA,CAAKJ,EACR,CAAA,CAAA,MAAM,IAAI75C,CAAAA,CACR,0BACA,4BACF,CAAA,CAGF,OAAOi6C,EAAAA,CAAA,IAAKJ,CAAAA,EAAAA,CACd,CAgBA,aAAa,wBAKXn3C,CAAAA,CAAAA,CACAg6B,CACiC,CAAA,CACjC,IAAMpwB,CAAAA,CAAgB,IAAIwtC,EACxBp3C,CAAAA,CACF,CACA,CAAA,MAAM4J,CAAc,CAAA,4BAAA,EACpB,CAAA,IAAMrH,CAASqH,CAAAA,CAAAA,CACf,OAAMowB,MAAAA,CAAAA,GAAKz3B,CAAM,CAAA,CACVA,CACT,CAeA,aAAa,aAKXi1C,CAAAA,CAAAA,CACAxd,CACe,CAAA,CACf,IAAMpwB,CAAAA,CAAgB,IAAIwtC,EAAAA,CACxBI,CACF,CAAA,CACA,MAAM5tC,CAAAA,CAAc,8BAEpB,CAAA,IAAMrH,CAASqH,CAAAA,CAAAA,CAEf,GAAI,CACF,MAAMowB,CAAAA,CAAGz3B,CAAM,CAAA,CACXqH,CAAc,CAAA,WAAA,EAChB,MAAMA,CAAAA,CAAc,kBAExB,CAAA,MAASnM,CAAO,CAAA,CACd,MAAImM,CAAAA,CAAc,WAChB,EAAA,MAAMA,CAAc,CAAA,eAAA,EAEhBnM,CAAAA,CACR,CACF,CAKA,aAAa,eAAiC,EAAA,CAC5C,GAAI,CAAC85C,EAAA,CAAA,IAAA,CAAKJ,EAAW,CAAA,CAAA,CACnB/0C,CAAO,CAAA,IAAA,CAAK,2BAA2B,CAAA,CACvC,MACF,CAEA,MAAMm1C,EAAA,CAAA,IAAA,CAAKJ,EAAU,CAAA,CAAA,eAAA,EACrBM,CAAAA,EAAAA,CAAA,IAAKN,CAAAA,EAAAA,CAAY,IACnB,EAAA,CAKA,aAAa,UAAA,EAA4B,CACvC,OAAO,KAAK,eAAgB,EAC9B,CAMA,aAAa,sBACXx2C,CAAAA,CAAAA,CACsB,CACtB,OAAO,IAAK,CAAA,QAAA,CAAS,sBAAuBA,CAAAA,CAAO,CACrD,CAMA,aAAa,uBAAyC,EAAA,CACpD,MAAM,IAAA,CAAK,QAAS,CAAA,uBAAA,GACtB,CAMA,aAAa,yBAAA,EAA2C,CACtD,MAAM,IAAK,CAAA,QAAA,CAAS,4BACtB,CAKA,WAAW,qBAAA,EAAiC,CAC1C,OAAO,CAAC,CAAC42C,EAAA,CAAA,IAAA,CAAKJ,EAAW,CAAA,EAAA,iBAC3B,CAwHA,MAAM,SAAyB,CAC7B,GAAII,EAAAH,CAAAA,EAAAA,CAAcD,EAChB,CAAA,CAAA,MAAM,IAAI75C,CAAAA,CACR,wBACA,CAAA,gCACF,CAIF,CAAA,IAAA,CAAK,OAAU,CAAA,MAAMyC,EAAc,CAAA,IAAA,CAAK,OAAS,CAAA,IAAA,CAAK,YAAY,CAAA,CAClE,IAAK,CAAA,QAAA,CAAW,IAGZ,CAAA,IAAA,CAAK,MAAO,CAAA,MAAA,EACd,MAAM,OAAA,CAAQ,GACZ,CAAA,IAAA,CAAK,OAAO,GAAI,CAAA,MAAOu3C,CAAU,EAAA,CAC/BA,CAAM,CAAA,OAAA,CAAU,MAAMv3C,EAAAA,CACpBu3C,CAAM,CAAA,OAAA,CACNA,CAAM,CAAA,YACR,CACAA,CAAAA,CAAAA,CAAM,SAAW,KACnB,CAAC,CACH,CAAA,CAIFG,EAAAL,CAAAA,EAAAA,CAAcD,EAAY,CAAA,IAAA,EAC5B,CASA,IAAI,WAAuB,EAAA,CACzB,OAAO,CAAC,CAAC,IAAK,CAAA,OAAA,EAAW,CAAC,CAAC,IAAK,CAAA,aAClC,CAKA,IAAI,qBAAiC,EAAA,CACnC,OAAO,CAAC,CAAC,IAAA,CAAK,iBAChB,CAKA,IAAI,MAAY,EAAA,CACd,OAAO,IAAA,CAAK,OACd,CAMA,QAA0C,EAAA,CACxC,GAAI,CAAC,IAAK,CAAA,MAAA,CAAO,OACf,OAAO,IAAA,CAGT,GAAI,IAAA,CAAK,cAAmB,GAAA,QAAA,CAC1B,OAAO,IAAA,CAAK,MAAO,CAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,MAAO,EAAA,CAAI,KAAK,MAAO,CAAA,MAAM,CAAC,CAAA,CAGnE,IAAMG,CAAAA,CAAQ,IAAK,CAAA,MAAA,CAAO,IAAK,CAAA,eAAA,CAAkB,IAAK,CAAA,MAAA,CAAO,MAAM,CAAA,CACnE,YAAK,eAAmB,CAAA,CAAA,IAAA,CAAK,eAAkB,CAAA,CAAA,EAAK,IAAK,CAAA,MAAA,CAAO,MACzDA,CAAAA,CACT,CAsBA,MAAM,QACJ93C,CAAAA,CAAAA,CACAk4C,CACGC,CAAAA,GAAAA,CAAAA,CACgC,CACnC,GAAI,CAAC,IAAK,CAAA,YAAA,CACR,MAAM,IAAIr6C,CACR,CAAA,yBAAA,CACA,8BACF,CAAA,CAGF,IAAMs6C,CAAAA,CAAmB,IAAK,CAAA,SAAA,CAAUp4C,CAAG,CAC3C,CAAA,GAAI,CAACo4C,CAAAA,CACH,MAAM,IAAIt6C,CACR,CAAA,yBAAA,CACA,CAAOkC,IAAAA,EAAAA,CAAa,CACtB,oCAAA,CAAA,CAAA,CAGF,IAAMq4C,CAAAA,CAAoBD,EAA8B,MAClDE,CAAAA,CAAAA,CACJ,OAAOJ,CAAAA,EAAkB,QAAYG,EAAAA,CAAAA,GAAqBF,CAAS,CAAA,MAAA,CAEjEjtC,CACA8M,CAAAA,CAAAA,CAAc,EAAC,CAEfsgC,CACFptC,EAAAA,CAAAA,CAAMgtC,EACNlgC,CAAOmgC,CAAAA,CAAAA,GAEPjtC,CAAM,CAAA,MAAA,CACN8M,CACEkgC,CAAAA,CAAAA,GAAkB,MAAY,CAAA,CAACA,CAAe,CAAA,GAAGC,CAAQ,CAAA,CAAIA,CAGjE,CAAA,CAAA,IAAMI,EAAaxsC,EAAW,CAAA,IAAA,CAAK,SAAUiM,CAAAA,CAAI,CAAC,CAAA,CAC5CwgC,CAAYD,CAAAA,CAAAA,CACd,CAAGv4C,EAAAA,CAAa,CAAIu4C,CAAAA,EAAAA,CAAU,CAC7Bv4C,CAAAA,CAAAA,CAAAA,CAECy4C,EAAc,MAAM,IAAA,CAAK,YAAa,CAAA,GAAA,CAAaD,CAAS,CAAA,CAClE,GAAIC,CAAAA,GAAgB,MAClB,CAAA,OAAOA,CAGT,CAAA,IAAMC,CAAiB,CAAA,MAAON,EAA8B,GAAGpgC,CAAI,CACnE,CAAA,OAAA,MAAM,IAAK,CAAA,YAAA,CAAa,GAAIwgC,CAAAA,CAAAA,CAAWE,CAAgBxtC,CAAAA,CAAG,CACnDwtC,CAAAA,CACT,CAYA,MAAM,aAAgC14C,CAAWgY,CAAAA,GAAAA,CAAAA,CAA4B,CAC3E,GAAI,CAAC,IAAA,CAAK,YACR,CAAA,MAAM,IAAIla,CAAAA,CACR,6BACA,CAAA,8BACF,CAGF,CAAA,IAAMs6C,CAAmB,CAAA,IAAA,CAAK,SAAUp4C,CAAAA,CAAG,CAC3C,CAAA,GAAI,CAACo4C,CAAAA,CACH,MAAM,IAAIt6C,CACR,CAAA,6BAAA,CACA,CAAOkC,IAAAA,EAAAA,CAAa,CACtB,oCAAA,CAAA,CAAA,CAKF,GAF0Bo4C,CAA8B,CAAA,MAAA,CAEjC,CAAKpgC,EAAAA,CAAAA,CAAK,MAAW,GAAA,CAAA,CAAG,CAC7C,IAAMwgC,CAAYx4C,CAAAA,CAAAA,CAClB,MAAM,IAAA,CAAK,YAAa,CAAA,UAAA,CAAWw4C,CAAS,CAC5C,CAAA,MACF,CAEA,IAAMD,CAAaxsC,CAAAA,EAAAA,CAAW,IAAK,CAAA,SAAA,CAAUiM,CAAI,CAAC,CAC5CwgC,CAAAA,CAAAA,CAAYD,CACd,CAAA,CAAA,EAAGv4C,CAAa,CAAIu4C,CAAAA,EAAAA,CAAU,CAC7Bv4C,CAAAA,CAAAA,CAAAA,CAEL,MAAM,IAAA,CAAK,YAAa,CAAA,UAAA,CAAWw4C,CAAS,EAC9C,CAMA,MAAM,kBAAmBx4C,CAAAA,CAAAA,CAA4B,CACnD,GAAI,CAAC,IAAK,CAAA,YAAA,CACR,MAAM,IAAIlC,CACR,CAAA,mCAAA,CACA,8BACF,CAAA,CAGF,MAAM,IAAA,CAAK,YAAa,CAAA,aAAA,CAAckC,CAAG,EAC3C,CAQA,MAAM,KAAA,CAAMmB,CAA0C,CAAA,CACpD,IAAMw3C,CAAAA,CAAS,IAAIf,EAAAA,CAAc,IAAK,CAAA,YAAY,CAIlD,CAAA,OAFEe,EAAO,OAAY,GAAA,QAAA,EAAY,CAAC,CAACx3C,CAAS,EAAA,kBAAA,EAG1Cw3C,CAAO,CAAA,OAAA,CAAU,MAAMp4C,EAAAA,CACrBo4C,CAAO,CAAA,OAAA,CACP,IAAK,CAAA,YACP,EACAA,CAAO,CAAA,QAAA,CAAW,IAElBA,GAAAA,CAAAA,CAAO,OAAU,CAAA,IAAA,CAAK,OACtBA,CAAAA,CAAAA,CAAO,QAAW,CAAA,KAAA,CAAA,CAGbA,CACT,CAKA,SAAe,EAAA,CACb,OAAO,IAAK,CAAA,OACd,CAOA,KAAA,CACEx1C,CACAhC,CAAAA,CAAAA,CACc,CACd,IAAMy3C,CACJ,CAAA,IAAA,CAAK,qBAAyB,EAAA,IAAA,CAAK,iBAAmB,EAAA,QAAA,CAClD,KAAK,iBAAkB,CAAA,GAAA,CACvB,IAEAjG,CAAAA,CAAAA,CAAK,IAAIzC,CAAAA,CACb8G,EAAwB7zC,CAAAA,CAAAA,CAAOhC,CAAO,CAAA,CACtCy3C,CACF,CAAA,CAEA,OAAIz3C,CAAAA,EAAS,OACXwxC,CAAG,CAAA,IAAA,CAAKxvC,CAAOhC,CAAAA,CAAAA,CAAQ,KAAK,CAAA,CAGvBwxC,CACT,CAKA,QACExvC,CAAAA,CAAAA,CACAhC,CACsC,CAAA,CACtC,OAAO,IAAI41C,GAAgBC,EAAwB7zC,CAAAA,CAAAA,CAAOhC,CAAO,CAAA,CAAG,IAAI,CAC1E,CAKA,UAAA,CAAA,GAAc6W,CAAkD,CAAA,CAC9D,IAAM6mB,CAAAA,CAAS,IAAItD,EAAAA,CAAO,KAAK,SAAU,EAAC,CAC1C,CAAA,OAAAsD,CAAO,CAAA,UAAA,CAAW,GAAG7mB,CAAI,CAClB6mB,CAAAA,CAAAA,CAAO,eAChB,CAKA,WAAe7mB,CAAAA,GAAAA,CAAAA,CAAiD,CAC9D,IAAM6mB,CAAAA,CAAS,IAAItD,EAAAA,CAAO,IAAK,CAAA,SAAA,EAAW,CAAA,CAC1C,OAAAsD,CAAAA,CAAO,WAAY,CAAA,GAAG7mB,CAAI,CAAA,CACnB6mB,EAAO,eAAgB,CAAA,CAAC,CAAK,EAAA,EACtC,CAMA,MAAM,sBACJ19B,CAAAA,CAAAA,CACsB,CACtB,IAAMw3C,CAAS,CAAA,MAAM,IAAK,CAAA,KAAA,GAC1B,OAAAA,CAAAA,CAAO,aAAgB,CAAA,MAAMA,CAAO,CAAA,aAAA,EACpC,CAAA,IAAA,CAAK,iBAAoB,CAAA,IAAI1B,EAAY0B,CAAAA,CAAAA,CAAQx3C,CAAS,EAAA,cAAc,EACxE,MAAM,IAAA,CAAK,iBAAkB,CAAA,gBAAA,EACtB,CAAA,IAAA,CAAK,iBACd,CAMA,MAAM,uBAAA,CACJA,CACe,CAAA,CACf,GAAI,CAAC,KAAK,iBACR,CAAA,MAAM,IAAIrD,CAAAA,CACR,wCACA,CAAA,gCACF,CAGF,CAAA,MAAM,IAAK,CAAA,iBAAA,CAAkB,MAAO,CAAA,CAClC,+BAAiCqD,CAAAA,CAAAA,EAAS,+BAC5C,CAAC,CAAA,CACD,IAAK,CAAA,iBAAA,CAAoB,KAC3B,CAKA,MAAM,yBAAA,CACJA,CACe,CAAA,CACf,GAAI,CAAC,IAAK,CAAA,iBAAA,CAAmB,CAC3ByB,CAAO,CAAA,IAAA,CACL,2EACF,CAAA,CACA,MACF,CAEA,MAAM,IAAA,CAAK,iBAAkB,CAAA,QAAA,CAAS,CACpC,+BAAA,CAAiCzB,CAAS,EAAA,+BAC5C,CAAC,CACD,CAAA,IAAA,CAAK,iBAAoB,CAAA,KAC3B,CAeA,MAAM,gBACJ03C,CAAAA,CAAAA,CAGAC,CAC8C,CAAA,CAC9C,IAAM33C,CAAAA,CACJ,OAAO03C,CAAAA,EAAgB,WAAaC,CAAeD,CAAAA,CAAAA,CAGrD,GAAI,IAAA,CAAK,iBAAmB,EAAA,QAAA,CAAU,CACpC,GAAI,OAAOA,CAAAA,EAAgB,UACzB,CAAA,GAAI,CACF,MAAM,KAAK,iBAAkB,CAAA,iBAAA,CAAkBA,CAAW,CAAA,CAC1D,MACF,CAAA,MAAS56C,CAAO,CAAA,CACd,MAAMA,CACR,CAIF,OADe,MAAM,IAAA,CAAK,kBAAkB,iBAAkB,EAEhE,CAEA,IAAM06C,CAAS,CAAA,MAAM,IAAK,CAAA,KAAA,EAC1BA,CAAAA,CAAAA,CAAO,aAAgB,CAAA,MAAMA,CAAO,CAAA,aAAA,GACpC,IAAMI,CAAAA,CAAS,IAAI9B,EAAAA,CAAY0B,CAAQx3C,CAAAA,CAAAA,EAAS,cAAc,CAAA,CAG9D,GAFA,MAAM43C,CAAO,CAAA,gBAAA,EAET,CAAA,OAAOF,GAAgB,UACzB,CAAA,GAAI,CACF,MAAMA,CAAYE,CAAAA,CAAM,CACxB,CAAA,MAAMA,CAAO,CAAA,MAAA,CAAO,CAClB,+BAAA,CAAiC,CACnC,CAAA,CAAC,EACD,MACF,CAAA,MAAS96C,CAAO,CAAA,CACd,MAAM86C,MAAAA,CAAAA,CAAO,QAAS,CAAA,CACpB,+BAAiC,CAAA,KACnC,CAAC,CAAA,CACK96C,CACR,CAGF,OAAO86C,CACT,CAUA,MAAM,WAAA,CACJF,CAGAC,CAAAA,CAAAA,CAC6B,CAC7B,OAAO,IAAK,CAAA,gBAAA,CACVD,CACAC,CAAAA,CACF,CACF,CAKA,gBACE1wC,CACiB,CAAA,CACjB,GAAI,CAAC,IAAK,CAAA,WAAA,CACR,MAAM,IAAItK,CACR,CAAA,gCAAA,CACA,4BACF,CAAA,CAGF,OAAI,IAAA,CAAK,mBAAmB,QACnB,CAAA,IAAIq4C,EACT/tC,CAAAA,CAAAA,CACA,IAAK,CAAA,iBAAA,CAAkB,GACzB,CAAA,CAGK,IAAI+tC,EAAAA,CAAa/tC,CAAuB,CAAA,IAAI,CACrD,CAMA,SAAgC,CAC9B,GAAI,CAAC,IAAA,CAAK,OACR,CAAA,MAAM,IAAItK,CAAAA,CACR,wBACA,CAAA,4BACF,CAGF,CAAA,OAAO,IAAK,CAAA,OACd,CAMA,MAAM,aAAA,EAAqD,CACzD,GAAI,IAAK,CAAA,aAAA,CACP,OAAO,IAAA,CAAK,aAGd,CAAA,GAAI,CAAC,IAAA,CAAK,OACR,CAAA,MAAM,IAAIA,CAAAA,CACR,8BACA,CAAA,4BACF,CAGF,CAAA,OAAQ,IAAK,CAAA,OAAA,EACX,KAAK,OACL,CAAA,KAAK,SAEH,CAAA,OAAQ,MADU,IAAA,CAAK,QACC,aAAc,EAAA,CACxC,KAAK,UAAA,CACL,KAAK,aAAA,CAEH,OAAQ,MADO,IAAK,CAAA,OAAA,CACC,OAAQ,EAAA,CAC/B,KAAK,QAAA,CACH,OAAO,IAAK,CAAA,OAAA,CACd,KAAK,OAAA,CAEH,OADkB,IAAA,CAAK,OACN,CAAA,WAAA,EACnB,CAAA,KAAK,UAEH,CAAA,OAAQ,MADa,IAAA,CAAK,QACC,aAAc,EAAA,CAC3C,QACE,MAAM,IAAIA,CAAAA,CACR,8BACA,CAAA,CAAA,0BAAA,EAA6B,IAAK,CAAA,OAAO,CAC3C,CAAA,CACJ,CACF,CAOA,MAAM,eAAiC,EAAA,CACrC,GAAI,CAAC,IAAK,CAAA,WAAA,CAAa,CACrByE,CAAAA,CAAI,8CAAgD,CAAA,IAAA,CAAK,IAAI,CAAA,CAC7D,MACF,CAEA,GAAI,CAAC,IAAA,CAAK,QAAU,CAAA,CAClB,IAAK,CAAA,aAAA,CAAgB,IACrB,CAAA,MACF,CAEA,GAAI,CACE,IAAA,CAAK,iBAAmB,EAAA,QAAA,EAC1B,MAAM,IAAK,CAAA,yBAAA,CAA0B,CACnC,+BAAA,CAAiC,CACnC,CAAA,CAAC,EAEL,CAAA,KAAmB,CACjBK,CAAAA,CAAO,IACL,CAAA,8EACF,EACF,CAmBA,OAjBA,MAAM,IAAA,CAAK,YAAc,EAAA,UAAA,IAErB,CAAA,IAAA,CAAK,MAAO,CAAA,MAAA,EACd,MAAM,OAAA,CAAQ,GACZ,CAAA,IAAA,CAAK,MAAO,CAAA,GAAA,CAAI,MAAOk1C,CAAU,EAAA,CAC/B,GAAI,CACF,MAAMA,CAAAA,CAAM,eAAgB,GAC9B,CAAS92C,MAAAA,CAAAA,CAAU,CACjB4B,CAAAA,CAAO,IACL,CAAA,CAAA,uEAAA,EAA0E5B,EAAI,OAAO,CAAA,CACvF,EACF,CACF,CAAC,CACH,CAGFuB,CAAAA,CAAAA,CAAI,oBAAsB,CAAA,IAAA,CAAK,IAAI,CAAA,CAC3B,IAAK,CAAA,OAAA,EACX,KAAK,OAAA,CACL,KAAK,SAAA,CACH,MAAO,IAAA,CAAK,OAAoC,CAAA,GAAA,EAChD,CAAA,MACF,KAAK,UAAA,CACL,KAAK,aAAA,CACH,MAAO,IAAK,CAAA,OAAA,CAAiC,GAAI,EAAA,CACjD,MACF,KAAK,QACH,CAAA,MAAM,IAAI,OAAA,CAAc,CAAC8E,CAAAA,CAASC,CAAW,GAAA,CAC1C,KAAK,OAAqC,CAAA,KAAA,CAAOtG,CAAQ,EAAA,CACpDA,CACFsG,EAAAA,CAAAA,CAAOtG,CAAG,CAAA,CAEZqG,CAAQ,GACV,CAAC,EACH,CAAC,CAAA,CACD,MACF,KAAK,OAAA,CACH,MAAO,IAAA,CAAK,OAA8B,CAAA,KAAA,EAC1C,CAAA,MACF,KAAK,UAAA,CACH,MAAO,IAAA,CAAK,OAAiC,CAAA,KAAA,GAC7C,MACF,QACE,MAAM,IAAIvJ,CACR,CAAA,gCAAA,CACA,CAA6B,0BAAA,EAAA,IAAA,CAAK,OAAO,CAAA,CAC3C,CACJ,CAEA,IAAK,CAAA,OAAA,CAAU,KACf,IAAK,CAAA,aAAA,CAAgB,KACvB,CAKA,oBAAoD,EAAA,CAClD,OAAO,CACL,IAAM,CAAA,IAAA,CAAK,SAAU,EAAA,CACrB,IAAM,CAAA,IAAA,CAAK,IACX,CAAA,IAAA,CAAM,IAAK,CAAA,IAAA,CACX,QAAU,CAAA,IAAA,CAAK,QACf,CAAA,QAAA,CAAU,IAAK,CAAA,QAAA,CACf,QAAU,CAAA,IAAA,CAAK,QACf,CAAA,kBAAA,CAAoB,IAAK,CAAA,YAAA,CACtB,mBACH,kBAAoB,CAAA,IAAA,CAAK,YAAa,CAAA,kBACxC,CACF,CAKA,MAAM,UAAA,EAA4B,CAChC,OAAO,IAAK,CAAA,eAAA,EACd,CAOA,MAAM,UAAWqD,CAAAA,CAAAA,CAAqD,CAGpE,GAFAA,CAAUA,CAAAA,CAAAA,EAAW,CAAE,aAAA,CAAe,KAAM,CAAA,CAExC,IAAK,CAAA,OAAA,GAAY,QAAU,CAAA,CAC7ByB,EAAO,IAAK,CAAA,0DAA0D,CACtE,CAAA,MACF,CAGA,IAAMo2C,CADO,CAAA,CAAA,MAAMtX,EAAW,CAAA,QAAA,CAAS,IAAI,CAAA,EAChB,gBAAiB,EAAA,CAC5C,GAAI,CAACsX,CAAAA,CAAc,MAAQ,CAAA,CACzBp2C,CAAO,CAAA,IAAA,CACL,qEACF,CAAA,CACA,MACF,CAMA,GAJAA,CAAAA,CAAO,IACL,CAAA,CAAA,UAAA,EAAao2C,EAAc,MAAM,CAAA,8BAAA,CACnC,CAEI,CAAA,CAAC73C,CAAS,EAAA,aAAA,CAAe,CAC3B,IAAA,IAAWoC,CAAOy1C,IAAAA,CAAAA,CAChB,MAAM,IAAA,CAAK,QAASz1C,CAAAA,CAAG,EAGzBX,CAAO,CAAA,IAAA,CAAK,CAAsBo2C,mBAAAA,EAAAA,CAAAA,CAAc,MAAM,CAAA,eAAA,CAAiB,CACvE,CAAA,MACF,CAEA,MAAM,IAAK,CAAA,WAAA,CAAY,MAAOr1C,CAAAA,EAAQ,CACpC,IAAWJ,IAAAA,CAAAA,IAAOy1C,CAChB,CAAA,MAAMr1C,CAAI,CAAA,GAAA,CAAI,QAASJ,CAAAA,CAAG,EAE9B,CAAC,CACDX,CAAAA,CAAAA,CAAO,IAAK,CAAA,CAAA,mBAAA,EAAsBo2C,EAAc,MAAM,CAAA,eAAA,CAAiB,EACzE,CAKA,MAAM,QAAA,CACJx2C,CACAH,CAAAA,CAAAA,CAAgB,EAAC,CACjBlB,CACY,CAAA,CACZ,GAAI,CAAC,KAAK,WACR,CAAA,MAAM,IAAIrD,CAAAA,CACR,yBACA,CAAA,4BACF,CAGF,CAAA,IAAMgP,CAAiBD,CAAAA,EAAAA,CAAY,IAAMrK,CAAAA,CAAK,CAG9C,CAAA,OAAA,CAFwBrB,GAAS,eAAmB,EAAA,QAAA,IAE5B,OACf,CAAA,IAAA,CAAK,cAAe,CAAA,MAAO83C,CACzBhO,EAAAA,CAAAA,CACLn+B,CACAzK,CAAAA,CAAAA,CACA42C,CACA,CAAA,IAAA,CAAK,SAAU,EAAA,CACf,KACF,CACD,CAAA,CAGIhO,CAAQn+B,CAAAA,CAAAA,CAAgBzK,CAAQ,CAAA,IAAA,CAAM,IAAK,CAAA,SAAA,EAAa,CAAA,KAAK,CACtE,CAeA,YAAapC,CAAAA,CAAAA,CAAe,CAC1B,OAAO,IAAIke,CAAQle,CAAAA,CAAK,CAC1B,CAKA,MAAM,cAAA,CAAekD,CAAyC,CAAA,CAC5D,GAAM,CAACmF,CAAS4wC,CAAAA,CAAAA,CAAS1c,EAAa/yB,CAAU,CAAA,CAAI,MAAM,OAAA,CAAQ,GAAI,CAAA,CACpE,IAAK,CAAA,YAAA,CAAatG,CAAK,CAAA,CACvB,IAAK,CAAA,YAAA,CAAaA,CAAK,CAAA,CACvB,KAAK,iBAAkBA,CAAAA,CAAK,CAC5B,CAAA,IAAA,CAAK,iBAAkBA,CAAAA,CAAK,CAC9B,CAAC,CAED,CAAA,OAAO,CAAE,OAAA,CAAAmF,CAAS,CAAA,OAAA,CAAA4wC,EAAS,WAAA1c,CAAAA,CAAAA,CAAa,UAAA/yB,CAAAA,CAAW,CACrD,CAMA,qBAAwB,EAAA,CACtB,OAAOqC,EAAAA,CACL,MAAO,CAAA,MAAA,CAAO,IAAK,CAAA,OAAO,CAC5B,CACF,CAQA,MAAM,iBAAmD,EAAA,CACvD,GAAI,CAAC,IAAK,CAAA,cAAA,EAAgB,OACxB,CAAA,MAAM,IAAIhO,CAAAA,CACR,kCACA,CAAA,qBACF,EAGF,OAAI,IAAA,CAAK,eACA,CAAA,IAAA,CAAK,eAAgB,CAAA,KAAA,EAG9B,IAAK,CAAA,eAAA,CAAkB,MAAMqM,EAAAA,CAAkB,IAAM,CAAA,IAAA,CAAK,cAAc,CAAA,CACjE,KAAK,eAAiB,EAAA,KAAA,CAC/B,CAMA,MAAM,wBAA+D,EAAA,CACnE,GAAI,CAAC,IAAK,CAAA,cAAA,EAAgB,OACxB,CAAA,MAAM,IAAIrM,CAAAA,CACR,0CACA,qBACF,CAAA,CAGF,OAAI,IAAA,CAAK,eAAiB,EAAA,MAAA,CACjB,IAAK,CAAA,eAAA,EAGd,IAAK,CAAA,eAAA,CAAkB,MAAM6M,EAAAA,CAC3B,IACA,CAAA,IAAA,CAAK,cACP,CACO,CAAA,IAAA,CAAK,eACd,CAAA,CAKA,UAA0C,EAAA,CACxC,OAAO,IAAA,CAAK,eACd,CAKA,iBAAgD,EAAA,CAC9C,OAAO,IAAA,CAAK,cACd,CAKA,gBAAA,EAA4B,CAC1B,OAAO,CAAC,CAAC,IAAK,CAAA,cAAA,EAAgB,OAChC,CAKA,MAAM,YAAA,CAAaxH,CAA2C,CAAA,CAU5D,IAAMI,CATM,CAAA,IAAI6J,CACd,CAAA,CACE,KAAAjK,CAAAA,CAAAA,CACA,sBAAwB,CAAA,UAAA,CACxB,mBAAqB,CAAA,UACvB,CACA,CAAA,IAAA,CAAK,SAAU,EACjB,EAEgB,KAAM,CAAA,CAAC,IAAIg0B,EAAAA,CAAch0B,CAAK,CAAC,CAAC,CAAA,CAAE,GAC9C4mC,CAAAA,CAAAA,CAAc,EAAC,CACnB,GAAI,CACFA,EAAO,MAAM,IAAA,CAAK,QAASxmC,CAAAA,CAAG,EAChC,CAAA,MAASvC,CAAU,CAAA,CACjB,GAAI4L,EAAAA,CAAoB,IAAK,CAAA,SAAA,EAAa5L,CAAAA,CAAG,EAC3C,OAAO,EAET,CAAA,MAAMA,CACR,CACA,IAAMsoC,CAAAA,CAAK,IAAK,CAAA,SAAA,EAChB,CAAA,OAAIA,CAAO,GAAA,QAAA,CACFS,EAAK,GAAKxzB,CAAAA,CAAAA,EAAW,CAC1B,IAAM6qB,CAAU,CAAA,MAAA,CAAO7qB,CAAE,CAAA,IAAA,EAAQ,EAAE,CAAA,CAAE,WAAY,EAAA,CAC3C4iB,CAAW+H,CAAAA,EAAAA,CAAoBoI,EAAIlI,CAAO,CAAA,CAChD,OAAO,CACL,IAAM7qB,CAAAA,CAAAA,CAAE,IACR,CAAA,QAAA,CAAA4iB,CACA,CAAA,UAAA,CAAY5iB,CAAE,CAAA,OAAA,GAAY,CAC1B,CAAA,YAAA,CAAcA,EAAE,UAAc,EAAA,IAAA,CAC9B,YAAc,CAAA,IAChB,CACF,CAAC,CAGIwzB,CAAAA,CAAAA,CAAK,GAAKxzB,CAAAA,CAAAA,EAAW,CAC1B,IAAMtT,CAAO,CAAA,MAAA,CAAOsT,EAAE,WAAeA,EAAAA,CAAAA,CAAE,WAAeA,EAAAA,CAAAA,CAAE,IAAQ,EAAA,EAAE,CAC5D6qB,CAAAA,CAAAA,CAAU,MACd7qB,CAAAA,CAAAA,CAAE,SAAaA,EAAAA,CAAAA,CAAE,SAAaA,EAAAA,CAAAA,CAAE,MAAQ,EAC1C,CAAA,CAAE,WAAY,EAAA,CACR4iB,CAAW+H,CAAAA,EAAAA,CAAoBoI,CAAIlI,CAAAA,CAAO,CAC1C+X,CAAAA,CAAAA,CACJ5iC,CAAE,CAAA,WAAA,GAAgB,MACdA,CAAAA,CAAAA,CAAE,YACFA,CAAE,CAAA,WAAA,GAAgB,MAChBA,CAAAA,CAAAA,CAAE,WACF,CAAA,MAAA,CACFykB,CACA,CAAA,OAAOme,CAAgB,EAAA,QAAA,CAClBA,CAAY,CAAA,WAAA,EAAkB,GAAA,IAAA,CAEnC,OAAOA,CAAgB,EAAA,SAAA,CAClBA,CAEL5iC,CAAAA,CAAAA,CAAE,OAAY,GAAA,MAAA,CACTA,CAAE,CAAA,OAAA,GAAY,CAEhB,CAAA,IAAA,CAGHnI,CACJmI,CAAAA,CAAAA,CAAE,cACFA,EAAAA,CAAAA,CAAE,gBACFA,CAAE,CAAA,YAAA,EACFA,CAAE,CAAA,UAAA,EACF,IACItE,CAAAA,CAAAA,CAASsE,CAAE,CAAA,WAAA,EAAe,IAAO,CAAA,MAAA,CAAOA,CAAE,CAAA,WAAW,CAAI,CAAA,IAAA,CACzDqI,EACJrI,CAAE,CAAA,iBAAA,EAAqB,IAAO,CAAA,MAAA,CAAOA,CAAE,CAAA,iBAAiB,CAAI,CAAA,IAAA,CACxDsI,CAAQtI,CAAAA,CAAAA,CAAE,aAAiB,EAAA,IAAA,CAAO,MAAOA,CAAAA,CAAAA,CAAE,aAAa,CAAI,CAAA,IAAA,CAC5D6iC,CACJ7iC,CAAAA,CAAAA,CAAE,QAAY,EAAA,IAAA,CACV,CAAQA,CAAAA,CAAAA,CAAE,QACV,CAAA,OAAOA,CAAE,CAAA,kBAAA,EAAuB,QAC9B,CAAA,gBAAA,CAAiB,KACf,MAAOA,CAAAA,CAAAA,CAAE,WAAeA,EAAAA,CAAAA,CAAE,QAAY,EAAA,EAAE,CAAE,CAAA,WAAA,EAC5C,CAAA,CACA,gBAAiB,CAAA,IAAA,CACf,MAAOA,CAAAA,CAAAA,CAAE,aAAeA,CAAE,CAAA,QAAA,EAAY,EAAE,CAAA,CAAE,WAAY,EACxD,CACR,CAAA,OAAO,CACL,IAAA,CAAAtT,CACA,CAAA,QAAA,CAAAk2B,CACA,CAAA,UAAA,CAAA6B,EACA,YAAA5sB,CAAAA,CAAAA,CACA,MAAA6D,CAAAA,CAAAA,CACA,SAAA2M,CAAAA,CAAAA,CACA,KAAAC,CAAAA,CAAAA,CACA,YAAAu6B,CAAAA,CACF,CACF,CAAC,CACH,CAKA,MAAM,YAAaj2C,CAAAA,CAAAA,CAA0C,CAU3D,IAAMI,CATM,CAAA,IAAI6J,CACd,CAAA,CACE,KAAAjK,CAAAA,CAAAA,CACA,sBAAwB,CAAA,UAAA,CACxB,mBAAqB,CAAA,UACvB,EACA,IAAK,CAAA,SAAA,EACP,CAAA,CAEgB,KAAM,CAAA,CAAC,IAAI8zB,EAAAA,CAAc9zB,CAAK,CAAC,CAAC,CAAA,CAAE,GAC5CmmC,CAAAA,CAAAA,CAAK,KAAK,SAAU,EAAA,CACtBS,CAAc,CAAA,EAClB,CAAA,GAAI,CACFA,CAAAA,CAAO,MAAM,IAAA,CAAK,QAASxmC,CAAAA,CAAG,EAChC,CAAA,MAASvC,EAAU,CACjB,GAAI4L,EAAoB,CAAA,IAAA,CAAK,SAAU,EAAA,CAAG5L,CAAG,CAAA,CAC3C,OAAO,EAET,CAAA,MAAMA,CACR,CACA,GAAIsoC,CAAO,GAAA,OAAA,EAAWA,CAAO,GAAA,SAAA,CAAW,CACtC,IAAM+P,CAAM,CAAA,IAAI,GAIhB,CAAA,IAAA,IAAW9iC,CAAKwzB,IAAAA,CAAAA,CAAM,CACpB,IAAM/pC,EAAMuW,CAAE,CAAA,QAAA,CACR+iC,CAAW/iC,CAAAA,CAAAA,CAAE,UAAe,GAAA,CAAA,CAC5BnD,CAAMimC,CAAAA,CAAAA,CAAI,GAAIr5C,CAAAA,CAAG,CAAK,EAAA,CAC1B,IAAMA,CAAAA,CAAAA,CACN,QAAS,EAAC,CACV,QAAAs5C,CAAAA,CACF,CACAlmC,CAAAA,CAAAA,CAAI,OAAQ,CAAA,IAAA,CAAKmD,CAAE,CAAA,WAAW,CAC9B8iC,CAAAA,CAAAA,CAAI,GAAIr5C,CAAAA,CAAAA,CAAKoT,CAAG,EAClB,CACA,OAAO,KAAA,CAAM,IAAKimC,CAAAA,CAAAA,CAAI,MAAO,EAAC,CAChC,CAEA,GAAI/P,CAAAA,GAAO,UAAcA,EAAAA,CAAAA,GAAO,cAAe,CAC7C,IAAM+P,CAAM,CAAA,IAAI,GAIhB,CAAA,IAAA,IAAW9iC,CAAKwzB,IAAAA,CAAAA,CAAM,CACpB,IAAM/pC,CAAMuW,CAAAA,CAAAA,CAAE,UACR+iC,CAAAA,CAAAA,CAAW,CAAC,CAAC/iC,CAAE,CAAA,SAAA,CACfnD,CAAMimC,CAAAA,CAAAA,CAAI,GAAIr5C,CAAAA,CAAG,CAAK,EAAA,CAC1B,IAAMA,CAAAA,CAAAA,CACN,OAAS,CAAA,EACT,CAAA,QAAA,CAAAs5C,CACF,CACAlmC,CAAAA,CAAAA,CAAI,OAAQ,CAAA,IAAA,CAAKmD,CAAE,CAAA,WAAW,CAC9B8iC,CAAAA,CAAAA,CAAI,GAAIr5C,CAAAA,CAAAA,CAAKoT,CAAG,EAClB,CACA,OAAO,MAAM,IAAKimC,CAAAA,CAAAA,CAAI,MAAO,EAAC,CAChC,CAGA,IAAMt2C,CAAAA,CAA2B,EAAC,CAClC,IAAWwT,IAAAA,CAAAA,IAAKwzB,CAAM,CAAA,CACpB,IAAM9mC,CAAOsT,CAAAA,CAAAA,CAAE,IACT+iC,CAAAA,CAAAA,CAAW,CAAC,CAAC/iC,CAAE,CAAA,MAAA,CAEfjO,CADkB,CAAA,CAAA,MAAM,IAAK,CAAA,QAAA,CAAS,CAAqBrF,kBAAAA,EAAAA,CAAI,GAAG,CAC/C,EAAA,GAAA,CAAKs2C,CAAOA,EAAAA,CAAAA,CAAG,IAAI,CAAA,CAC5Cx2C,CAAO,CAAA,IAAA,CAAK,CAAE,IAAA,CAAAE,CAAM,CAAA,OAAA,CAAAqF,CAAS,CAAA,QAAA,CAAAgxC,CAAS,CAAC,EACzC,CACA,OAAOv2C,CACT,CAKA,MAAM,iBAAA,CAAkBI,CAA+C,CAAA,CAUrE,IAAMI,CAAAA,CATM,IAAI6J,CAAAA,CACd,CACE,KAAAjK,CAAAA,CAAAA,CACA,sBAAwB,CAAA,UAAA,CACxB,mBAAqB,CAAA,UACvB,CACA,CAAA,IAAA,CAAK,SAAU,EACjB,CAEgB,CAAA,KAAA,CAAM,CAAC,IAAI6zB,GAAmB7zB,CAAK,CAAC,CAAC,CAAA,CAAE,GACnD4mC,CAAAA,CAAAA,CAAc,EAAC,CACnB,GAAI,CACFA,CAAO,CAAA,MAAM,IAAK,CAAA,QAAA,CAASxmC,CAAG,EAChC,CAAA,MAASvC,CAAU,CAAA,CACjB,GAAI4L,EAAAA,CAAoB,IAAK,CAAA,SAAA,EAAa5L,CAAAA,CAAG,CAC3C,CAAA,OAAO,EAAC,CAEV,MAAMA,CACR,CAGA,GADW,IAAA,CAAK,SAAU,EAAA,GACf,QAAU,CAAA,CACnB,IAAMw4C,CAAAA,CAAU,IAAI,GAAA,CACpB,IAAWjjC,IAAAA,CAAAA,IAAKwzB,EAAM,CACpB,IAAMxgC,CAAK,CAAA,MAAA,CAAOgN,CAAE,CAAA,EAAE,CAChBrS,CAAAA,CAAAA,CAAKs1C,CAAQ,CAAA,GAAA,CAAIjwC,CAAE,CAAA,EAAK,CAC5B,IAAA,CAAM,OACN,OAAS,CAAA,EACT,CAAA,eAAA,CAAiB,MAAOgN,CAAAA,CAAAA,CAAE,KAAK,CAAA,CAC/B,iBAAmB,CAAA,EACnB,CAAA,QAAA,CAAUA,CAAE,CAAA,SAAA,EAAa,KACzB,QAAUA,CAAAA,CAAAA,CAAE,SAAa,EAAA,IAC3B,CAEArS,CAAAA,CAAAA,CAAG,OAAQ,CAAA,IAAA,CAAK,MAAOqS,CAAAA,CAAAA,CAAE,IAAI,CAAC,CAC9BrS,CAAAA,CAAAA,CAAG,kBAAkB,IAAK,CAAA,MAAA,CAAOqS,CAAE,CAAA,EAAE,CAAC,CAAA,CACtCijC,CAAQ,CAAA,GAAA,CAAIjwC,CAAIrF,CAAAA,CAAE,EACpB,CACA,OAAO,KAAA,CAAM,KAAKs1C,CAAQ,CAAA,MAAA,EAAQ,CACpC,CAEA,IAAMH,CAAM,CAAA,IAAI,GAChB,CAAA,IAAA,IAAWr2C,CAAO+mC,IAAAA,CAAAA,CAAM,CACtB,IAAM9mC,EAAO,MAAOD,CAAAA,CAAAA,CAAI,IAAQ,EAAA,EAAE,CAC5BhD,CAAAA,CAAAA,CAAMiD,CAAQ,EAAA,CAAA,EAAGD,CAAI,CAAA,gBAAgB,CAAIA,CAAAA,EAAAA,CAAAA,CAAI,WAAW,CAAA,CAAA,CACxDkB,CAAKm1C,CAAAA,CAAAA,CAAI,GAAIr5C,CAAAA,CAAG,CAAK,EAAA,CACzB,IAAMiD,CAAAA,CAAAA,EAAQ,MACd,CAAA,OAAA,CAAS,EAAC,CACV,eAAiB,CAAA,MAAA,CAAOD,CAAI,CAAA,gBAAgB,EAC5C,iBAAmB,CAAA,EACnB,CAAA,QAAA,CAAUA,CAAI,CAAA,SAAA,EAAa,IAC3B,CAAA,QAAA,CAAUA,CAAI,CAAA,SAAA,EAAa,IAC7B,CAAA,CAEAkB,CAAG,CAAA,OAAA,CAAQ,KAAK,MAAOlB,CAAAA,CAAAA,CAAI,WAAW,CAAC,CACvCkB,CAAAA,CAAAA,CAAG,iBAAkB,CAAA,IAAA,CAAK,MAAOlB,CAAAA,CAAAA,CAAI,iBAAiB,CAAC,CACvDq2C,CAAAA,CAAAA,CAAI,IAAIr5C,CAAKkE,CAAAA,CAAE,EACjB,CAEA,OAAO,KAAA,CAAM,IAAKm1C,CAAAA,CAAAA,CAAI,MAAO,EAAC,CAChC,CAKA,MAAM,iBAAA,CACJl2C,EAC0C,CAU1C,IAAMI,CATM,CAAA,IAAI6J,CACd,CAAA,CACE,KAAAjK,CAAAA,CAAAA,CACA,sBAAwB,CAAA,UAAA,CACxB,mBAAqB,CAAA,UACvB,CACA,CAAA,IAAA,CAAK,WACP,CAAA,CAEgB,KAAM,CAAA,CAAC,IAAI+zB,EAAAA,CAAmB/zB,CAAK,CAAC,CAAC,CAAA,CAAE,GACnD4mC,CAAAA,CAAAA,CAAc,EAAC,CACnB,GAAI,CACFA,CAAAA,CAAO,MAAM,IAAA,CAAK,QAASxmC,CAAAA,CAAG,EAChC,CAAA,MAASvC,CAAU,CAAA,CACjB,GAAI4L,EAAAA,CAAoB,IAAK,CAAA,SAAA,GAAa5L,CAAG,CAAA,CAC3C,OAEF,MAAMA,CACR,CAEA,GAAI,CAAC+oC,CAAK,CAAA,MAAA,CACR,OAGF,IAAMzhC,CAAUyhC,CAAAA,CAAAA,CAAK,IAAK/mC,CAAQ,EAAA,MAAA,CAAOA,CAAI,CAAA,WAAW,CAAC,CAAA,CAGzD,OAAO,CACL,IAHW+mC,CAAAA,CAAAA,CAAK,CAAC,CAAA,CAAE,IAGL,EAAA,MAAA,CACd,QAAAzhC,CACF,CACF,CASA,MAAM,WACJmxC,CAAAA,CAAAA,CAAkB,eAClBC,CAAAA,CAAAA,CAAoB,GACF,CAAA,CAClB,IAAM52C,CAAAA,CAAS,IAAK,CAAA,SAAA,GAEpB,GAAI,CACF,OAAQA,CAAAA,EACN,KAAK,UACL,CAAA,KAAK,aAAe,CAAA,CAClB,IAAM62C,CAAAA,CAAS,IAAK,CAAA,kBAAA,CAAmBF,CAAO,CAKxCG,CAAAA,CAAAA,CAAAA,CAJU,MAAM,IAAA,CAAK,QACzB,CAAA,yDAAA,CACA,CAACD,CAAM,CACT,CAAA,EAC4B,IAAO,GAAA,CAAC,CAAG,EAAA,oBAAA,CAEvC,OAAOC,CAAiB,GAAA,CAAA,CAAA,EAAQA,CAAiB,GAAA,GACnD,CAEA,KAAK,OACL,CAAA,KAAK,SAAW,CAAA,CACd,IAAMC,CAAAA,CAAiB,IAAK,CAAA,KAAA,CAAMH,EAAY,GAAI,CAAA,CAKlD,OAJgB,CAAA,MAAM,IAAK,CAAA,QAAA,CACzB,sCACA,CAAA,CAACD,CAASI,CAAAA,CAAc,CAC1B,CAAA,EACc,CAAC,CAAA,GAAI,CAAC,CAAG,EAAA,WAAA,GAAgB,CACzC,CAEA,KAAK,OAAA,CAMH,OALgB,CAAA,CAAA,MAAM,IAAK,CAAA,QAAA,CACzB,uKACA,CAAA,CAACJ,CAASC,CAAAA,CAAS,CACrB,CAC0B,EAAA,SAAA,GAAY,CAAC,CAAA,EAAG,WAAe,EAAA,CAAA,GAAA,GACpC,CAGvB,CAAA,KAAK,UACH,CAAA,GAAI,CACF,IAAMI,CAAa,CAAA,IAAA,CAAK,kBAAmBL,CAAAA,CAAO,CAClD,CAAA,OAAA,MAAM,IAAK,CAAA,QAAA,CACT,CAAoCA,iCAAAA,EAAAA,CAAO,CAAOK,IAAAA,EAAAA,CAAU,CAC9D,QAAA,CAAA,CAAA,CAAA,CACe,MAAM,IAAA,CAAK,QACxB,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA,iCAAA,EAIqBA,CAAU,CAAA;AAAA;AAAA,8BAAA,EAEb,IAAK,CAAA,KAAA,CAAMJ,CAAY,CAAA,GAAI,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAA,CAShD,IACe,QAAU,EAAA,MAAA,GAAW,CACtC,CAASz7C,MAAAA,CAAAA,CAAO,CACd,IAAM+C,CAAAA,CACJ/C,CAAiB,YAAA,KAAA,CAAQA,EAAQ,IAAI,KAAA,CAAM,OAAOA,CAAK,CAAC,EAC1D,OAAA2E,CAAAA,CAAO,IACL,CAAA,CAAA,wCAAA,EAA2C5B,EAAI,OAAO,CAAA,CACxD,EACO,CACT,CAAA,CAGF,KAAK,QACH,CAAA,OAAA4B,EAAO,IACL,CAAA,qEACF,EACO,CAET,CAAA,CAAA,QACE,OAAAA,CAAO,CAAA,IAAA,CACL,qDAAqDE,CAAM,CAAA,CAC7D,CACO,CAAA,CAAA,CACX,CACF,CAAS7E,MAAAA,CAAAA,CAAO,CACd,IAAM+C,CAAAA,CAAM/C,aAAiB,KAAQA,CAAAA,CAAAA,CAAQ,IAAI,KAAM,CAAA,MAAA,CAAOA,CAAK,CAAC,CAAA,CACpE,OAAA2E,CAAO,CAAA,KAAA,CACL,2BAA2B5B,CAAI,CAAA,OAAA,EAAW,IAAK,CAAA,SAAA,CAAU/C,CAAK,CAAC,CAAA,UAAA,EAAa6E,CAAM,CAAc22C,WAAAA,EAAAA,CAAO,kBAAkB,IAAK,CAAA,SAAA,CAAUx7C,CAAK,CAAC,CAAA,CAChJ,EACO,KACT,CACF,CAOA,MAAM,WAAA,CAAYw7C,EAAkB,eAAmC,CAAA,CACrE,IAAM32C,CAAAA,CAAS,KAAK,SAAU,EAAA,CAE9B,GAAI,CACF,OAAQA,GACN,KAAK,UACL,CAAA,KAAK,cAAe,CAClB,IAAM62C,EAAS,IAAK,CAAA,kBAAA,CAAmBF,CAAO,CAKxCM,CAAAA,CAAAA,CAAAA,CAJU,MAAM,IAAA,CAAK,SACzB,qDACA,CAAA,CAACJ,CAAM,CACT,CAAA,EAC4B,OAAO,CAAC,CAAA,EAAG,mBAEvC,OAAOI,CAAAA,GAAiB,IAAQA,CAAiB,GAAA,GACnD,CAEA,KAAK,OAAA,CACL,KAAK,SAKH,CAAA,OAAA,CAJgB,MAAM,IAAA,CAAK,SACzB,0CACA,CAAA,CAACN,CAAO,CACV,CAAA,EACc,CAAC,CAAI,GAAA,CAAC,GAAG,cAAmB,GAAA,CAAA,CAG5C,KAAK,OAMH,CAAA,OAAA,CAAA,CALgB,MAAM,IAAK,CAAA,QAAA,CACzB,kIACA,CAACA,CAAO,CACV,CAAA,EAC0B,YAAY,CAAC,CAAA,EAAG,gBAAkB,CACvC,GAAA,GAAA,CAAA,CAGvB,KAAK,UACH,CAAA,GAAI,CACF,IAAMK,CAAAA,CAAa,KAAK,kBAAmBL,CAAAA,CAAO,EAalD,OAZe,CAAA,MAAM,KAAK,QACxB,CAAA,CAAA;AAAA;AAAA;AAAA,+CAAA,EAGmCK,CAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAA,CAO/C,CACe,GAAA,QAAA,EAAU,MAAW,GAAA,CACtC,OAAS77C,CAAO,CAAA,CACd,IAAM+C,CAAAA,CACJ/C,CAAiB,YAAA,KAAA,CAAQA,CAAQ,CAAA,IAAI,MAAM,MAAOA,CAAAA,CAAK,CAAC,CAAA,CAC1D,OAAA2E,CAAAA,CAAO,IAAK,CAAA,CAAA,qCAAA,EAAwC5B,EAAI,OAAO,CAAA,CAAE,CAC1D,CAAA,CAAA,CACT,CAGF,KAAK,QACH,CAAA,OAAO,GAET,QACE,OAAA4B,CAAO,CAAA,IAAA,CACL,CAAqDE,kDAAAA,EAAAA,CAAM,CAC7D,CAAA,CAAA,CACO,EACX,CACF,CAAA,MAAS7E,CAAO,CAAA,CACd,IAAM+C,CAAAA,CAAM/C,CAAiB,YAAA,KAAA,CAAQA,EAAQ,IAAI,KAAA,CAAM,MAAOA,CAAAA,CAAK,CAAC,CAAA,CACpE,OAAA2E,CAAAA,CAAO,MACL,CAA2B5B,wBAAAA,EAAAA,CAAAA,CAAI,OAAW,EAAA,IAAA,CAAK,SAAU/C,CAAAA,CAAK,CAAC,CAAA,UAAA,EAAa6E,CAAM,CAAc22C,WAAAA,EAAAA,CAAO,CAAkB,eAAA,EAAA,IAAA,CAAK,SAAUx7C,CAAAA,CAAK,CAAC,CAAA,CAChJ,EACO,KACT,CACF,CASQ,kBAAA,CAAmB2Q,CAAqB,CAAA,CAC9C,IAAIorC,CAAAA,CAAO,EACX,IAASxtC,IAAAA,CAAAA,CAAI,CAAGA,CAAAA,CAAAA,CAAIoC,CAAI,CAAA,MAAA,CAAQpC,CAAK,EAAA,CAAA,CACnC,IAAMytC,CAAOrrC,CAAAA,CAAAA,CAAI,UAAWpC,CAAAA,CAAC,CAC7BwtC,CAAAA,CAAAA,CAAAA,CAAQA,CAAQ,EAAA,CAAA,EAAKA,EAAOC,CAC5BD,CAAAA,CAAAA,CAAOA,CAAOA,CAAAA,EAChB,CACA,OAAO,IAAK,CAAA,GAAA,CAAIA,CAAI,CACtB,CAOA,MAAc,cAAA,CACZjZ,CACY,CAAA,CACZ,IAAM+W,CAAAA,CAAQ,KAAK,QAAS,EAAA,CAE5B,GAAI,CAACA,CACH,CAAA,OAAO/W,CAAU,CAAA,IAAI,EAGvB,GAAI,CACF,OAAO,MAAMA,CAAU+W,CAAAA,CAAK,CAC9B,CAAA,MAAS75C,EAAO,CACd,IAAM+C,CAAM/C,CAAAA,CAAAA,YAAiB,KAAQA,CAAAA,CAAAA,CAAQ,IAAI,KAAA,CAAM,OAAOA,CAAK,CAAC,CAEpE,CAAA,GAAI,IAAK,CAAA,oBAAA,CACP,OAAM,MAAA,IAAA,CAAK,qBAAqB+C,CAAK,CAAA,CACnC,IAAM82C,CAAAA,CAAAA,CAAM,IACZ,CAAA,IAAA,CAAMA,CAAM,CAAA,IAAA,CACZ,SAAUA,CAAM,CAAA,QAAA,CAChB,QAAUA,CAAAA,CAAAA,CAAM,QAChB,CAAA,QAAA,CAAUA,CAAM,CAAA,QAAA,CAChB,KAAMA,CAAM,CAAA,OACd,CAAC,CAAA,CAEM/W,CAAU,CAAA,IAAI,CAGvB,CAAA,MAAM//B,CACR,CACF,CAMA,MAAc,4BAAA,EAA8C,CAC1D,IAAA,CAAK,OAAU,CAAA,MAAMT,GAAc,IAAK,CAAA,OAAA,CAAS,IAAK,CAAA,YAAY,CAClE,CAAA,IAAA,CAAK,QAAW,CAAA,KAClB,CACF,CApoDSo3C,CAAAA,EAAAA,CAAA,IAAPuC,OAAAA,CAAAA,EAAAA,CALWtC,EAKJD,CAAAA,EAAAA,CAAkC,IALpC,CAAA,CAAA,IAAMt/B,GAANu/B,EClFA,CAAA,IAAM9vC,EAAN,CAAA,KAAe,CAIpB,WAAA,CAAYvE,CAAqB,CAAA,CAFjC,KAAiB,cAAiB,CAAA,YAAA,CAGhC,IAAK,CAAA,GAAA,CAAMA,CAAO8U,EAAAA,EAAAA,CAAc,SAClC,CAEA,MAAM,YAAajS,CAAAA,CAAAA,CAAwC,CACzD,IAAA,IAAWI,CAAaJ,IAAAA,CAAAA,CAAY,CAClCxD,CAAAA,CAAO,KAAK,CAAqB4D,kBAAAA,EAAAA,CAAAA,CAAU,aAAa,CAAA,CAAE,CAC1D,CAAA,MAAMA,CAAU,CAAA,EAAA,GAChB,IAAMi1B,CAAAA,CAAaj1B,CAAU,CAAA,MAAA,CAAO,eACpC,CAAA,IAAA,IAAWk1B,CAAaD,IAAAA,CAAAA,CACjBC,GAIL,MAAM,IAAA,CAAK,GAAI,CAAA,QAAA,CAASA,CAAS,CAAA,CAGnC,MAAM,IAAA,CAAK,6BAA6Bl1B,CAAS,CAAA,CAC7CA,CAAU,CAAA,cAAA,EACZ,MAAMA,CAAAA,CAAU,cAAe,CAAA,IAAA,CAAK,GAAG,EAE3C,CACF,CAEA,MAAM,cAAeJ,CAAAA,CAAAA,CAAwC,CAC3DA,CAAAA,CAAaA,EAAW,OAAQ,EAAA,CAChC,IAAWI,IAAAA,CAAAA,IAAaJ,CAAY,CAAA,CAClCxD,CAAO,CAAA,IAAA,CAAK,0BAA0B4D,CAAU,CAAA,aAAa,CAAE,CAAA,CAAA,CAC/D,MAAMA,CAAAA,CAAU,IAAK,EAAA,CACrB,IAAMi1B,CAAaj1B,CAAAA,CAAAA,CAAU,MAAO,CAAA,eAAA,CACpC,IAAWk1B,IAAAA,CAAAA,IAAaD,CACjBC,CAAAA,CAAAA,EAIL,MAAM,IAAK,CAAA,GAAA,CAAI,QAASA,CAAAA,CAAS,CAGnC,CAAA,MAAM,IAAK,CAAA,iCAAA,CAAkCl1B,CAAS,CAClDA,CAAAA,CAAAA,CAAU,cACZ,EAAA,MAAMA,CAAU,CAAA,cAAA,CAAe,IAAK,CAAA,GAAG,EAE3C,CACF,CAEA,MAAc,4BAAA,CAA6BA,CAAsB,CAAA,CAC/D,IAAM2zC,CAAAA,CAAuB,IAAI,IAE3Bn4C,CAAAA,CAAAA,CACJ,IAAK,CAAA,GAAA,CAAI,SAAU,EAAA,GAAM,UACrBm4C,CAAAA,CAAAA,CACAA,EACG,WAAY,EAAA,CACZ,OAAQ,CAAA,GAAA,CAAK,GAAG,CAAA,CAChB,OAAQ,CAAA,WAAA,CAAa,EAAE,CAEhC,CAAA,MAAM,IAAK,CAAA,GAAA,CAAI,KAAM,CAAA,IAAA,CAAK,cAAc,CAAA,CAAE,OAAO,CAC/C,IAAA,CAAM3zC,CAAU,CAAA,aAAA,CAChB,SAAAxE,CAAAA,CACF,CAAC,EACH,CAEA,MAAc,iCAAA,CAAkCwE,CAAsB,CAAA,CACpE,MAAM,IAAA,CAAK,GACR,CAAA,KAAA,CAAM,KAAK,cAAc,CAAA,CACzB,KAAM,CAAA,MAAA,CAAQA,CAAU,CAAA,aAAa,CACrC,CAAA,MAAA,GACL,CACF,CAAA,CC7EA,eAAO4zC,EAAAA,CACL72C,CACA82C,CAAAA,CAAAA,CACAh2C,CACAW,CAAAA,CAAAA,CACAvB,EACA,CACA,IAAMX,CAASS,CAAAA,CAAAA,CAAI,SAAU,EAAA,CACvBK,CACJH,CAAAA,CAAAA,EAAiBX,IAAW,OAAWA,EAAAA,CAAAA,GAAW,UAChDa,CAAAA,CAAAA,CAA0B,IAC9Bf,CAAAA,CAAAA,CAAO,IAAK,CAAA,6CAAA,CAAgDE,CAAM,CAElE,CAAA,GAAI,CACF,IAAM4E,CAAuC,CAAA,MAAMhC,EACjD5C,CAAAA,CAAAA,CACAS,EAAI,OAAQ,EACd,CACM6C,CAAAA,CAAAA,CAA0B,MAAMH,EAAAA,CACpCnD,CACAuB,CAAAA,CAAAA,CACAW,CACF,CAEMs1C,CAAAA,CAAAA,CAAkB5yC,CAAe,CAAA,GAAA,CAAKlB,CAAcA,EAAAA,CAAAA,CAAU,IAAI,CAAA,CAClEmB,EAAoBvB,CAAW,CAAA,MAAA,CAAQI,CAC3C8zC,EAAAA,CAAAA,CAAgB,QAAS9zC,CAAAA,CAAAA,CAAU,aAAa,CAClD,EAEA,GAAImB,CAAAA,CAAkB,MAAW,GAAA,CAAA,CAAG,CAClC/E,CAAAA,CAAO,IAAK,CAAA,wBAAwB,EACpC,MACF,CAEA,GAAIy3C,CAAAA,CAAe,CACjB,IAAME,CAAqB5yC,CAAAA,CAAAA,CAAkB,UAC1CnB,CAAcA,EAAAA,CAAAA,CAAU,aAAkB6zC,GAAAA,CAC7C,CAEA,CAAA,GAAIE,CAAuB,GAAA,CAAA,CAAA,CAAI,CAC7B33C,CAAO,CAAA,KAAA,CAAM,CAAuCy3C,oCAAAA,EAAAA,CAAa,CAAE,CAAA,CAAA,CACnE,MACF,CAEA,IAAMxyC,CAAqBF,CAAAA,CAAAA,CAAkB,KAAM4yC,CAAAA,CAAkB,CAEjE32C,CAAAA,CAAAA,GACFD,CAAM,CAAA,MAAMJ,EAAI,gBAAiB,EAAA,CACjCA,CAAMI,CAAAA,CAAAA,CAAI,GAIZ,CAAA,CAAA,MADiB,IAAImE,EAAAA,CAASvE,CAAG,CAClB,CAAA,cAAA,CAAesE,CAAkB,CAAA,CAE5CjE,CACF,EAAA,MAAMD,CAAK,EAAA,MAAA,GAGbf,CAAO,CAAA,IAAA,CAAK,qCAAqC,CAAA,CACjD,MACF,CAEA,IAAMmF,CAAAA,CAAW,IAAID,EAASvE,CAAAA,CAAG,CAC7BK,CAAAA,CAAAA,GACFD,CAAM,CAAA,MAAMJ,CAAI,CAAA,gBAAA,GAChBA,CAAMI,CAAAA,CAAAA,CAAI,GAGZ,CAAA,CAAA,MAAMoE,CAAS,CAAA,cAAA,CAAeJ,CAAiB,CAAA,CAE3C/D,GACF,MAAMD,CAAAA,EAAK,MAAO,GAEtB,CAAS1F,MAAAA,CAAAA,CAAY,CACnB,MAAI2F,GACF,MAAMD,CAAAA,EAAK,QAAS,EAAA,CAGhB1F,CACR,CAEA2E,CAAO,CAAA,IAAA,CAAK,qCAAqC,EACnD,CC3FO,IAAM43C,EAAAA,CAAN,KAAgC,CACrC,aAAa,QAASxB,CAAAA,CAAAA,CAAyB,CAoB7C,OAnBiB,CAAA;;AAAA;AAAA;AAAA,EAInBA,CAAAA,CACC,GAAKtd,CAAAA,CAAAA,EAOG,CANkBA,0BAAAA,EAAAA,CAAAA,CACtB,OAAQ,CAAA,KAAA,CAAO,MAAM,CAAA,CACrB,OAAQ,CAAA,IAAA,CAAM,KAAK,CAAA,CACnB,OAAQ,CAAA,KAAA,CAAO,KAAK,CAAA,CACpB,OAAQ,CAAA,KAAA,CAAO,KAAK,CAAA,CACpB,OAAQ,CAAA,KAAA,CAAO,KAAK,CAC6B,CACrD,GAAA,CAAA,CAAA,CACA,IAAK,CAAA;AAAA,CAAI,CAAC;AAAA;;AAAA;AAAA,CAAA,CAMX,CACF,CCvBO,CAAA,IAAM+e,GAAN,KAAoB,CACzB,OAAO,YAAan6C,CAAAA,CAAAA,CAAsB,CACxC,IAAMo6C,EAAO,IAAK,CAAA,cAAA,CAAep6C,CAAI,CAC/BS,CAAAA,CAAAA,CAAWT,IAAS,QAAW,CAAA,aAAA,CAAgB,UAC/Cq6C,CAAAA,CAAAA,CACJr6C,IAAS,SACL,CAAA,OAAA,CACAA,IAAS,OACP,CAAA,OAAA,CACA,gBAER,OAAIA,CAAAA,GAAS,WAAaA,CAAS,GAAA,OAAA,CAC1B,KAAK,qBACVA,CAAAA,CAAAA,CACAq6C,IAAe,eAAkB,CAAA,KAAA,CAAQA,CAC3C,CAGK,CAAA;AAAA,SAAA,EACAA,CAAU,CAAA;;AAAA,eAAA,EAEJA,CAAU,CAAA;AAAA,SAAA,EAChBr6C,CAAI,CAAA;AAAA,aACAS,EAAAA,CAAQ,CACnBT,EAAAA,EAAAA,CAAAA,GAAS,QACL,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,CAAA,CAAA;AAAA,QAAA,EACEo6C,CAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQZ,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAUA,CAEA,OAAe,qBACbp6C,CAAAA,CAAAA,CACAq6C,CACQ,CAAA,CACR,IAAMC,CAAAA,CAAS,IAAK,CAAA,wBAAA,CAAyBt6C,CAAI,CAAA,CACjD,OAAIs6C,CACK,CAAA;AAAA,SAAA,EACFD,CAAU,CAAA;;AAAA,iBAEFA,EAAAA,CAAU,YAAYC,CAAM,CAAA;AAAA;AAAA;AAAA;;AAAA,kBAAA,CAAA,CAQpC,EACT,CAEA,OAAe,wBAAA,CAAyBt6C,EAAsB,CAC5D,OAAQA,CAAM,EACZ,KAAK,SACH,CAAA,OAAO,qDACT,CAAA,KAAK,QACH,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA,CAOT,QACE,OAAO,EACX,CACF,CAEA,OAAe,cAAA,CAAeA,CAAsB,CAAA,CAClD,OAAQA,CAAM,EACZ,KAAK,OAAA,CACH,OACF,IAAA,CAAA,KAAK,UACH,CAAA,OACF,IAAA,CAAA,KAAK,SACH,CAAA,YACF,KAAK,aAAA,CACH,OAAO,KAAA,CACT,KAAK,OACH,CAAA,OACF,IAAA,CAAA,KAAK,UACH,OAAO,KAAA,CACT,KAAK,OAAA,CACH,OAAO,IAAA,CACT,KAAK,UAAA,CACH,OACF,IAAA,CAAA,QACE,OAAO,IACX,CACF,CACF,CAAA,CCzGA,eAAOu6C,GACLt3C,CACA6G,CAAAA,CAAAA,CACAiJ,CACe,CAAA,CACf,IAAMynC,CAAe1wC,CAAAA,CAAAA,CAAc,SAAU,EAAA,CAC7CxH,EAAO,IAAK,CAAA,CAAA,gBAAA,EAAmBk4C,CAAY,CAAA,CAAE,EAC7C,IAAM/3C,CAAAA,CAAS,MAAMqH,CAAAA,CAAc,QAAS7G,CAAAA,CAAG,CAE/C,CAAA,GADAX,EAAO,IAAK,CAAA,sBAAsB,CAC9ByQ,CAAAA,CAAAA,CAAK,CACP,IAAM0nC,CAAAA,CAAUx2C,mBAAK,CAAA,OAAA,CAAQ8O,CAAG,CAC3BvT,CAAAA,mBAAAA,CAAG,UAAWi7C,CAAAA,CAAO,CACxBj7C,EAAAA,mBAAAA,CAAG,SAAUi7C,CAAAA,CAAAA,CAAS,CAAE,SAAW,CAAA,IAAK,CAAC,CAAA,CAG3Cj7C,oBAAG,aAAcuT,CAAAA,CAAAA,CAAK,IAAK,CAAA,SAAA,CAAUtQ,EAAQ,IAAM,CAAA,CAAC,CAAC,CAAA,CACrDH,CAAO,CAAA,IAAA,CAAK,CAAyByQ,sBAAAA,EAAAA,CAAG,EAAE,CAC1C,CAAA,MACF,CAEAzQ,CAAAA,CAAO,KAAK,IAAK,CAAA,SAAA,CAAUG,CAAQ,CAAA,IAAA,CAAM,CAAC,CAAC,CAAA,CAC3C,MAAMqH,CAAAA,CAAc,aACtB,CC3BO,IAAM4wC,GAAN,KAAsB,CAC3B,OAAO,cAAA,EAAyB,CAC9B,OAAO,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAWT,CACF,ECTA,IAAMC,EAAAA,CAAwB,CAC5Bh4C,CACAi4C,CAAAA,CAAAA,CACAC,CACS,GAAA,CACT,IAAMC,CAAAA,CAAgBD,GAAc,kBAC9BE,CAAAA,CAAAA,CAAYH,CAAa,CAAA,KAAA,CAAQ,KAEjCI,CAAAA,CAAAA,CAAW,GADC,IAAK,CAAA,GAAA,EACM,CAAA,CAAA,EAAIr4C,CAAI,CAAA,EAAGo4C,CAAS,CAE5Cv7C,CAAAA,CAAAA,mBAAAA,CAAG,UAAWs7C,CAAAA,CAAa,CAC9Bt7C,GAAAA,mBAAAA,CAAG,UAAUs7C,CAAe,CAAA,CAAE,SAAW,CAAA,IAAK,CAAC,CAAA,CAC/Cx4C,EAAO,IAAK,CAAA,CAAA,2BAAA,EAA8Bw4C,CAAa,CAAA,CAAE,CAG3D,CAAA,CAAA,IAAM/1C,EAAWd,mBAAK,CAAA,IAAA,CAAK62C,CAAeE,CAAAA,CAAQ,CAC5CC,CAAAA,CAAAA,CAAWP,GAAgB,cAAe,EAAA,CAEhDl7C,oBAAG,aAAcuF,CAAAA,CAAAA,CAAUk2C,CAAQ,CACnC34C,CAAAA,CAAAA,CAAO,IAAK,CAAA,CAAA,6BAAA,EAAgCyC,CAAQ,CAAA,CAAE,EACxD,CAEOm2C,CAAAA,EAAAA,CAAQP,EC3Bf,CAMA,IAAMQ,EAAAA,CAAsB,MAC1BrxC,CAAAA,CACAsxC,EACA12C,CACkB,GAAA,CAClB,IAAM22C,CAAAA,CAAsD,EAAC,CAE7D,QAAWR,CAAcO,IAAAA,CAAAA,CAAa,CACpC,IAAME,CAAer3C,CAAAA,mBAAAA,CAAK,QAAQ,OAAQ,CAAA,GAAA,EAAO42C,CAAAA,CAAU,CAEtDr7C,CAAAA,mBAAAA,CAAG,WAAW87C,CAAY,CAAA,GAC7Bh5C,CAAO,CAAA,KAAA,CAAM,CAAmBg5C,gBAAAA,EAAAA,CAAY,EAAE,CAC9C,CAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAGhB,IAAMC,CAAQ/7C,CAAAA,mBAAAA,CAAG,QAAS87C,CAAAA,CAAY,CAEtC,CAAA,GAAIC,EAAM,WAAY,EAAA,CAAG,CACvB,IAAMC,CAAQh8C,CAAAA,mBAAAA,CACX,YAAY87C,CAAY,CAAA,CACxB,MAAQ30C,CAAAA,CAAAA,EAASA,CAAK,CAAA,QAAA,CAAS,KAAK,CAAKA,EAAAA,CAAAA,CAAK,QAAS,CAAA,KAAK,CAAC,CAAA,CAC7D,MAEH,CAAA,IAAA,IAAWA,CAAQ60C,IAAAA,CAAAA,CACjBH,CAAW,CAAA,IAAA,CAAK,CAAE,IAAA10C,CAAAA,CAAAA,CAAM,MAAQ20C,CAAAA,CAAa,CAAC,EAElD,SAAWC,CAAM,CAAA,MAAA,EAAU,CAAA,CACzB,IAAMP,CAAAA,CAAW/2C,oBAAK,QAASq3C,CAAAA,CAAY,EACrCG,CAAax3C,CAAAA,mBAAAA,CAAK,QAAQq3C,CAAY,CAAA,CAExCN,CAAS,CAAA,QAAA,CAAS,KAAK,CAAA,EAAKA,EAAS,QAAS,CAAA,KAAK,CACrDK,CAAAA,CAAAA,CAAW,IAAK,CAAA,CAAE,KAAML,CAAU,CAAA,MAAA,CAAQS,CAAW,CAAC,CAEtDn5C,EAAAA,CAAAA,CAAO,MAAM,CAAmC04C,gCAAAA,EAAAA,CAAQ,CAAE,CAAA,CAAA,CAC1D,OAAQ,CAAA,IAAA,CAAK,CAAC,CAElB,EAAA,CACF,CAEA,GAAI,CAACK,CAAAA,CAAW,OAAQ,CACtB/4C,CAAAA,CAAO,IAAK,CAAA,kBAAkB,CAC9B,CAAA,MACF,CAEAA,CAAO,CAAA,IAAA,CAAK,CAAS+4C,MAAAA,EAAAA,CAAAA,CAAW,MAAM,CAAA,iBAAA,CAAmB,EAEpDvxC,CAAc,CAAA,WAAA,EACjB,MAAMA,CAAc,CAAA,OAAA,GAGtB,IAAW,GAAA,CAAE,IAAAnD,CAAAA,CAAAA,CAAM,MAAA+0C,CAAAA,CAAO,IAAKL,CAC7B,CAAA,GAAI,CACF/4C,CAAAA,CAAO,IAAK,CAAA,CAAA,gBAAA,EAAmBqE,CAAI,CAAE,CAAA,CAAA,CACrC,IAAMg1C,CAAAA,CAAiB13C,mBAAK,CAAA,OAAA,CAAQy3C,EAAQ/0C,CAAI,CAAA,CAE1Ci1C,CAAe,CAAA,MAAMp3C,EAIxBm3C,CAAAA,CAAAA,CAAgBj3C,CAAY,CAE/B,CAAA,GAAI,CAACk3C,CAAAA,CAAa,OAAS,CAAA,CACzBt5C,EAAO,KAAM,CAAA,CAAA,OAAA,EAAUqE,CAAI,CAAA,gCAAA,CAAkC,CAC7D,CAAA,QACF,CAEA,IAAMk1C,CAAAA,CAAiB,IAAID,CAAAA,CAAa,OAAQ9xC,CAAAA,CAAa,EAE7D,GAAI,OAAO+xC,EAAe,GAAQ,EAAA,UAAA,CAAY,CAC5Cv5C,CAAO,CAAA,KAAA,CACL,CAAUqE,OAAAA,EAAAA,CAAI,CAChB,4EAAA,CAAA,CAAA,CACA,QACF,CAEA,MAAMk1C,CAAe,CAAA,GAAA,EACrBv5C,CAAAA,CAAAA,CAAO,KAAK,CAAuBqE,yBAAAA,EAAAA,CAAI,CAAE,CAAA,EAC3C,CAAShJ,MAAAA,CAAAA,CAAO,CACd,MAAA2E,CAAAA,CAAO,KAAM,CAAA,CAAA,qBAAA,EAAwBqE,CAAI,CAAA,EAAA,EAAKhJ,CAAK,CAAE,CAAA,CAAA,CAC/CA,CACR,CAGF2E,CAAO,CAAA,IAAA,CAAK,oCAAoC,EAClD,CAAA,CAEOw5C,EAAQX,CAAAA,EAAAA,CCpFR,IAAMY,EAAAA,CAAoB,IACXv8C,mBAAG,CAAA,UAAA,CAAWyE,mBAAK,CAAA,IAAA,CAAK,OAAQ,CAAA,GAAA,GAAO,WAAW,CAAC,CAE9D,CAAA,CAAC,MAAQ,CAAA,KAAK,EAEHzE,mBAAG,CAAA,UAAA,CAAWyE,mBAAK,CAAA,IAAA,CAAK,OAAQ,CAAA,GAAA,GAAO,gBAAgB,CAAC,CAEnE,CAAA,CAAC,MAAQ,CAAA,KAAK,EAEAzE,mBAAG,CAAA,UAAA,CACxByE,mBAAK,CAAA,IAAA,CAAK,OAAQ,CAAA,GAAA,GAAO,mBAAmB,CAC9C,CAES,CAAA,CAAC,KAAO,CAAA,SAAS,EAEPzE,mBAAG,CAAA,UAAA,CAAWyE,mBAAK,CAAA,IAAA,CAAK,OAAQ,CAAA,GAAA,GAAO,WAAW,CAAC,EAE7D,CAAC,KAAA,CAAO,KAAK,CAEFzE,CAAAA,mBAAAA,CAAG,UAAWyE,CAAAA,mBAAAA,CAAK,IAAK,CAAA,OAAA,CAAQ,KAAO,CAAA,WAAW,CAAC,CAAA,CAE9D,CAAC,MAAA,CAAQ,KAAK,CAEhB,CAAA,CAAC,KAAO,CAAA,SAAS,CAWb+3C,CAAAA,EAAAA,CAAiB,MAC5BC,CACAC,CAAAA,CAAAA,CACA9f,CACAv7B,CAAAA,CAAAA,GACqB,CACrB,IAAMs7C,EAAKC,mBAAS,CAAA,eAAA,CAAgB,CAClC,KAAA,CAAO,OAAQ,CAAA,KAAA,CACf,OAAQ,OAAQ,CAAA,MAClB,CAAC,CAAA,CAEKC,CAAmBjgB,CAAAA,CAAAA,CAAa,KAAK,IAAI,CAAA,CACzCkgB,CAAS,CAAA,CAAA,wDAAA,EAA2DJ,CAAc,CAAA;AAAA,EAAMG,CAAgB;AAAA,OAE9G,CAAA,CAAA,OAAO,IAAI,OAASt1C,CAAAA,CAAAA,EAAY,CAC9Bo1C,CAAG,CAAA,QAAA,CAASG,CAASC,CAAAA,CAAAA,EAAW,CAG9B,GAFAJ,EAAG,KAAM,EAAA,CAELI,EAAO,WAAY,EAAA,GAAM,KAAOA,CAAO,CAAA,WAAA,EAAkB,GAAA,KAAA,CAAO,CAClEC,sBAAAA,CAASP,EAASp7C,CAAO,CAAA,CACzBkG,EAAQ,IAAI,CAAA,CACZ,MACF,CAEAA,CAAAA,CAAQ,KAAK,EACf,CAAC,EACH,CAAC,CACH,CAAA,CAEa01C,EAA0B,CAAA,MACrCP,CACAQ,CAAAA,CAAAA,CACA18C,IACkB,CAClB,IAAM28C,CAAkBC,CAAAA,EAAAA,CAAiB,QAAS58C,CAAAA,CAAI,EAClD,CAAC,uBAAA,CAAyB,oBAAqB,iBAAiB,CAAA,CAChE,EAEA68C,CAAAA,CAAAA,CAAmB,EACvB,CAAA,OAAQ78C,CAAM,EACZ,KAAK,SACL,CAAA,KAAK,OACH68C,CAAAA,CAAAA,CAAmB,gBACnBF,CAAAA,CAAAA,CAAgB,KAAK,mCAAmC,CAAA,CACxD,MACF,KAAK,aACL,CAAA,KAAK,WACHE,CAAmB,CAAA,YAAA,CACnBF,EAAgB,IAAK,CAAA,mBAAmB,EACxC,MACF,KAAK,QACHE,CAAAA,CAAAA,CAAmB,gBACnBF,CAAAA,CAAAA,CAAgB,KAAK,uBAAuB,CAAA,CAC5C,MACF,KAAK,OACHE,CAAAA,CAAAA,CAAmB,iBACnBF,CAAgB,CAAA,IAAA,CAAK,uBAAuB,CAAA,CAC5C,MACF,KAAK,QACHE,CAAmB,CAAA,gBAAA,CACnBF,EAAgB,IAAK,CAAA,uBAAuB,EAC5C,MACF,KAAK,OACHE,CAAAA,CAAAA,CAAmB,eACnBF,CAAAA,CAAAA,CAAgB,KAAK,qBAAqB,CAAA,CAC1C,MACF,KAAK,UACHE,CAAAA,CAAAA,CAAmB,mBACnBF,CAAgB,CAAA,IAAA,CAAK,yBAAyB,CAAA,CAC9C,MACF,QACE,MAAM,IAAI,KAAA,CAAM,0BAA0B38C,CAAI,CAAA,CAAE,CACpD,CAEA,GAAI68C,CAAkB,CAAA,CACpB,IAAMC,CAAAA,CAAkB,MAAMd,EAC5B,CAAA,CAAA,EAAGE,CAAc,CAAA,CAAA,EAAIQ,CAAqB,CAAA,CAAA,EAAIG,CAAgB,CAC9DX,CAAAA,CAAAA,CAAAA,CACA,CAACW,CAAgB,CACjB,CAAA,CAAE,MAAO,SAAU,CACrB,EAEIC,CACFx6C,EAAAA,CAAAA,CAAO,KAAK,0CAA0C,CAAA,CAGnDw6C,CACHx6C,EAAAA,CAAAA,CAAO,IAAK,CAAA,wCAAwC,EAExD,CAEA,IAAMy6C,CAAUb,CAAAA,CAAAA,GAAmB,MAAS,CAAA,OAAA,CAAU,KACtD,GAAIS,CAAAA,CAAgB,MAAQ,CAAA,CAC1B,IAAMK,CAAAA,CAAe,MAAMhB,EACzB,CAAA,CAAA,EAAGE,CAAc,CAAIQ,CAAAA,EAAAA,CAAqB,IAAIC,CAAgB,CAAA,IAAA,CAAK,GAAG,CAAC,CAAII,CAAAA,EAAAA,CAAO,GAClFb,CACAS,CAAAA,CAAAA,CACA,CAAE,KAAA,CAAO,SAAU,CACrB,EAEIK,CACF16C,EAAAA,CAAAA,CAAO,IAAK,CAAA,yCAAyC,CAGlD06C,CAAAA,CAAAA,EACH16C,EAAO,IAAK,CAAA,uCAAuC,EAEvD,CACF,CAAA,KCnIas6C,EAAmB,CAAA,CAC9B,QACA,CAAA,OAAA,CACA,UACA,CAAA,SAAA,CACA,cACA,OACF,CAAA,CACMK,GAAmBL,EAAiB,CAAA,MAAA,CAAO,UAAW,OAAO,CAAA,CAE7DM,EAAU,CAAA,IAAIC,kBAEpBD,EAAAA,CACG,QAAQ,MAAQ,CAAA,CAAE,UAAW,KAAM,CAAC,EACpC,MACC,CAAA,mBAAA,CACA,CAAwDD,qDAAAA,EAAAA,EAAAA,CAAiB,IAAK,CAAA,IAAI,CAAC,CACnF,CAAA,CAAA,MACF,CACC,CAAA,WAAA,CACC,8MACF,CAAA,CACC,OAAO,MAAOG,CAAAA,EAAwC,CACrD,IAAMC,CAAiBJ,CAAAA,EAAAA,CAAiB,KAAK,IAAI,CAAA,CAC5CG,EAAO,IACV96C,GAAAA,CAAAA,CAAO,MACL,CAA2D+6C,wDAAAA,EAAAA,CAAc,CAC3E,CAAA,CAAA,CACA,OAAQ,CAAA,IAAA,CAAK,CAAC,CAGXJ,CAAAA,CAAAA,EAAAA,CAAiB,QAASG,CAAAA,CAAAA,CAAO,IAAI,CAAA,GACxC96C,EAAO,KACL,CAAA,CAAA,uBAAA,EAA0B86C,CAAO,CAAA,IAAI,CAAsBH,mBAAAA,EAAAA,EAAAA,CAAiB,KAAK,IAAI,CAAC,EACxF,CACA,CAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAGhB36C,CAAO,CAAA,IAAA,CAAK,uDAAuD,CAAA,CACnEA,EAAO,IACL,CAAA,CAAA,eAAA,EAAkB86C,CAAO,CAAA,IAAA,EAAQ,sCAAsC,CAAA,CACzE,EAEA,GAAM,CAAClB,CAAgBQ,CAAAA,CAAqB,CAAIX,CAAAA,EAAAA,GAChDz5C,CAAO,CAAA,IAAA,CAAK,oBAAoB45C,CAAc,CAAA,CAAE,EAEhD55C,CAAO,CAAA,IAAA,CAAK,8BAA8B,CAAA,CAC1C,MAAMm6C,EAAAA,CACJP,EACAQ,CACAU,CAAAA,CAAAA,CAAO,IACT,CAAA,CAEA,IAAMnC,CAAAA,CAAWd,GAAc,YAAaiD,CAAAA,CAAAA,CAAO,IAAI,CAAA,CAClD59C,mBAAG,CAAA,UAAA,CAAW,UAAU,CAG3B8C,CAAAA,CAAAA,CAAO,KAAK,0CAA0C,CAAA,CAFtD9C,oBAAG,SAAU,CAAA,UAAA,CAAY,CAAE,SAAA,CAAW,IAAK,CAAC,EAKzCA,mBAAG,CAAA,UAAA,CAAW,mBAAmB,CAAA,CAGpC8C,CAAO,CAAA,IAAA,CAAK,iDAAiD,CAF7D9C,CAAAA,mBAAAA,CAAG,aAAc,CAAA,mBAAA,CAAqBy7C,CAAQ,CAAA,CAM9C2B,GAAiB,QAASQ,CAAAA,CAAAA,CAAO,IAAI,CACrC,EAAA,CAAC59C,oBAAG,UAAW,CAAA,qBAAqB,CAEpCA,CAAAA,mBAAAA,CAAG,SAAU,CAAA,qBAAA,CAAuB,CAAE,SAAW,CAAA,IAAK,CAAC,CAAA,CAEvD8C,CAAO,CAAA,IAAA,CACL,8EACF,CAGFA,CAAAA,CAAAA,CAAO,IAAK,CAAA,uCAAuC,EACrD,CAAC,EAEH46C,EACG,CAAA,OAAA,CAAQ,WAAW,CACnB,CAAA,KAAA,CAAM,SAAS,CACf,CAAA,MAAA,CAAO,mBAAqB,CAAA,sBAAA,CAAwB,MAAS,CAAA,CAC7D,OACC,yBACA,CAAA,wCAAA,CACA,MACF,CAAA,CACC,MAAO,CAAA,mBAAA,CAAqB,qCAAsC,MAAS,CAAA,CAC3E,MACC,CAAA,+BAAA,CACA,6DACA,CAAA,MACF,EACC,WACC,CAAA,+GACF,EACC,MACC,CAAA,MACEj6C,EACAm6C,CAMG,GAAA,CACH96C,CAAO,CAAA,IAAA,CAAK,wBAAwB,CAAA,CAC/B86C,GAAQ,UACX96C,GAAAA,CAAAA,CAAO,MAAM,uDAAuD,CAAA,CACpE,QAAQ,IAAK,CAAA,CAAC,CAGhB,CAAA,CAAA,IAAIyC,CAAWq4C,CAAAA,CAAAA,EAAQ,KACnB,CAACn6C,CAAAA,EAAO,CAAC8B,CACXzC,GAAAA,CAAAA,CAAO,MAAM,oCAAoC,CAAA,CACjD,OAAQ,CAAA,IAAA,CAAK,CAAC,CAAA,CAAA,CAGZW,GAAO8B,CACTzC,GAAAA,CAAAA,CAAO,KAAM,CAAA,6CAA6C,CAC1D,CAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAGhB,IAAMg5C,CAAAA,CAAer3C,mBAAK,CAAA,OAAA,CAAQ,QAAQ,GAAI,EAAA,CAAGm5C,EAAO,UAAU,CAAA,CAC5D,CAAE,OAASE,CAAAA,CAAM,CAAI,CAAA,MAAM94C,EAE9B82C,CAAAA,CAAAA,CAAc8B,GAAQ,YAAY,CAAA,CAErC,GAAIn6C,CAAAA,CAAK,CACPX,CAAAA,CAAO,KAAK,gDAAgD,CAAA,CAC5D,GAAI,CACF,MAAMi4C,EAAAA,CAAgBt3C,EAAKq6C,CAAOF,CAAAA,CAAAA,EAAQ,GAAG,CAC7C96C,CAAAA,CAAAA,CAAO,KAAK,sCAAsC,CAAA,CAClD,OAAQ,CAAA,IAAA,CAAK,CAAC,EAChB,OAAS3E,CAAO,CAAA,CACd2E,CAAO,CAAA,KAAA,CAAM,CAAyB3E,sBAAAA,EAAAA,CAAK,EAAE,CAC7C,CAAA,OAAA,CAAQ,IAAK,CAAA,CAAC,EAChB,CACF,CAEKoH,CACHzC,GAAAA,CAAAA,CAAO,MAAM,mCAAmC,CAAA,CAChD,QAAQ,IAAK,CAAA,CAAC,CAGhBA,CAAAA,CAAAA,CAAAA,CAAO,IAAK,CAAA,CAAA,uBAAA,EAA0ByC,CAAQ,CAAE,CAAA,CAAA,CAChDA,CAAWd,CAAAA,mBAAAA,CAAK,OAAQ,CAAA,OAAA,CAAQ,KAAOc,CAAAA,CAAQ,CAC1CvF,CAAAA,mBAAAA,CAAG,UAAWuF,CAAAA,CAAQ,IACzBzC,CAAO,CAAA,KAAA,CAAM,mBAAmByC,CAAQ,CAAA,CAAE,EAC1C,OAAQ,CAAA,IAAA,CAAK,CAAC,CAAA,CAAA,CAGhB,IAAM+wB,CAAAA,CAAet2B,oBAAG,YAAauF,CAAAA,CAAAA,CAAU,OAAO,CAAA,CACtDzC,CAAO,CAAA,IAAA,CACL,iCAAiCwzB,CAAa,CAAA,MAAM,CACtD,YAAA,CAAA,CAAA,CACA,GAAI,CACF,MAAMykB,EAAgBzkB,CAAAA,CAAAA,CAAcwnB,EAAOF,CAAQ,EAAA,GAAG,EACtD96C,CAAO,CAAA,IAAA,CAAK,2CAA2C,CAAA,CACvD,OAAQ,CAAA,IAAA,CAAK,CAAC,EAChB,CAAA,MAAS3E,CAAO,CAAA,CACd2E,CAAO,CAAA,KAAA,CAAM,8BAA8B3E,CAAK,CAAA,CAAE,CAClD,CAAA,OAAA,CAAQ,IAAK,CAAA,CAAC,EAChB,CACF,CACF,EAEFu/C,EACG,CAAA,OAAA,CAAQ,yBAAyB,CACjC,CAAA,WAAA,CACC,gJACF,CAAA,CACC,MACC,CAAA,kBAAA,CACA,2EACA,KACF,CAAA,CACC,MACC,CAAA,aAAA,CACA,kDACA,CAAA,KACF,EACC,MACC,CAAA,cAAA,CACA,kDACA,CAAA,KACF,CACC,CAAA,MAAA,CACC,sBACA,mDACA,CAAA,KACF,EACC,MACC,CAAA,CACEv6C,EACAy6C,CAMG,GAAA,CACH96C,CAAO,CAAA,IAAA,CAAK,CAAuBK,oBAAAA,EAAAA,CAAI,EAAE,CACzCL,CAAAA,CAAAA,CAAO,IACL,CAAA,CAAA,8BAAA,EAAiC86C,CAAO,CAAA,UAAU,WAAWA,CAAO,CAAA,KAAK,CAAYA,SAAAA,EAAAA,CAAAA,CAAO,MAAM,CAAA,QAAA,EAAWA,EAAO,KAAS,EAAA,eAAe,EAC9I,CAEKz6C,CAAAA,CAAAA,GACHL,EAAO,KAAM,CAAA,4BAA4B,CACzC,CAAA,OAAA,CAAQ,IAAK,CAAA,CAAC,GAGZ86C,CAAO,CAAA,KAAA,EAASA,CAAO,CAAA,MAAA,GACzB96C,CAAO,CAAA,KAAA,CAAM,kDAAkD,CAC/D,CAAA,OAAA,CAAQ,IAAK,CAAA,CAAC,CAGZ86C,CAAAA,CAAAA,CAAAA,CAAO,OAAS,EAAEA,CAAAA,CAAO,QAAUA,CAAO,CAAA,KAAA,CAAA,GAC5C96C,EAAO,KAAM,CAAA,gDAAgD,CAC7D,CAAA,OAAA,CAAQ,IAAK,CAAA,CAAC,GAGhB,IAAMi7C,CAAAA,CAAgBH,CAAO,CAAA,KAAA,CACzB,OACAA,CAAAA,CAAAA,CAAO,OACL,QACA,CAAA,OAAA,CAEN96C,CAAO,CAAA,IAAA,CAAK,CAAmBi7C,gBAAAA,EAAAA,CAAa,EAAE,CAC9Cr5C,CAAAA,EAAAA,CACEvB,EACAy6C,CAAO,CAAA,UAAA,CACPG,EACAH,CAAO,CAAA,KAAA,EAASz6C,CAClB,EACF,CACF,CAAA,CAEFu6C,GACG,OAAQ,CAAA,oBAAoB,CAC5B,CAAA,MAAA,CACC,+BACA,CAAA,6DAAA,CACA,MACF,CACC,CAAA,MAAA,CACC,yBACA,CAAA,wCAAA,CACA,MACF,CAAA,CACC,OACC,sCACA,CAAA,wBAAA,CACA,MACF,CACC,CAAA,MAAA,CACC,sBACA,mFACA,CAAA,IACF,CACC,CAAA,MAAA,CACC,YACA,CAAA,iFAAA,CACA,IACF,CACC,CAAA,MAAA,CACC,8BACA,CAAA,sEAAA,CACA,MACF,CAAA,CACC,YACC,+GACF,CAAA,CACC,MACC,CAAA,MACE/1C,CACAi2C,CAAAA,CAAAA,GAQG,CACEA,CAAQ,EAAA,UAAA,GACX96C,EAAO,KAAM,CAAA,uDAAuD,EACpE,OAAQ,CAAA,IAAA,CAAK,CAAC,CAAA,CAAA,CAEhB,GAAM,CAAE,QAASg7C,CAAM,CAAA,CAAI,MAAM94C,EAAAA,CAE9BP,mBAAK,CAAA,OAAA,CAAQ,QAAQ,GAAI,EAAA,CAAGm5C,CAAO,CAAA,UAAU,CAAGA,CAAAA,CAAAA,EAAQ,YAAY,CAGjEr5C,CAAAA,CAAAA,CAAgBq5C,GAAQ,aAAiBE,EAAAA,CAAAA,CAAM,gBAAgB,IAC/DE,CAAAA,CAAAA,CAAWJ,CAAQ,EAAA,YAAA,EAAgBE,CAAM,CAAA,eAAA,CAAgB,SACzDG,CAAUL,CAAAA,CAAAA,EAAQ,IAAQE,EAAAA,CAAAA,CAAM,eAAgB,CAAA,IAAA,CAChDI,EAAcN,CAAQ,EAAA,WAAA,CACxB,QAASA,CAAAA,CAAAA,CAAO,WAAa,CAAA,EAAE,EAC/BE,CAAM,CAAA,eAAA,CAAgB,YACpBn6C,CACJi6C,CAAAA,CAAAA,EAAQ,eAAiBE,CAAM,CAAA,eAAA,CAAgB,aAC7ChE,CAAAA,CAAAA,CAAe,KAEnB,CAAA,GAAI,CACF,GAAImE,CAAAA,CAAS,CAOX,GANAn7C,CAAO,CAAA,IAAA,CAAK,0BAA0B,CACtCg3C,CAAAA,CAAAA,CAAe,MAAMgE,CAAAA,CAAM,WACzB,CAAA,yBAAA,CACAI,CACF,CAEI,CAAA,CAACpE,EACH,MAAAh3C,CAAAA,CAAO,MACL,qEACF,CAAA,CACM,IAAI,KAAA,CAAM,kCAAkC,CAAA,CAGpDA,EAAO,IAAK,CAAA,sCAAsC,EACpD,CAEA,MAAM4E,GACJo2C,CACAn2C,CAAAA,CAAAA,CACApD,CACAy5C,CAAAA,CAAAA,CACAr6C,CACF,EACF,OAASxF,CAAO,CAAA,CACd,cAAQ,KAAMA,CAAAA,CAAK,EACbA,CACR,CAAA,OAAE,CACI8/C,CAAAA,EAAWnE,CACbh3C,GAAAA,CAAAA,CAAO,KAAK,0BAA0B,CAAA,CACrB,MAAMg7C,CAAAA,CAAM,WAAY,CAAA,yBAAyB,GAGhEh7C,CAAO,CAAA,IAAA,CAAK,kCAAkC,CAAA,CAAA,CAGlD,MAAMg7C,CAAAA,CAAM,kBACd,CACF,CACF,CAEFJ,CAAAA,EAAAA,CACG,QAAQ,0BAA0B,CAAA,CAClC,MACC,CAAA,+BAAA,CACA,6DACA,CAAA,MACF,EACC,MACC,CAAA,yBAAA,CACA,wCACA,CAAA,MACF,CACC,CAAA,MAAA,CACC,uCACA,wBACA,CAAA,MACF,CACC,CAAA,MAAA,CACC,qBACA,CAAA,oJAAA,CACA,IACF,CACC,CAAA,MAAA,CACC,aACA,iFACA,CAAA,IACF,EACC,MACC,CAAA,8BAAA,CACA,sEACA,CAAA,MACF,CACC,CAAA,WAAA,CACC,8IACF,CACC,CAAA,MAAA,CACC,MACES,CAAAA,CACAP,CAQG,GAAA,CACEA,GAAQ,UACX96C,GAAAA,CAAAA,CAAO,KAAM,CAAA,uDAAuD,CACpE,CAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAEhB,GAAM,CAAE,OAAA,CAASg7C,CAAM,CAAI,CAAA,MAAM94C,EAE9BP,CAAAA,mBAAAA,CAAK,OAAQ,CAAA,OAAA,CAAQ,KAAOm5C,CAAAA,CAAAA,CAAO,UAAU,CAAA,CAAGA,CAAQ,EAAA,YAAY,EAGjEr5C,CAAgBq5C,CAAAA,CAAAA,EAAQ,aAAiBE,EAAAA,CAAAA,CAAM,eAAgB,CAAA,IAAA,CAC/DE,EAAWJ,CAAQ,EAAA,YAAA,EAAgBE,EAAM,eAAgB,CAAA,QAAA,CACzDG,EAAUL,CAAQ,EAAA,IAAA,EAAQE,CAAM,CAAA,eAAA,CAAgB,IAChDI,CAAAA,CAAAA,CAAcN,GAAQ,WACxB,CAAA,QAAA,CAASA,CAAO,CAAA,WAAA,CAAa,EAAE,CAAA,CAC/BE,EAAM,eAAgB,CAAA,WAAA,CACpBn6C,CACJi6C,CAAAA,CAAAA,EAAQ,aAAiBE,EAAAA,CAAAA,CAAM,gBAAgB,aAC7ChE,CAAAA,CAAAA,CAAe,MAEnB,GAAI,CACF,GAAImE,CAAS,CAAA,CAOX,GANAn7C,CAAAA,CAAO,IAAK,CAAA,0BAA0B,EACtCg3C,CAAe,CAAA,MAAMgE,CAAM,CAAA,WAAA,CACzB,yBACAI,CAAAA,CACF,EAEI,CAACpE,CAAAA,CACH,MAAAh3C,CAAAA,CAAO,KACL,CAAA,qEACF,EACM,IAAI,KAAA,CAAM,kCAAkC,CAGpDA,CAAAA,CAAAA,CAAO,KAAK,sCAAsC,EACpD,CAEA,MAAMw3C,EACJwD,CAAAA,CAAAA,CACAK,EACA55C,CACAy5C,CAAAA,CAAAA,CACAr6C,CACF,EACF,CAASxF,MAAAA,CAAAA,CAAO,CACd,MAAQ,OAAA,CAAA,KAAA,CAAMA,CAAK,CAAA,CACbA,CACR,CAAA,OAAE,CACI8/C,CAAWnE,EAAAA,CAAAA,GACbh3C,EAAO,IAAK,CAAA,0BAA0B,EACrB,MAAMg7C,CAAAA,CAAM,WAAY,CAAA,yBAAyB,CAGhEh7C,EAAAA,CAAAA,CAAO,KAAK,kCAAkC,CAAA,CAAA,CAGlD,MAAMg7C,CAAM,CAAA,eAAA,GACd,CACF,CACF,CAEFJ,CAAAA,EAAAA,CACG,OAAQ,CAAA,SAAS,EACjB,MACC,CAAA,aAAA,CACA,uGACA,KACF,CAAA,CACC,OACC,+BACA,CAAA,6DAAA,CACA,MACF,CAAA,CACC,MACC,CAAA,yBAAA,CACA,yCACA,MACF,CAAA,CACC,MACC,CAAA,qBAAA,CACA,oJACA,CAAA,IACF,EACC,MACC,CAAA,YAAA,CACA,iFACA,CAAA,IACF,CACC,CAAA,MAAA,CACC,+BACA,sEACA,CAAA,MACF,EACC,MAAO,CAAA,6BAAA,CAA+B,yBAA0B,MAAS,CAAA,CACzE,WACC,CAAA,yEACF,CACC,CAAA,MAAA,CACC,MAAOE,CAQD,EAAA,CACJ,IAAMQ,CAAAA,CAAQR,CAAQ,EAAA,KAAA,EAAS,MAC1BA,CAAQ,EAAA,UAAA,GACX96C,CAAO,CAAA,KAAA,CAAM,uDAAuD,CAAA,CACpE,QAAQ,IAAK,CAAA,CAAC,GAEhB,GAAM,CAAE,QAASg7C,CAAM,CAAA,CAAI,MAAM94C,EAAAA,CAE9BP,mBAAK,CAAA,OAAA,CAAQ,QAAQ,GAAI,EAAA,CAAGm5C,CAAO,CAAA,UAAU,CAAGA,CAAAA,CAAAA,EAAQ,YAAY,CAGjEr5C,CAAAA,CAAAA,CAAgBq5C,CAAQ,EAAA,aAAA,EAAiBE,CAAM,CAAA,eAAA,CAAgB,KAC/DE,CAAWJ,CAAAA,CAAAA,EAAQ,cAAgBE,CAAM,CAAA,eAAA,CAAgB,SACzDG,CAAUL,CAAAA,CAAAA,EAAQ,IAAQE,EAAAA,CAAAA,CAAM,eAAgB,CAAA,IAAA,CAChDI,EAAcN,CAAQ,EAAA,WAAA,CACxB,QAASA,CAAAA,CAAAA,CAAO,WAAa,CAAA,EAAE,EAC/BE,CAAM,CAAA,eAAA,CAAgB,WACpBn6C,CAAAA,CAAAA,CACJi6C,CAAQ,EAAA,aAAA,EAAiBE,EAAM,eAAgB,CAAA,aAAA,CAC7ChE,EAAe,KAEnB,CAAA,GAAI,CACF,GAAImE,CAAAA,CAAS,CAOX,GANAn7C,CAAO,CAAA,IAAA,CAAK,gDAAgD,CAC5Dg3C,CAAAA,CAAAA,CAAe,MAAMgE,CAAAA,CAAM,WACzB,CAAA,yBAAA,CACAI,CACF,CAEI,CAAA,CAACpE,CACH,CAAA,MAAAh3C,CAAO,CAAA,KAAA,CACL,qEACF,CACM,CAAA,IAAI,MAAM,kCAAkC,CAAA,CAGpDA,EAAO,IAAK,CAAA,sCAAsC,EACpD,CAEAs7C,CACI,CAAA,MAAM56C,GAAuBs6C,CAAO,CAAA,CAAA,CAAA,CAAOn6C,CAAa,CAAA,CACxD,MAAM22C,EAAAA,CACJwD,EACA,KACAv5C,CAAAA,CAAAA,CAAAA,CACAy5C,CACAr6C,CAAAA,CACF,CAEJ,CAAA,MAAM+D,GACJo2C,CACA,CAAA,KAAA,CAAA,CACAv5C,EACAy5C,CACAr6C,CAAAA,CACF,EACF,CAASxF,MAAAA,CAAAA,CAAO,CACd,OAAA,CAAQ,KAAMA,CAAAA,CAAK,EACrB,CAAE,OAAA,CACI8/C,CAAWnE,EAAAA,CAAAA,GACbh3C,CAAO,CAAA,IAAA,CAAK,0BAA0B,CACrB,CAAA,MAAMg7C,CAAM,CAAA,WAAA,CAAY,yBAAyB,CAAA,EAGhEh7C,EAAO,IAAK,CAAA,kCAAkC,GAGlD,MAAMg7C,CAAAA,CAAM,kBACd,CACF,CACF,CAAA,CAEFJ,EACG,CAAA,OAAA,CAAQ,qBAAqB,CAC7B,CAAA,WAAA,CACC,0GACF,CACC,CAAA,MAAA,CACC,gCACA,6DACA,CAAA,MACF,CACC,CAAA,MAAA,CACC,yBACA,CAAA,wCAAA,CACA,MACF,CACC,CAAA,MAAA,CACC,YACA,kEACA,CAAA,KACF,EACC,MACC,CAAA,kBAAA,CACA,0EACA,CAAA,KACF,CACC,CAAA,MAAA,CAAO,8BAA+B,wBAA0B,CAAA,MAAS,CACzE,CAAA,MAAA,CAAO,mBAAqB,CAAA,uBAAA,CAAyB,MAAS,CAC9D,CAAA,MAAA,CACC,MAAOE,CAAAA,EAOD,CACCA,CAAAA,EAAQ,aACX96C,CAAO,CAAA,KAAA,CAAM,uDAAuD,CACpE,CAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAGX86C,CAAQ,EAAA,IAAA,GACXA,CAAO,CAAA,IAAA,CAAO,4BAGhBA,CAAO,CAAA,IAAA,CAAO,CAAG,EAAA,IAAA,CAAK,GAAI,EAAC,IAAIA,CAAO,CAAA,IAAI,CAE1C,CAAA,CAAA,GAAM,CAAE,OAAA,CAASE,CAAM,CAAI,CAAA,MAAM94C,GAE9BP,mBAAK,CAAA,OAAA,CAAQ,QAAQ,GAAI,EAAA,CAAGm5C,CAAO,CAAA,UAAU,CAAGA,CAAAA,CAAAA,EAAQ,YAAY,CAGjEr5C,CAAAA,CAAAA,CAAgBq5C,CAAQ,EAAA,aAAA,EAAiBE,CAAM,CAAA,eAAA,CAAgB,KAExC,CAC3B,OAAA,CACA,UACA,CAAA,SAAA,CACA,aACF,CAAA,CAC0B,SAASA,CAAM,CAAA,SAAA,EAAW,CAClDh7C,GAAAA,CAAAA,CAAO,MACL,CAA4Cg7C,yCAAAA,EAAAA,CAAAA,CAAM,SAAU,EAAC,CAC/D,iDAAA,CAAA,CAAA,CACA,QAAQ,IAAK,CAAA,CAAC,CAGhB,CAAA,CAAA,GAAI,CAEF,IAAM5E,GADO,MAAMtX,EAAAA,CAAW,QAASkc,CAAAA,CAAK,CACjB,EAAA,gBAAA,GAQ3B,GAPK5E,CAAAA,CAAc,SACjBp2C,CAAO,CAAA,IAAA,CACL,qEACF,CACA,CAAA,OAAA,CAAQ,IAAK,CAAA,CAAC,CAGZ86C,CAAAA,CAAAA,CAAAA,CAAO,IAAK,CACd,IAAA,IAAWn6C,CAAOy1C,IAAAA,CAAAA,CAChB,OAAQ,CAAA,GAAA,CAAIz1C,CAAG,CAGjB,CAAA,OAAA,CAAQ,IAAK,CAAA,CAAC,EAChB,CAEKzD,oBAAG,UAAWuE,CAAAA,CAAa,GAC9BvE,mBAAG,CAAA,SAAA,CAAUuE,EAAe,CAAE,SAAA,CAAW,CAAK,CAAA,CAAC,CAGjD,CAAA,IAAMk3C,EACJ,MAAMf,EAAAA,CAA0B,QAASxB,CAAAA,CAAa,CAElDqC,CAAAA,CAAAA,CAAYqC,GAAQ,UAAa,CAAA,KAAA,CAAQ,KAC/C59C,CAAAA,mBAAAA,CAAG,aACD,CAAA,CAAA,EAAGuE,CAAa,CAAIq5C,CAAAA,EAAAA,CAAAA,EAAQ,IAAI,CAAGrC,EAAAA,CAAS,GAC5CE,CACF,CAAA,CACA34C,CAAO,CAAA,IAAA,CACL,CAAwC86C,qCAAAA,EAAAA,CAAAA,EAAQ,IAAI,CAAGrC,EAAAA,CAAS,CAClE,CAAA,CAAA,CAEA,MAAMuC,CAAAA,CAAM,iBACZ,CAAA,OAAA,CAAQ,IAAK,CAAA,CAAC,EAChB,CAAA,MAAS3/C,EAAO,CACd,OAAA,CAAQ,MAAMA,CAAK,CAAA,CACnB,MAAM2/C,CAAM,CAAA,eAAA,EACZ,CAAA,OAAA,CAAQ,IAAK,CAAA,CAAC,EAChB,CACF,CACF,CAEFJ,CAAAA,EAAAA,CACG,OAAQ,CAAA,sBAAsB,EAC9B,WAAY,CAAA,0BAA0B,CACtC,CAAA,MAAA,CACC,kBACA,CAAA,uEAAA,CACA,KACF,CACC,CAAA,MAAA,CAAO,2BAA4B,qBAAuB,CAAA,MAAS,EACnE,MACC,CAAA,CACEv6C,CACAy6C,CAAAA,CAAAA,GAIG,CACH96C,CAAAA,CAAO,KAAK,CAAoBK,iBAAAA,EAAAA,CAAI,CAAE,CAAA,CAAA,CACtCL,CAAO,CAAA,IAAA,CAAK,8BAA8B86C,CAAO,CAAA,UAAU,CAAE,CAAA,CAAA,CAExDz6C,CACHL,GAAAA,CAAAA,CAAO,MAAM,yBAAyB,CAAA,CACtC,QAAQ,IAAK,CAAA,CAAC,GAGhB44C,EAAsBv4C,CAAAA,CAAAA,CAAMy6C,CAAO,CAAA,UAAA,CAAYA,CAAO,CAAA,UAAU,EAClE,CACF,CAAA,CAEFF,EACG,CAAA,OAAA,CAAQ,MAAM,CAAA,CACd,YAAY,oDAAoD,CAAA,CAChE,MACC,CAAA,+BAAA,CACA,6DACA,CAAA,MACF,EACC,MACC,CAAA,yBAAA,CACA,yCACA,MACF,CAAA,CACC,OACC,0BACA,CAAA,oFAAA,CACA,CAACv9C,CAAAA,CAAOk+C,CAAqB,CAAA,KACpB,CAAC,GAAGA,CAAUl+C,CAAAA,CAAK,CAE9B,CAAA,CACC,OACC,MAAOy9C,CAAAA,EAID,CACJ96C,CAAAA,CAAO,IAAK,CAAA,2BAA2B,EAClC86C,CAAQ,EAAA,UAAA,GACX96C,EAAO,KAAM,CAAA,uDAAuD,EACpE,OAAQ,CAAA,IAAA,CAAK,CAAC,CAAA,CAAA,CAGhB,GAAM,CAAE,QAASg7C,CAAM,CAAA,CAAI,MAAM94C,EAAAA,CAE9BP,mBAAK,CAAA,OAAA,CAAQ,QAAQ,GAAI,EAAA,CAAGm5C,CAAO,CAAA,UAAU,CAAGA,CAAAA,CAAAA,EAAQ,YAAY,CAEnEhC,CAAAA,CAAAA,CACAgC,GAAQ,UAAcA,EAAAA,CAAAA,CAAO,WAAW,MAAS,CAAA,CAAA,CACnDhC,CAAcgC,CAAAA,CAAAA,CAAO,UAAW,CAAA,OAAA,CAASn5C,GACvCA,CAAK,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,GAAKi9B,CAAAA,CAAAA,EAAMA,EAAE,IAAK,EAAC,CACrC,CAAA,CAEAka,CAAc,CAAA,CAACkC,EAAM,YAAa,CAAA,IAAI,EAExC,IAAME,CAAAA,CAAWJ,GAAQ,YAAgBE,EAAAA,CAAAA,CAAM,YAAa,CAAA,QAAA,CAE5D,GAAI,CACF,MAAMxB,EAAoBwB,CAAAA,CAAAA,CAAOlC,CAAaoC,CAAAA,CAAQ,CACtD,CAAA,MAAMF,EAAM,eAAgB,EAAA,CAC5Bh7C,CAAO,CAAA,IAAA,CAAK,gCAAgC,CAAA,CAC5C,QAAQ,IAAK,CAAA,CAAC,EAChB,CAAS3E,MAAAA,CAAAA,CAAO,CACd,OAAQ,CAAA,KAAA,CAAMA,CAAK,CAAA,CACnB,MAAM2/C,CAAAA,CAAM,iBACZ,CAAA,OAAA,CAAQ,IAAK,CAAA,CAAC,EAChB,CACF,CACF,CAEFJ,CAAAA,EAAAA,CAAQ,KAAM,CAAA,OAAA,CAAQ,IAAI,CAAA","file":"cli.cjs","sourcesContent":["import { HysteriaErrorCode } from \"./hysteria_error.types\";\n\nexport class HysteriaError extends Error {\n code: HysteriaErrorCode;\n caller: string;\n error?: Error;\n\n constructor(caller: string, code: HysteriaErrorCode, error?: Error) {\n super(caller + \" - \" + code);\n this.code = code;\n this.caller = caller;\n this.error = error;\n }\n}\n","import type { DataSourceType } from \"../data_source/data_source_types\";\nimport { HysteriaError } from \"../errors/hysteria_error\";\nimport type { DriverSpecificOptions } from \"./driver_types\";\nimport type { DriverImport } from \"./driver_types\";\n\nexport abstract class Driver {\n abstract type: DataSourceType | \"redis\";\n abstract client: DriverImport;\n options?: DriverSpecificOptions<DataSourceType>;\n\n constructor(driverSpecificOptions?: DriverSpecificOptions<DataSourceType>) {\n this.options = driverSpecificOptions;\n }\n\n static async createDriver(\n _driverSpecificOptions: DriverSpecificOptions<DataSourceType>,\n ): Promise<Driver> {\n throw new HysteriaError(\n \"Driver::createDriver This error should never happen. Please report it to the developers.\",\n \"DEVELOPMENT_ERROR\",\n );\n }\n}\n","export class DriverNotFoundError extends Error {\n constructor(driverName: string) {\n super(\"\");\n this.message = `Driver '${driverName}' not found, it's likely not installed, try running 'npm install ${driverName}'`;\n }\n}\n","import { Driver } from \"./driver\";\nimport { DriverNotFoundError } from \"./driver_constants\";\nimport { DriverSpecificOptions, MongoClientImport } from \"./driver_types\";\n\nexport class MongoDriver extends Driver {\n static mongoClient: MongoClientImport | null = null;\n\n override type = \"mongo\" as const;\n override client: MongoClientImport;\n\n constructor(\n client: MongoClientImport,\n driverSpecificOptions?: DriverSpecificOptions<\"mongo\">,\n ) {\n super(driverSpecificOptions);\n this.client = client;\n }\n\n static async createDriver(): Promise<Driver> {\n if (this.mongoClient) {\n return new MongoDriver(this.mongoClient);\n }\n\n const mongoModule = await import(\"mongodb\").catch(() => {\n throw new DriverNotFoundError(\"mongodb\");\n });\n\n this.mongoClient =\n (mongoModule as { default?: MongoClientImport }).default ?? mongoModule;\n\n if (!this.mongoClient) {\n throw new DriverNotFoundError(\"mongodb\");\n }\n\n return new MongoDriver(this.mongoClient);\n }\n}\n","import { Driver } from \"./driver\";\nimport { DriverNotFoundError } from \"./driver_constants\";\nimport { DriverSpecificOptions, MssqlImport } from \"./driver_types\";\n\nexport class MssqlDriver extends Driver {\n static mssqlClient: MssqlImport | null = null;\n\n override type = \"mssql\" as const;\n override client: MssqlImport;\n\n constructor(\n client: MssqlImport,\n driverSpecificOptions?: DriverSpecificOptions<\"mssql\">,\n ) {\n super(driverSpecificOptions);\n this.client = client;\n }\n\n static async createDriver(): Promise<Driver> {\n if (this.mssqlClient) {\n return new MssqlDriver(this.mssqlClient);\n }\n\n const mssqlModule = await import(\"mssql\").catch(() => {\n throw new DriverNotFoundError(\"mssql\");\n });\n\n this.mssqlClient =\n (mssqlModule as { default?: MssqlImport }).default ?? mssqlModule;\n\n if (!this.mssqlClient) {\n throw new DriverNotFoundError(\"mssql\");\n }\n\n return new MssqlDriver(this.mssqlClient);\n }\n}\n","import { Driver } from \"./driver\";\nimport { DriverNotFoundError } from \"./driver_constants\";\nimport { DriverSpecificOptions, Mysql2Import } from \"./driver_types\";\n\nexport class MysqlDriver extends Driver {\n static mysqlClient: Mysql2Import | null = null;\n\n override type = \"mysql\" as const;\n override client: Mysql2Import;\n\n constructor(\n client: Mysql2Import,\n driverSpecificOptions?: DriverSpecificOptions<\"mysql\">,\n ) {\n super(driverSpecificOptions);\n this.client = client;\n }\n\n static async createDriver(): Promise<Driver> {\n if (this.mysqlClient) {\n return new MysqlDriver(this.mysqlClient);\n }\n\n const mysqlModule = await import(\"mysql2/promise\").catch(() => {\n throw new DriverNotFoundError(\"mysql2\");\n });\n\n this.mysqlClient =\n (mysqlModule as { default?: Mysql2Import }).default ?? mysqlModule;\n\n if (!this.mysqlClient) {\n throw new DriverNotFoundError(\"mysql2\");\n }\n\n return new MysqlDriver(this.mysqlClient);\n }\n}\n","import { Driver } from \"./driver\";\nimport { DriverNotFoundError } from \"./driver_constants\";\nimport { DriverSpecificOptions, OracleDBImport } from \"./driver_types\";\n\nexport class OracleDBDriver extends Driver {\n static oracledbClient: OracleDBImport | null = null;\n\n override type = \"oracledb\" as const;\n override client: OracleDBImport;\n\n constructor(\n client: OracleDBImport,\n driverSpecificOptions?: DriverSpecificOptions<\"oracledb\">,\n ) {\n super(driverSpecificOptions);\n this.client = client;\n }\n\n static async createDriver(): Promise<Driver> {\n if (this.oracledbClient) {\n return new OracleDBDriver(this.oracledbClient);\n }\n\n const oracledbModule = await import(\"oracledb\").catch(() => {\n throw new DriverNotFoundError(\"oracledb\");\n });\n\n this.oracledbClient =\n (oracledbModule as { default?: OracleDBImport }).default ??\n oracledbModule;\n\n if (!this.oracledbClient) {\n throw new DriverNotFoundError(\"oracledb\");\n }\n\n return new OracleDBDriver(this.oracledbClient);\n }\n}\n","import { Driver } from \"./driver\";\nimport { DriverNotFoundError } from \"./driver_constants\";\nimport { DriverSpecificOptions, PgImport } from \"./driver_types\";\n\nexport class PgDriver extends Driver {\n static pgClient: PgImport | null = null;\n\n override type = \"postgres\" as const;\n override client: PgImport;\n\n constructor(\n client: PgImport,\n driverSpecificOptions?: DriverSpecificOptions<\"postgres\">,\n ) {\n super(driverSpecificOptions);\n this.client = client;\n }\n\n static async createDriver(): Promise<Driver> {\n if (this.pgClient) {\n return new PgDriver(this.pgClient);\n }\n\n const pgModule = await import(\"pg\").catch(() => {\n throw new DriverNotFoundError(\"pg\");\n });\n\n this.pgClient = (pgModule as { default?: PgImport }).default ?? pgModule;\n\n if (!this.pgClient) {\n throw new DriverNotFoundError(\"pg\");\n }\n\n return new PgDriver(this.pgClient);\n }\n}\n","import { Driver } from \"./driver\";\nimport { DriverNotFoundError } from \"./driver_constants\";\nimport { DriverSpecificOptions, Sqlite3Import } from \"./driver_types\";\n\nexport class Sqlite3Driver extends Driver {\n static sqlite3Client: Sqlite3Import | null = null;\n\n override type = \"sqlite\" as const;\n override client: Sqlite3Import;\n\n constructor(\n client: Sqlite3Import,\n driverSpecificOptions?: DriverSpecificOptions<\"sqlite\">,\n ) {\n super(driverSpecificOptions);\n this.client = client;\n }\n\n static async createDriver(): Promise<Driver> {\n if (this.sqlite3Client) {\n return new Sqlite3Driver(this.sqlite3Client);\n }\n\n const sqliteModule = await import(\"sqlite3\").catch(() => {\n throw new DriverNotFoundError(\"sqlite3\");\n });\n\n this.sqlite3Client =\n (sqliteModule as { default?: Sqlite3Import }).default ?? sqliteModule;\n\n if (!this.sqlite3Client) {\n throw new DriverNotFoundError(\"sqlite3\");\n }\n\n return new Sqlite3Driver(this.sqlite3Client);\n }\n}\n","import type { DataSourceType } from \"../data_source/data_source_types\";\nimport { HysteriaError } from \"../errors/hysteria_error\";\nimport { Driver } from \"./driver\";\nimport { MongoDriver } from \"./mongo_driver\";\nimport { MssqlDriver } from \"./mssql_driver\";\nimport { MysqlDriver } from \"./mysql_driver\";\nimport { OracleDBDriver } from \"./oracledb_driver\";\nimport { PgDriver } from \"./pg_driver\";\nimport { Sqlite3Driver } from \"./sqlite3_driver\";\n\nexport class DriverFactory {\n static mysqlDriver: Driver | null = null;\n static pgDriver: Driver | null = null;\n static sqliteDriver: Driver | null = null;\n static mssqlDriver: Driver | null = null;\n static oracledbDriver: Driver | null = null;\n static mongodbDriver: Driver | null = null;\n\n static async getDriver(client: DataSourceType | \"redis\"): Promise<Driver> {\n const existingDriver = this.getExistingDriver(client);\n if (existingDriver) {\n return existingDriver;\n }\n\n switch (client) {\n case \"mysql\":\n case \"mariadb\":\n this.mysqlDriver = await MysqlDriver.createDriver();\n return this.mysqlDriver;\n case \"postgres\":\n case \"cockroachdb\":\n this.pgDriver = await PgDriver.createDriver();\n return this.pgDriver;\n case \"sqlite\":\n this.sqliteDriver = await Sqlite3Driver.createDriver();\n return this.sqliteDriver;\n case \"mongo\":\n this.mongodbDriver = await MongoDriver.createDriver();\n return this.mongodbDriver;\n case \"mssql\":\n this.mssqlDriver = await MssqlDriver.createDriver();\n return this.mssqlDriver;\n case \"oracledb\":\n this.oracledbDriver = await OracleDBDriver.createDriver();\n return this.oracledbDriver;\n default:\n throw new HysteriaError(\n `DriverFactory::getDriver Driver ${client} not supported`,\n \"DRIVER_NOT_FOUND\",\n );\n }\n }\n\n private static getExistingDriver(\n client: DataSourceType | \"redis\",\n ): Driver | null {\n switch (client) {\n case \"mysql\":\n case \"mariadb\":\n return this.mysqlDriver;\n case \"postgres\":\n case \"cockroachdb\":\n return this.pgDriver;\n case \"sqlite\":\n return this.sqliteDriver;\n case \"mongo\":\n return this.mongodbDriver;\n case \"mssql\":\n return this.mssqlDriver;\n case \"oracledb\":\n return this.oracledbDriver;\n default:\n return null;\n }\n }\n}\n","import fs from \"node:fs\";\nimport type { Env } from \"./env_types\";\n\nconst envBase: Env = {\n DB_TYPE: process.env.DB_TYPE,\n DB_HOST: process.env.DB_HOST,\n DB_PORT: process.env.DB_PORT,\n DB_USER: process.env.DB_USER,\n DB_PASSWORD: process.env.DB_PASSWORD,\n DB_DATABASE: process.env.DB_DATABASE,\n DB_LOGS: process.env.DB_LOGS === \"true\",\n MIGRATION_PATH: process.env.MIGRATION_PATH || \"database/migrations\",\n\n REDIS_HOST: process.env.REDIS_HOST,\n REDIS_PORT: process.env.REDIS_PORT,\n REDIS_USERNAME: process.env.REDIS_USERNAME,\n REDIS_PASSWORD: process.env.REDIS_PASSWORD,\n REDIS_DATABASE: process.env.REDIS_DATABASE,\n\n MONGO_URL: process.env.MONGO_URL,\n MONGO_LOGS: process.env.MONGO_LOGS === \"true\",\n\n MSSQL_TRUST_SERVER_CERTIFICATE:\n process.env.MSSQL_TRUST_SERVER_CERTIFICATE === \"true\" || false,\n};\n\nconst fillEnvWithDatabaseEnvs = (): Env => {\n try {\n const envs = fs.readFileSync(\".env\", \"utf8\");\n const envVars = envs.split(\"\\n\");\n envVars.forEach((envVar) => {\n const [key, value] = envVar.split(\"=\");\n const trimmedKey = key.trim();\n const trimmedValue = value.trim();\n\n switch (trimmedKey) {\n case \"DB_TYPE\":\n envBase.DB_TYPE ||= trimmedValue;\n break;\n case \"DB_HOST\":\n envBase.DB_HOST ||= trimmedValue;\n break;\n case \"DB_PORT\":\n envBase.DB_PORT ||= trimmedValue;\n break;\n case \"DB_USER\":\n envBase.DB_USER ||= trimmedValue;\n break;\n case \"DB_PASSWORD\":\n envBase.DB_PASSWORD ||= trimmedValue;\n break;\n case \"DB_DATABASE\":\n envBase.DB_DATABASE ||= trimmedValue;\n break;\n case \"MIGRATION_PATH\":\n envBase.MIGRATION_PATH ||= trimmedValue || \"database/migrations\";\n break;\n\n case \"REDIS_HOST\":\n envBase.REDIS_HOST ||= trimmedValue;\n break;\n case \"REDIS_PORT\":\n envBase.REDIS_PORT ||= trimmedValue;\n break;\n case \"REDIS_USERNAME\":\n envBase.REDIS_USERNAME ||= trimmedValue;\n break;\n case \"REDIS_PASSWORD\":\n envBase.REDIS_PASSWORD ||= trimmedValue;\n break;\n case \"REDIS_DATABASE\":\n envBase.REDIS_DATABASE ||= trimmedValue;\n break;\n\n case \"MONGO_URL\":\n envBase.MONGO_URL ||= trimmedValue;\n break;\n case \"MSSQL_TRUST_SERVER_CERTIFICATE\":\n envBase.MSSQL_TRUST_SERVER_CERTIFICATE ||= trimmedValue === \"true\";\n break;\n }\n });\n } catch (error) {\n } finally {\n return envBase;\n }\n};\n\nexport const env = fillEnvWithDatabaseEnvs();\n","import type {\n MssqlDataSourceInput,\n MysqlSqlDataSourceInput,\n PostgresSqlDataSourceInput,\n SqliteDataSourceInput,\n} from \"../data_source/data_source_types\";\nimport type {\n MssqlImport,\n Mysql2Import,\n OracleDBImport,\n PgImport,\n Sqlite3Import,\n} from \"../drivers/driver_types\";\nimport { DriverFactory } from \"../drivers/drivers_factory\";\nimport { env } from \"../env/env\";\nimport { HysteriaError } from \"../errors/hysteria_error\";\nimport {\n SqlDataSourceInput,\n SqlDataSourceType,\n SqlDriverSpecificOptions,\n Sqlite3ConnectionOptions,\n SqlPoolType,\n} from \"./sql_data_source_types\";\n\nconst getDriverConnection = async (type: SqlDataSourceType) => {\n const driver = (await DriverFactory.getDriver(type)).client;\n return driver;\n};\n\nexport const createSqlPool = async <T extends SqlDataSourceType>(\n type: T,\n input?: SqlDataSourceInput<T>,\n): Promise<SqlPoolType> => {\n const driver = await getDriverConnection(type);\n switch (type) {\n case \"mariadb\":\n case \"mysql\":\n const mysqlInput = input as MysqlSqlDataSourceInput & {\n driverOptions?: SqlDriverSpecificOptions<\"mysql\" | \"mariadb\">;\n };\n\n const mysqlDriver = driver as Mysql2Import;\n const mysqlPool = mysqlDriver.createPool({\n host: mysqlInput.host,\n port: mysqlInput.port,\n user: mysqlInput.username,\n password: mysqlInput.password,\n database: mysqlInput.database,\n ...mysqlInput?.driverOptions,\n });\n return mysqlPool;\n case \"postgres\":\n case \"cockroachdb\":\n const pgInput = input as PostgresSqlDataSourceInput & {\n driverOptions?: SqlDriverSpecificOptions<\"postgres\" | \"cockroachdb\">;\n };\n const pgDriver = driver as PgImport;\n const pgPool = new pgDriver.Pool({\n host: pgInput.host,\n port: pgInput.port,\n user: pgInput.username,\n password: pgInput.password,\n database: pgInput.database,\n ...pgInput?.driverOptions,\n });\n\n return pgPool;\n case \"sqlite\":\n const sqliteDriver = driver as Sqlite3Import;\n const sqliteInput = input as SqliteDataSourceInput & {\n driverOptions?: Sqlite3ConnectionOptions;\n };\n\n const database = sqliteInput?.database as string;\n const sqlitePool = new sqliteDriver.Database(\n database,\n sqliteInput?.driverOptions?.mode ?? undefined,\n (err) => {\n if (err) {\n throw new HysteriaError(\n \"SqliteDataSource::createSqlPool\",\n \"CONNECTION_NOT_ESTABLISHED\",\n );\n }\n },\n );\n return sqlitePool;\n case \"mssql\":\n const mssqlDriver = driver as MssqlImport;\n const mssqlInput = input as MssqlDataSourceInput & {\n driverOptions?: SqlDriverSpecificOptions<\"mssql\">;\n };\n\n const { options, ...rest } = mssqlInput.driverOptions ?? {};\n const mssqlPool = await mssqlDriver.connect({\n server: mssqlInput.host ?? \"localhost\",\n port: mssqlInput.port,\n database: mssqlInput.database,\n user: mssqlInput.username,\n password: mssqlInput.password,\n ...rest,\n options: {\n trustServerCertificate:\n env.MSSQL_TRUST_SERVER_CERTIFICATE ?? undefined,\n ...options,\n abortTransactionOnError: false,\n enableImplicitTransactions: false,\n },\n });\n\n return mssqlPool;\n case \"oracledb\":\n const oracledbDriver = driver as OracleDBImport;\n const oracledbInput = input as MssqlDataSourceInput & {\n driverOptions?: SqlDriverSpecificOptions<\"oracledb\">;\n };\n\n const connectionString = `${oracledbInput.host}/${oracledbInput.database}`;\n const oracledbPool = await oracledbDriver.createPool({\n user: oracledbInput.username,\n password: oracledbInput.password,\n connectString: connectionString,\n ...oracledbInput.driverOptions,\n });\n\n return oracledbPool;\n default:\n throw new HysteriaError(\n \"SqlConnectionUtils::createSqlPool\",\n `UNSUPPORTED_DATABASE_TYPE_${type}`,\n );\n }\n};\n","import { highlight } from \"sql-highlight\";\n\nexport type CustomLogger = {\n info(message: string): void;\n error(message: string): void;\n warn(message: string): void;\n};\n\nconst colors = {\n info: \"\\x1b[32m\",\n warn: \"\\x1b[33m\",\n error: \"\\x1b[31m\",\n reset: \"\\x1b[0m\",\n};\n\nfunction getTimestamp(): string {\n const now = new Date();\n const pad = (n: number) => n.toString().padStart(2, \"0\");\n\n return `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())} ${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}`;\n}\n\nfunction formatLogMessage(level: string, message: string): string {\n const timestamp = getTimestamp();\n const levelUpper = level.toUpperCase();\n\n if (level === \"error\") {\n return `${colors.error}[${levelUpper}] ${timestamp}\\n${message}${colors.reset}\\n`;\n }\n\n if (level === \"warn\") {\n return `${colors.warn}[${levelUpper}] ${timestamp}\\n${message}${colors.reset}\\n`;\n }\n\n if (level === \"info\") {\n return `${colors.info}[${levelUpper}] ${timestamp}\\n${message}${colors.reset}\\n`;\n }\n\n return `[${levelUpper}] ${timestamp}\\n${message}\\n`;\n}\n\nclass HysteriaLogger {\n static loggerInstance: CustomLogger = {\n info(message: string): void {\n console.log(formatLogMessage(\"info\", message));\n },\n error(message: string): void {\n console.error(formatLogMessage(\"error\", message));\n },\n warn(message: string): void {\n console.warn(formatLogMessage(\"warn\", message));\n },\n };\n\n static setCustomLogger(customLogger: CustomLogger) {\n this.loggerInstance = customLogger;\n }\n\n static info(message: string): void {\n this.loggerInstance.info(message);\n }\n\n static error(message: string | Error): void {\n if (message instanceof Error) {\n this.loggerInstance.error(String(message));\n return;\n }\n this.loggerInstance.error(message);\n }\n\n static warn(message: string): void {\n this.loggerInstance.warn(message);\n }\n}\n\nfunction formatParams(params: any[]): string {\n return params\n .map((param) => {\n if (typeof param === \"object\") {\n return JSON.stringify(param);\n }\n\n if (typeof param === \"string\") {\n return `'${param}'`;\n }\n\n if (typeof param === \"number\") {\n return param;\n }\n\n if (typeof param === \"boolean\") {\n return param ? \"true\" : \"false\";\n }\n\n return param;\n })\n .join(\", \");\n}\n\nexport function log(query: string, logs: boolean, params?: any[]) {\n if (!logs) {\n return;\n }\n\n query = highlight(query, {\n colors: {\n keyword: \"\\x1b[34m\",\n string: \"\\x1b[32m\",\n number: \"\\x1b[33m\",\n bracket: \"\\x1b[36m\",\n clear: \"\\x1b[0m\",\n comment: \"\\x1b[90m\",\n function: \"\\x1b[35m\",\n identifier: \"\\x1b[37m\",\n special: \"\\x1b[31m\",\n },\n });\n\n const logMessage = `${query} [${formatParams(params || [])}]`;\n HysteriaLogger.loggerInstance.info(logMessage);\n}\n\nexport function logMessage(\n message: string,\n type: \"info\" | \"error\" | \"warn\",\n logs: boolean = false,\n) {\n if (!logs) {\n return;\n }\n\n HysteriaLogger.loggerInstance[type](message);\n}\n\nexport default HysteriaLogger;\n","import { SqlDataSourceType } from \"../../sql/sql_data_source_types\";\n\nclass MigrationTemplates {\n parseGetAllTables(\n dbType: SqlDataSourceType,\n database: string,\n result: any,\n ): string[] {\n switch (dbType) {\n case \"mysql\":\n case \"mariadb\":\n const rows = result[0];\n return rows.map((row: any) => row[`Tables_in_${database}`]);\n case \"cockroachdb\":\n case \"postgres\":\n return result.rows.map((row: any) => row.table_name);\n case \"mssql\":\n return result.recordset.map((row: any) => row.TABLE_NAME);\n case \"oracledb\":\n return (result.rows || [])\n .map((row: any) => {\n if (Array.isArray(row)) return row[0];\n return row?.TABLE_NAME;\n })\n .filter(\n (name: any): name is string =>\n typeof name === \"string\" && name.length > 0,\n );\n default:\n throw new Error(`Unsupported database type: ${dbType}`);\n }\n }\n\n getAllTablesTemplate(dbType: SqlDataSourceType, database: string): string {\n switch (dbType) {\n case \"mysql\":\n case \"mariadb\":\n return `SHOW TABLES FROM ${database};`;\n case \"cockroachdb\":\n case \"postgres\":\n return `SELECT table_name\nFROM information_schema.tables\nWHERE table_catalog = '${database}'\n AND table_schema = 'public'\n AND table_type = 'BASE TABLE';`;\n case \"mssql\":\n return `SELECT TABLE_NAME\nFROM INFORMATION_SCHEMA.TABLES\nWHERE TABLE_CATALOG = '${database}'\n AND TABLE_TYPE = 'BASE TABLE';`;\n case \"oracledb\":\n return `SELECT TABLE_NAME FROM USER_TABLES`;\n default:\n throw new Error(`Unsupported database type: ${dbType}`);\n }\n }\n\n dropAllTablesTemplate(dbType: SqlDataSourceType, tables: string[]): string {\n if (!tables.length) {\n return \"SELECT 1;\";\n }\n\n switch (dbType) {\n case \"mysql\":\n case \"mariadb\":\n case \"cockroachdb\":\n case \"postgres\":\n return `DROP TABLE IF EXISTS ${tables.join(\", \")} CASCADE;`;\n case \"mssql\":\n return tables\n .map((table) => `DROP TABLE IF EXISTS [${table}];`)\n .join(\"\\n\");\n case \"oracledb\":\n // Oracle doesn't support DROP TABLE IF EXISTS or CASCADE in standard syntax\n // Use PURGE to immediately free space\n return (\n tables\n .map((table) => `DROP TABLE \"${table}\" CASCADE CONSTRAINTS PURGE`)\n .join(\";\\n\") + \";\"\n );\n default:\n throw new Error(`Unsupported database type: ${dbType}`);\n }\n }\n\n basicMigrationTemplate(js: boolean = false): string {\n if (js) {\n return `import { Migration } from 'hysteria-orm';\n\nexport default class extends Migration {\n async up() {\n // Your migration logic here\n }\n\n async down() {\n // Your rollback logic here\n }\n}\n`;\n }\n\n return `import { Migration } from 'hysteria-orm';\n\nexport default class extends Migration {\n async up(): Promise<void> {\n // Your migration logic here\n }\n\n async down(): Promise<void> {\n // Your rollback logic here\n }\n}\n`;\n }\n\n createMigrationTemplate(js: boolean = false, table: string): string {\n if (js) {\n return `import { Migration } from 'hysteria-orm';\n\nexport default class extends Migration {\n async up() {\n this.schema.createTable(\n '${table}',\n (table) => {\n // Your create table logic here\n },\n );\n }\n\n async down() {\n // Your rollback logic here\n }\n}\n`;\n }\n\n return `import { Migration } from 'hysteria-orm';\n\nexport default class extends Migration {\n async up(): Promise<void> {\n this.schema.createTable(\n '${table}',\n (table) => {\n // Your create table logic here\n },\n );\n }\n\n async down(): Promise<void> {\n // Your rollback logic here\n }\n}\n`;\n }\n\n alterMigrationTemplate(js: boolean = false, table: string): string {\n if (js) {\n return `import { Migration } from 'hysteria-orm';\n\nexport default class extends Migration {\n async up() {\n this.schema.alterTable(\n '${table}',\n (table) => {\n // Your alter table logic here\n },\n );\n }\n\n async down() {\n // Your rollback logic here\n }\n}\n`;\n }\n\n return `import { Migration } from 'hysteria-orm';\n\nexport default class extends Migration {\n async up(): Promise<void> {\n this.schema.alterTable(\n '${table}',\n (table) => {\n // Your alter table logic here\n },\n );\n }\n\n async down(): Promise<void> {\n // Your rollback logic here\n }\n}\n`;\n }\n\n selectAllFromMigrationsTemplate(): string {\n return `SELECT * FROM migrations`;\n }\n\n migrationTableTemplateMysql(): string {\n return `CREATE TABLE IF NOT EXISTS \\`migrations\\`(\n \\`id\\` INT NOT NULL AUTO_INCREMENT,\n \\`name\\` VARCHAR(255) NOT NULL,\n \\`timestamp\\` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n PRIMARY KEY (\\`id\\`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n`;\n }\n\n migrationTableTemplatePg(): string {\n return `CREATE TABLE IF NOT EXISTS migrations (\n id SERIAL PRIMARY KEY,\n name VARCHAR(255) NOT NULL,\n timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n`;\n }\n\n migrationTableTemplateSQLite(): string {\n const now = new Date().toISOString();\n return `CREATE TABLE IF NOT EXISTS migrations (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL,\n timestamp TEXT NOT NULL DEFAULT '${now}'\n);`;\n }\n\n migrationTableTemplateMssql(): string {\n return `IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='migrations' AND xtype='U')\nCREATE TABLE [migrations] (\n [id] INT NOT NULL IDENTITY(1,1),\n [name] NVARCHAR(255) NOT NULL,\n [timestamp] DATETIME NOT NULL DEFAULT GETDATE(),\n PRIMARY KEY ([id])\n);`;\n }\n\n migrationTableTemplateOracle(): string {\n return `CREATE TABLE \"migrations\" (\n \"id\" NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,\n \"name\" VARCHAR2(255) NOT NULL,\n \"timestamp\" TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL\n)`;\n }\n}\n\nexport default new MigrationTemplates();\n","import fs from \"fs/promises\";\nimport { createSqlPool } from \"../sql/sql_connection_utils\";\nimport { type SqlDataSource } from \"../sql/sql_data_source\";\nimport { SqlDataSourceType } from \"../sql/sql_data_source_types\";\nimport { Transaction } from \"../sql/transactions/transaction\";\nimport logger from \"../utils/logger\";\nimport MigrationTemplates from \"./resources/migration_templates\";\n\nexport default async function dropAllTablesConnector(\n sql: SqlDataSource,\n shouldExit: boolean = true,\n transactional?: boolean,\n) {\n const dbType = sql.getDbType();\n const dbDatabase = sql.database;\n\n if (!dbType) {\n logger.error(\"DB_TYPE is not set could not drop all tables\");\n process.exit(1);\n }\n\n if (!dbDatabase) {\n logger.error(\"DB_DATABASE is not set could not drop all tables\");\n process.exit(1);\n }\n\n logger.info(\"Dropping all tables for database type: \" + dbType);\n\n let trx: Transaction | null = null;\n const shouldUseTransaction = transactional && dbType === \"postgres\";\n\n try {\n if (dbType === \"sqlite\") {\n await sql.closeConnection();\n\n await fs.rm(dbDatabase as string, { recursive: true, force: true });\n logger.info(\"Sqlite database dropped successfully\");\n await fs.writeFile(dbDatabase as string, \"\");\n logger.info(\"Sqlite database recreated successfully\");\n\n const details = sql.getConnectionDetails();\n sql.sqlPool = await createSqlPool(sql.getDbType(), details);\n\n logger.info(\"All tables dropped successfully\");\n return;\n }\n\n const templates = MigrationTemplates.getAllTablesTemplate(\n dbType as SqlDataSourceType,\n dbDatabase as string,\n );\n\n const tables: string[] = await sql.rawQuery(templates);\n const parsedTables = MigrationTemplates.parseGetAllTables(\n dbType as SqlDataSourceType,\n dbDatabase as string,\n tables,\n );\n\n if (!parsedTables.length) {\n logger.info(\"No tables to drop\");\n return;\n }\n\n const dropAllTablesTemplate = MigrationTemplates.dropAllTablesTemplate(\n dbType as SqlDataSourceType,\n parsedTables,\n );\n if (shouldUseTransaction) {\n trx = await sql.startTransaction();\n sql = trx.sql as SqlDataSource;\n }\n if (dbType === \"mysql\" || dbType === \"mariadb\") {\n await sql.rawQuery(`SET FOREIGN_KEY_CHECKS = 0;`);\n }\n\n if (dbType === \"mssql\") {\n const fkResult = await sql.rawQuery<any>(`\n SELECT\n OBJECT_NAME(parent_object_id) AS table_name,\n name AS constraint_name\n FROM sys.foreign_keys;\n `);\n const fkConstraints = fkResult.recordset;\n for (const fk of fkConstraints) {\n await sql.rawQuery(\n `ALTER TABLE [${fk.table_name}] DROP CONSTRAINT [${fk.constraint_name}];`,\n );\n }\n }\n\n if (dbType === \"oracledb\") {\n const fkResult = await sql.rawQuery<any>(`\n SELECT constraint_name, table_name\n FROM user_constraints\n WHERE constraint_type = 'R'\n `);\n\n // Oracle rawQuery returns rows as objects with UPPERCASE column names\n for (const fk of fkResult.rows || []) {\n await sql.rawQuery(\n `ALTER TABLE \"${fk.TABLE_NAME}\" DROP CONSTRAINT \"${fk.CONSTRAINT_NAME}\"`,\n );\n }\n\n // Oracle can't execute multiple statements at once, drop each table individually\n for (const table of parsedTables) {\n await sql.rawQuery(`DROP TABLE \"${table}\" CASCADE CONSTRAINTS PURGE`);\n }\n } else {\n await sql.rawQuery(dropAllTablesTemplate);\n }\n\n if (dbType === \"mysql\" || dbType === \"mariadb\") {\n await sql.rawQuery(`SET FOREIGN_KEY_CHECKS = 1;`);\n }\n\n if (shouldUseTransaction) {\n await trx?.commit();\n }\n\n logger.info(\"All tables dropped successfully\");\n } catch (error: any) {\n if (shouldUseTransaction) {\n await trx?.rollback();\n }\n\n logger.error(error);\n throw error;\n } finally {\n if (shouldExit) {\n await sql.closeConnection();\n }\n }\n}\n","import fs from \"fs\";\nimport path from \"path\";\nimport logger from \"../utils/logger\";\nimport MigrationTemplates from \"./resources/migration_templates\";\nimport { env } from \"../env/env\";\n\nconst getOrCreateMigrationPath = (): string => {\n const migrationPath = env.MIGRATION_PATH;\n const currentPath = path.resolve(process.cwd(), migrationPath);\n if (!fs.existsSync(currentPath)) {\n fs.mkdirSync(currentPath, { recursive: true });\n }\n\n return currentPath;\n};\n\nexport default (\n name: string,\n js: boolean = false,\n mode: \"alter\" | \"create\" | \"basic\" = \"basic\",\n table: string = \"table\",\n) => {\n const migrationFolderPath = getOrCreateMigrationPath();\n const timestamp = new Date().getTime();\n const migrationFileName = !js\n ? `${timestamp}_${name}.ts`\n : `${timestamp}_${name}.js`;\n const migrationFilePath = path.join(migrationFolderPath, migrationFileName);\n\n let migrationTemplate: string;\n switch (mode) {\n case \"alter\":\n migrationTemplate = MigrationTemplates.alterMigrationTemplate(js, table);\n break;\n case \"create\":\n migrationTemplate = MigrationTemplates.createMigrationTemplate(js, table);\n break;\n default:\n migrationTemplate = MigrationTemplates.basicMigrationTemplate(js);\n break;\n }\n\n fs.writeFileSync(migrationFilePath, migrationTemplate);\n logger.info(`Migration created successfully at '${migrationFilePath}'.`);\n process.exit(0);\n};\n","import fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path, { join } from \"node:path\";\nimport { pathToFileURL } from \"url\";\nimport { env } from \"../env/env\";\nimport { HysteriaError } from \"../errors/hysteria_error\";\nimport { Migration } from \"../sql/migrations/migration\";\nimport type {\n MssqlPoolInstance,\n MysqlConnectionInstance,\n OracleDBPoolInstance,\n PgPoolClientInstance,\n SqlDataSourceType,\n SqliteConnectionInstance,\n SqlPoolType,\n} from \"../sql/sql_data_source_types\";\nimport { importTsUniversal } from \"../utils/importer\";\nimport { MigrationTableType } from \"./resources/migration_table_type\";\nimport MigrationTemplates from \"./resources/migration_templates\";\n\nconst importMigrationFile = async (filePath: string, tsconfigPath?: string) => {\n const isTs = filePath.endsWith(\".ts\");\n if (isTs) {\n await import(\"typescript\").catch(() => {\n throw new HysteriaError(\n \"MigrationUtils::importMigrationFile In order to use TypeScript migrations, you must have `typeScript` installed in your project. Please install it with `npm install typescript --save-dev`, if you're in a production environment, it's recommended to transpile your migrations to JavaScript before running the application.\",\n \"MIGRATION_MODULE_NOT_FOUND\",\n );\n });\n\n await import(\"esbuild\").catch(() => {\n throw new HysteriaError(\n \"MigrationUtils::importMigrationFile In order to use TypeScript migrations, you must have `esbuild` installed in your project. Please install it with `npm install esbuild --save-dev`, if you're in a production environment, it's recommended to transpile your migrations to JavaScript before running the application.\",\n \"MIGRATION_MODULE_NOT_FOUND\",\n );\n });\n\n await import(\"bundle-require\").catch(() => {\n throw new HysteriaError(\n \"MigrationUtils::importMigrationFile In order to use TypeScript migrations, you must have `bundle-require` installed in your project. Please install it with `npm install bundle-require --save-dev`, if you're in a production environment, it's recommended to transpile your migrations to JavaScript before running the application.\",\n \"MIGRATION_MODULE_NOT_FOUND\",\n );\n });\n\n return importTsUniversal(filePath, tsconfigPath);\n }\n\n try {\n const fileUrl = pathToFileURL(filePath).href;\n return import(fileUrl);\n } catch (error) {\n const require = createRequire(import.meta.url);\n try {\n const module = require(filePath);\n return {\n default: module.default || module,\n ...module,\n };\n } catch (requireError) {\n throw new HysteriaError(\n `MigrationUtils::importMigrationFile Failed to import migration file: ${filePath}. Both ESM and CommonJS imports failed.`,\n \"MIGRATION_MODULE_NOT_FOUND\",\n );\n }\n }\n};\n\nexport async function getMigrationTable(\n dbType: SqlDataSourceType,\n sqlConnection: SqlPoolType,\n): Promise<MigrationTableType[]> {\n switch (dbType) {\n case \"mariadb\":\n case \"mysql\":\n const mysqlConnection = sqlConnection as MysqlConnectionInstance;\n await mysqlConnection.query(\n MigrationTemplates.migrationTableTemplateMysql(),\n );\n const result = await mysqlConnection.query(\n MigrationTemplates.selectAllFromMigrationsTemplate(),\n );\n return result[0] as MigrationTableType[];\n\n case \"postgres\":\n case \"cockroachdb\":\n const pgConnection = sqlConnection as PgPoolClientInstance;\n await pgConnection.query(MigrationTemplates.migrationTableTemplatePg());\n const pgResult = await pgConnection.query(\n MigrationTemplates.selectAllFromMigrationsTemplate(),\n );\n return pgResult.rows as MigrationTableType[];\n\n case \"sqlite\":\n await promisifySqliteQuery(\n MigrationTemplates.migrationTableTemplateSQLite(),\n [],\n sqlConnection as SqliteConnectionInstance,\n );\n\n return (\n (await promisifySqliteQuery<MigrationTableType>(\n MigrationTemplates.selectAllFromMigrationsTemplate(),\n [],\n sqlConnection as SqliteConnectionInstance,\n )) || []\n );\n\n case \"mssql\":\n const mssqlConnection = sqlConnection as MssqlPoolInstance;\n await mssqlConnection\n .request()\n .query(MigrationTemplates.migrationTableTemplateMssql());\n const mssqlResult = await mssqlConnection\n .request()\n .query(MigrationTemplates.selectAllFromMigrationsTemplate());\n return mssqlResult.recordset as MigrationTableType[];\n\n case \"oracledb\":\n const oraclePool = sqlConnection as OracleDBPoolInstance;\n const oracleConnection = await oraclePool.getConnection();\n try {\n try {\n await oracleConnection.execute(\n MigrationTemplates.migrationTableTemplateOracle(),\n );\n } catch (err: any) {\n if (err.errorNum !== 955) {\n throw err;\n }\n }\n // Oracle requires quoted identifiers to match case from CREATE TABLE\n const oracleResult = await oracleConnection.execute(\n `SELECT * FROM \"migrations\"`,\n );\n // Oracle returns rows as arrays: [id, name, timestamp]\n return (oracleResult.rows || []).map((row: any) => ({\n id: row[0],\n name: row[1],\n timestamp: row[2],\n })) as MigrationTableType[];\n } finally {\n await oracleConnection.close();\n }\n\n default:\n throw new HysteriaError(\n \"MigrationUtils::getMigrationTable Unsupported database type\",\n \"DEVELOPMENT_ERROR\",\n );\n }\n}\n\nexport async function getMigrations(\n dbType: SqlDataSourceType,\n migrationPath?: string,\n tsconfigPath?: string,\n): Promise<Migration[]> {\n const migrationNames = findMigrationNames(migrationPath);\n const migrations: Migration[] = [];\n\n for (const migrationName of migrationNames) {\n const migrationModule = await findMigrationModule(\n migrationName,\n migrationPath,\n tsconfigPath,\n );\n\n const migration: Migration = new migrationModule(dbType || env.DB_TYPE);\n migration.migrationName = migrationName;\n migrations.push(migration);\n }\n\n return migrations;\n}\n\nexport function getPendingMigrations(\n migrations: Migration[],\n migrationTable: MigrationTableType[],\n): Migration[] {\n return migrations.filter((migration) => {\n const migrationName = migration.migrationName;\n const migrationEntry = migrationTable.find(\n (migration) => migration.name === migrationName,\n );\n\n return !migrationEntry;\n });\n}\n\nasync function loadMigrationModule(\n pathToFile: string,\n tsconfigPath?: string,\n): Promise<new (dbType: SqlDataSourceType) => Migration> {\n const migrationModule = await importMigrationFile(pathToFile, tsconfigPath);\n if (!migrationModule.default) {\n throw new HysteriaError(\n \"MigrationUtils::loadMigrationModule Migration module does not have a default export\",\n \"MIGRATION_MODULE_NOT_FOUND\",\n );\n }\n\n return migrationModule.default;\n}\n\nasync function findMigrationModule(\n migrationName: string,\n migrationModulePath: string = env.MIGRATION_PATH || \"database/migrations\",\n tsconfigPath?: string,\n): Promise<new (dbType: SqlDataSourceType) => Migration> {\n migrationModulePath = join(migrationModulePath, migrationName);\n const migrationPath = path.resolve(process.cwd(), migrationModulePath);\n const migrationModule = await loadMigrationModule(\n migrationPath,\n tsconfigPath,\n );\n\n if (!migrationModule) {\n throw new HysteriaError(\n \"MigrationUtils::findMigrationModule migrations module not found for migration: \" +\n migrationName,\n \"MIGRATION_MODULE_NOT_FOUND\",\n );\n }\n\n return migrationModule;\n}\n\nfunction findMigrationNames(inputMigrationPath?: string): string[] {\n const currentUserDirectory = process.cwd();\n const migrationPath = path.resolve(\n inputMigrationPath || env.MIGRATION_PATH || \"database/migrations\",\n );\n\n const fullPathToMigrationPath = path.resolve(\n currentUserDirectory,\n migrationPath,\n );\n\n try {\n const migrationFiles = fs\n .readdirSync(fullPathToMigrationPath)\n .filter((file) => {\n const ext = path.extname(file);\n const fullFilePath = path.join(fullPathToMigrationPath, file);\n const isFile = fs.statSync(fullFilePath).isFile();\n return isFile && (ext === \".ts\" || ext === \".js\");\n });\n\n if (migrationFiles.length) {\n return migrationFiles;\n }\n\n throw new HysteriaError(\n \"MigrationUtils::findMigrationNames No database migration files found on path: \" +\n fullPathToMigrationPath,\n \"MIGRATION_MODULE_NOT_FOUND\",\n );\n } catch (error) {\n throw new HysteriaError(\n \"MigrationUtils::findMigrationNames No database migration files found on path: \" +\n fullPathToMigrationPath,\n \"MIGRATION_MODULE_NOT_FOUND\",\n );\n }\n}\n\nexport async function promisifySqliteQuery<T>(\n query: string,\n params: any,\n sqLiteConnection: SqliteConnectionInstance,\n): Promise<T[]> {\n return new Promise<T[]>((resolve, reject) => {\n sqLiteConnection.all<T>(query, params, (err, results) => {\n if (err) {\n reject(err);\n }\n resolve(results);\n });\n });\n}\n","import path from \"node:path\";\nimport { DriverNotFoundError } from \"../drivers/driver_constants\";\n\nexport async function importTsUniversal<T = any>(\n entry: string,\n tsconfigPath?: string,\n): Promise<T> {\n const { bundleRequire } = await import(\"bundle-require\").catch(() => {\n throw new DriverNotFoundError(\"bundle-require\");\n });\n\n const filepath = path.isAbsolute(entry)\n ? entry\n : path.resolve(process.cwd(), entry);\n\n const { mod } = await bundleRequire({\n filepath,\n format: \"esm\",\n preserveTemporaryFile: false,\n esbuildOptions: {\n keepNames: true,\n sourcemap: true,\n },\n tsconfig: tsconfigPath ?? \"./tsconfig.json\",\n external: [\n \"ioredis\",\n \"mongodb\",\n \"pg\",\n \"mysql2\",\n \"sqlite3\",\n \"bundle-require\",\n \"esbuild\",\n \"sql-formatter\",\n \"sql-highlight\",\n \"dayjs\",\n \"commander\",\n ],\n });\n\n return mod as T;\n}\n","import { Migration } from \"../sql/migrations/migration\";\nimport { Migrator } from \"../sql/migrations/migrator\";\nimport { type SqlDataSource } from \"../sql/sql_data_source\";\nimport { SqlDataSourceType } from \"../sql/sql_data_source_types\";\nimport { Transaction } from \"../sql/transactions/transaction\";\nimport logger from \"../utils/logger\";\nimport { getMigrations, getMigrationTable } from \"./migration_utils\";\nimport { MigrationTableType } from \"./resources/migration_table_type\";\n\nexport default async function runMigrationsConnector(\n sql: SqlDataSource,\n runUntil?: string,\n migrationPath?: string,\n tsconfigPath?: string,\n transactional?: boolean,\n) {\n const dbType = sql.getDbType();\n const shouldUseTransaction =\n transactional && dbType !== \"mssql\" && dbType !== \"oracledb\";\n let trx: Transaction | null = null;\n logger.info(\"Running migrations for database type: \" + dbType);\n\n try {\n const migrationTable: MigrationTableType[] = await getMigrationTable(\n dbType as SqlDataSourceType,\n sql.getPool(),\n );\n const migrations: Migration[] = await getMigrations(\n dbType as SqlDataSourceType,\n migrationPath,\n tsconfigPath,\n );\n\n const pendingMigrations = migrations.filter(\n (migration) =>\n !migrationTable\n .map((table) => table.name)\n .includes(migration.migrationName),\n );\n\n if (!pendingMigrations.length) {\n logger.info(\"No pending migrations.\");\n return;\n }\n\n if (runUntil) {\n const runUntilIndex = pendingMigrations.findIndex(\n (migration) => migration.migrationName === runUntil,\n );\n\n if (runUntilIndex === -1) {\n console.error(`Migration ${runUntil} not found.`);\n return;\n }\n\n const filteredMigrations = pendingMigrations.slice(0, runUntilIndex + 1);\n\n if (shouldUseTransaction) {\n trx = await sql.startTransaction();\n sql = trx.sql as SqlDataSource;\n }\n\n const migrator = new Migrator(sql);\n await migrator.upMigrations(filteredMigrations);\n\n if (shouldUseTransaction) {\n await trx?.commit();\n }\n\n logger.info(\"Migrations ran successfully\");\n return;\n }\n\n const migrator = new Migrator(sql);\n if (shouldUseTransaction) {\n trx = await sql.startTransaction();\n sql = trx.sql as SqlDataSource;\n }\n\n await migrator.upMigrations(pendingMigrations);\n\n if (shouldUseTransaction) {\n await trx?.commit();\n }\n } catch (error: any) {\n if (shouldUseTransaction) {\n await trx?.rollback();\n }\n\n throw error;\n }\n\n logger.info(\"Migrations ran successfully\");\n}\n","/**\n * @description AdminJS plugin types - All AdminJS imports are done at runtime via dynamic import()\n * @description This ensures the plugin is completely optional\n */\n\nimport type { Model } from \"../sql/models/model\";\nimport type express from \"express\";\n\n/**\n * @description Configuration options for AdminJS integration\n */\nexport type AdminJsOptions = {\n /**\n * @description Whether to enable AdminJS admin panel\n * @default false\n */\n enabled?: boolean;\n\n /**\n * @description The root path for the AdminJS panel\n * @default '/admin'\n */\n rootPath?: string;\n\n /**\n * @description Custom branding options for AdminJS\n */\n branding?: AdminJsBranding;\n\n /**\n * @description Models to expose in the AdminJS panel\n * @description If not provided, all models registered in the SqlDataSource will be used\n */\n resources?: (typeof Model)[];\n\n /**\n * @description Custom resource options for specific models\n */\n resourceOptions?: Record<string, AdminJsResourceOptions>;\n\n /**\n * @description Locale settings for AdminJS\n */\n locale?: AdminJsLocale;\n\n /**\n * @description Assets configuration\n */\n assets?: AdminJsAssets;\n\n /**\n * @description Settings configuration\n */\n settings?: AdminJsSettings;\n\n /**\n * @description Custom pages to add to AdminJS\n */\n pages?: Record<string, AdminJsPage>;\n};\n\nexport type AdminJsBranding = {\n /**\n * @description Company name displayed in the admin panel\n */\n companyName?: string;\n\n /**\n * @description URL to the company logo\n */\n logo?: string;\n\n /**\n * @description URL to the favicon\n */\n favicon?: string;\n\n /**\n * @description Whether to display the \"Made with AdminJS\" notice\n * @default true\n */\n withMadeWithLove?: boolean;\n\n /**\n * @description Theme settings\n */\n theme?: Record<string, unknown>;\n\n /**\n * @description Software brothers branding override\n */\n softwareBrothers?: boolean;\n};\n\nexport type AdminJsResourceOptions = {\n /**\n * @description Navigation settings for this resource\n */\n navigation?: {\n name?: string;\n icon?: string;\n } | null;\n\n /**\n * @description Custom name for the resource\n */\n name?: string;\n\n /**\n * @description Properties configuration\n */\n properties?: Record<string, AdminJsPropertyOptions>;\n\n /**\n * @description Actions configuration\n */\n actions?: Record<string, AdminJsActionOptions>;\n\n /**\n * @description Sort configuration\n */\n sort?: {\n sortBy?: string;\n direction?: \"asc\" | \"desc\";\n };\n\n /**\n * @description List of properties to display in list view\n */\n listProperties?: string[];\n\n /**\n * @description List of properties to display in show view\n */\n showProperties?: string[];\n\n /**\n * @description List of properties to display in edit view\n */\n editProperties?: string[];\n\n /**\n * @description List of properties to display in filter view\n */\n filterProperties?: string[];\n\n /**\n * @description Parent resource for navigation grouping\n */\n parent?: {\n name?: string;\n icon?: string;\n } | null;\n};\n\nexport type AdminJsPropertyOptions = {\n /**\n * @description Whether the property is visible in the list view\n */\n isVisible?:\n | boolean\n | {\n list?: boolean;\n edit?: boolean;\n filter?: boolean;\n show?: boolean;\n };\n\n /**\n * @description Position of the property in forms\n */\n position?: number;\n\n /**\n * @description Whether the property is required\n */\n isRequired?: boolean;\n\n /**\n * @description Whether the property is an ID\n */\n isId?: boolean;\n\n /**\n * @description Whether the property is a title\n */\n isTitle?: boolean;\n\n /**\n * @description Whether the property is disabled in edit forms\n */\n isDisabled?: boolean;\n\n /**\n * @description Whether the property is an array\n */\n isArray?: boolean;\n\n /**\n * @description Whether the property is sortable\n */\n isSortable?: boolean;\n\n /**\n * @description Property type override\n */\n type?: string;\n\n /**\n * @description Available values for select/enum properties\n */\n availableValues?: Array<{\n value: string | number;\n label: string;\n }>;\n\n /**\n * @description Custom components for rendering\n */\n components?: {\n list?: string;\n show?: string;\n edit?: string;\n filter?: string;\n };\n\n /**\n * @description Custom props to pass to components\n */\n props?: Record<string, unknown>;\n\n /**\n * @description Description shown in the UI\n */\n description?: string;\n};\n\nexport type AdminJsActionOptions = {\n /**\n * @description Action type\n */\n actionType?: \"record\" | \"resource\" | \"bulk\";\n\n /**\n * @description Whether the action is visible\n */\n isVisible?: boolean;\n\n /**\n * @description Whether the action is accessible\n */\n isAccessible?: boolean;\n\n /**\n * @description Icon for the action\n */\n icon?: string;\n\n /**\n * @description Label for the action\n */\n label?: string;\n\n /**\n * @description Guard message shown before action execution\n */\n guard?: string;\n\n /**\n * @description Whether to show the action in the drawer\n */\n showInDrawer?: boolean;\n\n /**\n * @description Whether to hide the action button\n */\n hideActionHeader?: boolean;\n\n /**\n * @description Custom component for the action\n */\n component?: string | false;\n\n /**\n * @description Container width for the action\n */\n containerWidth?: number | string;\n\n /**\n * @description Layout configuration\n */\n layout?: unknown[];\n};\n\nexport type AdminJsLocale = {\n /**\n * @description Language code\n */\n language?: string;\n\n /**\n * @description Available languages\n */\n availableLanguages?: string[];\n\n /**\n * @description Custom translations\n */\n translations?: Record<string, Record<string, unknown>>;\n\n /**\n * @description Whether to show the language selector\n */\n withBackend?: boolean;\n};\n\nexport type AdminJsAssets = {\n /**\n * @description Custom styles to include\n */\n styles?: string[];\n\n /**\n * @description Custom scripts to include\n */\n scripts?: string[];\n};\n\nexport type AdminJsSettings = {\n /**\n * @description Default number of items per page\n */\n defaultPerPage?: number;\n};\n\nexport type AdminJsPage = {\n /**\n * @description Page component path\n */\n component?: string;\n\n /**\n * @description Page icon\n */\n icon?: string;\n\n /**\n * @description Handler for the page\n */\n handler?: (\n request: unknown,\n response: unknown,\n context: unknown,\n ) => Promise<unknown>;\n};\n\nexport type AdminJsAdminInstance = {\n options: { rootPath: string; [key: string]: unknown };\n watch: () => Promise<void>;\n initialize: () => Promise<void>;\n resources: unknown[];\n findResource: (resourceId: string) => unknown;\n};\n\n/**\n * @description Return type for getAdminJs method\n */\nexport type AdminJsInstance = {\n /**\n * @description The AdminJS instance\n */\n admin: AdminJsAdminInstance;\n\n /**\n * @description Express router for AdminJS (if using express adapter)\n */\n router?: ReturnType<typeof express.Router>;\n};\n\n/**\n * @description Property type mapping from Hysteria ORM to AdminJS\n */\nexport const HYSTERIA_TO_ADMINJS_TYPE_MAP: Record<string, string> = {\n string: \"string\",\n varchar: \"string\",\n char: \"string\",\n text: \"textarea\",\n longtext: \"textarea\",\n mediumtext: \"textarea\",\n tinytext: \"textarea\",\n integer: \"number\",\n int: \"number\",\n smallint: \"number\",\n bigint: \"number\",\n tinyint: \"number\",\n mediumint: \"number\",\n float: \"float\",\n double: \"float\",\n decimal: \"float\",\n numeric: \"float\",\n real: \"float\",\n boolean: \"boolean\",\n bool: \"boolean\",\n date: \"date\",\n datetime: \"datetime\",\n timestamp: \"datetime\",\n time: \"string\",\n year: \"number\",\n json: \"mixed\",\n jsonb: \"mixed\",\n uuid: \"string\",\n ulid: \"string\",\n binary: \"string\",\n blob: \"string\",\n enum: \"string\",\n};\n","/**\n * @description AdminJS adapter for Hysteria ORM\n */\n\nimport type {\n BaseProperty,\n BaseRecord,\n BaseResource,\n Filter,\n ParamsType,\n PropertyType,\n} from \"adminjs\";\nimport { DriverNotFoundError } from \"../drivers/driver_constants\";\nimport type { Model } from \"../sql/models/model\";\nimport type { SqlDataSource } from \"../sql/sql_data_source\";\nimport {\n HYSTERIA_TO_ADMINJS_TYPE_MAP,\n type AdminJsInstance,\n type AdminJsOptions,\n} from \"./adminjs_types\";\n\ntype AnyModel = typeof Model & { new (): any };\n\n// Store the sqlDataSource reference for resources to use\nlet globalSqlDataSource: SqlDataSource | null = null;\n\nfunction applyFilter(\n query: ReturnType<AnyModel[\"query\"]>,\n filter: unknown,\n model: AnyModel,\n): void {\n if (!filter || typeof filter !== \"object\") return;\n\n const filterObj = filter as { filters?: Record<string, { value: unknown }> };\n if (!filterObj.filters) return;\n\n const columns = model.getColumns();\n\n for (const [key, filterValue] of Object.entries(filterObj.filters)) {\n const value = filterValue.value;\n if (value === undefined || value === null || value === \"\") continue;\n\n const column = columns.find(\n (c) => c.columnName === key || c.databaseName === key,\n );\n if (!column) continue;\n\n const typeString = typeof column.type === \"string\" ? column.type : \"string\";\n const propertyType = HYSTERIA_TO_ADMINJS_TYPE_MAP[typeString] || \"string\";\n\n if (propertyType === \"string\" || propertyType === \"textarea\") {\n query.whereLike(key, `%${value}%`);\n continue;\n }\n\n if (propertyType === \"boolean\") {\n query.where(key, value === \"true\" || value === true);\n continue;\n }\n\n if (propertyType === \"date\" || propertyType === \"datetime\") {\n if (typeof value === \"object\" && value !== null) {\n const dateFilter = value as { from?: string; to?: string };\n if (dateFilter.from) {\n query.where(key, \">=\", dateFilter.from);\n }\n if (dateFilter.to) {\n query.where(key, \"<=\", dateFilter.to);\n }\n continue;\n }\n query.where(key, value as string);\n continue;\n }\n\n query.where(key, value as string | number | boolean);\n }\n}\n\nfunction recordToParams(\n record: Model,\n model: AnyModel,\n): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n const columns = model.getColumns();\n\n for (const column of columns) {\n const value = record[column.columnName as keyof typeof record];\n params[column.columnName] = value;\n }\n\n return params;\n}\n\n/**\n * @description Creates a Hysteria Resource class that extends AdminJS BaseResource\n */\nasync function createHysteriaResourceClass() {\n const adminjs = await import(\"adminjs\").catch(() => {\n throw new DriverNotFoundError(\"adminjs\");\n });\n\n const {\n BaseResource: BaseResourceClass,\n BaseRecord: BaseRecordClass,\n BaseProperty: BasePropertyClass,\n } = adminjs;\n\n return class HysteriaResource extends BaseResourceClass {\n private _model: AnyModel;\n private _db: SqlDataSource;\n\n constructor(model: AnyModel) {\n super(model);\n this._model = model;\n this._db = globalSqlDataSource!;\n }\n\n static isAdapterFor(rawResource: unknown): boolean {\n if (typeof rawResource !== \"function\") return false;\n const resource = rawResource as AnyModel;\n return (\n resource.prototype !== undefined &&\n typeof resource.table === \"string\" &&\n typeof resource.getColumns === \"function\"\n );\n }\n\n databaseName(): string {\n return this._db.database || \"hysteria\";\n }\n\n databaseType(): string {\n return this._db.getDbType();\n }\n\n id(): string {\n return this._model.table;\n }\n\n properties(): BaseProperty[] {\n const columns = this._model.getColumns();\n return columns.map((column) => {\n const typeString =\n typeof column.type === \"string\" ? column.type : \"string\";\n const adminJsType =\n HYSTERIA_TO_ADMINJS_TYPE_MAP[typeString] || \"string\";\n\n return new BasePropertyClass({\n path: column.columnName,\n type: adminJsType as PropertyType,\n isId: column.isPrimary,\n isSortable: true,\n });\n });\n }\n\n property(path: string): BaseProperty | null {\n const columns = this._model.getColumns();\n const column = columns.find(\n (c) => c.columnName === path || c.databaseName === path,\n );\n\n if (!column) return null;\n\n const typeString =\n typeof column.type === \"string\" ? column.type : \"string\";\n const adminJsType = HYSTERIA_TO_ADMINJS_TYPE_MAP[typeString] || \"string\";\n\n return new BasePropertyClass({\n path: column.columnName,\n type: adminJsType as PropertyType,\n isId: column.isPrimary,\n isSortable: true,\n });\n }\n\n async count(filter: Filter): Promise<number> {\n const query = this._model.query({ connection: this._db });\n applyFilter(query, filter, this._model);\n return query.getCount();\n }\n\n async find(\n filter: Filter,\n options: {\n limit?: number;\n offset?: number;\n sort?: { sortBy?: string; direction?: \"asc\" | \"desc\" };\n } = {},\n ): Promise<BaseRecord[]> {\n const query = this._model.query({ connection: this._db });\n applyFilter(query, filter, this._model);\n\n if (options.limit) {\n query.limit(options.limit);\n }\n if (options.offset) {\n query.offset(options.offset);\n }\n if (options.sort?.sortBy) {\n query.orderBy(options.sort.sortBy, options.sort.direction || \"asc\");\n }\n\n const records = await query.many();\n return records.map(\n (record: unknown) =>\n new BaseRecordClass(\n recordToParams(record as Model, this._model),\n this,\n ),\n );\n }\n\n async findOne(id: string | number): Promise<BaseRecord | null> {\n const primaryKey = this._model.primaryKey;\n if (!primaryKey) return null;\n\n const record = await this._model.findOneByPrimaryKey(id as string, {\n connection: this._db,\n });\n\n if (!record) return null;\n\n return new BaseRecordClass(\n recordToParams(record as Model, this._model),\n this,\n );\n }\n\n async findMany(ids: (string | number)[]): Promise<BaseRecord[]> {\n const primaryKey = this._model.primaryKey;\n if (!primaryKey) return [];\n\n const records = await this._model\n .query({ connection: this._db })\n .whereIn(primaryKey, ids)\n .many();\n\n return records.map(\n (record: unknown) =>\n new BaseRecordClass(\n recordToParams(record as Model, this._model),\n this,\n ),\n );\n }\n\n async create(params: Record<string, unknown>): Promise<ParamsType> {\n const record = await this._model.insert(params, {\n connection: this._db,\n });\n return recordToParams(record as Model, this._model);\n }\n\n async update(\n id: string | number,\n params: Record<string, unknown>,\n ): Promise<ParamsType> {\n const primaryKey = this._model.primaryKey;\n if (!primaryKey) {\n throw new Error(\"Model has no primary key\");\n }\n\n const existingRecord = await this._model.findOneByPrimaryKey(\n id as string,\n {\n connection: this._db,\n },\n );\n\n if (!existingRecord) {\n throw new Error(\"Record not found\");\n }\n\n const updatedRecord = await this._model.updateRecord(\n existingRecord,\n params,\n { connection: this._db },\n );\n\n return recordToParams(updatedRecord as Model, this._model);\n }\n\n async delete(id: string | number): Promise<void> {\n const primaryKey = this._model.primaryKey;\n if (!primaryKey) {\n throw new Error(\"Model has no primary key\");\n }\n\n const record = await this._model.findOneByPrimaryKey(id as string, {\n connection: this._db,\n });\n\n if (record) {\n await this._model.deleteRecord(record, {\n connection: this._db,\n });\n }\n }\n };\n}\n\n/**\n * @description Creates a Hysteria Database class that extends AdminJS BaseDatabase\n */\nasync function createHysteriaDatabaseClass() {\n const adminjs = await import(\"adminjs\").catch(() => {\n throw new DriverNotFoundError(\"adminjs\");\n });\n\n const { BaseDatabase: BaseDatabaseClass } = adminjs;\n\n return class HysteriaDatabase extends BaseDatabaseClass {\n static isAdapterFor(_database: unknown): boolean {\n // We don't use database-level adapter, only resource-level\n return false;\n }\n\n resources(): BaseResource[] {\n return [];\n }\n };\n}\n\n/**\n * @description Registers the Hysteria ORM adapter with AdminJS\n */\nexport async function registerHysteriaAdapter(): Promise<void> {\n const AdminJS = await import(\"adminjs\").catch(() => {\n throw new DriverNotFoundError(\"adminjs\");\n });\n\n const HysteriaResource = await createHysteriaResourceClass();\n const HysteriaDatabase = await createHysteriaDatabaseClass();\n\n AdminJS.default.registerAdapter({\n Database: HysteriaDatabase,\n Resource: HysteriaResource,\n });\n}\n\n/**\n * @description Initializes AdminJS with Hysteria ORM models\n */\nexport async function initializeAdminJs(\n sqlDataSource: SqlDataSource,\n options: AdminJsOptions,\n): Promise<AdminJsInstance> {\n // Set global reference for resources to use\n globalSqlDataSource = sqlDataSource;\n\n const AdminJS = await import(\"adminjs\").catch(() => {\n throw new DriverNotFoundError(\"adminjs\");\n });\n\n // Register the adapter first\n await registerHysteriaAdapter();\n\n const models =\n options.resources || (Object.values(sqlDataSource.models) as AnyModel[]);\n\n if (!models.length) {\n throw new Error(\n \"No models provided for AdminJS. Please provide models in the resources option or register them in SqlDataSource.\",\n );\n }\n\n // Build resources with options\n const resources = models.map((model) => {\n const modelOptions = options.resourceOptions?.[model.table] || {};\n return {\n resource: model,\n options: modelOptions,\n };\n });\n\n const adminOptions: Record<string, unknown> = {\n rootPath: options.rootPath || \"/admin\",\n resources,\n };\n\n if (options.branding) {\n adminOptions.branding = options.branding;\n }\n if (options.locale?.language) {\n adminOptions.locale = options.locale;\n }\n if (options.assets) {\n adminOptions.assets = options.assets;\n }\n if (options.settings) {\n adminOptions.settings = options.settings;\n }\n if (options.pages) {\n const validPages: Record<string, unknown> = {};\n for (const [key, page] of Object.entries(options.pages)) {\n if (page.component) {\n validPages[key] = page;\n }\n }\n if (Object.keys(validPages).length > 0) {\n adminOptions.pages = validPages;\n }\n }\n\n const admin = new AdminJS.default(adminOptions);\n\n return { admin } as unknown as AdminJsInstance;\n}\n\n/**\n * @description Initializes AdminJS with Express router\n * @description Requires @adminjs/express to be installed\n */\nexport async function initializeAdminJsExpress(\n sqlDataSource: SqlDataSource,\n options: AdminJsOptions,\n): Promise<Required<AdminJsInstance>> {\n const { admin } = await initializeAdminJs(sqlDataSource, options);\n\n // Dynamic import with type erasure to avoid compile-time dependency\n let AdminJSExpress: { buildRouter: (admin: unknown) => unknown };\n try {\n // @ts-expect-error - @adminjs/express is an optional peer dependency\n AdminJSExpress = await import(\"@adminjs/express\");\n } catch {\n throw new DriverNotFoundError(\"@adminjs/express\");\n }\n\n const router = AdminJSExpress.buildRouter(admin);\n\n return { admin, router } as unknown as Required<AdminJsInstance>;\n}\n","import { CacheAdapter } from \"../cache_adapter\";\n\nconst inMemoryCache = new Map<string, any>();\n\nexport class InMemoryAdapter implements CacheAdapter {\n async get<T = void>(key: string): Promise<T> {\n return inMemoryCache.get(key);\n }\n\n async set<T = any>(key: string, data: T, ttl?: number): Promise<void> {\n inMemoryCache.set(key, data);\n if (ttl) {\n setTimeout(() => {\n inMemoryCache.delete(key);\n }, ttl);\n }\n }\n\n async invalidate(key: string): Promise<void> {\n inMemoryCache.delete(key);\n }\n\n async invalidateAll(key: string): Promise<void> {\n const keys = inMemoryCache.keys();\n for (const cacheKey of keys) {\n if (cacheKey.startsWith(key)) {\n inMemoryCache.delete(cacheKey);\n }\n }\n }\n}\n","import { HysteriaError } from \"../errors/hysteria_error\";\nimport type {\n DataSourceInput,\n DataSourceType,\n MongoDataSourceInput,\n MssqlDataSourceInput,\n MysqlSqlDataSourceInput,\n PostgresSqlDataSourceInput,\n SqliteDataSourceInput,\n} from \"./data_source_types\";\nimport { env } from \"../env/env\";\n\nexport abstract class DataSource {\n declare type: DataSourceType;\n declare host: string;\n declare port: number;\n declare username: string;\n declare password: string;\n declare database: string;\n declare url: string;\n declare logs: boolean;\n\n protected constructor(input?: DataSourceInput) {\n this.type = input?.type || (env.DB_TYPE as DataSourceType);\n switch (this.type) {\n case \"mongo\":\n this.handleMongoSource(input as MongoDataSourceInput);\n break;\n case \"cockroachdb\":\n this.handleCockroachdbSource(input as PostgresSqlDataSourceInput);\n break;\n case \"postgres\":\n this.handlePostgresSource(input as PostgresSqlDataSourceInput);\n break;\n case \"mariadb\":\n case \"mysql\":\n this.handleMysqlSource(input as MysqlSqlDataSourceInput);\n break;\n case \"sqlite\":\n this.handleSqliteSource(input as SqliteDataSourceInput);\n break;\n case \"mssql\":\n this.handleMssqlSource(input as MssqlDataSourceInput);\n break;\n case \"oracledb\":\n this.handleOracleDBSource(input as MssqlDataSourceInput);\n break;\n default:\n throw new HysteriaError(\n `Invalid database type: ${this.type}, please provide a valid database type in your input or in the .env file with the key DB_TYPE\nValid database types are: [mongo, postgres, cockroachdb, mysql, mariadb, sqlite]`,\n `UNSUPPORTED_DATABASE_TYPE_${this.type}`,\n );\n }\n }\n\n protected handleCockroachdbSource(input?: PostgresSqlDataSourceInput) {\n this.host = (input?.host || env.DB_HOST) as string;\n this.port = +(input?.port as number) || +(env.DB_PORT as string);\n this.username = (input?.username || env.DB_USER) as string;\n this.password = (input?.password || env.DB_PASSWORD) as string;\n this.database = (input?.database || env.DB_DATABASE) as string;\n this.logs = input?.logs || env.DB_LOGS || false;\n\n if (!this.port) {\n this.port = 26257;\n }\n }\n\n protected handlePostgresSource(input?: PostgresSqlDataSourceInput) {\n this.host = (input?.host || env.DB_HOST) as string;\n this.port = +(input?.port as number) || +(env.DB_PORT as string);\n this.username = (input?.username || env.DB_USER) as string;\n this.password = (input?.password || env.DB_PASSWORD) as string;\n this.database = (input?.database || env.DB_DATABASE) as string;\n this.logs = input?.logs || env.DB_LOGS || false;\n\n if (!this.port) {\n this.port = 5432;\n }\n }\n\n protected handleMysqlSource(input?: MysqlSqlDataSourceInput) {\n this.host = (input?.host || env.DB_HOST) as string;\n this.port = +(input?.port as number) || +(env.DB_PORT as string);\n this.username = (input?.username || env.DB_USER) as string;\n this.password = (input?.password || env.DB_PASSWORD) as string;\n this.database = (input?.database || env.DB_DATABASE) as string;\n this.logs = input?.logs || env.DB_LOGS || false;\n\n if (!this.port) {\n this.port = 3306;\n }\n }\n\n protected handleSqliteSource(input?: SqliteDataSourceInput) {\n this.database = input?.database || env.DB_DATABASE || \":memory:\";\n this.logs = input?.logs || env.DB_LOGS || false;\n }\n\n protected handleMongoSource(input?: MongoDataSourceInput) {\n this.url = input?.url || (env.MONGO_URL as string);\n this.logs = input?.logs || env.MONGO_LOGS || false;\n }\n\n protected handleMssqlSource(input?: MssqlDataSourceInput) {\n this.host = (input?.host || env.DB_HOST) as string;\n this.port = +(input?.port as number) || +(env.DB_PORT as string);\n this.username = (input?.username || env.DB_USER) as string;\n this.password = (input?.password || env.DB_PASSWORD) as string;\n this.database = (input?.database || env.DB_DATABASE) as string;\n this.logs = input?.logs || env.DB_LOGS || false;\n\n if (!this.port) {\n this.port = 1433;\n }\n }\n\n protected handleOracleDBSource(input?: MssqlDataSourceInput) {\n this.host = (input?.host || env.DB_HOST) as string;\n this.port = +(input?.port as number) || +(env.DB_PORT as string);\n this.username = (input?.username || env.DB_USER) as string;\n this.password = (input?.password || env.DB_PASSWORD) as string;\n this.database = (input?.database || env.DB_DATABASE) as string;\n this.logs = input?.logs || env.DB_LOGS || false;\n\n if (!this.port) {\n this.port = 1521;\n }\n }\n}\n","import { ColumnType } from \"../sql/models/decorators/model_decorators_types\";\nimport { Model } from \"../sql/models/model\";\nimport { OpenApiModelPropertyType, OpenApiModelType } from \"./openapi_types\";\n\n/**\n * @description Detects column type from decorator metadata and serialize/prepare functions in best effort\n * @description By default it tries to cover the base serialization of the base columns types like column.integer, column.boolean etc.\n */\nconst detectColumnType = (column: ColumnType): OpenApiModelPropertyType => {\n const { required, ...rest } = column.openApi || {};\n const baseType: OpenApiModelPropertyType = {\n ...rest,\n type: column.openApi?.type || \"string\",\n description:\n column.openApi?.description ?? `Property: ${column.columnName}`,\n };\n\n // if an explicit openApi.type was provided, we honor it\n if (column.openApi?.type) {\n return {\n ...baseType,\n type: column.openApi.type,\n };\n }\n\n // enum (array of allowed string values)\n if (Array.isArray(column.type)) {\n return {\n ...baseType,\n type: \"string\",\n enum: column.type as string[],\n };\n }\n\n // dates / times\n if (\n column.type === \"date\" ||\n column.type === \"datetime\" ||\n column.type === \"timestamp\" ||\n column.type === \"time\"\n ) {\n return {\n ...baseType,\n type: \"string\",\n format: \"date-time\",\n };\n }\n\n // boolean\n if (column.type === \"boolean\") {\n return {\n ...baseType,\n type: \"boolean\",\n };\n }\n\n // integer-like types\n if (\n column.type === \"integer\" ||\n column.type === \"tinyint\" ||\n column.type === \"smallint\" ||\n column.type === \"mediumint\" ||\n column.type === \"increment\"\n ) {\n return {\n ...baseType,\n type: \"integer\",\n format: \"int32\",\n };\n }\n\n // big integers\n if (column.type === \"biginteger\" || column.type === \"bigIncrement\") {\n return {\n ...baseType,\n type: \"integer\",\n format: \"int64\",\n };\n }\n\n // floating / decimal numbers\n if (column.type === \"float\" || column.type === \"real\") {\n return {\n ...baseType,\n type: \"number\",\n format: \"float\",\n };\n }\n\n if (column.type === \"double\") {\n return {\n ...baseType,\n type: \"number\",\n format: \"double\",\n };\n }\n\n if (column.type === \"decimal\" || column.type === \"numeric\") {\n // decimals can be represented as numbers but some APIs prefer strings for precision\n return {\n ...baseType,\n type: \"number\",\n };\n }\n\n // JSON\n if (column.type === \"json\" || column.type === \"jsonb\") {\n return {\n ...baseType,\n type: \"object\",\n };\n }\n\n // UUID / ULID\n if (column.type === \"uuid\") {\n return {\n ...baseType,\n type: \"string\",\n format: \"uuid\",\n };\n }\n\n if (column.type === \"ulid\") {\n return {\n ...baseType,\n type: \"string\",\n format: \"ulid\",\n };\n }\n\n // text / string-like\n if (\n column.type === \"string\" ||\n column.type === \"char\" ||\n column.type === \"varchar\" ||\n column.type === \"text\" ||\n column.type === \"longtext\" ||\n column.type === \"mediumtext\" ||\n column.type === \"tinytext\"\n ) {\n return {\n ...baseType,\n type: \"string\",\n };\n }\n\n // binary / blob\n if (\n column.type === \"blob\" ||\n column.type === \"binary\" ||\n column.type === \"varbinary\" ||\n column.type === \"tinyblob\" ||\n column.type === \"mediumblob\" ||\n column.type === \"longblob\"\n ) {\n return {\n ...baseType,\n type: \"string\",\n format: \"binary\",\n };\n }\n\n // year\n if (column.type === \"year\") {\n return {\n ...baseType,\n type: \"integer\",\n format: \"int32\",\n };\n }\n\n // fallback to baseType\n return baseType;\n};\n\n/**\n * Determines if a column is required based on metadata and TypeScript type\n */\nconst isColumnRequired = (column: ColumnType): boolean => {\n return column.openApi?.required ?? false;\n};\n\n/**\n * Generates OpenAPI properties from model columns\n */\nconst generateColumnProperties = (\n model: typeof Model,\n): Record<string, OpenApiModelPropertyType> => {\n const columns = model.getColumns();\n const properties: Record<string, OpenApiModelPropertyType> = {};\n\n for (const column of columns) {\n if (column.hidden) {\n continue;\n }\n\n properties[column.columnName] = detectColumnType(column);\n }\n\n return properties;\n};\n\n/**\n * Gets required fields based on column metadata and TypeScript types\n */\nconst getRequiredFields = (model: typeof Model): string[] => {\n const columns = model.getColumns();\n const required: string[] = [];\n\n for (const column of columns) {\n if (isColumnRequired(column)) {\n required.push(column.columnName);\n }\n }\n\n return required || [];\n};\n\n/**\n * Generates OpenAPI schema for a model\n */\nconst generateModelSchema = (model: typeof Model): OpenApiModelType => {\n const properties = generateColumnProperties(model);\n const required = getRequiredFields(model);\n\n return {\n type: \"object\",\n properties,\n required: required.length ? required : [],\n };\n};\n\n/**\n * Generates OpenAPI schemas for multiple models\n */\nexport const generateOpenApiModel = <T extends new () => Model>(\n models: T[],\n): OpenApiModelType[] => {\n return models.map((model) =>\n generateModelSchema(model as unknown as typeof Model),\n );\n};\n\n/**\n * Generates OpenAPI schema for a single model\n */\nexport const generateOpenApiModelSchema = <T extends new () => Model>(\n model: T,\n): OpenApiModelType => {\n return generateModelSchema(model as unknown as typeof Model);\n};\n\n/**\n * Generates OpenAPI schemas with additional metadata\n */\nexport const generateOpenApiModelWithMetadata = <T extends new () => Model>(\n models: T[],\n): Array<OpenApiModelType & { modelName: string; $id?: string }> => {\n return models.map((model) => ({\n ...generateModelSchema(model as unknown as typeof Model),\n modelName: model.name,\n $id: model.name,\n }));\n};\n","import crypto from \"node:crypto\";\n\n/**\n * Hashes a given value using SHA-256 algorithm\n * @param value - The value to hash\n * @param salt - Optional salt to add to the hash\n * @returns Promise<string> - The hashed value in hexadecimal format\n */\nexport const hashString = (value: string, salt?: string): string => {\n const hashInstance = crypto.createHash(\"sha256\");\n\n const valueToHash = salt ? salt + value : value;\n\n hashInstance.update(valueToHash);\n return hashInstance.digest(\"hex\");\n};\n\n/**\n * Verifies if a given value matches a hash\n * @param value - The value to verify\n * @param hash - The hash to compare against\n * @param salt - Optional salt that was used in the original hash\n * @returns Promise<boolean> - Whether the value matches the hash\n */\nexport async function verifyHash(\n value: string,\n hash: string,\n salt?: string,\n): Promise<boolean> {\n const hashedValue = hashString(value, salt);\n return hashedValue === hash;\n}\n","import { format } from \"sql-formatter\";\nimport { SqlDataSource } from \"../sql/sql_data_source\";\nimport { SqlDataSourceType } from \"../sql/sql_data_source_types\";\n\n/**\n * @description Removes the \"FROM\" clause and spaces around it from a statement insensitive to case\n */\nexport const removeFromStatement = (statement: string): string => {\n return statement.replace(/\\s?from\\s?/i, \"\");\n};\n\nexport const getSqlDialect = (\n sqlType: SqlDataSourceType,\n): NonNullable<Parameters<typeof format>[1]>[\"language\"] => {\n switch (sqlType) {\n case \"mysql\":\n return \"mysql\";\n\n case \"mariadb\":\n return \"mariadb\";\n\n case \"postgres\":\n case \"cockroachdb\":\n return \"postgresql\";\n\n case \"sqlite\":\n return \"sqlite\";\n\n case \"mssql\":\n return \"transactsql\";\n\n case \"oracledb\":\n return \"plsql\";\n\n default:\n return \"sql\";\n }\n};\n\nconst formatParam = (param: any): string => {\n if (param === null || param === undefined) {\n return \"NULL\";\n } else if (param instanceof Date) {\n return `'${param.toISOString()}'`;\n }\n\n const type = typeof param;\n if (type === \"boolean\") {\n return param ? \"TRUE\" : \"FALSE\";\n } else if (type === \"number\" && Number.isFinite(param)) {\n return String(param);\n } else if (type === \"bigint\") {\n return String(param);\n } else if (type === \"string\") {\n const escaped = param.replace(/'/g, \"''\");\n return `'${escaped}'`;\n }\n\n if (\n Array.isArray(param) ||\n (type === \"object\" && Object.keys(param).length > 0)\n ) {\n const json = JSON.stringify(param);\n const escaped = json.replace(/'/g, \"''\");\n return `'${escaped}'`;\n }\n\n return String(param);\n};\n\n/**\n * @description bind params into query, useful for logging and toQuery()\n */\nexport const bindParamsIntoQuery = (query: string, params: any[]): string => {\n let result = query;\n\n // Replace MySQL/SQLite-style placeholders (?) only up to params length\n for (let i = 0; i < params.length; i++) {\n if (!result.includes(\"?\")) {\n break;\n }\n result = result.replace(/\\?/, formatParam(params[i]));\n }\n\n // Replace PostgreSQL-style placeholders ($1, $2, ...)\n for (let i = 0; i < params.length; i++) {\n const pgPlaceholder = new RegExp(`\\\\$${i + 1}(?!\\\\d)`, \"g\");\n result = result.replace(pgPlaceholder, formatParam(params[i]));\n }\n\n // Replace MSSQL-style placeholders (@p0, @p1, ...)\n for (let i = 0; i < params.length; i++) {\n const mssqlPlaceholder = new RegExp(`\\\\@${i + 1}(?!\\\\d)`, \"g\");\n result = result.replace(mssqlPlaceholder, formatParam(params[i]));\n }\n\n // Replace Oracle-style placeholders (:1, :2, ...)\n for (let i = 0; i < params.length; i++) {\n const oraclePlaceholder = new RegExp(`:${i + 1}(?!\\\\d)`, \"g\");\n result = result.replace(oraclePlaceholder, formatParam(params[i]));\n }\n\n return result;\n};\n\nexport const isTableMissingError = (\n sqlType: SqlDataSourceType,\n error: any,\n): boolean => {\n if (!error) {\n return false;\n }\n\n if (sqlType === \"mysql\" || sqlType === \"mariadb\") {\n return error.code === \"ER_NO_SUCH_TABLE\" || error.errno === 1146;\n }\n\n if (sqlType === \"postgres\" || sqlType === \"cockroachdb\") {\n return error.code === \"42P01\"; // undefined_table\n }\n\n if (sqlType === \"sqlite\") {\n return /no such table/i.test(String(error.message || \"\"));\n }\n\n if (sqlType === \"mssql\") {\n return error.number === 208; // Invalid object name\n }\n\n if (sqlType === \"oracledb\") {\n return error.errorNum === 942; // ORA-00942: table or view does not exist\n }\n\n return false;\n};\n\nexport const formatQuery = (sql: SqlDataSource, query: string): string => {\n const dbType = sql.getDbType();\n let formattedQuery: string;\n try {\n formattedQuery = format(query, {\n ...sql.inputDetails.queryFormatOptions,\n language: getSqlDialect(dbType as SqlDataSourceType),\n });\n } catch (_) {\n // Retry without language\n try {\n formattedQuery = format(query, {\n ...sql.inputDetails.queryFormatOptions,\n });\n } catch (_) {\n // Ultimate fallback\n formattedQuery = query;\n }\n }\n\n return formattedQuery;\n};\n","import { AstParser } from \"../../../ast/parser\";\nimport { AddColumnNode } from \"../../../ast/query/node/alter_table/add_column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlAddColumnInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const acNode = node as AddColumnNode;\n const ast = new AstParser(this.model, \"mssql\" as SqlDataSourceType);\n let { sql } = ast.parse([acNode.column]);\n\n const inlineConstraints = (acNode as any).inlineConstraints;\n if (inlineConstraints && inlineConstraints.length) {\n const constraintParts: string[] = [];\n\n for (const constraint of inlineConstraints) {\n const { sql: constraintSql } = ast.parse([constraint]);\n constraintParts.push(constraintSql);\n }\n\n if (constraintParts.length) {\n sql += ` ${constraintParts.join(\" \")}`;\n }\n }\n\n return { sql: `add ${sql}`, bindings: [] };\n }\n}\nexport default new MssqlAddColumnInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { AddConstraintNode } from \"../../../ast/query/node/alter_table/add_constraint\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlAddConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const acNode = node as AddConstraintNode;\n const ast = new AstParser(this.model, \"mssql\" as SqlDataSourceType);\n const { sql } = ast.parse([acNode.constraint]);\n return { sql: `add ${sql}`, bindings: [] };\n }\n}\nexport default new MssqlAddConstraintInterpreter();\n","import { AddPrimaryKeyNode } from \"../../../ast/query/node/alter_table/add_primary_key\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlAddPrimaryKeyInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const pk = node as AddPrimaryKeyNode;\n const cols = pk.columns.map((c) => `[${c}]`).join(\", \");\n return { sql: `add primary key (${cols})`, bindings: [] };\n }\n}\nexport default new MssqlAddPrimaryKeyInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { AlterColumnTypeNode } from \"../../../ast/query/node/alter_table/alter_column_type\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlAlterColumnTypeInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const a = node as AlterColumnTypeNode;\n const ast = new AstParser(this.model, \"mssql\" as SqlDataSourceType);\n const { sql } = ast.parse([a.newType]);\n const [, ...restTokens] = sql.trim().split(/\\s+/);\n const typeSql = restTokens.join(\" \");\n\n let nullClause = \"\";\n if (a.options.nullable !== undefined) {\n nullClause = a.options.nullable ? \" null\" : \" not null\";\n }\n\n let resultSql = `alter column [${a.column}] ${typeSql}${nullClause}`;\n\n if (a.options.dropDefault) {\n resultSql = `drop constraint DF_${a.column}, ${resultSql}`;\n }\n\n if (a.options.default !== undefined && !a.options.dropDefault) {\n let defaultValue = a.options.default;\n if (defaultValue === null) {\n defaultValue = \"null\";\n } else if (typeof defaultValue === \"string\") {\n if (defaultValue === \"NULL\") {\n defaultValue = \"null\";\n } else if (defaultValue === \"TRUE\" || defaultValue === \"FALSE\") {\n defaultValue = defaultValue === \"TRUE\" ? \"1\" : \"0\";\n } else {\n defaultValue = `'${defaultValue}'`;\n }\n }\n resultSql += `, add constraint DF_${a.column} default ${defaultValue} for [${a.column}]`;\n }\n\n if (a.options.unique !== undefined) {\n if (a.options.unique) {\n resultSql += `, add constraint UQ_${a.column} unique ([${a.column}])`;\n }\n }\n\n return { sql: resultSql, bindings: [] };\n }\n}\nexport default new MssqlAlterColumnTypeInterpreter();\n","export abstract class QueryNode {\n /**\n * Sql keyword to use for the query e.g. \"select\"\n */\n keyword: string;\n\n /**\n * The current parameter index to use for the query\n */\n currParamIndex: number = 1;\n\n /**\n * Whether the query node is a raw value and should not be parsed by the interpreter\n */\n isRawValue: boolean = false;\n\n /**\n * Whether the keyword can be seen multiple times in the query, e.g. \"join\" can be seen multiple times in a query\n */\n abstract canKeywordBeSeenMultipleTimes: boolean;\n\n /**\n * The string to use to chain the keyword with the next keyword\n */\n abstract chainsWith: string;\n\n /**\n * The folder to use for the query node, e.g. \"select\" is in the \"select\" folder inside the interpreter map\n */\n abstract folder: string;\n\n /**\n * The file to use for the query node, e.g. \"select\" is in the \"select\" file inside the interpreter map\n */\n abstract file: string;\n\n constructor(keyword: string, isRawValue: boolean = false) {\n this.keyword = keyword;\n this.isRawValue = isRawValue;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class RenameTableNode extends QueryNode {\n newName: string;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"alter_table\";\n file = \"rename_table\";\n\n constructor(newName: string) {\n super(\"rename to\");\n this.newName = newName;\n }\n}\n","export type CaseConvention =\n | \"camel\"\n | \"snake\"\n | \"preserve\"\n | RegExp\n | ((column: string) => string);\n\nfunction toSnake(str: any) {\n if (typeof str !== \"string\" || !str) {\n return str;\n }\n\n return str\n .replace(/([a-z])([A-Z])/g, \"$1_$2\")\n .replace(/([A-Z])([A-Z][a-z])/g, \"$1_$2\")\n .toLowerCase();\n}\n\nfunction toCamel(str: any) {\n if (typeof str !== \"string\" || !str) {\n return str;\n }\n\n return str.replace(/([-_][a-z])/g, (group) =>\n group.toUpperCase().replace(\"-\", \"\").replace(\"_\", \"\"),\n );\n}\n\nexport function convertCase(value: any, to: CaseConvention) {\n if (to === \"preserve\") {\n return value;\n }\n\n if (to === \"snake\") {\n return toSnake(value);\n }\n\n if (to === \"camel\") {\n return toCamel(value);\n }\n\n if (to instanceof RegExp) {\n return value.replace(to, (x: string) => x[1].toUpperCase());\n }\n\n return to(value);\n}\n","import dayjs from \"dayjs\";\nimport customParseFormat from \"dayjs/plugin/customParseFormat.js\";\nimport timezone from \"dayjs/plugin/timezone.js\";\nimport utc from \"dayjs/plugin/utc.js\";\nimport { HysteriaError } from \"../errors/hysteria_error\";\n\ndayjs.extend(utc);\ndayjs.extend(timezone);\ndayjs.extend(customParseFormat);\n\nexport type DateFormat = \"ISO\" | \"TIMESTAMP\" | \"DATE_ONLY\" | \"TIME_ONLY\";\nexport type Timezone = \"UTC\" | \"LOCAL\";\n\nexport const getDate = (\n date: Date,\n format: DateFormat = \"ISO\",\n timezone: Timezone = \"UTC\",\n): string => {\n if (!(date instanceof Date) || isNaN(date.getTime())) {\n throw new Error(\"Invalid date provided\");\n }\n\n const d = dayjs(date);\n\n if (timezone === \"LOCAL\") {\n const localDate = d.local();\n switch (format) {\n case \"ISO\":\n return localDate.format(\"YYYY-MM-DD HH:mm:ss\");\n case \"DATE_ONLY\":\n return localDate.format(\"YYYY-MM-DD\");\n case \"TIME_ONLY\":\n return localDate.format(\"HH:mm:ss\");\n default:\n return localDate.unix().toString();\n }\n }\n\n const utcDate = d.utc();\n switch (format) {\n case \"ISO\":\n return utcDate.format(\"YYYY-MM-DD HH:mm:ss\");\n case \"DATE_ONLY\":\n return utcDate.format(\"YYYY-MM-DD\");\n case \"TIME_ONLY\":\n return utcDate.format(\"HH:mm:ss\");\n default:\n return utcDate.unix().toString();\n }\n};\n\nexport const parseDate = (\n value: string | Date | null,\n format?: string,\n timezone: Timezone = \"UTC\",\n): Date | null => {\n if (value === null) {\n return null;\n }\n\n if (value instanceof Date) {\n if (isNaN(value.getTime())) {\n throw new HysteriaError(\"DateUtils::parseDate\", \"INVALID_DATE_OBJECT\");\n }\n return value;\n }\n\n try {\n const parsed = format ? dayjs(value, format) : dayjs(value);\n if (!parsed.isValid()) {\n throw new HysteriaError(\"DateUtils::parseDate\", \"INVALID_DATE_STRING\");\n }\n\n return timezone === \"UTC\" ? parsed.utc().toDate() : parsed.local().toDate();\n } catch (error) {\n throw new HysteriaError(\n \"DateUtils::parseDate\",\n \"FAILED_TO_PARSE_DATE\",\n error as Error,\n );\n }\n};\n\nexport const baseSoftDeleteDate = (date: Date = new Date()): string => {\n return dayjs(date).utc().format(\"YYYY-MM-DD HH:mm:ss\");\n};\n","import crypto, { privateDecrypt, publicEncrypt } from \"node:crypto\";\nimport { HysteriaError } from \"../errors/hysteria_error\";\n\n// #region Symmetric Encryption\nexport const encryptSymmetric = (key: string, value: string): string => {\n try {\n const keyBuffer = crypto.createHash(\"sha256\").update(key).digest();\n const iv = crypto.randomBytes(16);\n const cipher = crypto.createCipheriv(\"aes-256-cbc\", keyBuffer, iv);\n let encrypted = cipher.update(value, \"utf8\", \"hex\");\n encrypted += cipher.final(\"hex\");\n return `${iv.toString(\"hex\")}:${encrypted}`;\n } catch (error) {\n throw new HysteriaError(\n \"Encryption::encryptSymmetric\",\n \"FAILED_TO_ENCRYPT_SYMMETRICALLY\",\n error instanceof Error ? error : undefined,\n );\n }\n};\n\nexport const decryptSymmetric = (key: string, value: string): string => {\n try {\n const keyBuffer = crypto.createHash(\"sha256\").update(key).digest();\n // Ensure value is a string and trim any whitespace (Oracle may add trailing spaces)\n const stringValue = String(value).trim();\n const [ivHex, encrypted] = stringValue.split(\":\");\n if (!ivHex || !encrypted) {\n throw new Error(\n `Invalid encrypted value format: expected \"iv:data\" but got \"${stringValue.substring(0, 50)}...\"`,\n );\n }\n // Normalize hex to lowercase (Oracle may return uppercase)\n const normalizedIv = ivHex.toLowerCase();\n const normalizedEncrypted = encrypted.toLowerCase();\n const decipher = crypto.createDecipheriv(\n \"aes-256-cbc\",\n keyBuffer,\n Buffer.from(normalizedIv, \"hex\"),\n );\n let decrypted = decipher.update(normalizedEncrypted, \"hex\", \"utf8\");\n decrypted += decipher.final(\"utf8\");\n return decrypted;\n } catch (error) {\n throw new HysteriaError(\n \"Encryption::decryptSymmetric\",\n \"FAILED_TO_DECRYPT_SYMMETRICALLY\",\n error instanceof Error ? error : undefined,\n );\n }\n};\n// #endregion\n\n// #region Asymmetric Encryption\nexport const encryptAsymmetric = (publicKey: string, value: string): string => {\n try {\n // Generate a random symmetric key\n const symmetricKey = crypto.randomBytes(32);\n const iv = crypto.randomBytes(16);\n\n // Encrypt the data with AES\n const cipher = crypto.createCipheriv(\"aes-256-cbc\", symmetricKey, iv);\n let encryptedData = cipher.update(value, \"utf8\", \"hex\");\n encryptedData += cipher.final(\"hex\");\n\n // Encrypt the symmetric key with RSA\n const encryptedKey = publicEncrypt(publicKey, symmetricKey);\n\n // Combine all components\n return `${iv.toString(\"hex\")}:${encryptedKey.toString(\"hex\")}:${encryptedData}`;\n } catch (error) {\n throw new HysteriaError(\n \"Encryption::encryptAsymmetric\",\n \"FAILED_TO_ENCRYPT_ASYMMETRICALLY\",\n error instanceof Error ? error : undefined,\n );\n }\n};\n\nexport const decryptAsymmetric = (\n privateKey: string,\n value: string,\n): string => {\n try {\n // Ensure value is a string and trim any whitespace (Oracle may add trailing spaces)\n const stringValue = String(value).trim();\n const [ivHex, encryptedKeyHex, encryptedData] = stringValue.split(\":\");\n if (!ivHex || !encryptedKeyHex || !encryptedData) {\n throw new Error(\n `Invalid encrypted value format: expected \"iv:key:data\" but got \"${stringValue.substring(0, 50)}...\"`,\n );\n }\n\n const symmetricKey = privateDecrypt(\n privateKey,\n Buffer.from(encryptedKeyHex, \"hex\"),\n );\n\n const decipher = crypto.createDecipheriv(\n \"aes-256-cbc\",\n symmetricKey,\n Buffer.from(ivHex, \"hex\"),\n );\n\n let decrypted = decipher.update(encryptedData, \"hex\", \"utf8\");\n decrypted += decipher.final(\"utf8\");\n\n return decrypted;\n } catch (error) {\n throw new HysteriaError(\n \"Encryption::decryptAsymmetric\",\n \"FAILED_TO_DECRYPT_ASYMMETRICALLY\",\n error instanceof Error ? error : undefined,\n );\n }\n};\n// #endregion\n\nexport const generateKeyPair = (): {\n publicKey: string;\n privateKey: string;\n} => {\n const { publicKey, privateKey } = crypto.generateKeyPairSync(\"rsa\", {\n modulusLength: 4096,\n });\n\n return {\n publicKey: publicKey.export({ type: \"spki\", format: \"pem\" }).toString(),\n privateKey: privateKey.export({ type: \"pkcs8\", format: \"pem\" }).toString(),\n };\n};\n","type MetadataKey = string | symbol;\ntype Property = string | symbol | undefined;\n\ntype MetadataMap = Map<MetadataKey, unknown>;\ntype PropertyStore = Map<Property, MetadataMap>;\n\n/* Own version of reflect-metadata with only the features we need and without having to rely on the original package */\nexport class Reflect {\n private static store: WeakMap<object, PropertyStore> = new WeakMap();\n\n static defineMetadata(\n metadataKey: MetadataKey,\n metadataValue: unknown,\n target: object,\n propertyKey?: string | symbol,\n ): void {\n if (\n (typeof target !== \"object\" || target === null) &&\n typeof target !== \"function\"\n ) {\n throw new TypeError(\"target must be an object or function\");\n }\n\n let propStore = this.store.get(target);\n if (!propStore) {\n propStore = new Map();\n this.store.set(target, propStore);\n }\n\n let metaMap = propStore.get(propertyKey);\n if (!metaMap) {\n metaMap = new Map();\n propStore.set(propertyKey, metaMap);\n }\n\n metaMap.set(metadataKey, metadataValue);\n }\n\n static getMetadata<T = unknown>(\n metadataKey: MetadataKey,\n target: object,\n propertyKey?: string | symbol,\n ): T | undefined {\n if (\n (typeof target !== \"object\" || target === null) &&\n typeof target !== \"function\"\n ) {\n throw new TypeError(\"target must be an object or function\");\n }\n\n let current: object | null = target;\n while (current) {\n const propStore = this.store.get(current);\n if (propStore) {\n const metaMap = propStore.get(propertyKey);\n if (metaMap && metaMap.has(metadataKey)) {\n return metaMap.get(metadataKey) as T;\n }\n }\n\n current = Object.getPrototypeOf(current);\n }\n\n return;\n }\n}\n","import { randomBytes } from \"node:crypto\";\n\nconst ENCODING = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\nconst ENCODING_LEN = ENCODING.length;\nconst TIME_LEN = 10;\nconst RANDOM_LEN = 16;\n\n/**\n * Encodes a number to Base32 string\n */\nconst encodeTime = (now: number, length: number): string => {\n let str = \"\";\n for (let i = 0; i < length; i++) {\n const mod = now % ENCODING_LEN;\n str = ENCODING.charAt(mod) + str;\n now = (now - mod) / ENCODING_LEN;\n }\n return str;\n};\n\n/**\n * Generates random bytes and encodes them to Base32\n */\nconst encodeRandom = (length: number): string => {\n const bytes = randomBytes(length);\n let str = \"\";\n for (let i = 0; i < length; i++) {\n const randomByte = bytes[i];\n str += ENCODING.charAt(randomByte % ENCODING_LEN);\n }\n return str;\n};\n\n/**\n * Generates a ULID (Universally Unique Lexicographically Sortable Identifier) string, 26 characters long\n */\nexport const generateULID = (): string => {\n const now = Math.floor(Date.now() / 1000);\n const time = encodeTime(now, TIME_LEN);\n const random = encodeRandom(RANDOM_LEN);\n return time + random;\n};\n","import { HysteriaError } from \"../../errors/hysteria_error\";\n\nexport function convertValueToSQL(value: any, type: string): string {\n switch (type) {\n case \"string\":\n return `'${value}'`;\n case \"number\":\n case \"boolean\":\n return `${value}`;\n default:\n throw new HysteriaError(\n \"convertValueToSQL\",\n `UNSUPPORTED_DATABASE_TYPE_${type}`,\n );\n }\n}\n\nexport function stripIdentifierQuotes(identifier: string): string {\n return identifier.replace(/^[`\"]|[`\"]$/g, \"\");\n}\n\nexport function remapSelectedColumnToFromAlias(\n column: string,\n fromAlias: string,\n modelTable: string,\n): string {\n if (!column.includes(\".\")) {\n const cleanCol = stripIdentifierQuotes(column);\n return `${fromAlias}.${cleanCol}`;\n }\n\n let [table, col] = column.split(\".\");\n table = stripIdentifierQuotes(table);\n col = stripIdentifierQuotes(col);\n\n if (table !== modelTable) {\n return column;\n }\n\n if (col === \"*\") {\n return `${fromAlias}.*`;\n }\n\n return `${fromAlias}.${col}`;\n}\n\nexport function getColumnValue(column: string | (() => string)) {\n return typeof column === \"function\" ? column() : column;\n}\n\nexport const deepCloneNode = (val: any, seen = new WeakMap()): any => {\n if (val === null || typeof val !== \"object\") {\n return val;\n }\n\n if (seen.has(val)) {\n return seen.get(val);\n }\n\n if (Array.isArray(val)) {\n const arr: any[] = [];\n seen.set(val, arr);\n for (let i = 0; i < val.length; i++) {\n arr[i] = deepCloneNode(val[i], seen);\n }\n return arr;\n }\n\n const out: any = Object.create(Object.getPrototypeOf(val) || {});\n seen.set(val, out);\n\n for (const key of Object.getOwnPropertyNames(val)) {\n const v = (val as any)[key];\n if (typeof v === \"function\") {\n out[key] = v;\n continue;\n }\n\n out[key] = deepCloneNode(v, seen);\n }\n\n return out;\n};\n","import { CaseConvention } from \"./utils/case_utils\";\n\n/**\n * @description The most basic class for all models for both SQL and NoSQL databases\n * @internal Not meant to be used outside of the library\n */\nexport abstract class Entity {\n /**\n * @description Defines the case convention for the model\n * @description Useful in raw queries, better to leave it as none in Model definition so it will respect the exact column name from the model, else it will convert the column name to the case convention you choose (default is camel case)\n * @type {CaseConvention}\n */\n static modelCaseConvention: CaseConvention = \"camel\";\n\n /**\n * @description Defines the case convention for the database, this should be the case convention you use in your database\n * @type {CaseConvention}\n */\n static databaseCaseConvention: CaseConvention = \"snake\";\n}\n","import { convertCase } from \"../utils/case_utils\";\nimport { ColumnType } from \"./models/decorators/model_decorators_types\";\nimport { Model } from \"./models/model\";\n\nexport const parseDatabaseDataIntoModelResponse = async <\n T extends Record<string, any>,\n>(\n model: T,\n typeofModel: typeof Model,\n modelColumns: ColumnType[],\n modelColumnsMap: Map<string, ColumnType>,\n modelSelectedColumns: string[] = [],\n modelAnnotatedColumns: string[] = [],\n mustRemoveAnnotations: boolean = false,\n): Promise<T> => {\n const casedModel: Record<string, any> =\n new (typeofModel as unknown as new () => T)();\n const hiddenColumnsSet = new Set<string>(\n modelColumns\n .filter((column) => column.hidden)\n .map((column) => column.columnName),\n );\n\n const databaseColumnsMap = new Map<string, ColumnType>(\n modelColumns.map((modelColumn) => [modelColumn.databaseName, modelColumn]),\n );\n\n const modelSelectedColumnsSet = modelSelectedColumns.length\n ? new Set<string>(modelSelectedColumns)\n : null;\n\n await Promise.all(\n Object.keys(model).map(async (key) => {\n const databaseValue = model[key];\n const modelKey =\n databaseColumnsMap.get(key)?.columnName ??\n convertCase(key, typeofModel.modelCaseConvention);\n\n if (modelKey === \"$annotations\" && !mustRemoveAnnotations) {\n processAnnotations(\n model,\n key,\n casedModel,\n typeofModel,\n modelAnnotatedColumns,\n );\n return;\n }\n\n if (\n !modelColumnsMap.has(modelKey) || // Handled in the $annotations property\n hiddenColumnsSet.has(modelKey) ||\n (modelSelectedColumnsSet && !modelSelectedColumnsSet.has(modelKey))\n ) {\n return;\n }\n\n // Include null values\n if (databaseValue === null) {\n casedModel[modelKey] = null;\n return;\n }\n\n const modelColumn = modelColumnsMap.get(modelKey);\n if (modelColumn && modelColumn.serialize) {\n casedModel[modelKey] = await modelColumn.serialize(databaseValue);\n return;\n }\n\n casedModel[modelKey] = databaseValue;\n }),\n );\n\n // Fill model with modelSelectedColumns as null if not present in the model\n if (modelSelectedColumnsSet) {\n for (const column of modelSelectedColumnsSet) {\n if (!(column in casedModel)) {\n casedModel[column] = null;\n }\n }\n }\n\n return casedModel as T;\n};\n\nexport const processAnnotations = (\n model: Record<string, any>,\n key: string,\n casedModel: Record<string, any>,\n typeofModel: typeof Model,\n modelAnnotatedColumns: string[] = [],\n) => {\n const annotationsData = model[key];\n if (!annotationsData || !Object.keys(annotationsData).length) {\n return;\n }\n\n const modelAnnotatedColumnsSet =\n modelAnnotatedColumns.length > 0\n ? new Set<string>(modelAnnotatedColumns)\n : null;\n\n if (!modelAnnotatedColumnsSet) {\n return;\n }\n\n const $annotations: Record<string, any> = {};\n for (const objKey of Object.keys(annotationsData)) {\n if (modelAnnotatedColumnsSet.has(objKey)) {\n $annotations[convertCase(objKey, typeofModel.modelCaseConvention)] =\n annotationsData[objKey];\n }\n }\n\n if (Object.keys($annotations).length > 0) {\n casedModel[key] = $annotations;\n }\n};\n\n/**\n * @description Main serializer function\n */\nexport const serializeModel = async <T extends Model>(\n models: T[],\n typeofModel: typeof Model,\n modelSelectedColumns: string[] = [],\n modelAnnotatedColumns: string[] = [],\n mustRemoveAnnotations: boolean = false,\n): Promise<T | T[] | null> => {\n if (!models.length) {\n return null;\n }\n\n const modelColumns = typeofModel.getColumns();\n const modelColumnsMap = new Map<string, ColumnType>(\n modelColumns.map((modelColumn) => [modelColumn.columnName, modelColumn]),\n );\n\n // At this point `modelSelectedColumns` are in database convention\n const processedSelectedColumns: string[] = [];\n for (const databaseColumn of modelSelectedColumns) {\n // If alias, skip because it will be added in $annotations\n if (databaseColumn.toLowerCase().includes(\"as\")) {\n continue;\n }\n\n let processedColumn = databaseColumn;\n // If contains . it means it's something like user.name, so split it and return the last part since it was something useful for the query but at this point we want what to retrieve\n if (processedColumn.includes(\".\")) {\n processedColumn = processedColumn.split(\".\").pop() as string;\n }\n\n if (processedColumn === \"*\") {\n continue;\n }\n\n const columnName =\n modelColumnsMap.get(processedColumn)?.columnName ??\n convertCase(processedColumn, typeofModel.modelCaseConvention);\n processedSelectedColumns.push(columnName);\n }\n modelSelectedColumns = processedSelectedColumns;\n\n const serializedModels = await Promise.all(\n models.map(async (model) => {\n const serializedModel = await parseDatabaseDataIntoModelResponse(\n model,\n typeofModel,\n modelColumns,\n modelColumnsMap,\n modelSelectedColumns,\n modelAnnotatedColumns,\n mustRemoveAnnotations,\n );\n\n return serializedModel;\n }),\n );\n\n return serializedModels.length === 1 ? serializedModels[0] : serializedModels;\n};\n","import { SqlDataSourceType } from \"../sql_data_source_types\";\n\nexport const databasesWithReturning: SqlDataSourceType[] = [\n \"postgres\",\n \"cockroachdb\",\n];\n","import plural from \"pluralize\";\nimport { convertCase } from \"../../utils/case_utils\";\nimport { Model } from \"./model\";\n\nexport function getBaseTableName(target: typeof Model): string {\n const className = target.name;\n const snakeCaseName = convertCase(className, \"snake\");\n return plural(snakeCaseName);\n}\n\nexport function getBaseModelInstance<T extends Model>(): T {\n return {} as T;\n}\n","import { ModelManager } from \"./model_manager/model_manager\";\nimport type {\n FindOneType,\n FindReturnType,\n FindType,\n InsertOptions,\n ModelKey,\n ModelRelation,\n OnlyM2MRelations,\n UnrestrictedFindOneType,\n UnrestrictedFindType,\n UpsertOptions,\n WhereType,\n} from \"./model_manager/model_manager_types\";\nimport type { ModelQueryBuilder } from \"./model_query_builder/model_query_builder\";\nimport type {\n BaseModelMethodOptions,\n ModelWithoutRelations,\n} from \"./model_types\";\n\nimport { Entity } from \"../../entity\";\nimport { HysteriaError } from \"../../errors/hysteria_error\";\nimport { CaseConvention, convertCase } from \"../../utils/case_utils\";\nimport { baseSoftDeleteDate } from \"../../utils/date_utils\";\nimport { DryModelQueryBuilderWithoutReadOperations } from \"../query_builder/query_builder_types\";\nimport type {\n TableColumnInfo,\n TableIndexInfo,\n TableSchemaInfo,\n} from \"../schema_introspection_types\";\nimport { serializeModel } from \"../serializer\";\nimport { SqlDataSource } from \"../sql_data_source\";\nimport { databasesWithReturning } from \"../sql_runner/sql_runner_constants\";\nimport {\n belongsTo,\n column,\n getIndexes,\n getModelColumns,\n getPrimaryKey,\n getRelations,\n getRelationsMetadata,\n getUniques,\n hasMany,\n hasOne,\n manyToMany,\n} from \"./decorators/model_decorators\";\nimport {\n ColumnType,\n IndexType,\n LazyRelationType,\n UniqueType,\n} from \"./decorators/model_decorators_types\";\nimport { AnnotatedModel } from \"./model_query_builder/model_query_builder_types\";\nimport { getBaseTableName } from \"./model_utils\";\nimport { ManyToMany } from \"./relations/many_to_many\";\nimport { RelationEnum } from \"./relations/relation\";\n\n/**\n * @description Represents a Table in the Database\n */\nexport abstract class Model extends Entity {\n declare private \"*\": string;\n\n /**\n * @description The column used to soft delete a record, default is deletedAt\n */\n static softDeleteColumn = \"deletedAt\";\n\n /**\n * @description The value used to soft delete a record, default is the current date and time\n * @default format: \"YYYY-MM-DD HH:mm:ss\" in UTC timezone\n */\n static softDeleteValue: boolean | string = baseSoftDeleteDate();\n\n /**\n * @description The sql sqlInstance generated by SqlDataSource.connect\n */\n static sqlInstance: SqlDataSource;\n\n /**\n * @description Getter for the table name of the model\n */\n static get table(): string {\n const descriptor = Object.getOwnPropertyDescriptor(this, \"table\");\n if (descriptor && \"value\" in descriptor) {\n return descriptor.value;\n }\n\n return getBaseTableName(this);\n }\n\n /**\n * @description Setter for the table name of the model\n */\n static set table(value: string) {\n Object.defineProperty(this, \"table\", {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n\n /**\n * @description Getter for the primary key of the model\n */\n static get primaryKey(): string | undefined {\n return getPrimaryKey(this);\n }\n\n constructor() {\n super();\n }\n\n /**\n * @description Returns all the records for the given model\n */\n static async all<T extends Model>(\n this: new () => T | typeof Model,\n options: BaseModelMethodOptions = {},\n ): Promise<AnnotatedModel<T, {}>[]> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return (await modelManager.find({\n ignoreHooks: options.ignoreHooks ? [\"afterFetch\", \"beforeFetch\"] : [],\n })) as AnnotatedModel<T, {}>[];\n }\n\n /**\n * @description Gives a query sqlInstance for the given model\n */\n static query<T extends Model>(\n this: new () => T | typeof Model,\n options?: Omit<BaseModelMethodOptions, \"ignoreHooks\">,\n ): ModelQueryBuilder<T> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return modelManager.query() as ModelQueryBuilder<T>;\n }\n\n /**\n * @description Returns a dry query builder instance\n * @description The dry query builder instance will not execute the query\n */\n static dryQuery<T extends Model>(\n this: new () => T | typeof Model,\n options?: Omit<BaseModelMethodOptions, \"ignoreHooks\">,\n ): DryModelQueryBuilderWithoutReadOperations<T> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return modelManager.dryQuery() as unknown as DryModelQueryBuilderWithoutReadOperations<T>;\n }\n\n /**\n * @description Finds the first record in the database\n * @deprecated Used only for debugging purposes, use findOne or query instead\n */\n static async first<T extends Model>(\n this: new () => T | typeof Model,\n options?: BaseModelMethodOptions,\n ): Promise<AnnotatedModel<T, {}> | null> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return modelManager.query().one({\n ignoreHooks: options?.ignoreHooks ? [\"afterFetch\", \"beforeFetch\"] : [],\n });\n }\n\n /**\n * @description Finds records for the given model\n */\n static async find<\n T extends Model,\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(\n this: new () => T | typeof Model,\n findOptions?: FindType<T, S, R> | UnrestrictedFindType<T, S, R>,\n options?: Omit<BaseModelMethodOptions, \"ignoreHooks\">,\n ): Promise<FindReturnType<T, S, R>[]> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return (await modelManager.find(\n findOptions as FindType<T, S, R>,\n )) as FindReturnType<T, S, R>[];\n }\n\n /**\n * @description Finds a record for the given model or throws an error if it doesn't exist\n */\n static async findOneOrFail<\n T extends Model,\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(\n this: new () => T | typeof Model,\n findOneOptions: (\n | FindOneType<T, S, R>\n | UnrestrictedFindOneType<T, S, R>\n ) & {\n customError?: Error;\n },\n options?: Omit<BaseModelMethodOptions, \"ignoreHooks\">,\n ): Promise<FindReturnType<T, S, R>> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return (await modelManager.findOneOrFail(\n findOneOptions as FindOneType<T, S, R>,\n )) as FindReturnType<T, S, R>;\n }\n\n /**\n * @description Finds a record for the given model\n */\n static async findOne<\n T extends Model,\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(\n this: new () => T | typeof Model,\n findOneOptions: (FindOneType<T, S, R> | UnrestrictedFindOneType<T, S, R>) &\n BaseModelMethodOptions,\n options?: Omit<BaseModelMethodOptions, \"ignoreHooks\">,\n ): Promise<FindReturnType<T, S, R> | null> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return (await modelManager.findOne(\n findOneOptions as FindOneType<T, S, R>,\n )) as FindReturnType<T, S, R> | null;\n }\n\n /**\n * @description Finds records for the given column and value\n */\n static async findBy<\n T extends Model,\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(\n this: new () => T | typeof Model,\n column: ModelKey<T>,\n value: string | number | boolean | Date | null,\n options: BaseModelMethodOptions = {},\n ): Promise<FindReturnType<T, S, R>[]> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return (await modelManager.find({\n ignoreHooks: options.ignoreHooks ? [\"afterFetch\", \"beforeFetch\"] : [],\n where: {\n [column as unknown as keyof T]: value as T[keyof T],\n } as WhereType<T>,\n })) as FindReturnType<T, S, R>[];\n }\n\n /**\n * @description Finds the first record for the given column and value\n */\n static async findOneBy<\n T extends Model,\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(\n this: new () => T | typeof Model,\n column: ModelKey<T>,\n value: string | number | boolean | Date | null,\n options: BaseModelMethodOptions = {},\n ): Promise<FindReturnType<T, S, R> | null> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return (await modelManager.findOne({\n ignoreHooks: options.ignoreHooks ? [\"afterFetch\", \"beforeFetch\"] : [],\n where: {\n [column as keyof T]: value as T[keyof T],\n } as WhereType<T>,\n })) as FindReturnType<T, S, R> | null;\n }\n\n /**\n * @description Finds a record for the given model for the given value, the model must have a primary key defined else it will throw an error\n */\n static async findOneByPrimaryKey<\n T extends Model,\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(\n this: new () => T | typeof Model,\n value: string | number,\n options: Omit<BaseModelMethodOptions, \"ignoreHooks\"> = {},\n ): Promise<FindReturnType<T, S, R> | null> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return (await modelManager.findOneByPrimaryKey(value)) as FindReturnType<\n T,\n S,\n R\n > | null;\n }\n\n /**\n * @description Refreshes a model from the database, the model must have a primary key defined\n */\n static async refresh<T extends Model>(\n this: new () => T | typeof Model,\n model: T,\n options: Omit<BaseModelMethodOptions, \"ignoreHooks\"> = {},\n ): Promise<AnnotatedModel<T, {}> | null> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n const primaryKey = typeofModel.primaryKey as keyof T;\n const primaryKeyValue = model[primaryKey];\n const refreshedModel = await modelManager.findOneByPrimaryKey(\n primaryKeyValue as string,\n );\n if (!refreshedModel) {\n return null;\n }\n\n return refreshedModel;\n }\n\n /**\n * @description Saves a new record to the database\n * @description $annotations will be ignored if set in the modelData and won't be returned in the response\n * @warning If not using postgres and the model has no primary key, the model will be saved, but it won't be possible to retrieve it so at that point it will be returned as null, this is not typed as Model | null for type safety reasons\n * @mysql If no Primary Key is present in the model definition, the model will be returned\n * @sqlite If no Primary Key is present in the model definition, the model will be returned\n * @sqlite Returning Not supported and won't have effect\n */\n static async insert<T extends Model>(\n this: new () => T | typeof Model,\n modelData: Partial<ModelWithoutRelations<T>>,\n options: BaseModelMethodOptions & InsertOptions<T> = {},\n ): Promise<AnnotatedModel<T, {}>> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return modelManager.insert(modelData as T, {\n ignoreHooks: options.ignoreHooks,\n returning: options.returning,\n });\n }\n\n /**\n * @description Saves multiple records to the database\n * @description $annotations will be ignored if set in the modelData and won't be returned in the response\n * @warning If not using postgres and the model has no primary key, the models will be saved, but it won't be possible to retrieve them so at that point they will be returned as an empty array\n * @mysql If no Primary Key is present in the model definition, the model will be returned\n * @sqlite If no Primary Key is present in the model definition, the model will be returned\n * @sqlite Returning Not supported and won't have effect\n * @oracledb may do multiple inserts with auto-generated identity columns\n */\n static async insertMany<T extends Model>(\n this: new () => T | typeof Model,\n modelsData: Partial<ModelWithoutRelations<T>>[],\n options: BaseModelMethodOptions & InsertOptions<T> = {},\n ): Promise<AnnotatedModel<T, {}>[]> {\n if (!modelsData.length) {\n return [];\n }\n\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return modelManager.insertMany(modelsData as T[], {\n ignoreHooks: options.ignoreHooks,\n returning: options.returning,\n });\n }\n\n /**\n * @description Syncs in the through table the given models for the given relation\n * @param relation The many to many relation to sync, this is not type safe since many to many relations defined at a decorator level\n * @param leftModel The source (left) model instance to synchronize in the many-to-many relation.\n * @param rightModels The target (right) model instances to associate with the left model in the join table.\n * @param joinTableCustomData Optional function that returns custom data for each join table row (receives rightModel and index)\n * @param options.caseConvention Optional. Controls naming convention for left/right foreign keys in the join table. Defaults to the left model's convention; set to `none` to disable.\n * @warning Use only when the join table contains no business logic beyond foreign keys. For business logic, define and use a dedicated join model.\n * @warning This method does not trigger hooks on the join table, even if a Model exists. Use the join model's `insertMany` for hook support.\n * @throws {HysteriaError} If the specified relation does not exist on the model.\n * @throws {HysteriaError} If the specified relation is not a many-to-many relation.\n */\n static async sync<T extends Model, R extends OnlyM2MRelations<T>>(\n this: new () => T | typeof Model,\n relation: R,\n leftModel: T,\n rightModels: T[R] extends any[] ? T[R] : T[R][],\n joinTableCustomData?: (\n rightModel: T[R] extends any[] ? T[R][number] : T[R],\n index: number,\n ) => Record<string, any>,\n options: BaseModelMethodOptions & { caseConvention?: CaseConvention } = {},\n ): Promise<void> {\n if (!Array.isArray(rightModels)) {\n rightModels = [rightModels] as T[R] extends any[] ? T[R] : T[R][];\n }\n\n if (!rightModels.length) {\n return;\n }\n\n const typeofModel = this as unknown as typeof Model;\n const modelRelations = getRelations(typeofModel);\n const m2mRelation = modelRelations.find(\n (r) => r.columnName === relation,\n ) as ManyToMany;\n\n if (!m2mRelation) {\n throw new HysteriaError(\n `${typeofModel.name}::sync`,\n \"RELATION_NOT_FOUND\",\n );\n }\n\n if (m2mRelation.type !== RelationEnum.manyToMany) {\n throw new HysteriaError(\n `${typeofModel.name}::sync`,\n \"RELATION_NOT_MANY_TO_MANY\",\n );\n }\n\n const casedLeftForeignKey = convertCase(\n m2mRelation.leftForeignKey,\n options.caseConvention || typeofModel.databaseCaseConvention,\n );\n\n const casedRightForeignKey = convertCase(\n m2mRelation.rightForeignKey,\n options.caseConvention || typeofModel.databaseCaseConvention,\n );\n\n const joinTableModelsToInsert = rightModels.map((rightModel, index) => ({\n [casedLeftForeignKey]: leftModel[typeofModel.primaryKey as keyof T],\n [casedRightForeignKey]:\n rightModel[m2mRelation.model.primaryKey as keyof T],\n ...(joinTableCustomData ? joinTableCustomData(rightModel, index) : {}),\n }));\n\n class ThroughModel extends Model {\n static databaseCaseConvention: CaseConvention = \"preserve\";\n static modelCaseConvention: CaseConvention = \"preserve\";\n\n static get table() {\n return m2mRelation.throughModel;\n }\n }\n\n const throughModelManager =\n ThroughModel.dispatchModelManager<InstanceType<typeof ThroughModel>>(\n options,\n );\n\n await throughModelManager.insertMany(joinTableModelsToInsert);\n }\n\n /**\n * @description Updates a record, returns the updated record\n * @description Model is retrieved from the database using the primary key regardless of any model hooks\n * @description Can only be used if the model has a primary key, use a massive update if the model has no primary key\n * @throws {HysteriaError} If the model has no primary key\n */\n static async updateRecord<T extends Model>(\n this: new () => T | typeof Model,\n modelSqlInstance: Partial<T>,\n updatePayload?: Partial<ModelWithoutRelations<T>>,\n options: Omit<BaseModelMethodOptions, \"ignoreHooks\"> = {},\n ): Promise<AnnotatedModel<T, {}>> {\n try {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n updatePayload &&\n typeofModel.combineProps(modelSqlInstance, updatePayload as Partial<T>);\n const updatedModel = await modelManager.updateRecord(modelSqlInstance);\n return updatedModel;\n } catch (error) {\n if (\n error instanceof HysteriaError &&\n error.message === \"MODEL_HAS_NO_PRIMARY_KEY\"\n ) {\n throw new HysteriaError(\n `${this.name}::updateRecord`,\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n throw error;\n }\n }\n\n /**\n * @description Finds the first record or creates a new one if it doesn't exist\n */\n static async firstOrInsert<T extends Model, O extends boolean = false>(\n this: new () => T | typeof Model,\n searchCriteria: Partial<ModelWithoutRelations<T>>,\n createData: Partial<ModelWithoutRelations<T>>,\n options: Omit<BaseModelMethodOptions, \"ignoreHooks\"> & {\n fullResponse?: O;\n } = {},\n ): Promise<\n O extends true\n ? {\n isNew: boolean;\n model: T;\n }\n : T\n > {\n if (!options.fullResponse) {\n options.fullResponse = false as O;\n }\n\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n const doesExist = (await modelManager.findOne({\n where: searchCriteria as WhereType<T>,\n })) as T;\n\n if (doesExist) {\n if (options.fullResponse) {\n return {\n isNew: false,\n model: doesExist,\n } as O extends true ? { isNew: boolean; model: T } : T;\n }\n\n return doesExist as O extends true ? { isNew: boolean; model: T } : T;\n }\n\n const newModel = (await modelManager.insert(createData as T)) as T;\n if (options.fullResponse) {\n return {\n isNew: true,\n model: newModel,\n } as O extends true ? { isNew: boolean; model: T } : T;\n }\n\n return newModel as O extends true ? { isNew: boolean; model: T } : T;\n }\n\n /**\n * @description Updates or creates a new record, if no searchCriteria payload is provided, provided data will be inserted as is\n */\n static async upsert<T extends Model>(\n this: new () => T | typeof Model,\n searchCriteria: Partial<ModelWithoutRelations<T>>,\n data: Partial<ModelWithoutRelations<T>>,\n options: UpsertOptions<T> & BaseModelMethodOptions = {\n updateOnConflict: true,\n },\n ): Promise<AnnotatedModel<T, {}>> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n const hasSearchCriteria = Object.keys(searchCriteria).length > 0;\n\n // If no search criteria is given, it is given for granted that record must be created\n const doesExist = !hasSearchCriteria\n ? null\n : await modelManager.findOne({\n ignoreHooks: options.ignoreHooks ? [\"afterFetch\", \"beforeFetch\"] : [],\n where: searchCriteria as WhereType<T>,\n });\n\n if (doesExist) {\n (data as T)[typeofModel.primaryKey as keyof T] =\n doesExist[typeofModel.primaryKey as keyof ModelWithoutRelations<T>];\n\n if (options.updateOnConflict) {\n return (await modelManager.updateRecord(data as T, {\n returning: options.returning as ModelKey<T>[] | undefined,\n })) as T;\n }\n\n return doesExist;\n }\n\n return (await modelManager.insert(data as T, {\n ignoreHooks: options.ignoreHooks,\n returning: options.returning ?? ([\"*\"] as ModelKey<T>[]),\n })) as T;\n }\n\n /**\n * @description Updates or creates multiple records\n * @param {updateOnConflict} If true, the record will be updated if it exists, otherwise it will be ignored\n */\n static async upsertMany<T extends Model>(\n this: new () => T | typeof Model,\n conflictColumns: ModelKey<T>[],\n data: Partial<ModelWithoutRelations<T>>[],\n options: UpsertOptions<T> & BaseModelMethodOptions = {\n updateOnConflict: true,\n },\n ): Promise<AnnotatedModel<T, {}>[]> {\n if (!data.length) {\n return [];\n }\n\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n\n if (\n !data.every((record) => {\n const recordKeys = new Set(Object.keys(record));\n return conflictColumns.every((col) => recordKeys.has(col as string));\n })\n ) {\n throw new HysteriaError(\n \"Model::upsertMany\",\n \"CONFLICT_COLUMNS_NOT_PRESENT_IN_DATA\",\n );\n }\n\n const columnsToUpdate = Object.keys(data[0]);\n const upsertResult = await modelManager.upsertMany(\n conflictColumns as string[],\n columnsToUpdate,\n data as ModelWithoutRelations<T>[],\n {\n ignoreHooks: options.ignoreHooks,\n returning: options.returning,\n updateOnConflict: options.updateOnConflict ?? true,\n },\n );\n\n const dbType = typeofModel.sqlInstance.getDbType();\n if (databasesWithReturning.includes(dbType)) {\n return (await serializeModel(\n upsertResult as T[],\n typeofModel,\n options.returning as string[],\n )) as unknown as AnnotatedModel<T, {}>[];\n }\n\n const lookupQuery = modelManager.query();\n if (options.returning?.length) {\n lookupQuery.select(...options.returning);\n }\n\n const conflictMap = new Map<string, any>();\n conflictColumns.forEach((column) => {\n data.forEach((record) => {\n conflictMap.set(column as string, [\n ...(conflictMap.get(column as string) || []),\n record[column as unknown as keyof ModelWithoutRelations<T>],\n ]);\n });\n });\n\n lookupQuery.where((query) => {\n conflictColumns.forEach((column) => {\n query.orWhereIn(column, conflictMap.get(column as string) || []);\n });\n });\n\n return lookupQuery.many({\n ignoreHooks: options.ignoreHooks ? [\"afterFetch\", \"beforeFetch\"] : [],\n });\n }\n\n /**\n * @description Deletes a record to the database\n */\n static async deleteRecord<T extends Model>(\n this: new () => T | typeof Model,\n modelSqlInstance: T,\n options?: Omit<BaseModelMethodOptions, \"ignoreHooks\">,\n ): Promise<void> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return modelManager.deleteRecord(modelSqlInstance);\n }\n\n /**\n * @description Soft Deletes a record to the database\n * @description default column: deletedAt\n * @description default value: The current date and time in UTC timezone in the format \"YYYY-MM-DD HH:mm:ss\"\n * @description You can override the column and value by providing the column and value on the static properties of the model `softDeleteColumn` and `softDeleteValue`\n */\n static async softDelete<T extends Model>(\n this: new () => T | typeof Model,\n modelSqlInstance: T,\n softDeleteOptions?: {\n column?: ModelKey<T>;\n value?: string | number | boolean | Date;\n },\n options?: Omit<BaseModelMethodOptions, \"ignoreHooks\">,\n ): Promise<AnnotatedModel<T, {}>> {\n const typeofModel = this as unknown as typeof Model;\n const {\n column = typeofModel.softDeleteColumn as ModelKey<T>,\n value = typeofModel.softDeleteValue,\n } = softDeleteOptions || {};\n\n modelSqlInstance[column as keyof T] = value as T[keyof T];\n const modelManager = typeofModel.dispatchModelManager<T>({\n trx: options?.trx,\n connection: options?.connection,\n });\n await modelManager.updateRecord(modelSqlInstance);\n\n if (typeof value === \"string\") {\n modelSqlInstance[column as keyof T] = new Date(value) as T[keyof T];\n return modelSqlInstance as AnnotatedModel<T, {}>;\n }\n\n modelSqlInstance[column as keyof T] = value as T[keyof T];\n return modelSqlInstance as AnnotatedModel<T, {}>;\n }\n\n /**\n * @description Truncates the table for the given model\n */\n static async truncate<T extends Model>(\n this: new () => T | typeof Model,\n options: BaseModelMethodOptions = {},\n ): Promise<void> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return modelManager.query().truncate();\n }\n\n /**\n * @description Returns the table info for the model form the database\n */\n static async getTableInfo(): Promise<TableColumnInfo[]> {\n const typeofModel = this as unknown as typeof Model;\n typeofModel.establishConnection();\n return typeofModel.sqlInstance.getTableInfo(typeofModel.table);\n }\n\n /**\n * @description Returns the index info for the model form the database\n */\n static async getIndexInfo(): Promise<TableIndexInfo[]> {\n const typeofModel = this as unknown as typeof Model;\n typeofModel.establishConnection();\n return typeofModel.sqlInstance.getIndexInfo(typeofModel.table);\n }\n\n /**\n * @description Returns the table schema for the model form the database\n */\n static async getTableSchema(): Promise<TableSchemaInfo> {\n const typeofModel = this as unknown as typeof Model;\n typeofModel.establishConnection();\n return typeofModel.sqlInstance.getTableSchema(typeofModel.table);\n }\n\n /**\n * @description Merges the provided data with the model instance\n */\n static combineProps<T extends Model>(\n sqlInstance: Partial<T>,\n data: Partial<T>,\n ): void {\n for (const key in data) {\n Object.assign(sqlInstance, { [key]: data[key] });\n }\n }\n\n // #region Lifecycle hooks\n\n /**\n * @description Adds a beforeFetch clause to the model, adding the ability to modify the querybuilder before fetching the data\n */\n static beforeFetch?(\n queryBuilder: ModelQueryBuilder<any>,\n ): Promise<void> | void;\n\n /**\n * @description Adds a beforeInsert clause to the model modifying the data before inserting the data\n * @param {Model} data The model to be inserted, in insertMany the hook will be called for each model\n * @example\n * ```typescript\n * static async beforeInsert?(data: User): Promise<void> {\n * data.name = data.name.toUpperCase();\n * }\n * ```\n */\n static beforeInsert?(data: any): Promise<void> | void;\n\n /**\n * @description Adds a beforeInsertMany clause to the model modifying the data before inserting the data\n * @param {Model[]} data The models to be inserted, in insertMany the hook will be called for each model\n * @example\n * ```typescript\n * static async beforeInsertMany?(data: User[]): Promise<void> {\n * data.forEach((user) => {\n * user.name = user.name.toUpperCase();\n * });\n * }\n * ```\n */\n static beforeInsertMany?(data: any[]): Promise<void> | void;\n\n /**\n * @description Adds a beforeUpdate clause to the model, adding the ability to modify the query before updating the data\n * @description Includes soft delete\n */\n static beforeUpdate?(\n queryBuilder: ModelQueryBuilder<any>,\n ): Promise<void> | void;\n\n /**\n * @description Adds a beforeDelete clause to the model, adding the ability to modify the query before deleting the data\n * @warning This hook does not include soft delete since it's an update operation\n */\n static beforeDelete?(\n queryBuilder: ModelQueryBuilder<any>,\n ): Promise<void> | void;\n\n /**\n * @description Adds a afterFetch clause to the model, adding the ability to modify the data after fetching the data\n * @param {Model} data Models fetched from the database, must always provide an implementation for an array of models regardless of the query result\n * @example\n * ```typescript\n * static async afterFetch?(data: User[]): Promise<User[]> {\n * return data;\n * }\n * ```\n */\n static afterFetch?(data: any[]): Promise<any[]> | any[];\n\n // #endregion Lifecycle hooks\n\n /**\n * @description Returns the columns of the model\n */\n static getColumns(): ColumnType[] {\n return getModelColumns(this);\n }\n\n /**\n * @description Returns the relations of the model\n */\n static getRelations(): LazyRelationType[] {\n return getRelationsMetadata(this);\n }\n\n /**\n * @description Returns the indexes metadata of the model\n */\n static getIndexes(): IndexType[] {\n return getIndexes(this);\n }\n\n static getUniques(): UniqueType[] {\n return getUniques(this);\n }\n\n // JS Static methods\n\n /**\n * @description Defines a column in the model, useful in javascript in order to not have to rely on decorators since are not supported without a transpiler like babel\n * @javascript\n */\n static column(columnName: string, ...args: Parameters<typeof column>): void {\n column(...args)(this.prototype, columnName);\n }\n\n /**\n * @description Defines an hasOne relation\n * @javascript\n */\n static hasOne(columnName: string, ...args: Parameters<typeof hasOne>): void {\n hasOne(...args)(this.prototype, columnName);\n }\n\n /**\n * @description Defines an hasMany\n * @javascript\n */\n static hasMany(\n columnName: string,\n ...args: Parameters<typeof hasMany>\n ): void {\n hasMany(...args)(this.prototype, columnName);\n }\n\n /**\n * @description Defines a belongsTo\n * @javascript\n */\n static belongsTo(\n columnName: string,\n ...args: Parameters<typeof belongsTo>\n ): void {\n belongsTo(...args)(this.prototype, columnName);\n }\n\n /**\n * @description Defines a many to many\n * @javascript\n */\n static manyToMany(\n columnName: string,\n ...args: Parameters<typeof manyToMany>\n ): void {\n manyToMany(...args)(this.prototype, columnName);\n }\n\n /**\n * @description Establishes a connection to the database instantiated from the SqlDataSource.connect method, this is done automatically when using the static methods\n * @description This method is meant to be used only if you want to establish sql sqlInstance of the model directly\n * @internal\n */\n private static establishConnection(): void {\n const sql = SqlDataSource.instance;\n if (!sql) {\n throw new HysteriaError(\n \"sqlInstance not initialized, did you defined it in SqlDataSource.connect static method?\",\n \"CONNECTION_NOT_ESTABLISHED\",\n );\n }\n\n this.sqlInstance = sql;\n }\n\n /**\n * @description Gives the correct model manager with the correct connection based on the options provided\n */\n private static dispatchModelManager<T extends Model>(\n this: typeof Model,\n options?: BaseModelMethodOptions,\n ): ModelManager<T> {\n let modelManager: ModelManager<T>;\n\n if (options?.connection) {\n modelManager = options.connection.getModelManager<T>(\n this as unknown as typeof Model,\n );\n } else if (options?.trx) {\n modelManager = options.trx.sql.getModelManager<T>(\n this as unknown as typeof Model,\n );\n } else {\n const typeofModel = this as unknown as typeof Model;\n typeofModel.establishConnection();\n modelManager = typeofModel.sqlInstance.getModelManager<T>(typeofModel);\n }\n\n if (options?.replicationMode) {\n modelManager.setReplicationMode(options.replicationMode);\n }\n\n return modelManager;\n }\n\n // instance methods\n\n /**\n * @description Merges the provided data with the model instance\n */\n mergeProps<T extends Model = this>(\n this: T,\n data: Partial<ModelWithoutRelations<T>>,\n ): void {\n const instance = this as unknown as new () => T | typeof Model;\n const typeofModel = instance.constructor as typeof Model &\n (new () => typeof Model);\n typeofModel.combineProps(this as unknown as T, data as unknown as T);\n }\n\n /**\n * @description inserts or updates the model to the database, must have a primary key in order to work\n * @throws {HysteriaError} If the model has no primary key\n */\n async save<T extends Model = this>(\n options: Omit<BaseModelMethodOptions, \"ignoreHooks\"> = {},\n ) {\n const instance = this as unknown as new () => T | typeof Model;\n const typeofModel = instance.constructor as typeof Model &\n (new () => typeof Model);\n const primaryKey = typeofModel.primaryKey as keyof T;\n if (!primaryKey) {\n throw new HysteriaError(\n typeofModel.name + \"::save\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n const primaryKeyValue: string | number =\n instance[primaryKey as keyof typeof instance];\n\n const searchCriteria = primaryKeyValue\n ? ({\n [primaryKey]: primaryKeyValue,\n } as unknown as ModelWithoutRelations<T>)\n : {};\n\n const payload = instance as unknown as ModelWithoutRelations<T>;\n const result = await typeofModel.upsert(\n searchCriteria,\n payload as ModelWithoutRelations<T>,\n {\n updateOnConflict: true,\n ...options,\n },\n );\n\n typeofModel.combineProps(this as unknown as T, result as unknown as T);\n return this as unknown as T;\n }\n\n /**\n * @description Updates the model in the database, must have a primary key in order to work\n * @throws {HysteriaError} If the model has no primary key valorized in the instance\n */\n async update<T extends Model = this>(\n payload: Partial<ModelWithoutRelations<T>>,\n options: Omit<BaseModelMethodOptions, \"ignoreHooks\"> = {},\n ) {\n const instance = this as unknown as new () => T | typeof Model;\n const typeofModel = instance.constructor as typeof Model &\n (new () => typeof Model);\n\n const primaryKey = typeofModel.primaryKey as keyof T;\n if (!primaryKey) {\n throw new HysteriaError(\n typeofModel.name + \"::save\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n const primaryKeyValue: string | number =\n instance[primaryKey as keyof typeof instance];\n\n if (!primaryKeyValue) {\n throw new HysteriaError(\n typeofModel.name + \"::update\",\n \"MODEL_HAS_NO_PRIMARY_KEY_VALUE\",\n );\n }\n\n await typeofModel.updateRecord(instance as unknown as T, payload, options);\n }\n\n /**\n * @description Soft deletes the model from the database, must have a primary key in order to work\n * @throws {HysteriaError} If the model has no primary key valorized in the instance\n */\n async softDelete<T extends Model = this>(\n this: T,\n softDeleteOptions?: {\n column?: keyof ModelWithoutRelations<T>;\n value?: string | number | boolean | Date;\n },\n options?: Omit<BaseModelMethodOptions, \"ignoreHooks\">,\n ) {\n const instance = this as unknown as new () => T | typeof Model;\n const typeofModel = instance.constructor as typeof Model &\n (new () => typeof Model);\n\n const primaryKey = typeofModel.primaryKey as keyof T;\n if (!primaryKey) {\n throw new HysteriaError(\n typeofModel.name + \"::softDelete\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n const primaryKeyValue: string | number =\n instance[primaryKey as keyof typeof instance];\n\n if (!primaryKeyValue) {\n throw new HysteriaError(\n typeofModel.name + \"::softDelete\",\n \"MODEL_HAS_NO_PRIMARY_KEY_VALUE\",\n );\n }\n\n await typeofModel.softDelete(\n instance as unknown as T,\n softDeleteOptions as {\n column?: ModelKey<T>;\n value?: string | number | boolean | Date;\n },\n options,\n );\n }\n\n /**\n * @description Deletes the model from the database, must have a primary key in order to work\n * @throws {HysteriaError} If the model has no primary key valorized in the instance\n */\n async delete<T extends Model = this>(\n options: Omit<BaseModelMethodOptions, \"ignoreHooks\"> = {},\n ) {\n const instance = this as unknown as new () => T | typeof Model;\n const typeofModel = instance.constructor as typeof Model &\n (new () => typeof Model);\n\n const primaryKey = typeofModel.primaryKey as keyof T;\n if (!primaryKey) {\n throw new HysteriaError(\n typeofModel.name + \"::delete\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n const primaryKeyValue: string | number =\n instance[primaryKey as keyof typeof instance];\n\n if (!primaryKeyValue) {\n throw new HysteriaError(\n typeofModel.name + \"::delete\",\n \"MODEL_HAS_NO_PRIMARY_KEY_VALUE\",\n );\n }\n\n await typeofModel.deleteRecord(this as unknown as T, options);\n }\n\n /**\n * @description Refreshes the model from the database, it both updates the instance and returns the refreshed model\n * @throws {HysteriaError} If the model has no primary key valorized in the instance\n */\n async refresh<T extends Model = this>(\n options?: Omit<BaseModelMethodOptions, \"ignoreHooks\">,\n ) {\n const instance = this as unknown as new () => T | typeof Model;\n const typeofModel = instance.constructor as typeof Model &\n (new () => typeof Model);\n\n const primaryKey = typeofModel.primaryKey as keyof T;\n if (!primaryKey) {\n throw new HysteriaError(\n typeofModel.name + \"::refresh\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n const primaryKeyValue: string | number =\n instance[primaryKey as keyof typeof instance];\n\n if (!primaryKeyValue) {\n throw new HysteriaError(\n typeofModel.name + \"::refresh\",\n \"MODEL_HAS_NO_PRIMARY_KEY_VALUE\",\n );\n }\n\n const refreshed = await typeofModel.refresh(this as unknown as T, options);\n typeofModel.combineProps(this as unknown as T, refreshed as unknown as T);\n return this as unknown as T;\n }\n}\n","import { Model } from \"../model\";\n\n/**\n * @description Options for the relation\n * @property {string} softDeleteColumn - The column name for the soft delete column, if set, the relation will only return rows that have not been soft deleted\n * @property {string} softDeleteType - The type of the soft delete column\n */\n\nexport enum RelationEnum {\n hasOne = \"hasOne\", // One to One without foreign key\n belongsTo = \"belongsTo\", // One to One with foreign key\n hasMany = \"hasMany\",\n manyToMany = \"manyToMany\",\n}\n\n/**\n * Main Relation Class\n */\nexport abstract class Relation {\n abstract type: RelationEnum;\n model: typeof Model = Model;\n columnName: string = \"\";\n foreignKey?: string;\n relatedModel: string = \"\";\n\n protected constructor(model: typeof Model, columnName: string) {\n this.model = model;\n this.columnName = columnName;\n this.relatedModel = this.model.table;\n }\n}\n","import { Model } from \"../model\";\nimport { Relation, RelationEnum } from \"./relation\";\n\nexport class BelongsTo extends Relation {\n type: RelationEnum;\n foreignKey: string;\n\n constructor(\n relatedModel: typeof Model,\n columnName: string,\n foreignKey: string,\n ) {\n super(relatedModel, columnName);\n this.foreignKey = foreignKey;\n this.type = RelationEnum.belongsTo;\n }\n}\n","import { Model } from \"../model\";\nimport { Relation, RelationEnum } from \"./relation\";\n\nexport class HasMany extends Relation {\n type: RelationEnum = RelationEnum.hasMany;\n foreignKey: string;\n\n constructor(\n relatedModel: typeof Model,\n columnName: string,\n foreignKey: string,\n ) {\n super(relatedModel, columnName);\n this.foreignKey = foreignKey;\n this.type = RelationEnum.hasMany;\n }\n}\n","import { Model } from \"../model\";\nimport { Relation, RelationEnum } from \"./relation\";\n\nexport class HasOne extends Relation {\n type: RelationEnum;\n foreignKey: string;\n\n constructor(\n relatedModel: typeof Model,\n columnName: string,\n foreignKey: string,\n ) {\n super(relatedModel, columnName);\n this.foreignKey = foreignKey;\n this.type = RelationEnum.hasOne;\n }\n}\n","import { Model } from \"../model\";\nimport { Relation, RelationEnum } from \"./relation\";\n\nexport class ManyToMany extends Relation {\n type = RelationEnum.manyToMany;\n /**\n * @description The model that establishes the relation\n */\n primaryModel: string;\n /**\n * @description The model that is being related to\n */\n relatedModel: string;\n /**\n * @description The foreign key of the related model in the through table\n */\n rightForeignKey: string;\n /**\n * @description The table that joins the two models\n */\n throughModel: string;\n /**\n * @description The foreign key of the primary model in the through table\n */\n leftForeignKey: string;\n\n constructor(\n model: typeof Model,\n columnName: string,\n data: {\n primaryModel: string;\n throughModel: string;\n leftForeignKey: string;\n rightForeignKey: string;\n },\n ) {\n super(model, columnName);\n this.primaryModel = data.primaryModel;\n this.relatedModel = model.table;\n this.throughModel = data.throughModel;\n this.leftForeignKey = data.leftForeignKey;\n this.rightForeignKey = data.rightForeignKey;\n }\n}\n","import pluralize from \"pluralize\";\n\nexport const COLUMN_METADATA_KEY = Symbol(\"columns\");\nexport const PRIMARY_KEY_METADATA_KEY = Symbol(\"primaryKey\");\nexport const RELATION_METADATA_KEY = Symbol(\"relations\");\nexport const INDEX_METADATA_KEY = Symbol(\"indexes\");\nexport const UNIQUE_METADATA_KEY = Symbol(\"uniques\");\n\nexport const getDefaultForeignKey = (table: string) => {\n return `${pluralize.singular(table)}_id`;\n};\n\nexport const getDefaultIndexName = (table: string, column: string) => {\n return `idx_${table}_${column}`;\n};\n\nexport const getDefaultUniqueConstraintName = (\n table: string,\n column: string,\n) => {\n return `uq_${table}_${column}`;\n};\n\nexport const getDefaultFkConstraintName = (\n table: string,\n leftColumn: string,\n rightColumn?: string,\n) => {\n return `fk_${table}_${leftColumn}${rightColumn ? `_${rightColumn}` : \"\"}`;\n};\n\nexport const getDefaultPrimaryKeyConstraintName = (\n table: string,\n column: string,\n) => {\n return `pk_${table}_${column}`;\n};\n","import crypto from \"node:crypto\";\nimport { HysteriaError } from \"../../../errors/hysteria_error\";\nimport { convertCase } from \"../../../utils/case_utils\";\nimport { getDate, parseDate } from \"../../../utils/date_utils\";\nimport {\n decryptAsymmetric,\n decryptSymmetric,\n encryptAsymmetric,\n encryptSymmetric,\n} from \"../../../utils/encryption\";\nimport { Reflect } from \"../../../utils/reflect_metadata\";\nimport { generateULID } from \"../../../utils/ulid\";\nimport { OnUpdateOrDelete } from \"../../migrations/schema/schema_types\";\nimport { getColumnValue } from \"../../resources/utils\";\nimport { Model } from \"../model\";\nimport { ModelKey } from \"../model_manager/model_manager_types\";\nimport { ModelQueryBuilder } from \"../model_query_builder/model_query_builder\";\nimport { BelongsTo } from \"../relations/belongs_to\";\nimport { HasMany } from \"../relations/has_many\";\nimport { HasOne } from \"../relations/has_one\";\nimport { ManyToMany } from \"../relations/many_to_many\";\nimport { Relation, RelationEnum } from \"../relations/relation\";\nimport {\n COLUMN_METADATA_KEY,\n INDEX_METADATA_KEY,\n PRIMARY_KEY_METADATA_KEY,\n RELATION_METADATA_KEY,\n UNIQUE_METADATA_KEY,\n getDefaultFkConstraintName,\n getDefaultForeignKey,\n getDefaultIndexName,\n getDefaultPrimaryKeyConstraintName,\n getDefaultUniqueConstraintName,\n} from \"./model_decorators_constants\";\nimport type {\n AsymmetricEncryptionOptions,\n ColumnDataTypeOptionWithDatePrecision,\n ColumnDataTypeOptionWithLength,\n ColumnDataTypeOptionWithPrecision,\n ColumnDataTypeOptionWithScaleAndPrecision,\n ColumnOptions,\n ColumnType,\n DateColumnOptions,\n IndexType,\n LazyRelationType,\n ManyToManyOptions,\n ManyToManyStringOptions,\n SymmetricEncryptionOptions,\n ThroughModel,\n UniqueType,\n} from \"./model_decorators_types\";\n\nexport type BaseModelRelationType = {\n onDelete?: OnUpdateOrDelete;\n onUpdate?: OnUpdateOrDelete;\n constraintName?: string;\n};\n\n/**\n * @description Class decorator to define indexes on the model\n * @description If no indexName is provided, the index name will be the model name plus the columns joined by underscores\n * @example User will have an index named \"user_name_index\" on the \"name\" column\n * @example User will have an index named \"user_name_email_index\" on the \"name\" and \"email\" columns\n * ```ts\n * @index([\"name\", \"email\"], \"user_name_email_index\")\n * class User extends Model {\n * @column()\n * name!: string;\n * }\n *\n * @index([\"name\", \"email\"])\n * class User extends Model {\n * @column()\n * name!: string;\n * }\n * ```\n */\nexport function index(\n indexes: string | string[],\n indexName?: string,\n): ClassDecorator {\n return (target: Function) => {\n const newIndexes = Array.isArray(indexes) ? indexes : [indexes];\n const existingIndexes =\n Reflect.getMetadata<{ columns: string[]; name: string }[]>(\n INDEX_METADATA_KEY,\n target.prototype,\n ) || [];\n existingIndexes.push({\n columns: newIndexes,\n name:\n indexName ??\n getDefaultIndexName(\n (target as typeof Model).table,\n newIndexes.join(\"_\"),\n ),\n });\n Reflect.defineMetadata(\n INDEX_METADATA_KEY,\n existingIndexes,\n target.prototype,\n );\n };\n}\n\nexport function unique(\n columns: string | string[],\n constraintName?: string,\n): ClassDecorator {\n return (target: Function) => {\n const newColumns = Array.isArray(columns) ? columns : [columns];\n const existingUniques =\n Reflect.getMetadata<{ columns: string[]; name: string }[]>(\n UNIQUE_METADATA_KEY,\n target.prototype,\n ) || [];\n existingUniques.push({\n columns: newColumns,\n name:\n constraintName ??\n getDefaultUniqueConstraintName(\n (target as typeof Model).table,\n newColumns.join(\"_\"),\n ),\n });\n Reflect.defineMetadata(\n UNIQUE_METADATA_KEY,\n existingUniques,\n target.prototype,\n );\n };\n}\n\n/**\n * @description Decorator to define a view on the model\n * @description This will automatically create a view on the database with the given statement\n * @description Since a view is intended to get data from other tables, a migration is not necessary\n * @example\n * ```ts\n * @view((query) => {\n * query.select(\"*\").from(\"users\");\n * })\n * class User extends Model {\n * @column()\n * name!: string;\n * }\n * ```\n */\nexport function view(\n statement: (query: ModelQueryBuilder<any>) => void,\n): ClassDecorator {\n return (target: Function) => {\n const targetClass = target as typeof Model;\n const originalQuery = targetClass.query;\n targetClass.query = function (...args: Parameters<typeof originalQuery>) {\n const query = originalQuery.bind(this).call(this, ...args);\n statement(query);\n return query;\n } as typeof originalQuery;\n };\n}\n\n/**\n * @description Decorator to define a column in the model\n */\nexport function column(\n options: ColumnOptions = {\n primaryKey: false,\n },\n): PropertyDecorator {\n const isPrimaryKey = options?.primaryKey ?? false;\n return (target: Object, propertyKey: string | symbol) => {\n const targetModel = target.constructor as typeof Model;\n if (isPrimaryKey) {\n const primaryKey = Reflect.getMetadata(PRIMARY_KEY_METADATA_KEY, target);\n if (primaryKey) {\n throw new HysteriaError(\n \"ModelDecorator::column\",\n \"MULTIPLE_PRIMARY_KEYS_NOT_ALLOWED\",\n );\n }\n Reflect.defineMetadata(PRIMARY_KEY_METADATA_KEY, propertyKey, target);\n }\n const databaseName =\n options.databaseName ??\n convertCase(propertyKey as string, targetModel.databaseCaseConvention);\n const column: ColumnType = {\n columnName: propertyKey as string,\n serialize: options.serialize,\n prepare: options.prepare,\n hidden: options.hidden,\n isPrimary: isPrimaryKey,\n primaryKeyConstraintName:\n options.primaryKeyConstraintName ??\n getDefaultPrimaryKeyConstraintName(\n targetModel.table,\n propertyKey as string,\n ),\n autoUpdate: options.autoUpdate,\n databaseName,\n openApi: options.openApi,\n type: options.type,\n length: (options as ColumnDataTypeOptionWithLength)?.length,\n precision: (options as ColumnDataTypeOptionWithPrecision)?.precision,\n scale: (options as ColumnDataTypeOptionWithScaleAndPrecision)?.scale,\n withTimezone: (options as ColumnDataTypeOptionWithDatePrecision)\n ?.withTimezone,\n constraints: {\n nullable: options.nullable,\n default: options.default,\n },\n };\n const existingColumns =\n Reflect.getMetadata<ColumnType[]>(COLUMN_METADATA_KEY, target) || [];\n existingColumns.push(column);\n Reflect.defineMetadata(COLUMN_METADATA_KEY, existingColumns, target);\n };\n}\n\ncolumn.primary = primaryKeyColumn;\ncolumn.date = dateColumn;\ncolumn.boolean = booleanColumn;\ncolumn.json = jsonColumn;\ncolumn.uuid = uuidColumn;\ncolumn.ulid = ulidColumn;\ncolumn.integer = integerColumn;\ncolumn.float = floatColumn;\ncolumn.increment = incrementColumn;\ncolumn.bigIncrement = bigIncrementColumn;\ncolumn.encryption = {\n symmetric,\n asymmetric,\n};\n\nfunction primaryKeyColumn(\n options: Omit<ColumnOptions, \"primaryKey\"> = {},\n): PropertyDecorator {\n return column({\n ...(options as ColumnOptions),\n primaryKey: true,\n });\n}\n\nfunction floatColumn(\n options: Omit<ColumnOptions, \"serialize\"> = {},\n): PropertyDecorator {\n return column({\n type: \"float\",\n ...(options as ColumnOptions),\n serialize: (value) => {\n if (value === undefined) {\n return;\n }\n\n if (value === null) {\n return null;\n }\n\n if (typeof value === \"number\") {\n return value;\n }\n\n if (typeof value === \"string\") {\n return +value;\n }\n\n return Number.parseFloat(value);\n },\n });\n}\n\n/**\n * @description Decorator to define a integer column in the model, this will automatically convert the integer to the correct format for the database\n * @description Useful in databases like postgres where the integer is returned as a string by the driver\n * @description Defaults type to integer for migration generation\n */\nfunction integerColumn(\n options: Omit<ColumnOptions, \"serialize\"> = {},\n): PropertyDecorator {\n return column({\n type: \"integer\",\n ...(options as ColumnOptions),\n serialize: (value) => {\n if (value === undefined) {\n return;\n }\n\n if (value === null) {\n return null;\n }\n\n if (typeof value === \"number\") {\n return value;\n }\n\n if (typeof value === \"string\") {\n return +value;\n }\n\n return Number.parseInt(value);\n },\n });\n}\n\n/**\n * @description Decorator to define an auto-incrementing integer primary key column\n * @description Automatically sets primaryKey: true and nullable: false\n * @mysql INTEGER with AUTO_INCREMENT\n * @postgres SERIAL (INTEGER with auto-increment sequence)\n * @sqlite INTEGER PRIMARY KEY AUTOINCREMENT\n */\nfunction incrementColumn(\n options: Omit<ColumnOptions, \"serialize\" | \"primaryKey\" | \"nullable\"> = {},\n): PropertyDecorator {\n return column({\n type: \"increment\",\n ...(options as ColumnOptions),\n primaryKey: true,\n nullable: false,\n serialize: (value) => {\n if (value === undefined) {\n return;\n }\n\n if (value === null) {\n return null;\n }\n\n if (typeof value === \"number\") {\n return value;\n }\n\n if (typeof value === \"string\") {\n return Number.parseInt(value);\n }\n\n return Number.parseInt(value);\n },\n });\n}\n\n/**\n * @description Decorator to define an auto-incrementing bigint primary key column\n * @description Automatically sets primaryKey: true and nullable: false\n * @mysql BIGINT with AUTO_INCREMENT\n * @postgres BIGSERIAL (BIGINT with auto-increment sequence)\n * @sqlite INTEGER PRIMARY KEY AUTOINCREMENT\n */\nfunction bigIncrementColumn(\n options: Omit<ColumnOptions, \"serialize\" | \"primaryKey\" | \"nullable\"> = {},\n): PropertyDecorator {\n return column({\n type: \"bigIncrement\",\n ...(options as ColumnOptions),\n primaryKey: true,\n nullable: false,\n serialize: (value) => {\n if (value === undefined) {\n return;\n }\n\n if (value === null) {\n return null;\n }\n\n if (typeof value === \"number\") {\n return value;\n }\n\n return Number.parseInt(value);\n },\n });\n}\n\n/**\n * @description Decorator to define a uuid column in the model\n * @description This will automatically generate a uuid if no value is provided\n * @description Defaults type to uuid for migration generation\n */\nfunction uuidColumn(\n options: Omit<ColumnOptions, \"prepare\"> = {},\n): PropertyDecorator {\n return column({\n type: \"uuid\",\n ...(options as ColumnOptions),\n prepare: (value) => {\n if (!value) {\n return crypto.randomUUID();\n }\n\n return value;\n },\n });\n}\n\n/**\n * @description Decorator to define a ulid column in the model\n * @description This will automatically generate a ulid if no value is provided\n * @description Defaults type to ulid for migration generation\n */\nfunction ulidColumn(\n options: Omit<ColumnOptions, \"prepare\"> = {},\n): PropertyDecorator {\n return column({\n type: \"ulid\",\n ...(options as ColumnOptions),\n prepare: (value) => {\n if (!value) {\n return generateULID();\n }\n\n return value;\n },\n });\n}\n\n/**\n * @description Decorator to define a symmetric encrypted column in the model with a key\n * @description This will automatically encrypt the value before it is inserted or updated in the database and decrypt it when it is retrieved from the database\n * @description If no value is provided, the value will be returned as is\n */\nfunction symmetric(\n options: Omit<SymmetricEncryptionOptions, \"prepare\" | \"serialize\">,\n): PropertyDecorator {\n return column({\n ...(options as ColumnOptions),\n prepare: (value) => {\n if (!value) {\n return value;\n }\n\n return encryptSymmetric(options.key, value);\n },\n serialize: (value) => {\n if (!value) {\n return value;\n }\n\n return decryptSymmetric(options.key, value);\n },\n });\n}\n\n/**\n * @description Decorator to define a asymmetric encrypted column in the model with public and private keys\n * @description This will automatically encrypt the value before it is inserted or updated in the database and decrypt it when it is retrieved from the database\n * @description If no value is provided, the value will be returned as is\n */\nfunction asymmetric(\n options: Omit<AsymmetricEncryptionOptions, \"prepare\" | \"serialize\">,\n): PropertyDecorator {\n return column({\n ...(options as ColumnOptions),\n prepare: (value) => {\n if (!value) {\n return value;\n }\n\n return encryptAsymmetric(options.publicKey, value);\n },\n serialize: (value) => {\n if (!value) {\n return value;\n }\n\n return decryptAsymmetric(options.privateKey, value);\n },\n });\n}\n\n/**\n * @description Decorator to define a boolean column in the model\n * @description This will automatically convert the boolean to the correct format for the database, useful for mysql since it stores booleans as tinyint(1)\n * @description Defaults type to boolean for migration generation\n */\nfunction booleanColumn(\n options: Omit<ColumnOptions, \"prepare\" | \"serialize\"> = {},\n): PropertyDecorator {\n return column({\n type: \"boolean\",\n ...(options as ColumnOptions),\n serialize: (value) => Boolean(value),\n prepare: (value) => Boolean(value),\n });\n}\n\n/**\n * @description Decorator to define a date column in the model\n * @description This will automatically convert the date to the correct format for the database\n * @description Supports both ISO format (YYYY-MM-DD HH:mm:ss) and Unix timestamp\n * @description Handles timezone conversion between UTC and local time\n * @description Can automatically update/create timestamps\n * @param options Configuration options for the date column\n * @param options.format The format to store dates in ('ISO' or 'TIMESTAMP')\n * @param options.timezone The timezone to use ('UTC' or 'LOCAL')\n * @param options.autoUpdate Whether to automatically update the timestamp on record updates\n * @param options.autoCreate Whether to automatically set the timestamp on record creation\n */\nfunction dateColumn(\n options: Omit<DateColumnOptions, \"prepare\" | \"serialize\"> = {},\n): PropertyDecorator {\n const {\n format = \"ISO\",\n timezone = \"UTC\",\n autoUpdate = false,\n autoCreate = false,\n ...rest\n } = options;\n\n return column({\n type: \"datetime\",\n ...(rest as ColumnOptions),\n autoUpdate,\n prepare: (value?: Date | string | null): string | null | undefined => {\n if (!value) {\n if (autoCreate) {\n return getDate(new Date(), format, timezone);\n }\n\n return null;\n }\n\n if (autoUpdate) {\n return getDate(new Date(), format, timezone);\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n return getDate(value, format, timezone);\n },\n serialize: (value?: Date | string | null): Date | null | undefined => {\n if (value === undefined) {\n return;\n }\n\n if (value === null) {\n return null;\n }\n\n return parseDate(value, format, timezone);\n },\n });\n}\n\n/**\n * @description Decorator to define a json column in the model\n * @description This will automatically convert the json to the correct format for the database\n * @throws json parse error if the value from the database is not valid json\n * @description Defaults type to jsonb for migration generation\n */\nfunction jsonColumn(\n options: Omit<ColumnOptions, \"prepare\" | \"serialize\"> = {},\n): PropertyDecorator {\n return column({\n type: \"jsonb\",\n ...(options as ColumnOptions),\n serialize: (value) => {\n if (typeof value === \"string\") {\n return JSON.parse(value);\n }\n\n return value;\n },\n prepare: (value) => {\n if (!(typeof value === \"string\")) {\n return JSON.stringify(value);\n }\n\n return value;\n },\n });\n}\n\nexport function getModelColumns(target: typeof Model): ColumnType[] {\n try {\n return Reflect.getMetadata(COLUMN_METADATA_KEY, target.prototype) || [];\n } catch (_) {\n return [];\n }\n}\n\n/**\n * relations\n */\n\n/**\n * @description Establishes a belongs to relation with the given model\n * @default foreignKey by default will be the singular of the model that establishes the relation name plus \"_id\"\n * @example Post that has a user will have foreignKey \"user_id\" on the model\n * ```typescript\n * belongsTo<typeof Post>(() => User, 'userId')\n * ```\n */\nexport function belongsTo<\n M extends typeof Model = any,\n R extends typeof Model = any,\n>(\n model: () => R,\n foreignKey?: ModelKey<InstanceType<M>>,\n options?: BaseModelRelationType,\n): PropertyDecorator;\nexport function belongsTo<R extends typeof Model = any>(\n model: () => R,\n foreignKey?: string,\n options?: BaseModelRelationType,\n): PropertyDecorator;\nexport function belongsTo<R extends typeof Model = any>(\n model: () => R,\n foreignKey?: string | ModelKey<InstanceType<R>>,\n options?: BaseModelRelationType,\n): PropertyDecorator {\n return (target: Object, propertyKey: string | symbol) => {\n const fallbackForeignKey = () =>\n getDefaultForeignKey(model().table as string);\n const fallbackConstraintName = () => {\n const targetTable = (target.constructor as typeof Model).table;\n const fkColumn = foreignKey || fallbackForeignKey();\n return getDefaultFkConstraintName(\n targetTable,\n fkColumn as string,\n model().table,\n );\n };\n\n const relation: LazyRelationType = {\n type: RelationEnum.belongsTo,\n columnName: propertyKey as string,\n model,\n foreignKey: foreignKey ? String(foreignKey) : fallbackForeignKey,\n constraintName: options?.constraintName ?? fallbackConstraintName,\n onUpdate: options?.onUpdate,\n onDelete: options?.onDelete,\n };\n\n const relations =\n Reflect.getMetadata<LazyRelationType[]>(RELATION_METADATA_KEY, target) ||\n [];\n relations.push(relation);\n Reflect.defineMetadata(RELATION_METADATA_KEY, relations, target);\n };\n}\n\n/**\n * @description Establishes a has one relation with the given model\n * @default foreignKey by default will be the singular of the model name plus \"_id\"\n * @example User will have foreignKey \"user_id\" on the Post model\n */\nexport function hasOne<T extends typeof Model>(\n model: () => T,\n foreignKey?: ModelKey<InstanceType<T>>,\n): PropertyDecorator;\nexport function hasOne<T extends typeof Model>(\n model: () => T,\n foreignKey?: string,\n): PropertyDecorator;\nexport function hasOne<T extends typeof Model>(\n model: () => T,\n foreignKey?: string | ModelKey<InstanceType<T>>,\n): PropertyDecorator {\n return (target: Object, propertyKey: string | symbol) => {\n const fallbackForeignKey = () =>\n getDefaultForeignKey((target.constructor as typeof Model).table);\n\n const relation: LazyRelationType = {\n type: RelationEnum.hasOne,\n columnName: propertyKey as string,\n model,\n constraintName: \"None\",\n foreignKey: foreignKey ? String(foreignKey) : fallbackForeignKey,\n };\n\n const relations =\n Reflect.getMetadata<LazyRelationType[]>(RELATION_METADATA_KEY, target) ||\n [];\n relations.push(relation);\n Reflect.defineMetadata(RELATION_METADATA_KEY, relations, target);\n };\n}\n\n/**\n * @description Establishes a has many relation with the given model\n * @default foreignKey by default will be the singular of the model name plus \"_id\"\n * @example User will have foreignKey \"user_id\" on the Post model\n */\nexport function hasMany<T extends typeof Model>(\n model: () => T,\n foreignKey?: ModelKey<InstanceType<T>>,\n): PropertyDecorator;\nexport function hasMany<T extends typeof Model>(\n model: () => T,\n foreignKey?: string,\n): PropertyDecorator;\nexport function hasMany<T extends typeof Model>(\n model: () => T,\n foreignKey?: string | ModelKey<InstanceType<T>>,\n): PropertyDecorator {\n return (target: Object, propertyKey: string | symbol) => {\n const fallbackForeignKey = () =>\n getDefaultForeignKey((target.constructor as typeof Model).table);\n\n const relation: LazyRelationType = {\n type: RelationEnum.hasMany,\n columnName: propertyKey as string,\n model,\n constraintName: \"None\",\n foreignKey: foreignKey ? String(foreignKey) : fallbackForeignKey,\n };\n\n const relations =\n Reflect.getMetadata<LazyRelationType[]>(RELATION_METADATA_KEY, target) ||\n [];\n relations.push(relation);\n Reflect.defineMetadata(RELATION_METADATA_KEY, relations, target);\n };\n}\n\n/**\n * @description Establishes a many to many relation with the given model\n * @default foreignKey by default will be the singular of the model that establishes the relation name plus \"_id\"\n * @param model The model that establishes the relation\n * @param throughModel The model that is used to join the two models\n * @param throughModelKeys The keys of the through model\n * @param throughModelKeys.leftForeignKey The foreign key of the through model from the primary model (where you are defining the many to many relation)\n * @param throughModelKeys.rightForeignKey The foreign key of the through model from the related model (the model you are joining to)\n * @example User will have foreignKey \"user_id\" on the Join table by default\n */\nexport function manyToMany<\n R extends typeof Model,\n T extends typeof Model,\n TM extends ThroughModel<T>,\n>(\n model: () => R,\n throughModel: TM,\n throughModelKeys?: ManyToManyOptions<T, TM>,\n options?: BaseModelRelationType,\n): PropertyDecorator;\nexport function manyToMany<R extends typeof Model>(\n model: () => R,\n throughModel: string | (() => typeof Model),\n throughModelKeys?: ManyToManyStringOptions,\n options?: BaseModelRelationType,\n): PropertyDecorator;\nexport function manyToMany<R extends typeof Model>(\n model: () => R,\n throughModel: string | (() => typeof Model),\n throughModelKeys?: ManyToManyStringOptions,\n options?: BaseModelRelationType,\n): PropertyDecorator {\n return (target: Object, propertyKey: string | symbol) => {\n const { leftForeignKey, rightForeignKey } = throughModelKeys ?? {};\n const wasModelProvided = typeof throughModel !== \"string\";\n const throughModelTable =\n typeof throughModel === \"string\"\n ? throughModel\n : () => throughModel().table;\n\n const primaryModel = (target.constructor as typeof Model).table;\n const fallbackLeftForeignKey = () => getDefaultForeignKey(primaryModel);\n const fallbackRightForeignKey = () => getDefaultForeignKey(model().table);\n const fallbackConstraintName = () =>\n getDefaultFkConstraintName(\n getColumnValue(throughModelTable),\n leftForeignKey ? String(leftForeignKey) : fallbackLeftForeignKey(),\n );\n\n const relation: LazyRelationType = {\n type: RelationEnum.manyToMany,\n columnName: propertyKey as string,\n model,\n constraintName: options?.constraintName ?? fallbackConstraintName,\n foreignKey: leftForeignKey\n ? String(leftForeignKey)\n : fallbackLeftForeignKey,\n onDelete: options?.onDelete,\n onUpdate: options?.onUpdate,\n manyToManyOptions: {\n primaryModel: primaryModel,\n throughModel: throughModelTable,\n leftForeignKey: leftForeignKey\n ? String(leftForeignKey)\n : fallbackLeftForeignKey,\n rightForeignKey: rightForeignKey\n ? String(rightForeignKey)\n : fallbackRightForeignKey,\n wasModelProvided,\n },\n };\n\n const relations =\n Reflect.getMetadata<LazyRelationType[]>(RELATION_METADATA_KEY, target) ||\n [];\n relations.push(relation);\n Reflect.defineMetadata(RELATION_METADATA_KEY, relations, target);\n };\n}\n\nexport function getRelationsMetadata(target: typeof Model): LazyRelationType[] {\n return Reflect.getMetadata(RELATION_METADATA_KEY, target.prototype) || [];\n}\n\n/**\n * @description Returns the relations of the model\n */\nexport function getRelations(target: typeof Model): Relation[] {\n const relations =\n Reflect.getMetadata<LazyRelationType[]>(\n RELATION_METADATA_KEY,\n target.prototype,\n ) || [];\n return relations.map((relation: LazyRelationType) => {\n const { type, model, columnName, foreignKey } = relation;\n\n const resolvedForeignKey = getColumnValue(foreignKey);\n\n const lazyLoadedModel = model();\n switch (type) {\n case RelationEnum.belongsTo:\n return new BelongsTo(lazyLoadedModel, columnName, resolvedForeignKey);\n case RelationEnum.hasOne:\n return new HasOne(lazyLoadedModel, columnName, resolvedForeignKey);\n case RelationEnum.hasMany:\n return new HasMany(lazyLoadedModel, columnName, resolvedForeignKey);\n case RelationEnum.manyToMany:\n if (!relation.manyToManyOptions) {\n throw new HysteriaError(\n \"ModelDecorator::getRelations\",\n \"MANY_TO_MANY_RELATION_MUST_HAVE_A_THROUGH_MODEL\",\n );\n }\n\n const relatedModel = model();\n return new ManyToMany(relatedModel, columnName, {\n primaryModel: relation.manyToManyOptions.primaryModel,\n throughModel: getColumnValue(relation.manyToManyOptions.throughModel),\n leftForeignKey: getColumnValue(\n relation.manyToManyOptions.leftForeignKey,\n ),\n rightForeignKey: getColumnValue(\n relation.manyToManyOptions.rightForeignKey,\n ),\n });\n default:\n throw new HysteriaError(\n \"ModelDecorator::getRelations\",\n `UNKNOWN_RELATION_TYPE_${type}`,\n );\n }\n });\n}\n\n/**\n * @description Returns the primary key of the model\n */\nexport function getPrimaryKey(target: typeof Model): string | undefined {\n return Reflect.getMetadata<string>(\n PRIMARY_KEY_METADATA_KEY,\n target.prototype,\n );\n}\n\nexport function getIndexes(target: typeof Model): IndexType[] {\n return Reflect.getMetadata(INDEX_METADATA_KEY, target.prototype) || [];\n}\n\nexport function getUniques(target: typeof Model): UniqueType[] {\n return Reflect.getMetadata(UNIQUE_METADATA_KEY, target.prototype) || [];\n}\n","import { convertCase } from \"../../utils/case_utils\";\nimport { AstParser } from \"../ast/parser\";\nimport { FromNode } from \"../ast/query/node/from\";\nimport { QueryNode } from \"../ast/query/query\";\nimport { getModelColumns } from \"../models/decorators/model_decorators\";\nimport { ColumnType } from \"../models/decorators/model_decorators_types\";\nimport { Model } from \"../models/model\";\nimport { SqlDataSourceType } from \"../sql_data_source_types\";\n\nexport class InterpreterUtils {\n private readonly modelColumnsMap: Map<string, ColumnType>;\n\n constructor(private readonly model: typeof Model) {\n const modelColumns = getModelColumns(model);\n this.modelColumnsMap = new Map(\n modelColumns.map((modelColumn) => [modelColumn.columnName, modelColumn]),\n );\n }\n\n formatStringColumn(dbType: SqlDataSourceType, column: string): string {\n if (column === \"*\") {\n return \"*\";\n }\n\n const hasTable = column.includes(\".\");\n if (hasTable) {\n const [table, foundColumn] = column.split(\".\");\n\n if (foundColumn === \"*\") {\n switch (dbType) {\n case \"mysql\":\n case \"mariadb\":\n return `\\`${table}\\`.*`;\n case \"postgres\":\n case \"cockroachdb\":\n case \"sqlite\":\n case \"oracledb\":\n return `\"${table}\".*`;\n case \"mssql\":\n return `[${table}].*`;\n default:\n throw new Error(`Unsupported database type: ${dbType}`);\n }\n }\n\n const casedColumn =\n this.modelColumnsMap.get(foundColumn)?.databaseName ??\n convertCase(foundColumn, this.model.databaseCaseConvention);\n\n switch (dbType) {\n case \"mysql\":\n case \"mariadb\":\n return `\\`${table}\\`.\\`${casedColumn}\\``;\n case \"postgres\":\n case \"cockroachdb\":\n case \"sqlite\":\n case \"oracledb\":\n return `\"${table}\".\"${casedColumn}\"`;\n case \"mssql\":\n return `[${table}].[${casedColumn}]`;\n default:\n throw new Error(`Unsupported database type: ${dbType}`);\n }\n }\n\n const casedColumn =\n this.modelColumnsMap.get(column)?.databaseName ??\n convertCase(column, this.model.databaseCaseConvention);\n\n switch (dbType) {\n case \"mysql\":\n case \"mariadb\":\n return `\\`${casedColumn}\\``;\n case \"postgres\":\n case \"cockroachdb\":\n case \"sqlite\":\n case \"oracledb\":\n return `\"${casedColumn}\"`;\n case \"mssql\":\n return `[${casedColumn}]`;\n default:\n throw new Error(`Unsupported database type: ${dbType}`);\n }\n }\n\n /**\n * @description Formats the table name for the database type, idempotent for quoting\n */\n formatStringTable(dbType: SqlDataSourceType, table: string): string {\n // Table normalization\n table = table.replace(/\\s+/g, \" \").trim();\n let alias = \"\";\n if (table.toLowerCase().includes(\" as \")) {\n [table, alias] = table.split(\" as \");\n }\n\n switch (dbType) {\n case \"mysql\":\n case \"mariadb\":\n return `\\`${table}\\`${alias ? ` as \\`${alias}\\`` : \"\"}`;\n case \"postgres\":\n case \"cockroachdb\":\n case \"sqlite\":\n case \"oracledb\":\n return `\"${table}\"${alias ? ` as \"${alias}\"` : \"\"}`;\n case \"mssql\":\n return `[${table}]${alias ? ` as [${alias}]` : \"\"}`;\n default:\n return `${table}${alias ? ` as ${alias}` : \"\"}`;\n }\n }\n\n async prepareColumns(\n columns: string[],\n values: any[],\n mode: \"insert\" | \"update\" = \"insert\",\n ): Promise<{ columns: string[]; values: any[] }> {\n if (!columns.length) {\n return { columns, values };\n }\n\n const filteredColumns: string[] = [];\n const filteredValues: any[] = [];\n\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i];\n const value = values[i];\n\n if (column === \"*\" || column === \"$annotations\") {\n continue;\n }\n\n filteredColumns.push(column);\n filteredValues.push(value);\n }\n\n await Promise.all(\n filteredColumns.map(async (_, i) => {\n const column = filteredColumns[i];\n const value = filteredValues[i];\n\n const modelColumn = this.modelColumnsMap.get(column);\n\n let preparedValue = value;\n if (modelColumn) {\n if (mode === \"insert\" && modelColumn.prepare) {\n preparedValue = await modelColumn.prepare(value);\n } else if (mode === \"update\") {\n preparedValue = (await modelColumn.prepare?.(value)) ?? value;\n }\n }\n\n filteredValues[i] = preparedValue;\n }),\n );\n\n for (const column of this.modelColumnsMap.keys()) {\n if (!filteredColumns.includes(column)) {\n const modelColumn = this.modelColumnsMap.get(column);\n if (!modelColumn) {\n continue;\n }\n\n if (\n mode === \"insert\" &&\n column === (this.model as typeof Model).primaryKey &&\n !modelColumn.prepare\n ) {\n continue;\n }\n\n if (mode === \"insert\" || modelColumn.autoUpdate) {\n filteredColumns.push(column);\n filteredValues.push(modelColumn.prepare?.(undefined) ?? undefined);\n }\n }\n }\n\n return { columns: filteredColumns, values: filteredValues };\n }\n\n /**\n * @description Formats the from node for write operations removing the \"from\" keyword\n */\n getFromForWriteOperations(\n dbType: SqlDataSourceType,\n fromNode: FromNode,\n ): string {\n if (typeof fromNode.table === \"string\") {\n return this.formatStringTable(dbType, fromNode.table);\n }\n\n const astParser = new AstParser(this.model, dbType);\n if (Array.isArray(fromNode.table)) {\n return `(${astParser.parse(fromNode.table).sql})`;\n }\n\n return `(${astParser.parse([fromNode.table as QueryNode]).sql})`;\n }\n}\n","import { AstParser } from \"../../../ast/parser\";\nimport { AlterTableNode } from \"../../../ast/query/node/alter_table\";\nimport { RenameTableNode } from \"../../../ast/query/node/alter_table/rename_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MssqlAlterTableInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const atNode = node as AlterTableNode;\n const utils = new InterpreterUtils(this.model);\n const tableName = utils.formatStringTable(\"mssql\", atNode.table);\n\n if (!atNode.children || !atNode.children.length) {\n return { sql: \"\", bindings: [] };\n }\n\n // MSSQL uses sp_rename for table renaming\n if (\n atNode.children.length === 1 &&\n atNode.children[0] instanceof RenameTableNode\n ) {\n const renameNode = atNode.children[0] as RenameTableNode;\n return {\n sql: `EXEC sp_rename '${atNode.table}', '${renameNode.newName}'`,\n bindings: [],\n };\n }\n\n const astParser = new AstParser(this.model, \"mssql\" as SqlDataSourceType);\n const parts: string[] = [];\n const bindings: any[] = [];\n\n for (const child of atNode.children) {\n const { sql, bindings: childBindings } = astParser.parse([child]);\n parts.push(sql.trim());\n bindings.push(...childBindings);\n }\n\n const stmt = parts.join(\", \");\n const finalSql = `${tableName} ${stmt}`;\n return { sql: finalSql, bindings };\n }\n}\n\nexport default new MssqlAlterTableInterpreter();\n","import { DropColumnNode } from \"../../../ast/query/node/alter_table/drop_column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlDropColumnInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const d = node as DropColumnNode;\n return { sql: `drop column [${d.column}]`, bindings: [] };\n }\n}\nexport default new MssqlDropColumnInterpreter();\n","import { DropConstraintNode } from \"../../../ast/query/node/alter_table/drop_constraint\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlDropConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const dNode = node as DropConstraintNode;\n return { sql: `drop constraint [${dNode.constraintName}]`, bindings: [] };\n }\n}\nexport default new MssqlDropConstraintInterpreter();\n","import { DropDefaultNode } from \"../../../ast/query/node/alter_table/drop_default\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlDropDefaultInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as DropDefaultNode;\n return { sql: `drop constraint DF_${n.column}`, bindings: [] };\n }\n}\nexport default new MssqlDropDefaultInterpreter();\n","import { DropNotNullNode } from \"../../../ast/query/node/alter_table/drop_not_null\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport logger from \"../../../../utils/logger\";\n\nclass MssqlDropNotNullInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as DropNotNullNode;\n logger.warn(\n \"MSSQL requires the full column type when altering nullability. \" +\n \"This operation may need manual adjustment.\",\n );\n return { sql: `alter column [${n.column}] null`, bindings: [] };\n }\n}\nexport default new MssqlDropNotNullInterpreter();\n","import { DropPrimaryKeyNode } from \"../../../ast/query/node/alter_table/drop_primary_key\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlDropPrimaryKeyInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const pk = node as DropPrimaryKeyNode;\n const constraintName = `pk_${pk.table}`;\n return { sql: `drop constraint [${constraintName}]`, bindings: [] };\n }\n}\nexport default new MssqlDropPrimaryKeyInterpreter();\n","import { RenameColumnNode } from \"../../../ast/query/node/alter_table/rename_column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlRenameColumnInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const r = node as RenameColumnNode;\n const table = this.model?.table ?? \"\";\n return {\n sql: `sp_rename '${table}.${r.oldName}', '${r.newName}', 'COLUMN'`,\n bindings: [],\n };\n }\n}\nexport default new MssqlRenameColumnInterpreter();\n","import { RenameTableNode } from \"../../../ast/query/node/alter_table/rename_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlRenameTableInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const rt = node as RenameTableNode;\n return { sql: `[${rt.newName}]`, bindings: [] };\n }\n}\nexport default new MssqlRenameTableInterpreter();\n","import { QueryNode } from \"../../query\";\n\nexport class RawNode extends QueryNode {\n rawValue: string;\n canKeywordBeSeenMultipleTimes = true;\n chainsWith = \" \";\n currParamIndex = 0;\n isRawValue = true;\n folder = \"raw\";\n file = \"raw\";\n\n constructor(value: string) {\n super(\"raw\", true);\n this.rawValue = value;\n }\n}\n","import { SetDefaultNode } from \"../../../ast/query/node/alter_table/set_default\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlSetDefaultInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as SetDefaultNode;\n let val: string;\n\n if (n.defaultValue instanceof RawNode) {\n val = n.defaultValue.rawValue;\n } else if (n.defaultValue === \"NULL\" || n.defaultValue === null) {\n val = \"null\";\n } else if (n.defaultValue === \"TRUE\") {\n val = \"1\";\n } else if (n.defaultValue === \"FALSE\") {\n val = \"0\";\n } else if (\n typeof n.defaultValue === \"string\" &&\n n.defaultValue !== \"null\" &&\n n.defaultValue !== \"1\" &&\n n.defaultValue !== \"0\"\n ) {\n val = `'${n.defaultValue}'`;\n } else {\n val = String(n.defaultValue);\n }\n\n return {\n sql: `add constraint DF_${n.column} default ${val} for [${n.column}]`,\n bindings: [],\n };\n }\n}\nexport default new MssqlSetDefaultInterpreter();\n","import { SetNotNullNode } from \"../../../ast/query/node/alter_table/set_not_null\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport logger from \"../../../../utils/logger\";\n\nclass MssqlSetNotNullInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as SetNotNullNode;\n logger.warn(\n \"MSSQL requires the full column type when altering nullability. \" +\n \"This operation may need manual adjustment.\",\n );\n return { sql: `alter column [${n.column}] not null`, bindings: [] };\n }\n}\nexport default new MssqlSetNotNullInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { ColumnTypeNode } from \"../../../ast/query/node/column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { getColumnValue } from \"../../../resources/utils\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MssqlColumnTypeInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const colNode = node as ColumnTypeNode;\n if (colNode.isRawValue) {\n return { sql: colNode.column as string, bindings: [] };\n }\n\n const utils = new InterpreterUtils(this.model);\n const columnName = utils.formatStringColumn(\n \"mssql\",\n getColumnValue(colNode.column),\n );\n\n const dt = colNode.dataType.toLowerCase();\n\n if (dt === \"char\") {\n const len = colNode.length ?? 1;\n return { sql: `${columnName} char(${len})`, bindings: [] };\n }\n\n if (dt === \"varchar\") {\n const len = colNode.length ?? 255;\n return { sql: `${columnName} varchar(${len})`, bindings: [] };\n }\n\n if (\n dt === \"text\" ||\n dt === \"longtext\" ||\n dt === \"mediumtext\" ||\n dt === \"tinytext\"\n ) {\n return { sql: `${columnName} varchar(max)`, bindings: [] };\n }\n\n if (dt === \"uuid\") {\n return { sql: `${columnName} uniqueidentifier`, bindings: [] };\n }\n\n if (dt === \"ulid\") {\n return { sql: `${columnName} varchar(26)`, bindings: [] };\n }\n\n if (dt === \"bigint\") {\n if (colNode.autoIncrement) {\n return { sql: `${columnName} bigint identity(1,1)`, bindings: [] };\n }\n return { sql: `${columnName} bigint`, bindings: [] };\n }\n\n if (dt === \"tinyint\") {\n return { sql: `${columnName} tinyint`, bindings: [] };\n }\n\n if (dt === \"smallint\") {\n return { sql: `${columnName} smallint`, bindings: [] };\n }\n\n if (dt === \"mediumint\") {\n return { sql: `${columnName} int`, bindings: [] };\n }\n\n if (dt === \"float\" || dt === \"real\") {\n return { sql: `${columnName} real`, bindings: [] };\n }\n\n if (dt === \"double\") {\n return { sql: `${columnName} float`, bindings: [] };\n }\n\n if (dt === \"decimal\" || dt === \"numeric\") {\n const precision = colNode.precision ?? 10;\n const scale = colNode.scale ?? 0;\n return {\n sql: `${columnName} decimal(${precision}, ${scale})`,\n bindings: [],\n };\n }\n\n if (dt === \"date\") {\n return { sql: `${columnName} date`, bindings: [] };\n }\n\n if (dt === \"year\") {\n return { sql: `${columnName} smallint`, bindings: [] };\n }\n\n if (dt === \"time\") {\n const p =\n typeof colNode.precision === \"number\" ? `(${colNode.precision})` : \"\";\n return { sql: `${columnName} time${p}`, bindings: [] };\n }\n\n if (dt === \"datetime\" || dt === \"timestamp\") {\n const p =\n typeof colNode.precision === \"number\" ? `(${colNode.precision})` : \"\";\n return { sql: `${columnName} datetime2${p}`, bindings: [] };\n }\n\n if (dt === \"boolean\" || dt === \"bool\") {\n return { sql: `${columnName} bit`, bindings: [] };\n }\n\n if (\n dt === \"bytea\" ||\n dt === \"binary\" ||\n dt === \"varbinary\" ||\n dt === \"blob\" ||\n dt === \"longblob\" ||\n dt === \"mediumblob\" ||\n dt === \"tinyblob\"\n ) {\n return { sql: `${columnName} varbinary(max)`, bindings: [] };\n }\n\n if (dt === \"json\" || dt === \"jsonb\") {\n return { sql: `${columnName} nvarchar(max)`, bindings: [] };\n }\n\n if (dt === \"enum\") {\n if (colNode.enumValues && colNode.enumValues.length > 0) {\n const values = colNode.enumValues.map((v) => `'${v}'`).join(\", \");\n return {\n sql: `${columnName} varchar(255) check (${columnName} in (${values}))`,\n bindings: [],\n };\n }\n return { sql: `${columnName} varchar(255)`, bindings: [] };\n }\n\n if (dt === \"integer\" || dt === \"int\") {\n if (colNode.autoIncrement) {\n return { sql: `${columnName} int identity(1,1)`, bindings: [] };\n }\n return { sql: `${columnName} int`, bindings: [] };\n }\n\n if (dt === \"geometry\") {\n return { sql: `${columnName} geometry`, bindings: [] };\n }\n\n if (dt === \"point\") {\n return { sql: `${columnName} geometry`, bindings: [] };\n }\n\n if (dt === \"linestring\") {\n return { sql: `${columnName} geometry`, bindings: [] };\n }\n\n if (dt === \"polygon\") {\n return { sql: `${columnName} geometry`, bindings: [] };\n }\n\n if (dt === \"multipoint\") {\n return { sql: `${columnName} geometry`, bindings: [] };\n }\n\n return {\n sql: `${columnName} ${dt}${colNode.length ? `(${colNode.length})` : \"\"}`,\n bindings: [],\n };\n }\n}\n\nexport default new MssqlColumnTypeInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlAfterConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(_node: QueryNode) {\n return { sql: \"\", bindings: [] };\n }\n}\nexport default new MssqlAfterConstraintInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { ConstraintNode } from \"../../../ast/query/node/constraint\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { getColumnValue } from \"../../../resources/utils\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MssqlConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const cNode = node as ConstraintNode;\n const utils = new InterpreterUtils(this.model);\n\n if (cNode.constraintType === \"primary_key\") {\n if (cNode.columns && cNode.columns.length) {\n const sqlPrefix = cNode.constraintName\n ? `constraint [${cNode.constraintName}] `\n : \"\";\n const cols = (cNode.columns ?? [])\n .map((c) => utils.formatStringColumn(\"mssql\", getColumnValue(c)))\n .join(\", \");\n return { sql: `${sqlPrefix}primary key (${cols})`, bindings: [] };\n }\n return { sql: `primary key`, bindings: [] };\n }\n\n if (cNode.constraintType === \"unique\") {\n if (cNode.columns && cNode.columns.length > 0) {\n const colsArr = cNode.columns ?? [];\n const sqlPrefixU = cNode.constraintName\n ? `constraint [${cNode.constraintName}] `\n : \"\";\n const cols = colsArr\n .map((c) => utils.formatStringColumn(\"mssql\", getColumnValue(c)))\n .join(\", \");\n if (!cNode.constraintName) {\n return { sql: `unique`, bindings: [] };\n }\n return { sql: `${sqlPrefixU}unique (${cols})`, bindings: [] };\n }\n return { sql: `unique`, bindings: [] };\n }\n\n if (cNode.constraintType === \"not_null\") {\n return { sql: `not null`, bindings: [] };\n }\n\n if (cNode.constraintType === \"null\") {\n return { sql: `null`, bindings: [] };\n }\n\n if (cNode.constraintType === \"default\") {\n if (cNode.defaultValue !== undefined) {\n const val = cNode.defaultValue;\n if (val instanceof RawNode) {\n return { sql: `default ${val.rawValue}`, bindings: [] };\n }\n if (val === \"NULL\" || val === null) {\n return { sql: `default null`, bindings: [] };\n }\n if (val === \"TRUE\") {\n return { sql: `default 1`, bindings: [] };\n }\n if (val === \"FALSE\") {\n return { sql: `default 0`, bindings: [] };\n }\n if (typeof val === \"string\") {\n return { sql: `default '${val}'`, bindings: [] };\n }\n return { sql: `default ${val}`, bindings: [] };\n }\n return { sql: `default null`, bindings: [] };\n }\n\n if (cNode.constraintType === \"foreign_key\") {\n if (!cNode.columns || !cNode.columns.length) {\n return { sql: \"\", bindings: [] };\n }\n const cols = cNode.columns\n .map((c) => utils.formatStringColumn(\"mssql\", getColumnValue(c)))\n .join(\", \");\n if (!cNode.references) {\n return { sql: \"\", bindings: [] };\n }\n const refTable = utils.formatStringTable(\"mssql\", cNode.references.table);\n const refCols = cNode.references.columns\n .map((c) => utils.formatStringColumn(\"mssql\", getColumnValue(c)))\n .join(\", \");\n const sqlPrefix = cNode.constraintName\n ? `constraint [${cNode.constraintName}] `\n : \"\";\n let sql = `${sqlPrefix}foreign key (${cols}) references ${refTable}(${refCols})`;\n if (cNode.onDelete) {\n sql += ` on delete ${cNode.onDelete}`;\n }\n if (cNode.onUpdate) {\n sql += ` on update ${cNode.onUpdate}`;\n }\n return { sql, bindings: [] };\n }\n\n return { sql: \"\", bindings: [] };\n }\n}\n\nexport default new MssqlConstraintInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { CreateTableNode } from \"../../../ast/query/node/create_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MssqlCreateTableInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const ctNode = node as CreateTableNode;\n\n const utils = new InterpreterUtils(this.model);\n const tableName = utils.formatStringTable(\"mssql\", ctNode.table);\n\n if (!ctNode.children || !ctNode.children.length) {\n return { sql: `${tableName} ()`, bindings: [] };\n }\n\n const astParser = new AstParser(this.model, \"mssql\" as SqlDataSourceType);\n\n const parts: string[] = [];\n const bindings: any[] = [];\n\n for (const child of ctNode.children) {\n const { sql, bindings: childBindings } = astParser.parse([child]);\n\n if (child.folder === \"constraint\") {\n const last = parts.pop() ?? \"\";\n const inlineConstraintSql = sql;\n\n if (\n /not null/i.test(inlineConstraintSql) ||\n /null/i.test(inlineConstraintSql) ||\n /default/i.test(inlineConstraintSql)\n ) {\n let combined = `${last} ${inlineConstraintSql}`.trim();\n combined = combined.replace(\n /(references\\s+\\[[^\\]]+\\]\\s*\\([^)]*\\))\\s+not null/i,\n \"not null $1\",\n );\n parts.push(combined);\n bindings.push(...childBindings);\n continue;\n }\n\n parts.push(last);\n parts.push(inlineConstraintSql);\n bindings.push(...childBindings);\n continue;\n }\n\n parts.push(sql);\n bindings.push(...childBindings);\n }\n\n for (const constraint of ctNode.namedConstraints) {\n const { sql, bindings: constraintBindings } = astParser.parse([\n constraint,\n ]);\n\n parts.push(sql);\n bindings.push(...constraintBindings);\n }\n\n const columnsSql = parts.join(\", \");\n const finalSql = `${tableName} (${columnsSql})`;\n return { sql: finalSql, bindings };\n }\n}\n\nexport default new MssqlCreateTableInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { DeleteNode } from \"../../../ast/query/node/delete\";\nimport { FromNode } from \"../../../ast/query/node/from\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MssqlDeleteInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const deleteNode = node as DeleteNode;\n\n if (\n deleteNode.isRawValue &&\n typeof deleteNode.fromNode.table === \"string\"\n ) {\n return {\n sql: deleteNode.fromNode.table,\n bindings: [],\n };\n }\n\n const formattedTable = new InterpreterUtils(\n this.model,\n ).getFromForWriteOperations(\"mssql\", deleteNode.fromNode as FromNode);\n\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n}\n\nexport default new MssqlDeleteInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlDistinctInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n return {\n sql: \"\",\n bindings: [],\n };\n }\n}\n\nexport default new MssqlDistinctInterpreter();\n","import logger from \"../../../../utils/logger\";\nimport { AstParser } from \"../../../ast/parser\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlDistinctOnInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n logger.warn(\n \"MSSQL does not support DISTINCT ON. This clause will be ignored.\",\n );\n\n return {\n sql: \"\",\n bindings: [],\n };\n }\n}\n\nexport default new MssqlDistinctOnInterpreter();\n","import { DropTableNode } from \"../../../ast/query/node/drop_table/drop_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MssqlDropTableInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const dt = node as DropTableNode;\n const utils = new InterpreterUtils(this.model);\n const tableSql = utils.formatStringTable(\"mssql\", dt.table);\n const exists = dt.ifExists ? \"if exists \" : \"\";\n return { sql: `${exists}${tableSql}`, bindings: [] };\n }\n}\nexport default new MssqlDropTableInterpreter();\n","import { CreateExtensionNode } from \"../../../ast/query/node/extension/create_extension\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlCreateExtensionInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const ext = node as CreateExtensionNode;\n return {\n sql: `-- MSSQL does not support extensions (extension: ${ext.extensionName})`,\n bindings: [],\n };\n }\n}\nexport default new MssqlCreateExtensionInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { FromNode } from \"../../../ast/query/node/from\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MssqlFromInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const fromNode = node as FromNode;\n\n if (typeof fromNode.table === \"string\") {\n const interpreterUtils = new InterpreterUtils(this.model);\n\n if (fromNode.alias && fromNode.alias.length > 0) {\n const tableSql = interpreterUtils.formatStringTable(\n \"mssql\",\n fromNode.table,\n );\n\n return {\n sql: `${tableSql} as [${fromNode.alias}]`,\n bindings: [],\n };\n }\n\n const tableSql = interpreterUtils.formatStringTable(\n \"mssql\",\n fromNode.table,\n );\n\n return { sql: tableSql, bindings: [] };\n }\n\n const subQueryNodes = Array.isArray(fromNode.table)\n ? fromNode.table\n : [fromNode.table];\n\n const astParser = new AstParser(this.model, \"mssql\" as SqlDataSourceType);\n const result = astParser.parse(subQueryNodes);\n\n const aliasSql =\n fromNode.alias && fromNode.alias.length ? ` as [${fromNode.alias}]` : \"\";\n\n return {\n sql: `(${result.sql})${aliasSql}`,\n bindings: result.bindings,\n };\n }\n}\n\nexport default new MssqlFromInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { GroupByNode } from \"../../../ast/query/node/group_by/group_by\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MssqlGroupByInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const groupByNode = node as GroupByNode;\n if (groupByNode.isRawValue) {\n return {\n sql: groupByNode.column,\n bindings: [],\n };\n }\n\n const columnSql = new InterpreterUtils(this.model).formatStringColumn(\n \"mssql\",\n groupByNode.column,\n );\n\n return {\n sql: columnSql,\n bindings: [],\n };\n }\n}\n\nexport default new MssqlGroupByInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { HavingNode } from \"../../../ast/query/node/having/having\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MssqlHavingInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const havingNode = node as HavingNode;\n if (havingNode.isRawValue) {\n return {\n sql: havingNode.column,\n bindings: havingNode.value as any[],\n };\n }\n\n const idx = havingNode.currParamIndex;\n let sql = \"\";\n let bindings: any[] = [];\n\n if (\n !(havingNode.value instanceof QueryNode) &&\n !Array.isArray(havingNode.value)\n ) {\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"mssql\", havingNode.column)} ${havingNode.operator} @${idx}`;\n bindings = [havingNode.value];\n }\n\n if (Array.isArray(havingNode.value)) {\n const placeholders = havingNode.value\n .map((_, i) => `@${idx + i}`)\n .join(\", \");\n\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"mssql\", havingNode.column)} ${havingNode.operator} (${placeholders})`;\n bindings = havingNode.value;\n }\n\n if (havingNode.isNegated) {\n sql = `not (${sql})`;\n }\n\n return { sql: sql.trim(), bindings };\n }\n}\n\nexport default new MssqlHavingInterpreter();\n","import { CreateIndexNode } from \"../../../ast/query/node/index_op/create_index\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MssqlCreateIndexInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const ci = node as CreateIndexNode;\n const utils = new InterpreterUtils(this.model);\n const tableSql = utils.formatStringTable(\"mssql\", ci.table);\n const cols = ci.columns.map((c) => `[${c}]`).join(\", \");\n const unique = ci.unique ? \"unique \" : \"\";\n return {\n sql: `${unique}[${ci.indexName}] on ${tableSql} (${cols})`,\n bindings: [],\n };\n }\n}\nexport default new MssqlCreateIndexInterpreter();\n","import { DropIndexNode } from \"../../../ast/query/node/index_op/drop_index\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlDropIndexInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const di = node as DropIndexNode;\n return {\n sql: `[${di.indexName}] on [${di.table}]`,\n bindings: [],\n };\n }\n}\nexport default new MssqlDropIndexInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { InsertNode } from \"../../../ast/query/node/insert\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MssqlInsertInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const insertNode = node as InsertNode;\n if (insertNode.isRawValue) {\n return {\n sql: insertNode.fromNode.table as string,\n bindings: [],\n };\n }\n\n const interpreterUtils = new InterpreterUtils(this.model);\n const formattedTable = interpreterUtils.getFromForWriteOperations(\n \"mssql\",\n insertNode.fromNode,\n );\n\n if (!insertNode.records.length) {\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n\n const firstRecord = insertNode.records[0];\n const columns = Object.keys(firstRecord).filter(\n (key) => firstRecord[key] !== undefined,\n );\n if (!columns.length) {\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n\n const formattedColumns = columns\n .map((column) => interpreterUtils.formatStringColumn(\"mssql\", column))\n .join(\", \");\n\n const allValues: any[] = [];\n const valuesClauses: string[] = [];\n let paramIndex = insertNode.currParamIndex;\n\n for (const record of insertNode.records) {\n const recordValues = columns.map((column) => record[column]);\n\n const placeholders: string[] = [];\n for (const value of recordValues) {\n if (value instanceof RawNode) {\n placeholders.push(value.rawValue);\n } else {\n allValues.push(value);\n placeholders.push(`@${paramIndex++}`);\n }\n }\n\n valuesClauses.push(`(${placeholders.join(\", \")})`);\n }\n\n let sql = `${formattedTable} (${formattedColumns}) values ${valuesClauses.join(\", \")}`;\n\n if (!insertNode.disableReturning) {\n if (insertNode.returning && insertNode.returning.length) {\n const returningCols = insertNode.returning\n .map(\n (column) =>\n `inserted.${interpreterUtils.formatStringColumn(\"mssql\", column)}`,\n )\n .join(\", \");\n sql = sql.replace(`) values`, `) output ${returningCols} values`);\n } else {\n const outputCols = this.getOutputColumns(columns, interpreterUtils);\n sql = sql.replace(`) values`, `) output ${outputCols} values`);\n }\n }\n\n return {\n sql,\n bindings: allValues,\n };\n }\n\n private getOutputColumns(\n insertedColumns: string[],\n interpreterUtils: InterpreterUtils,\n ): string {\n const outputColumns = [...insertedColumns];\n\n const primaryKey = this.model.primaryKey;\n if (primaryKey && !insertedColumns.includes(primaryKey)) {\n outputColumns.push(primaryKey);\n }\n\n return outputColumns\n .map(\n (column) =>\n `inserted.${interpreterUtils.formatStringColumn(\"mssql\", column)}`,\n )\n .join(\", \");\n }\n}\n\nexport default new MssqlInsertInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { JoinNode } from \"../../../ast/query/node/join/join\";\nimport type { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MssqlJoinInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const joinNode = node as JoinNode;\n if (joinNode.isRawValue) {\n return {\n sql: joinNode.table,\n bindings: [],\n };\n }\n\n const utils = new InterpreterUtils(this.model);\n\n let leftColumnStr = joinNode.left;\n if (!leftColumnStr.includes(\".\")) {\n leftColumnStr = `${joinNode.table}.${leftColumnStr}`;\n }\n\n let rightColumnStr = joinNode.right;\n if (!rightColumnStr.includes(\".\")) {\n rightColumnStr = `${this.model.table}.${rightColumnStr}`;\n }\n\n const leftSql = utils.formatStringColumn(\"mssql\", leftColumnStr);\n const rightSql = utils.formatStringColumn(\"mssql\", rightColumnStr);\n const tableSql = utils.formatStringTable(\"mssql\", joinNode.table);\n\n const sql = `${tableSql} on ${leftSql} ${joinNode.on?.operator} ${rightSql}`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new MssqlJoinInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { LimitNode } from \"../../../ast/query/node/limit/limit\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlLimitInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const limitNode = node as LimitNode;\n const idx = limitNode.currParamIndex;\n\n return {\n sql: `fetch next @${idx} rows only`,\n bindings: [limitNode.limit],\n };\n }\n}\n\nexport default new MssqlLimitInterpreter();\n","import { LockNode } from \"../../../ast/query/node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\n\n/**\n * MSSQL Lock Interpreter\n *\n * MSSQL uses table hints instead of FOR UPDATE/FOR SHARE:\n * - FOR UPDATE -> WITH (UPDLOCK)\n * - FOR SHARE -> WITH (HOLDLOCK)\n * - SKIP LOCKED -> WITH (READPAST)\n * - NOWAIT -> WITH (NOWAIT) or SET LOCK_TIMEOUT 0\n *\n * These hints are injected by the AST parser after the FROM clause table name,\n * so this interpreter returns empty SQL.\n */\nclass MssqlLockInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): { sql: string; bindings: any[] } {\n // Lock hints are handled by the AST parser and injected after FROM clause\n // See AstParser.getMssqlTableHints() for the implementation\n return {\n sql: \"\",\n bindings: [],\n };\n }\n}\n\nexport default new MssqlLockInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { OffsetNode } from \"../../../ast/query/node/offset/offset\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlOffsetInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const offsetNode = node as OffsetNode;\n const idx = offsetNode.currParamIndex;\n\n return {\n sql: `offset @${idx} rows`,\n bindings: [offsetNode.offset],\n };\n }\n}\n\nexport default new MssqlOffsetInterpreter();\n","import logger from \"../../../../utils/logger\";\nimport { AstParser } from \"../../../ast/parser\";\nimport { OnDuplicateNode } from \"../../../ast/query/node/on_duplicate\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\n\nclass MssqlOnDuplicateInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const onDuplicateNode = node as OnDuplicateNode;\n\n if (onDuplicateNode.isRawValue) {\n return {\n sql: onDuplicateNode.table,\n bindings: [],\n };\n }\n\n logger.warn(\n \"MSSQL does not support ON CONFLICT or ON DUPLICATE KEY. \" +\n \"Use MERGE statement for upsert operations. \" +\n \"This clause will be ignored. Consider using raw queries for MSSQL upserts.\",\n );\n\n return {\n sql: \"\",\n bindings: [],\n };\n }\n}\n\nexport default new MssqlOnDuplicateInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { OrderByNode } from \"../../../ast/query/node/order_by/order_by\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MssqlOrderByInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const orderByNode = node as OrderByNode;\n if (orderByNode.isRawValue) {\n return {\n sql: orderByNode.column,\n bindings: [],\n };\n }\n\n const columnSql = new InterpreterUtils(this.model).formatStringColumn(\n \"mssql\",\n orderByNode.column,\n );\n const directionSql = orderByNode.direction.toLowerCase();\n\n return {\n sql: `${columnSql} ${directionSql}`,\n bindings: [],\n };\n }\n}\n\nexport default new MssqlOrderByInterpreter();\n","import { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlRawInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): { sql: string; bindings: any[] } {\n const rawNode = node as RawNode;\n return {\n sql: rawNode.rawValue,\n bindings: [],\n };\n }\n}\n\nexport default new MssqlRawInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { ForeignKeyInfoNode } from \"../../../ast/query/node/schema/foreign_key_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlForeignKeyInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as ForeignKeyInfoNode;\n const table = node.table;\n const sql = `SELECT\n fk.name as name,\n c.name as column_name,\n rt.name as referenced_table,\n rc.name as referenced_column,\n fk.update_referential_action_desc as on_update,\n fk.delete_referential_action_desc as on_delete\nFROM sys.foreign_keys fk\nINNER JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id\nINNER JOIN sys.columns c ON fkc.parent_object_id = c.object_id AND fkc.parent_column_id = c.column_id\nINNER JOIN sys.tables rt ON fkc.referenced_object_id = rt.object_id\nINNER JOIN sys.columns rc ON fkc.referenced_object_id = rc.object_id AND fkc.referenced_column_id = rc.column_id\nWHERE fk.parent_object_id = OBJECT_ID('${table}')`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new MssqlForeignKeyInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { IndexInfoNode } from \"../../../ast/query/node/schema/index_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlIndexInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as IndexInfoNode;\n const table = node.table;\n const sql = `SELECT\n i.name as index_name,\n c.name as column_name,\n i.is_unique as is_unique\nFROM sys.indexes i\nINNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id\nINNER JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id\nWHERE i.object_id = OBJECT_ID('${table}')\n AND i.is_primary_key = 0\n AND i.type > 0`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new MssqlIndexInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { PrimaryKeyInfoNode } from \"../../../ast/query/node/schema/primary_key_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlPrimaryKeyInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as PrimaryKeyInfoNode;\n const table = node.table;\n const sql = `SELECT\n tc.CONSTRAINT_NAME as name,\n kcu.COLUMN_NAME as column_name\nFROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc\nJOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu\n ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME\nWHERE tc.CONSTRAINT_TYPE = 'PRIMARY KEY'\n AND tc.TABLE_NAME = '${table}'\nORDER BY kcu.ORDINAL_POSITION`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new MssqlPrimaryKeyInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { TableInfoNode } from \"../../../ast/query/node/schema/table_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlTableInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as TableInfoNode;\n const table = node.table;\n const sql = `SELECT\n c.COLUMN_NAME as column_name,\n c.DATA_TYPE as data_type,\n c.IS_NULLABLE as is_nullable,\n c.COLUMN_DEFAULT as column_default,\n c.CHARACTER_MAXIMUM_LENGTH as char_length,\n c.NUMERIC_PRECISION as numeric_precision,\n c.NUMERIC_SCALE as numeric_scale\nFROM INFORMATION_SCHEMA.COLUMNS c\nWHERE c.TABLE_NAME = '${table}'\nORDER BY c.ORDINAL_POSITION`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new MssqlTableInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { SelectNode } from \"../../../ast/query/node/select/basic_select\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MssqlSelectInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const selectNode = node as SelectNode;\n if (selectNode.isRawValue) {\n return {\n sql: selectNode.column as string,\n bindings: [],\n };\n }\n\n const columnResult = this.formatColumn(\n selectNode.column,\n selectNode.sqlFunction,\n );\n const aliasSql = this.formatAlias(selectNode.alias);\n\n return {\n sql: `${columnResult.sql}${aliasSql}`,\n bindings: columnResult.bindings,\n };\n }\n\n private formatColumn(\n column: string | QueryNode | QueryNode[],\n sqlFunction?: string,\n ): ReturnType<typeof AstParser.prototype.parse> {\n if (typeof column === \"string\") {\n const col = new InterpreterUtils(this.model).formatStringColumn(\n \"mssql\",\n column,\n );\n\n let sql = col;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}(${col})`;\n }\n\n return {\n sql,\n bindings: [],\n };\n }\n\n if (Array.isArray(column) && column.length > 0) {\n const astParser = new AstParser(this.model, \"mssql\" as SqlDataSourceType);\n const result = astParser.parse(column);\n\n let sql = `(${result.sql})`;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}${sql}`;\n }\n\n return {\n sql,\n bindings: result.bindings,\n };\n }\n\n if (!Array.isArray(column)) {\n const astParser = new AstParser(this.model, \"mssql\" as SqlDataSourceType);\n const result = astParser.parse([column]);\n\n let sql = `(${result.sql})`;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}${sql}`;\n }\n\n return {\n sql,\n bindings: result.bindings,\n };\n }\n\n const formattedColumns = column.map((col) => {\n if (typeof col === \"string\") {\n const formatted = new InterpreterUtils(this.model).formatStringColumn(\n \"mssql\",\n col,\n );\n\n if (sqlFunction) {\n return `${sqlFunction.toLowerCase()}(${formatted})`;\n }\n\n return formatted;\n }\n\n const astParser = new AstParser(this.model, \"mssql\" as SqlDataSourceType);\n const result = astParser.parse([col]);\n\n let sql = `(${result.sql})`;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}${sql}`;\n }\n\n return sql;\n });\n\n return {\n sql: formattedColumns.join(\", \"),\n bindings: [],\n };\n }\n\n private formatAlias(alias?: string): string {\n if (alias && alias.length > 0) {\n return ` as [${alias}]`;\n }\n\n return \"\";\n }\n}\n\nexport default new MssqlSelectInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { FromNode } from \"../../../ast/query/node/from\";\nimport { TruncateNode } from \"../../../ast/query/node/truncate\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MssqlTruncateInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const truncateNode = node as TruncateNode;\n\n if (truncateNode.isRawValue && typeof truncateNode.fromNode === \"string\") {\n return {\n sql: truncateNode.fromNode,\n bindings: [],\n };\n }\n\n const formattedTable = new InterpreterUtils(\n this.model,\n ).getFromForWriteOperations(\"mssql\", truncateNode.fromNode as FromNode);\n\n return {\n sql: `table ${formattedTable}`,\n bindings: [],\n };\n }\n}\n\nexport default new MssqlTruncateInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { UnionNode } from \"../../../ast/query/node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { Model } from \"../../../models/model\";\n\nclass MssqlUnionInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const unionNode = node as UnionNode;\n const parser = new AstParser(this.model, \"mssql\");\n const nodes = Array.isArray(unionNode.query)\n ? unionNode.query\n : [unionNode.query];\n\n const ast =\n typeof unionNode.query === \"string\"\n ? { sql: unionNode.query, bindings: [] }\n : parser.parse(\n nodes.filter(Boolean) as QueryNode[],\n unionNode.currParamIndex,\n );\n\n return {\n sql: ast.sql,\n bindings: ast.bindings,\n };\n }\n}\n\nexport default new MssqlUnionInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { FromNode } from \"../../../ast/query/node/from\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { UpdateNode } from \"../../../ast/query/node/update\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MssqlUpdateInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const updateNode = node as UpdateNode;\n if (updateNode.isRawValue && typeof updateNode.fromNode === \"string\") {\n return {\n sql: updateNode.fromNode as string,\n bindings: updateNode.values,\n };\n }\n\n const interpreterUtils = new InterpreterUtils(this.model);\n const formattedTable = interpreterUtils.getFromForWriteOperations(\n \"mssql\",\n updateNode.fromNode as FromNode,\n );\n\n if (!updateNode.columns.length || !updateNode.values.length) {\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n\n let rawNodeCount = 0;\n const finalBindings: any[] = [];\n const setClause = updateNode.columns\n .map((column, index) => {\n const idx = updateNode.currParamIndex + index - rawNodeCount;\n const value = updateNode.values[index];\n\n if (value instanceof RawNode) {\n rawNodeCount++;\n return `${interpreterUtils.formatStringColumn(\"mssql\", column)} = ${value.rawValue}`;\n }\n\n finalBindings.push(value);\n return `${interpreterUtils.formatStringColumn(\"mssql\", column)} = @${idx}`;\n })\n .join(\", \");\n\n return {\n sql: `${formattedTable} set ${setClause}`,\n bindings: finalBindings,\n };\n }\n}\n\nexport default new MssqlUpdateInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport type { WhereNode } from \"../../../ast/query/node/where/where\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MssqlWhereInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const whereNode = node as WhereNode;\n if (whereNode.isRawValue) {\n return {\n sql: whereNode.column,\n bindings: (whereNode.value as any[]) ?? [],\n };\n }\n\n const value = whereNode.value;\n const idx = whereNode.currParamIndex;\n\n if (this.isRawNode(value)) {\n const formattedRight = this.formatRawIdentifierIfPossible(value.rawValue);\n const formattedColumn = new InterpreterUtils(\n this.model,\n ).formatStringColumn(\"mssql\", whereNode.column);\n\n return {\n sql: `${formattedColumn} ${whereNode.operator} ${formattedRight}`.trim(),\n bindings: [],\n };\n }\n\n if (Array.isArray(value)) {\n const formattedColumn = new InterpreterUtils(\n this.model,\n ).formatStringColumn(\"mssql\", whereNode.column);\n\n if (whereNode.operator.toLowerCase() === \"between\") {\n const placeholders = `@${idx} AND @${idx + 1}`;\n let sql = `${formattedColumn} between ${placeholders}`;\n\n if (whereNode.isNegated) {\n sql = `not (${sql})`;\n }\n\n return {\n sql: sql.trim(),\n bindings: value,\n };\n }\n\n const placeholders = value.map((_, i) => `@${idx + i}`).join(\", \");\n\n let sql = `${formattedColumn} ${whereNode.operator} (${placeholders})`;\n\n if (whereNode.isNegated) {\n sql = `not (${sql})`;\n }\n\n return {\n sql: sql.trim(),\n bindings: value,\n };\n }\n\n const formattedColumn = new InterpreterUtils(this.model).formatStringColumn(\n \"mssql\",\n whereNode.column,\n );\n\n if (whereNode.operator.includes(\"null\")) {\n let sql = `${formattedColumn} ${whereNode.operator}`;\n\n if (whereNode.isNegated) {\n sql = `not (${sql})`;\n }\n\n return {\n sql: sql.trim(),\n bindings: [],\n };\n }\n\n if (value === undefined) {\n return {\n sql: \"\",\n bindings: [],\n };\n }\n\n let sql = `${formattedColumn} ${whereNode.operator} @${idx}`;\n\n if (whereNode.isNegated) {\n sql = `not (${sql})`;\n }\n\n return {\n sql: sql.trim(),\n bindings: [value],\n };\n }\n\n private isRawNode(value: any): value is RawNode {\n if (!value) {\n return false;\n }\n\n const isObject = typeof value === \"object\";\n if (!isObject) {\n return false;\n }\n\n const hasRawValue = \"rawValue\" in value;\n const isMarkedRaw = (value as RawNode).isRawValue === true;\n\n return hasRawValue && isMarkedRaw;\n }\n\n private formatRawIdentifierIfPossible(raw: string): string {\n const isIdentifier =\n /^[A-Za-z_][A-Za-z0-9_]*(\\.(\\*|[A-Za-z_][A-Za-z0-9_]*))?$/.test(raw);\n if (!isIdentifier) {\n return raw;\n }\n\n return new InterpreterUtils(this.model).formatStringColumn(\"mssql\", raw);\n }\n}\n\nexport default new MssqlWhereInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { WhereGroupNode } from \"../../../ast/query/node/where/where_group\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlWhereGroupInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const groupNode = node as WhereGroupNode;\n if (!groupNode.nodes || !groupNode.nodes.length) {\n return { sql: \"\", bindings: [] };\n }\n\n const astParser = new AstParser(this.model, \"mssql\" as SqlDataSourceType);\n\n const { sql, bindings } = astParser.parse(\n groupNode.nodes,\n groupNode.currParamIndex,\n true,\n );\n\n return {\n sql: `(${sql})`,\n bindings,\n };\n }\n}\n\nexport default new MssqlWhereGroupInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { WhereJsonNode } from \"../../../ast/query/node/where/where_json\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MssqlWhereJsonInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const whereJsonNode = node as WhereJsonNode;\n if (whereJsonNode.isRawValue) {\n return {\n sql: whereJsonNode.column,\n bindings: [],\n };\n }\n\n const idx = whereJsonNode.currParamIndex;\n let sql = \"\";\n let bindings: any[] = [];\n\n const columnSql = new InterpreterUtils(this.model).formatStringColumn(\n \"mssql\",\n whereJsonNode.column,\n );\n\n switch (whereJsonNode.jsonOperator) {\n case \"=\":\n sql = `${columnSql} = @${idx}`;\n bindings = [JSON.stringify(whereJsonNode.value)];\n break;\n case \"contains\":\n case \"not contains\":\n sql = `CHARINDEX(@${idx}, ${columnSql}) > 0`;\n bindings = [JSON.stringify(whereJsonNode.value)];\n break;\n case \"raw\":\n sql = whereJsonNode.column;\n bindings = Array.isArray(whereJsonNode.value)\n ? whereJsonNode.value\n : [];\n break;\n }\n\n if (whereJsonNode.isNegated) {\n sql = `NOT (${sql})`;\n }\n\n return { sql: sql.trim(), bindings };\n }\n}\n\nexport default new MssqlWhereJsonInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { WhereSubqueryNode } from \"../../../ast/query/node/where/where_subquery\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MssqlWhereSubqueryInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const subqueryNode = node as WhereSubqueryNode;\n\n if (this.isStringSubquery(subqueryNode.subquery)) {\n return this.handleStringSubquery(subqueryNode);\n }\n\n if (this.isArraySubquery(subqueryNode.subquery)) {\n return this.handleArraySubquery(subqueryNode);\n }\n\n return this.handleObjectSubquery(subqueryNode);\n }\n\n private isStringSubquery(\n subquery: string | QueryNode | QueryNode[],\n ): subquery is string {\n return typeof subquery === \"string\";\n }\n\n private isArraySubquery(\n subquery: string | QueryNode | QueryNode[],\n ): subquery is QueryNode[] {\n return Array.isArray(subquery);\n }\n\n private handleStringSubquery(\n subqueryNode: WhereSubqueryNode,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const sql = `${subqueryNode.column} ${subqueryNode.operator} (${subqueryNode.subquery})`;\n return { sql: sql.trim(), bindings: [] };\n }\n\n private handleArraySubquery(\n subqueryNode: WhereSubqueryNode,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const astParser = new AstParser(this.model, \"mssql\" as SqlDataSourceType);\n const { sql: subquerySql, bindings: subqueryBindings } = astParser.parse(\n subqueryNode.subquery as QueryNode[],\n subqueryNode.currParamIndex,\n );\n\n const sql = `${subqueryNode.column} ${subqueryNode.operator} (${subquerySql})`;\n return { sql: sql.trim(), bindings: subqueryBindings };\n }\n\n private handleObjectSubquery(\n subqueryNode: WhereSubqueryNode,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const astParser = new AstParser(this.model, \"mssql\" as SqlDataSourceType);\n const { sql: subquerySql, bindings: subqueryBindings } = astParser.parse(\n [subqueryNode.subquery as QueryNode],\n subqueryNode.currParamIndex,\n );\n\n const sql = `${subqueryNode.column} ${subqueryNode.operator} (${subquerySql})`;\n return { sql: sql.trim(), bindings: subqueryBindings };\n }\n}\n\nexport default new MssqlWhereSubqueryInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { WithNode } from \"../../../ast/query/node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport logger from \"../../../../utils/logger\";\n\nclass MssqlWithInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(\n node: QueryNode | string,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const withNode = node as WithNode;\n const parser = new AstParser(this.model, \"mssql\");\n const nodes = Array.isArray(withNode.body)\n ? withNode.body\n : [withNode.body];\n\n const ast = parser.parse(\n nodes.filter(Boolean) as QueryNode[],\n withNode.currParamIndex,\n );\n\n if (withNode.clause === \"materialized\") {\n logger.warn(\n \"MSSQL does not support MATERIALIZED CTEs. The clause will be ignored.\",\n );\n }\n\n return {\n sql: `[${withNode.alias}] as (${ast.sql})`,\n bindings: ast.bindings,\n };\n }\n}\n\nexport default new MssqlWithInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { AddColumnNode } from \"../../../ast/query/node/alter_table/add_column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlAddColumnInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode) {\n const acNode = node as AddColumnNode;\n const ast = new AstParser(this.model, \"mysql\" as SqlDataSourceType);\n let { sql } = ast.parse([acNode.column]);\n\n const inlineConstraints = (acNode as any).inlineConstraints;\n if (inlineConstraints && inlineConstraints.length > 0) {\n const constraintParts: string[] = [];\n\n for (const constraint of inlineConstraints) {\n const { sql: constraintSql } = ast.parse([constraint]);\n constraintParts.push(constraintSql);\n }\n\n if (constraintParts.length > 0) {\n sql += ` ${constraintParts.join(\" \")}`;\n }\n }\n\n return { sql: `add column ${sql}`, bindings: [] };\n }\n}\n\nexport default new MysqlAddColumnInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { AddConstraintNode } from \"../../../ast/query/node/alter_table/add_constraint\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlAddConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const acNode = node as AddConstraintNode;\n const ast = new AstParser(this.model, \"mysql\" as SqlDataSourceType);\n const { sql } = ast.parse([acNode.constraint]);\n return { sql: `add ${sql}`, bindings: [] };\n }\n}\nexport default new MysqlAddConstraintInterpreter();\n","import { AddPrimaryKeyNode } from \"../../../ast/query/node/alter_table/add_primary_key\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlAddPrimaryKeyInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const pk = node as AddPrimaryKeyNode;\n const cols = pk.columns.map((c) => `\\`${c}\\``).join(\", \");\n return { sql: `add primary key (${cols})`, bindings: [] };\n }\n}\nexport default new MysqlAddPrimaryKeyInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { AlterColumnTypeNode } from \"../../../ast/query/node/alter_table/alter_column_type\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlAlterColumnTypeInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const a = node as AlterColumnTypeNode;\n const ast = new AstParser(this.model, \"mysql\" as SqlDataSourceType);\n const { sql } = ast.parse([a.newType]);\n const [, ...rest] = sql.trim().split(/\\s+/);\n const typeSql = rest.join(\" \");\n\n // Generate type change SQL\n let resultSql = `modify column \\`${a.column}\\` ${typeSql}`;\n\n // Add constraint modifications\n if (a.options.nullable !== undefined) {\n const nullableSql = a.options.nullable ? \"\" : \" not null\";\n resultSql += nullableSql;\n }\n\n if (a.options.dropDefault) {\n resultSql += \" drop default\";\n } else if (a.options.default !== undefined) {\n let defaultValue = a.options.default;\n if (defaultValue === null) {\n defaultValue = \"null\";\n } else if (typeof defaultValue === \"string\") {\n if (defaultValue === \"NULL\") {\n defaultValue = \"null\";\n } else if (defaultValue === \"TRUE\" || defaultValue === \"FALSE\") {\n defaultValue = defaultValue.toLowerCase();\n } else {\n defaultValue = `'${defaultValue}'`;\n }\n }\n resultSql += ` default ${defaultValue}`;\n }\n\n if (a.options.unique !== undefined) {\n if (a.options.unique) {\n resultSql += \" unique\";\n }\n // MySQL doesn't support dropping unique constraint in modify column\n // It would need a separate ALTER TABLE statement\n }\n\n return { sql: resultSql, bindings: [] };\n }\n}\nexport default new MysqlAlterColumnTypeInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { AlterTableNode } from \"../../../ast/query/node/alter_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlAlterTableInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const atNode = node as AlterTableNode;\n const utils = new InterpreterUtils(this.model);\n const tableName = utils.formatStringTable(\"mysql\", atNode.table);\n\n if (!atNode.children || !atNode.children.length) {\n return { sql: \"\", bindings: [] };\n }\n\n const astParser = new AstParser(this.model, \"mysql\" as SqlDataSourceType);\n const parts: string[] = [];\n const bindings: any[] = [];\n\n for (const child of atNode.children) {\n const { sql, bindings: childBindings } = astParser.parse([child]);\n\n if (child.file === \"add_column\") {\n parts.push(sql);\n } else if (\n child.file === \"add_constraint\" ||\n child.folder === \"constraint\"\n ) {\n const last = parts[parts.length - 1] ?? \"\";\n const isExtendingAddColumn = /^\\s*add\\s+column\\b/i.test(last);\n const isNamedTableConstraint = /^\\s*add\\s+constraint\\b/i.test(sql);\n if (isExtendingAddColumn && !isNamedTableConstraint) {\n const cleaned = sql.replace(/^\\s*add\\s+/i, \"\").trimStart();\n parts[parts.length - 1] = `${last} ${cleaned}`;\n } else {\n const ensured = /^\\s*add\\b/i.test(sql) ? sql : `add ${sql}`;\n parts.push(ensured);\n }\n } else if (\n child.file === \"set_default\" ||\n child.file === \"drop_default\" ||\n child.file === \"set_not_null\" ||\n child.file === \"drop_not_null\"\n ) {\n parts.push(sql);\n } else {\n parts.push(sql);\n }\n\n bindings.push(...childBindings);\n }\n\n const stmt = parts.join(\", \");\n const ifExists = atNode.ifExists ? \"if exists \" : \"\";\n const dropIndexPattern = /^\\s*drop\\s+index\\b/i;\n const finalSql = dropIndexPattern.test(stmt)\n ? stmt\n : `${ifExists}${tableName} ${stmt}`;\n return { sql: finalSql, bindings };\n }\n}\n\nexport default new MysqlAlterTableInterpreter();\n","import { DropColumnNode } from \"../../../ast/query/node/alter_table/drop_column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlDropColumnInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const d = node as DropColumnNode;\n return { sql: `drop column \\`${d.column}\\``, bindings: [] };\n }\n}\nexport default new MysqlDropColumnInterpreter();\n","import { DropConstraintNode } from \"../../../ast/query/node/alter_table/drop_constraint\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlDropConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const dNode = node as DropConstraintNode;\n return { sql: `drop constraint \\`${dNode.constraintName}\\``, bindings: [] };\n }\n}\nexport default new MysqlDropConstraintInterpreter();\n","import { DropDefaultNode } from \"../../../ast/query/node/alter_table/drop_default\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlDropDefaultInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as DropDefaultNode;\n return { sql: `alter column \\`${n.column}\\` drop default`, bindings: [] };\n }\n}\nexport default new MysqlDropDefaultInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlDropNotNullInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(_node: QueryNode) {\n // MySQL doesn't support standalone drop not null operations\n return { sql: \"\", bindings: [] };\n }\n}\nexport default new MysqlDropNotNullInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlDropPrimaryKeyInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(_node: QueryNode) {\n return { sql: `drop primary key`, bindings: [] };\n }\n}\nexport default new MysqlDropPrimaryKeyInterpreter();\n","import { RenameColumnNode } from \"../../../ast/query/node/alter_table/rename_column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlRenameColumnInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const r = node as RenameColumnNode;\n return {\n sql: `rename column \\`${r.oldName}\\` to \\`${r.newName}\\``,\n bindings: [],\n };\n }\n}\nexport default new MysqlRenameColumnInterpreter();\n","import { RenameTableNode } from \"../../../ast/query/node/alter_table/rename_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlRenameTableInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const rt = node as RenameTableNode;\n return { sql: `\\`${rt.newName}\\``, bindings: [] };\n }\n}\nexport default new MysqlRenameTableInterpreter();\n","import { SetDefaultNode } from \"../../../ast/query/node/alter_table/set_default\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlSetDefaultInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as SetDefaultNode;\n let val: string;\n\n if (n.defaultValue instanceof RawNode) {\n val = n.defaultValue.rawValue;\n } else if (n.defaultValue === \"NULL\") {\n val = \"null\";\n } else if (n.defaultValue === \"TRUE\" || n.defaultValue === \"FALSE\") {\n val = n.defaultValue.toLowerCase();\n } else if (\n typeof n.defaultValue === \"string\" &&\n n.defaultValue !== \"null\" &&\n n.defaultValue !== \"true\" &&\n n.defaultValue !== \"false\"\n ) {\n val = `'${n.defaultValue}'`;\n } else {\n val = String(n.defaultValue);\n }\n\n return {\n sql: `alter column \\`${n.column}\\` set default ${val}`,\n bindings: [],\n };\n }\n}\nexport default new MysqlSetDefaultInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlSetNotNullInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(_node: QueryNode) {\n // MySQL doesn't support standalone set not null operations\n return { sql: \"\", bindings: [] };\n }\n}\nexport default new MysqlSetNotNullInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { ColumnTypeNode } from \"../../../ast/query/node/column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { getColumnValue } from \"../../../resources/utils\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlColumnTypeInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const colNode = node as ColumnTypeNode;\n if (colNode.isRawValue) {\n return { sql: colNode.column as string, bindings: [] };\n }\n\n const utils = new InterpreterUtils(this.model);\n const columnName = utils.formatStringColumn(\n \"mysql\",\n getColumnValue(colNode.column),\n );\n const dt = colNode.dataType.toLowerCase();\n\n if (dt === \"char\") {\n const len = colNode.length ?? 1;\n return { sql: `${columnName} char(${len})`, bindings: [] };\n } else if (dt === \"varchar\") {\n const len = colNode.length ?? 255;\n return { sql: `${columnName} varchar(${len})`, bindings: [] };\n } else if (dt === \"uuid\") {\n return { sql: `${columnName} varchar(36)`, bindings: [] };\n } else if (dt === \"ulid\") {\n return { sql: `${columnName} varchar(26)`, bindings: [] };\n } else if (\n dt === \"longtext\" ||\n dt === \"mediumtext\" ||\n dt === \"tinytext\" ||\n dt === \"text\"\n ) {\n return { sql: `${columnName} ${dt}`, bindings: [] };\n } else if (dt === \"integer\" || dt === \"int\") {\n let sqlType = `int`;\n if (colNode.autoIncrement) {\n sqlType += \" auto_increment\";\n }\n return { sql: `${columnName} ${sqlType}`, bindings: [] };\n } else if (dt === \"tinyint\") {\n return { sql: `${columnName} tinyint`, bindings: [] };\n } else if (dt === \"smallint\") {\n return { sql: `${columnName} smallint`, bindings: [] };\n } else if (dt === \"mediumint\") {\n return { sql: `${columnName} mediumint`, bindings: [] };\n } else if (dt === \"bigint\") {\n let sqlType = `bigint`;\n if (colNode.autoIncrement) {\n sqlType += \" auto_increment\";\n }\n return { sql: `${columnName} ${sqlType}`, bindings: [] };\n } else if (dt === \"float\") {\n return { sql: `${columnName} float`, bindings: [] };\n } else if (dt === \"double\") {\n return { sql: `${columnName} double`, bindings: [] };\n } else if (dt === \"real\") {\n return { sql: `${columnName} double`, bindings: [] };\n } else if (dt === \"decimal\") {\n const precision = colNode.precision ?? 10;\n const scale = colNode.scale ?? 0;\n return {\n sql: `${columnName} decimal(${precision}, ${scale})`,\n bindings: [],\n };\n } else if (dt === \"numeric\") {\n const precision = colNode.precision ?? 10;\n const scale = colNode.scale ?? 0;\n return {\n sql: `${columnName} numeric(${precision}, ${scale})`,\n bindings: [],\n };\n } else if (dt === \"date\") {\n return { sql: `${columnName} date`, bindings: [] };\n } else if (dt === \"time\") {\n const p =\n typeof colNode.precision === \"number\" ? `(${colNode.precision})` : \"\";\n return { sql: `${columnName} time${p}`.trimEnd(), bindings: [] };\n } else if (dt === \"datetime\") {\n const p =\n typeof colNode.precision === \"number\" ? `(${colNode.precision})` : \"\";\n return { sql: `${columnName} datetime${p}`.trimEnd(), bindings: [] };\n } else if (dt === \"timestamp\") {\n const p =\n typeof colNode.precision === \"number\" ? `(${colNode.precision})` : \"\";\n return { sql: `${columnName} timestamp${p}`.trimEnd(), bindings: [] };\n } else if (dt === \"year\") {\n return { sql: `${columnName} year`, bindings: [] };\n } else if (dt === \"boolean\") {\n return { sql: `${columnName} boolean`, bindings: [] };\n } else if (dt === \"varbinary\") {\n const len = colNode.length ?? 255;\n return { sql: `${columnName} varbinary(${len})`, bindings: [] };\n } else if (dt === \"binary\") {\n const len = colNode.length ?? 255;\n return { sql: `${columnName} binary(${len})`, bindings: [] };\n } else if (dt === \"bytea\" || dt === \"blob\") {\n return { sql: `${columnName} blob`, bindings: [] };\n } else if (dt === \"json\" || dt === \"jsonb\") {\n return { sql: `${columnName} json`, bindings: [] };\n } else if (dt === \"enum\") {\n if (colNode.enumValues && colNode.enumValues.length > 0) {\n const values = colNode.enumValues.map((v) => `'${v}'`).join(\", \");\n return { sql: `${columnName} enum(${values})`, bindings: [] };\n }\n return { sql: `${columnName} text`, bindings: [] };\n } else if (dt === \"geometry\") {\n return { sql: `${columnName} geometry`, bindings: [] };\n } else if (dt === \"point\") {\n return { sql: `${columnName} point`, bindings: [] };\n } else if (dt === \"linestring\") {\n return { sql: `${columnName} linestring`, bindings: [] };\n } else if (dt === \"polygon\") {\n return { sql: `${columnName} polygon`, bindings: [] };\n } else if (dt === \"multipoint\") {\n return { sql: `${columnName} multipoint`, bindings: [] };\n }\n\n return {\n sql: `${columnName} ${dt} ${colNode.length ? `(${colNode.length})` : \"\"}`,\n bindings: [],\n };\n }\n}\n\nexport default new MysqlColumnTypeInterpreter();\n","import { AfterConstraintNode } from \"../../../ast/query/node/constraint/after\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlAfterConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const a = node as AfterConstraintNode;\n return { sql: `after \\`${a.column}\\``, bindings: [] };\n }\n}\nexport default new MysqlAfterConstraintInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { ConstraintNode } from \"../../../ast/query/node/constraint\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { getColumnValue } from \"../../../resources/utils\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const cNode = node as ConstraintNode;\n const utils = new InterpreterUtils(this.model);\n\n if (cNode.constraintType === \"primary_key\") {\n const cols = (cNode.columns ?? [])\n .map((c) => utils.formatStringColumn(\"mysql\", getColumnValue(c)))\n .join(\", \");\n const prefix = cNode.constraintName\n ? `constraint \\`${cNode.constraintName}\\` `\n : \"\";\n return { sql: `${prefix}primary key (${cols})`, bindings: [] };\n }\n\n if (cNode.constraintType === \"unique\") {\n if (cNode.columns && cNode.columns.length > 0) {\n const cols = cNode.columns\n .map((c) => utils.formatStringColumn(\"mysql\", getColumnValue(c)))\n .join(\", \");\n const prefix = cNode.constraintName\n ? `constraint \\`${cNode.constraintName}\\` `\n : \"\";\n // For inline constraints in CREATE TABLE, don't include column names\n if (!cNode.constraintName) {\n return { sql: `unique`, bindings: [] };\n }\n return { sql: `${prefix}unique (${cols})`, bindings: [] };\n }\n return { sql: `unique`, bindings: [] };\n }\n\n if (cNode.constraintType === \"not_null\") {\n return { sql: `not null`, bindings: [] };\n }\n\n if (cNode.constraintType === \"null\") {\n return { sql: `null`, bindings: [] };\n }\n\n if (cNode.constraintType === \"default\") {\n const val = cNode.defaultValue;\n if (val instanceof RawNode) {\n return { sql: `default ${val.rawValue}`, bindings: [] };\n }\n if (val === \"NULL\" || val === null) {\n return { sql: `default null`, bindings: [] };\n }\n if (val === \"TRUE\" || val === \"FALSE\") {\n return { sql: `default ${val.toLowerCase()}`, bindings: [] };\n }\n if (typeof val === \"string\") {\n return { sql: `default '${val}'`, bindings: [] };\n }\n return { sql: `default ${val}`, bindings: [] };\n }\n\n if (cNode.constraintType === \"foreign_key\") {\n if (!cNode.references) {\n return { sql: \"\", bindings: [] };\n }\n const cols = (cNode.columns ?? [])\n .map((c) => utils.formatStringColumn(\"mysql\", getColumnValue(c)))\n .join(\", \");\n const refTable = utils.formatStringTable(\"mysql\", cNode.references.table);\n const refCols = cNode.references.columns\n .map((c) => utils.formatStringColumn(\"mysql\", getColumnValue(c)))\n .join(\", \");\n const prefix = cNode.constraintName\n ? `constraint \\`${cNode.constraintName}\\` `\n : \"\";\n let sql = `${prefix}foreign key (${cols}) references ${refTable}(${refCols})`;\n if (cNode.onDelete) {\n sql += ` on delete ${cNode.onDelete}`;\n }\n if (cNode.onUpdate) {\n sql += ` on update ${cNode.onUpdate}`;\n }\n return { sql, bindings: [] };\n }\n\n return { sql: \"\", bindings: [] };\n }\n}\n\nexport default new MysqlConstraintInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { CreateTableNode } from \"../../../ast/query/node/create_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlCreateTableInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const ctNode = node as CreateTableNode;\n const utils = new InterpreterUtils(this.model);\n const tableName = utils.formatStringTable(\"mysql\", ctNode.table);\n\n if (!ctNode.children || !ctNode.children.length) {\n return { sql: `${tableName} ()`, bindings: [] };\n }\n\n const astParser = new AstParser(this.model, \"mysql\" as SqlDataSourceType);\n const parts: string[] = [];\n const bindings: any[] = [];\n\n for (const child of ctNode.children) {\n const { sql, bindings: childBindings } = astParser.parse([child]);\n\n if (child.folder === \"constraint\") {\n const last = parts.pop() ?? \"\";\n const inlineConstraintSql = sql;\n\n // Handle inline constraints: not null, null, and default\n if (\n /not null/i.test(inlineConstraintSql) ||\n /null/i.test(inlineConstraintSql) ||\n /default/i.test(inlineConstraintSql)\n ) {\n let combined = `${last} ${inlineConstraintSql}`.trim();\n combined = combined.replace(\n /(references\\s+`[^`]+`\\s*\\([^)]*\\))\\s+not null/i,\n \"not null $1\",\n );\n parts.push(combined);\n bindings.push(...childBindings);\n continue;\n }\n\n parts.push(last);\n parts.push(inlineConstraintSql);\n bindings.push(...childBindings);\n continue;\n }\n\n parts.push(sql);\n bindings.push(...childBindings);\n }\n\n for (const constraint of ctNode.namedConstraints) {\n const { sql, bindings: constraintBindings } = astParser.parse([\n constraint,\n ]);\n\n parts.push(sql);\n bindings.push(...constraintBindings);\n }\n\n const columnsSql = parts.join(\", \");\n const ifNotExists = ctNode.ifNotExists ? \"if not exists \" : \"\";\n const finalSql = `${ifNotExists}${tableName} (${columnsSql})`;\n return { sql: finalSql, bindings };\n }\n}\n\nexport default new MysqlCreateTableInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { DeleteNode } from \"../../../ast/query/node/delete\";\nimport { FromNode } from \"../../../ast/query/node/from\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlDeleteInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const deleteNode = node as DeleteNode;\n\n if (\n deleteNode.isRawValue &&\n typeof deleteNode.fromNode.table === \"string\"\n ) {\n return {\n sql: deleteNode.fromNode.table,\n bindings: [],\n };\n }\n\n const formattedTable = new InterpreterUtils(\n this.model,\n ).getFromForWriteOperations(\"mysql\", deleteNode.fromNode as FromNode);\n\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n}\n\nexport default new MysqlDeleteInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { AstParser } from \"../../../ast/parser\";\nimport { Model } from \"../../../models/model\";\n\nclass MySqlDistinctInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n return {\n sql: \"distinct\",\n bindings: [],\n };\n }\n}\n\nexport default new MySqlDistinctInterpreter();\n","import logger from \"../../../../utils/logger\";\nimport { AstParser } from \"../../../ast/parser\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MySqlDistinctInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n logger.warn(\"MySQL does not support DISTINCT ON\");\n return {\n sql: \"\",\n bindings: [],\n };\n }\n}\n\nexport default new MySqlDistinctInterpreter();\n","import { DropTableNode } from \"../../../ast/query/node/drop_table/drop_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlDropTableInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const dt = node as DropTableNode;\n const utils = new InterpreterUtils(this.model);\n const tableSql = utils.formatStringTable(\"mysql\", dt.table);\n const exists = dt.ifExists ? \"if exists \" : \"\";\n return { sql: `${exists}${tableSql}`, bindings: [] };\n }\n}\nexport default new MysqlDropTableInterpreter();\n","import { CreateExtensionNode } from \"../../../ast/query/node/extension/create_extension\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlCreateExtensionInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const ext = node as CreateExtensionNode;\n return {\n sql: `-- MySQL does not support extensions (extension: ${ext.extensionName})`,\n bindings: [],\n };\n }\n}\nexport default new MysqlCreateExtensionInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { FromNode } from \"../../../ast/query/node/from\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MySqlFromInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const fromNode = node as FromNode;\n\n if (typeof fromNode.table === \"string\") {\n const interpreterUtils = new InterpreterUtils(this.model);\n\n if (fromNode.alias && fromNode.alias.length > 0) {\n const tableSql = interpreterUtils.formatStringTable(\n \"mysql\",\n fromNode.table,\n );\n\n return {\n sql: `${tableSql} as \\`${fromNode.alias}\\``,\n bindings: [],\n };\n }\n\n const tableSql = interpreterUtils.formatStringTable(\n \"mysql\",\n fromNode.table,\n );\n\n return { sql: tableSql, bindings: [] };\n }\n\n const subQueryNodes = Array.isArray(fromNode.table)\n ? fromNode.table\n : [fromNode.table];\n\n const astParser = new AstParser(this.model, \"mysql\" as SqlDataSourceType);\n const result = astParser.parse(subQueryNodes);\n\n const aliasSql =\n fromNode.alias && fromNode.alias.length\n ? ` as \\`${fromNode.alias}\\``\n : \"\";\n\n return {\n sql: `(${result.sql})${aliasSql}`,\n bindings: result.bindings,\n };\n }\n}\n\nexport default new MySqlFromInterpreter();\n","import type { GroupByNode } from \"../../../ast/query/node/group_by/group_by\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { AstParser } from \"../../../ast/parser\";\nimport { Model } from \"../../../models/model\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MySqlGroupByInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const groupByNode = node as GroupByNode;\n if (groupByNode.isRawValue) {\n return {\n sql: groupByNode.column,\n bindings: [],\n };\n }\n\n const columnSql = new InterpreterUtils(this.model).formatStringColumn(\n \"mysql\",\n groupByNode.column,\n );\n\n return {\n sql: columnSql,\n bindings: [],\n };\n }\n}\n\nexport default new MySqlGroupByInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { HavingNode } from \"../../../ast/query/node/having/having\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlHavingInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const havingNode = node as HavingNode;\n if (havingNode.isRawValue) {\n return {\n sql: havingNode.column,\n bindings: havingNode.value as any[],\n };\n }\n\n const idx = havingNode.currParamIndex;\n let sql = \"\";\n let bindings: any[] = [];\n\n if (\n !(havingNode.value instanceof QueryNode) &&\n !Array.isArray(havingNode.value)\n ) {\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"mysql\", havingNode.column)} ${havingNode.operator} $${idx}`;\n bindings = [havingNode.value];\n }\n\n if (Array.isArray(havingNode.value)) {\n const placeholders = havingNode.value\n .map((_, i) => `$${idx + i}`)\n .join(\", \");\n\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"mysql\", havingNode.column)} ${havingNode.operator} (${placeholders})`;\n bindings = havingNode.value;\n }\n\n if (havingNode.isNegated) {\n sql = `not (${sql})`;\n }\n\n return { sql: sql.trim(), bindings };\n }\n}\n\nexport default new MysqlHavingInterpreter();\n","import { CreateIndexNode } from \"../../../ast/query/node/index_op/create_index\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlCreateIndexInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const ci = node as CreateIndexNode;\n const utils = new InterpreterUtils(this.model);\n const tableSql = utils.formatStringTable(\"mysql\", ci.table);\n const cols = ci.columns.map((c) => `\\`${c}\\``).join(\", \");\n const unique = ci.unique ? \"unique \" : \"\";\n return {\n sql: `${unique}\\`${ci.indexName}\\` on ${tableSql} (${cols})`,\n bindings: [],\n };\n }\n}\nexport default new MysqlCreateIndexInterpreter();\n","import { DropIndexNode } from \"../../../ast/query/node/index_op/drop_index\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlDropIndexInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const di = node as DropIndexNode;\n if (!di.table) {\n throw new Error(\"MySQL DROP INDEX requires table name\");\n }\n return {\n sql: `\\`${di.indexName}\\` on \\`${di.table}\\``,\n bindings: [],\n };\n }\n}\nexport default new MysqlDropIndexInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { InsertNode } from \"../../../ast/query/node/insert\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlInsertInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const insertNode = node as InsertNode;\n\n if (insertNode.isRawValue) {\n return {\n sql: insertNode.fromNode.table as string,\n bindings: [],\n };\n }\n\n const interpreterUtils = new InterpreterUtils(this.model);\n const formattedTable = interpreterUtils.getFromForWriteOperations(\n \"mysql\",\n insertNode.fromNode,\n );\n\n if (!insertNode.records.length) {\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n\n const firstRecord = insertNode.records[0];\n const columns = Object.keys(firstRecord);\n if (!columns.length) {\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n\n const formattedColumns = columns\n .map((column) => interpreterUtils.formatStringColumn(\"mysql\", column))\n .join(\", \");\n\n const allValues: any[] = [];\n const valuesClauses: string[] = [];\n\n for (const record of insertNode.records) {\n const recordValues = columns.map((column) => record[column]);\n\n const placeholders: string[] = [];\n for (const value of recordValues) {\n if (value instanceof RawNode) {\n placeholders.push(value.rawValue);\n } else {\n allValues.push(value);\n placeholders.push(\"?\");\n }\n }\n\n valuesClauses.push(`(${placeholders.join(\", \")})`);\n }\n\n const sql = `${formattedTable} (${formattedColumns}) VALUES ${valuesClauses.join(\", \")}`;\n return {\n sql,\n bindings: allValues,\n };\n }\n}\n\nexport default new MysqlInsertInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { JoinNode } from \"../../../ast/query/node/join/join\";\nimport type { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlJoinInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const joinNode = node as JoinNode;\n if (joinNode.isRawValue) {\n return {\n sql: joinNode.table,\n bindings: [],\n };\n }\n\n const utils = new InterpreterUtils(this.model);\n\n let leftColumnStr = joinNode.left;\n if (!leftColumnStr.includes(\".\")) {\n leftColumnStr = `${joinNode.table}.${leftColumnStr}`;\n }\n\n let rightColumnStr = joinNode.right;\n if (!rightColumnStr.includes(\".\")) {\n rightColumnStr = `${this.model.table}.${rightColumnStr}`;\n }\n\n const leftSql = utils.formatStringColumn(\"mysql\", leftColumnStr);\n const rightSql = utils.formatStringColumn(\"mysql\", rightColumnStr);\n const tableSql = utils.formatStringTable(\"mysql\", joinNode.table);\n\n const sql = `${tableSql} on ${leftSql} ${joinNode.on?.operator} ${rightSql}`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new MysqlJoinInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { LimitNode } from \"../../../ast/query/node/limit/limit\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MySqlLimitInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const limitNode = node as LimitNode;\n\n return {\n sql: `?`,\n bindings: [limitNode.limit],\n };\n }\n}\n\nexport default new MySqlLimitInterpreter();\n","import { LockNode } from \"../../../ast/query/node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\n\nconst lockTypeToSql: Record<string, string> = {\n for_update: \"for update\",\n for_share: \"lock in share mode\",\n};\n\nexport class MysqlLockInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): { sql: string; bindings: any[] } {\n const lockNode = node as LockNode;\n let sql = lockTypeToSql[lockNode.lockType] || \"for update\";\n if (lockNode.skipLocked) {\n sql += \" skip locked\";\n }\n\n return {\n sql,\n bindings: [],\n };\n }\n}\n\nexport default new MysqlLockInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { OffsetNode } from \"../../../ast/query/node/offset/offset\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MySqlOffsetInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const offsetNode = node as OffsetNode;\n\n return {\n sql: `?`,\n bindings: [offsetNode.offset],\n };\n }\n}\n\nexport default new MySqlOffsetInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { OnDuplicateNode } from \"../../../ast/query/node/on_duplicate\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlOnDuplicateInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const onDuplicateNode = node as OnDuplicateNode;\n\n if (onDuplicateNode.isRawValue) {\n return {\n sql: onDuplicateNode.table,\n bindings: [],\n };\n }\n\n const interpreterUtils = new InterpreterUtils(this.model);\n\n if (onDuplicateNode.mode === \"ignore\") {\n const noOpColumn = (onDuplicateNode.conflictColumns?.[0] ||\n \"id\") as string;\n const formattedNoOpColumn = interpreterUtils.formatStringColumn(\n \"mysql\",\n `${onDuplicateNode.table}.${noOpColumn}`,\n );\n return {\n sql: `AS new ON DUPLICATE KEY UPDATE ${formattedNoOpColumn} = ${formattedNoOpColumn}`,\n bindings: [],\n };\n }\n\n const formattedColumns = onDuplicateNode.columnsToUpdate\n .map(\n (column) =>\n `${interpreterUtils.formatStringColumn(\"mysql\", column)} = new.${interpreterUtils.formatStringColumn(\"mysql\", column)}`,\n )\n .join(\", \");\n\n return {\n sql: `AS new ON DUPLICATE KEY UPDATE ${formattedColumns}`,\n bindings: [],\n };\n }\n}\n\nexport default new MysqlOnDuplicateInterpreter();\n","import type { OrderByNode } from \"../../../ast/query/node/order_by/order_by\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { AstParser } from \"../../../ast/parser\";\nimport { Model } from \"../../../models/model\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MySqlOrderByInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const orderByNode = node as OrderByNode;\n if (orderByNode.isRawValue) {\n return {\n sql: orderByNode.column,\n bindings: [],\n };\n }\n const columnSql = new InterpreterUtils(this.model).formatStringColumn(\n \"mysql\",\n orderByNode.column,\n );\n const directionSql = orderByNode.direction.toLowerCase();\n\n return {\n sql: `${columnSql} ${directionSql}`,\n bindings: [],\n };\n }\n}\n\nexport default new MySqlOrderByInterpreter();\n","import { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlRawInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): { sql: string; bindings: any[] } {\n const rawNode = node as RawNode;\n return {\n sql: rawNode.rawValue,\n bindings: [],\n };\n }\n}\n\nexport default new MysqlRawInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { ForeignKeyInfoNode } from \"../../../ast/query/node/schema/foreign_key_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlForeignKeyInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as ForeignKeyInfoNode;\n const table = node.table;\n const sql = `SELECT\n k.CONSTRAINT_NAME AS name,\n k.COLUMN_NAME AS column_name,\n k.REFERENCED_TABLE_NAME AS referenced_table,\n k.REFERENCED_COLUMN_NAME AS referenced_column,\n r.UPDATE_RULE AS on_update,\n r.DELETE_RULE AS on_delete\n FROM information_schema.KEY_COLUMN_USAGE k\n JOIN information_schema.REFERENTIAL_CONSTRAINTS r\n ON k.CONSTRAINT_NAME = r.CONSTRAINT_NAME AND k.CONSTRAINT_SCHEMA = r.CONSTRAINT_SCHEMA\n WHERE k.TABLE_SCHEMA = DATABASE() AND k.TABLE_NAME = '${table}' AND k.REFERENCED_TABLE_NAME IS NOT NULL\n ORDER BY k.POSITION_IN_UNIQUE_CONSTRAINT`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new MysqlForeignKeyInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { IndexInfoNode } from \"../../../ast/query/node/schema/index_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlIndexInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as IndexInfoNode;\n const table = node.table;\n const sql = `SHOW INDEX FROM \\`${table}\\``;\n return { sql, bindings: [] };\n }\n}\n\nexport default new MysqlIndexInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { PrimaryKeyInfoNode } from \"../../../ast/query/node/schema/primary_key_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlPrimaryKeyInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as PrimaryKeyInfoNode;\n const table = node.table;\n const sql = `SELECT\n CONSTRAINT_NAME AS name,\n COLUMN_NAME AS column_name\n FROM information_schema.KEY_COLUMN_USAGE k\n WHERE k.TABLE_SCHEMA = DATABASE() AND k.TABLE_NAME = '${table}' AND k.CONSTRAINT_NAME = 'PRIMARY'\n ORDER BY k.ORDINAL_POSITION`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new MysqlPrimaryKeyInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { TableInfoNode } from \"../../../ast/query/node/schema/table_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlTableInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as TableInfoNode;\n const table = node.table;\n const sql =\n `SELECT COLUMN_NAME AS column_name, ` +\n `DATA_TYPE AS data_type, ` +\n `IS_NULLABLE AS is_nullable, ` +\n `COLUMN_DEFAULT AS column_default, ` +\n `CHARACTER_MAXIMUM_LENGTH AS char_length, ` +\n `NUMERIC_PRECISION AS numeric_precision, ` +\n `NUMERIC_SCALE AS numeric_scale ` +\n `FROM information_schema.columns ` +\n `WHERE table_schema = DATABASE() AND table_name = '${table}' ` +\n `ORDER BY ORDINAL_POSITION`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new MysqlTableInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { SelectNode } from \"../../../ast/query/node/select/basic_select\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlSelectInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const selectNode = node as SelectNode;\n if (selectNode.isRawValue) {\n return {\n sql: selectNode.column as string,\n bindings: [],\n };\n }\n\n const columnResult = this.formatColumn(\n selectNode.column,\n selectNode.sqlFunction,\n );\n const aliasSql = this.formatAlias(selectNode.alias);\n return {\n sql: `${columnResult.sql}${aliasSql}`,\n bindings: columnResult.bindings,\n };\n }\n\n private formatColumn(\n column: string | QueryNode | QueryNode[],\n sqlFunction?: string,\n ): ReturnType<typeof AstParser.prototype.parse> {\n if (typeof column === \"string\") {\n const col = new InterpreterUtils(this.model).formatStringColumn(\n \"mysql\",\n column,\n );\n let sql = col;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}(${col})`;\n }\n return {\n sql,\n bindings: [],\n };\n }\n\n if (Array.isArray(column) && column.length > 0) {\n const astParser = new AstParser(this.model, \"mysql\" as SqlDataSourceType);\n const result = astParser.parse(column);\n let sql = `(${result.sql})`;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}${sql}`;\n }\n return {\n sql,\n bindings: result.bindings,\n };\n }\n\n if (!Array.isArray(column)) {\n const astParser = new AstParser(this.model, \"mysql\" as SqlDataSourceType);\n const result = astParser.parse([column]);\n let sql = `(${result.sql})`;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}${sql}`;\n }\n return {\n sql,\n bindings: result.bindings,\n };\n }\n\n const formattedColumns = column.map((col) => {\n if (typeof col === \"string\") {\n const formatted = new InterpreterUtils(this.model).formatStringColumn(\n \"mysql\",\n col,\n );\n if (sqlFunction) {\n return `${sqlFunction.toLowerCase()}(${formatted})`;\n }\n return formatted;\n }\n\n const astParser = new AstParser(this.model, \"mysql\" as SqlDataSourceType);\n const result = astParser.parse([col]);\n let sql = `(${result.sql})`;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}${sql}`;\n }\n return sql;\n });\n\n return {\n sql: formattedColumns.join(\", \"),\n bindings: [],\n };\n }\n\n private formatAlias(alias?: string): string {\n if (alias && alias.length) {\n return ` as \\`${alias}\\``;\n }\n return \"\";\n }\n}\n\nexport default new MysqlSelectInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { FromNode } from \"../../../ast/query/node/from\";\nimport { TruncateNode } from \"../../../ast/query/node/truncate\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlTruncateInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const truncateNode = node as TruncateNode;\n\n if (truncateNode.isRawValue && typeof truncateNode.fromNode === \"string\") {\n return {\n sql: truncateNode.fromNode,\n bindings: [],\n };\n }\n\n const formattedTable = new InterpreterUtils(\n this.model,\n ).getFromForWriteOperations(\"mysql\", truncateNode.fromNode as FromNode);\n\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n}\n\nexport default new MysqlTruncateInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { UnionNode } from \"../../../ast/query/node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { Model } from \"../../../models/model\";\n\nclass MysqlUnionInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const unionNode = node as UnionNode;\n const parser = new AstParser(this.model, \"mysql\");\n const nodes = Array.isArray(unionNode.query)\n ? unionNode.query\n : [unionNode.query];\n\n const ast =\n typeof unionNode.query === \"string\"\n ? { sql: unionNode.query, bindings: [] }\n : parser.parse(\n nodes.filter(Boolean) as QueryNode[],\n unionNode.currParamIndex,\n );\n\n return {\n sql: ast.sql,\n bindings: ast.bindings,\n };\n }\n}\n\nexport default new MysqlUnionInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { FromNode } from \"../../../ast/query/node/from\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { UpdateNode } from \"../../../ast/query/node/update\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlUpdateInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const updateNode = node as UpdateNode;\n if (updateNode.isRawValue && typeof updateNode.fromNode === \"string\") {\n return {\n sql: updateNode.fromNode as string,\n bindings: updateNode.values,\n };\n }\n\n const interpreterUtils = new InterpreterUtils(this.model);\n const formattedTable = interpreterUtils.getFromForWriteOperations(\n \"mysql\",\n updateNode.fromNode as FromNode,\n );\n\n if (!updateNode.columns.length || !updateNode.values.length) {\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n\n const finalBindings: any[] = [];\n const setClause = updateNode.columns\n .map((column, index) => {\n const value = updateNode.values[index];\n if (value instanceof RawNode) {\n return `${interpreterUtils.formatStringColumn(\"mysql\", column)} = ${value.rawValue}`;\n }\n\n finalBindings.push(value);\n return `${interpreterUtils.formatStringColumn(\"mysql\", column)} = ?`;\n })\n .join(\", \");\n\n return {\n sql: `${formattedTable} set ${setClause}`,\n bindings: finalBindings,\n };\n }\n}\n\nexport default new MysqlUpdateInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport type { WhereNode } from \"../../../ast/query/node/where/where\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlWhereInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const whereNode = node as WhereNode;\n if (whereNode.isRawValue) {\n return {\n sql: whereNode.column,\n bindings: (whereNode.value as any[]) ?? [],\n };\n }\n\n let sql = \"\";\n let bindings: any[] = [];\n\n if (this.isRawNode(whereNode.value)) {\n const formattedRight = this.formatRawIdentifierIfPossible(\n whereNode.value.rawValue,\n );\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"mysql\", whereNode.column)} ${whereNode.operator} ${formattedRight}`;\n bindings = [];\n } else if (Array.isArray(whereNode.value)) {\n if (whereNode.operator.toLowerCase() === \"between\") {\n const placeholders = `? AND ?`;\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"mysql\", whereNode.column)} between ${placeholders}`;\n bindings = whereNode.value;\n } else {\n const placeholders = whereNode.value.map((_) => `?`).join(\", \");\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"mysql\", whereNode.column)} ${whereNode.operator} (${placeholders})`;\n bindings = whereNode.value;\n }\n } else {\n if (whereNode.operator.includes(\"null\")) {\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"mysql\", whereNode.column)} ${whereNode.operator}`;\n bindings = [];\n } else if (whereNode.value === undefined) {\n return { sql: \"\", bindings: [] };\n } else {\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"mysql\", whereNode.column)} ${whereNode.operator} ?`;\n bindings = [whereNode.value];\n }\n }\n\n if (whereNode.isNegated) {\n sql = `not (${sql})`;\n }\n\n return { sql: sql.trim(), bindings };\n }\n\n private isRawNode(value: any): value is RawNode {\n return (\n value &&\n typeof value === \"object\" &&\n \"rawValue\" in value &&\n value.isRawValue === true\n );\n }\n\n private formatRawIdentifierIfPossible(raw: string): string {\n const isIdentifier =\n /^[A-Za-z_][A-Za-z0-9_]*(\\.(\\*|[A-Za-z_][A-Za-z0-9_]*))?$/.test(raw);\n if (!isIdentifier) {\n return raw;\n }\n return new InterpreterUtils(this.model).formatStringColumn(\"mysql\", raw);\n }\n}\n\nexport default new MysqlWhereInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { WhereGroupNode } from \"../../../ast/query/node/where/where_group\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlWhereGroupInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const groupNode = node as WhereGroupNode;\n if (!groupNode.nodes || groupNode.nodes.length === 0) {\n return { sql: \"\", bindings: [] };\n }\n\n const astParser = new AstParser(this.model, \"mysql\" as SqlDataSourceType);\n const { sql, bindings } = astParser.parse(\n groupNode.nodes,\n groupNode.currParamIndex,\n true,\n );\n\n return {\n sql: `(${sql})`,\n bindings,\n };\n }\n}\n\nexport default new MysqlWhereGroupInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { WhereJsonNode } from \"../../../ast/query/node/where/where_json\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlWhereJsonInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const whereJsonNode = node as WhereJsonNode;\n if (whereJsonNode.isRawValue) {\n return {\n sql: whereJsonNode.column,\n bindings: [],\n };\n }\n\n let sql = \"\";\n let bindings: any[] = [];\n\n const columnSql = new InterpreterUtils(this.model).formatStringColumn(\n \"mysql\",\n whereJsonNode.column,\n );\n\n switch (whereJsonNode.jsonOperator) {\n case \"=\":\n sql = `${columnSql} = CAST(? AS JSON)`;\n bindings = [JSON.stringify(whereJsonNode.value)];\n break;\n case \"contains\":\n sql = `JSON_CONTAINS(${columnSql}, ?)`;\n bindings = [JSON.stringify(whereJsonNode.value)];\n break;\n case \"not contains\":\n sql = `JSON_CONTAINS(${columnSql}, ?)`;\n bindings = [JSON.stringify(whereJsonNode.value)];\n break;\n case \"raw\":\n sql = whereJsonNode.column;\n bindings = Array.isArray(whereJsonNode.value)\n ? whereJsonNode.value\n : [];\n break;\n }\n\n if (whereJsonNode.isNegated) {\n sql = `NOT (${sql})`;\n }\n\n return { sql: sql.trim(), bindings };\n }\n}\n\nexport default new MysqlWhereJsonInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { WhereSubqueryNode } from \"../../../ast/query/node/where/where_subquery\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlWhereSubqueryInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const subqueryNode = node as WhereSubqueryNode;\n\n if (this.isStringSubquery(subqueryNode.subquery)) {\n return this.handleStringSubquery(subqueryNode);\n }\n\n if (this.isArraySubquery(subqueryNode.subquery)) {\n return this.handleArraySubquery(subqueryNode);\n }\n\n return this.handleObjectSubquery(subqueryNode);\n }\n\n private isStringSubquery(\n subquery: string | QueryNode | QueryNode[],\n ): subquery is string {\n return typeof subquery === \"string\";\n }\n\n private isArraySubquery(\n subquery: string | QueryNode | QueryNode[],\n ): subquery is QueryNode[] {\n return Array.isArray(subquery);\n }\n\n private handleStringSubquery(\n subqueryNode: WhereSubqueryNode,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const sql = `${subqueryNode.column} ${subqueryNode.operator} (${subqueryNode.subquery})`;\n return { sql: sql.trim(), bindings: [] };\n }\n\n private handleArraySubquery(\n subqueryNode: WhereSubqueryNode,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const astParser = new AstParser(this.model, \"mysql\" as SqlDataSourceType);\n const { sql: subquerySql, bindings: subqueryBindings } = astParser.parse(\n subqueryNode.subquery as QueryNode[],\n subqueryNode.currParamIndex,\n );\n\n const sql = `${subqueryNode.column} ${subqueryNode.operator} (${subquerySql})`;\n return { sql: sql.trim(), bindings: subqueryBindings };\n }\n\n private handleObjectSubquery(\n subqueryNode: WhereSubqueryNode,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const astParser = new AstParser(this.model, \"mysql\" as SqlDataSourceType);\n const { sql: subquerySql, bindings: subqueryBindings } = astParser.parse(\n [subqueryNode.subquery as QueryNode],\n subqueryNode.currParamIndex,\n );\n\n const sql = `${subqueryNode.column} ${subqueryNode.operator} (${subquerySql})`;\n return { sql: sql.trim(), bindings: subqueryBindings };\n }\n}\n\nexport default new MysqlWhereSubqueryInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { WithNode } from \"../../../ast/query/node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlWithInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(\n node: QueryNode | string,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const withNode = node as WithNode;\n const parser = new AstParser(this.model, \"mysql\");\n const nodes = Array.isArray(withNode.body)\n ? withNode.body\n : [withNode.body];\n\n const ast = parser.parse(\n nodes.filter(Boolean) as QueryNode[],\n withNode.currParamIndex,\n );\n\n return {\n sql: `${withNode.alias} as (${ast.sql})`,\n bindings: ast.bindings,\n };\n }\n}\n\nexport default new MysqlWithInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { AddColumnNode } from \"../../../ast/query/node/alter_table/add_column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass OracleAddColumnInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const acNode = node as AddColumnNode;\n const ast = new AstParser(this.model, \"oracledb\" as SqlDataSourceType);\n let { sql } = ast.parse([acNode.column]);\n\n const inlineConstraints = (acNode as any).inlineConstraints;\n if (inlineConstraints && inlineConstraints.length) {\n const constraintParts: string[] = [];\n\n for (const constraint of inlineConstraints) {\n const { sql: constraintSql } = ast.parse([constraint]);\n constraintParts.push(constraintSql);\n }\n\n if (constraintParts.length) {\n sql += ` ${constraintParts.join(\" \")}`;\n }\n }\n\n // Oracle uses ADD (column_definition) or ADD column_definition\n return { sql: `add ${sql}`, bindings: [] };\n }\n}\n\nexport default new OracleAddColumnInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { AddConstraintNode } from \"../../../ast/query/node/alter_table/add_constraint\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass OracleAddConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const acNode = node as AddConstraintNode;\n const ast = new AstParser(this.model, \"oracledb\" as SqlDataSourceType);\n const { sql } = ast.parse([acNode.constraint]);\n return { sql: `add ${sql}`, bindings: [] };\n }\n}\n\nexport default new OracleAddConstraintInterpreter();\n","import { AddPrimaryKeyNode } from \"../../../ast/query/node/alter_table/add_primary_key\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass OracleAddPrimaryKeyInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const pk = node as AddPrimaryKeyNode;\n const cols = pk.columns.map((c) => `\"${c}\"`).join(\", \");\n return { sql: `add primary key (${cols})`, bindings: [] };\n }\n}\n\nexport default new OracleAddPrimaryKeyInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { AlterColumnTypeNode } from \"../../../ast/query/node/alter_table/alter_column_type\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\n/**\n * Oracle uses MODIFY column_name new_type syntax to change column type\n */\nclass OracleAlterColumnTypeInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const a = node as AlterColumnTypeNode;\n const ast = new AstParser(this.model, \"oracledb\" as SqlDataSourceType);\n const { sql } = ast.parse([a.newType]);\n const [, ...restTokens] = sql.trim().split(/\\s+/);\n const typeSql = restTokens.join(\" \");\n\n // Oracle uses MODIFY for column type changes\n let resultSql = `modify \"${a.column}\" ${typeSql}`;\n\n // Add constraint modifications\n if (a.options.nullable !== undefined) {\n const nullableSql = a.options.nullable\n ? `modify \"${a.column}\" null`\n : `modify \"${a.column}\" not null`;\n resultSql += `, ${nullableSql}`;\n }\n\n if (a.options.dropDefault) {\n resultSql += `, modify \"${a.column}\" default null`;\n } else if (a.options.default !== undefined) {\n let defaultValue = a.options.default;\n if (defaultValue === null) {\n defaultValue = \"null\";\n } else if (typeof defaultValue === \"string\") {\n if (defaultValue === \"NULL\") {\n defaultValue = \"null\";\n } else if (defaultValue === \"TRUE\") {\n defaultValue = \"1\";\n } else if (defaultValue === \"FALSE\") {\n defaultValue = \"0\";\n } else {\n defaultValue = `'${defaultValue}'`;\n }\n }\n resultSql += `, modify \"${a.column}\" default ${defaultValue}`;\n }\n\n if (a.options.unique !== undefined) {\n if (a.options.unique) {\n resultSql += `, add constraint \"unique_${a.column}\" unique (\"${a.column}\")`;\n } else {\n resultSql += `, drop constraint \"unique_${a.column}\"`;\n }\n }\n\n return { sql: resultSql, bindings: [] };\n }\n}\n\nexport default new OracleAlterColumnTypeInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { AlterTableNode } from \"../../../ast/query/node/alter_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass OracleAlterTableInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const atNode = node as AlterTableNode;\n const utils = new InterpreterUtils(this.model);\n const tableName = utils.formatStringTable(\"oracledb\", atNode.table);\n\n if (!atNode.children || !atNode.children.length) {\n return { sql: \"\", bindings: [] };\n }\n\n const astParser = new AstParser(\n this.model,\n \"oracledb\" as SqlDataSourceType,\n );\n const parts: string[] = [];\n const bindings: any[] = [];\n\n for (const child of atNode.children) {\n const { sql, bindings: childBindings } = astParser.parse([child]);\n parts.push(sql.trim());\n bindings.push(...childBindings);\n }\n\n const stmt = parts.join(\", \");\n // Oracle doesn't support IF EXISTS in ALTER TABLE\n const finalSql = `${tableName} ${stmt}`;\n return { sql: finalSql, bindings };\n }\n}\n\nexport default new OracleAlterTableInterpreter();\n","import { DropColumnNode } from \"../../../ast/query/node/alter_table/drop_column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass OracleDropColumnInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const d = node as DropColumnNode;\n return { sql: `drop column \"${d.column}\"`, bindings: [] };\n }\n}\n\nexport default new OracleDropColumnInterpreter();\n","import { DropConstraintNode } from \"../../../ast/query/node/alter_table/drop_constraint\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass OracleDropConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const dNode = node as DropConstraintNode;\n return { sql: `drop constraint \"${dNode.constraintName}\"`, bindings: [] };\n }\n}\n\nexport default new OracleDropConstraintInterpreter();\n","import { DropDefaultNode } from \"../../../ast/query/node/alter_table/drop_default\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\n/**\n * Oracle drops default by setting it to NULL\n */\nclass OracleDropDefaultInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as DropDefaultNode;\n return { sql: `modify \"${n.column}\" default null`, bindings: [] };\n }\n}\n\nexport default new OracleDropDefaultInterpreter();\n","import { DropNotNullNode } from \"../../../ast/query/node/alter_table/drop_not_null\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\n/**\n * Oracle uses MODIFY column NULL syntax to drop NOT NULL constraint\n */\nclass OracleDropNotNullInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as DropNotNullNode;\n return { sql: `modify \"${n.column}\" null`, bindings: [] };\n }\n}\n\nexport default new OracleDropNotNullInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\n/**\n * Oracle supports DROP PRIMARY KEY\n */\nclass OracleDropPrimaryKeyInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(_node: QueryNode) {\n return { sql: `drop primary key`, bindings: [] };\n }\n}\n\nexport default new OracleDropPrimaryKeyInterpreter();\n","import { RenameColumnNode } from \"../../../ast/query/node/alter_table/rename_column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass OracleRenameColumnInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const r = node as RenameColumnNode;\n return {\n sql: `rename column \"${r.oldName}\" to \"${r.newName}\"`,\n bindings: [],\n };\n }\n}\n\nexport default new OracleRenameColumnInterpreter();\n","import { RenameTableNode } from \"../../../ast/query/node/alter_table/rename_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass OracleRenameTableInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const rt = node as RenameTableNode;\n // Oracle uses RENAME TO for table renaming\n return { sql: `rename to \"${rt.newName}\"`, bindings: [] };\n }\n}\n\nexport default new OracleRenameTableInterpreter();\n","import { SetDefaultNode } from \"../../../ast/query/node/alter_table/set_default\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\n/**\n * Oracle uses MODIFY column DEFAULT value syntax\n */\nclass OracleSetDefaultInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as SetDefaultNode;\n let val: string;\n\n if (n.defaultValue instanceof RawNode) {\n val = n.defaultValue.rawValue;\n } else if (n.defaultValue === \"NULL\") {\n val = \"null\";\n } else if (n.defaultValue === \"TRUE\") {\n val = \"1\";\n } else if (n.defaultValue === \"FALSE\") {\n val = \"0\";\n } else if (\n typeof n.defaultValue === \"string\" &&\n n.defaultValue !== \"null\"\n ) {\n val = `'${n.defaultValue}'`;\n } else {\n val = String(n.defaultValue);\n }\n\n return {\n sql: `modify \"${n.column}\" default ${val}`,\n bindings: [],\n };\n }\n}\n\nexport default new OracleSetDefaultInterpreter();\n","import { SetNotNullNode } from \"../../../ast/query/node/alter_table/set_not_null\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\n/**\n * Oracle uses MODIFY column NOT NULL syntax\n */\nclass OracleSetNotNullInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as SetNotNullNode;\n return { sql: `modify \"${n.column}\" not null`, bindings: [] };\n }\n}\n\nexport default new OracleSetNotNullInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { ColumnTypeNode } from \"../../../ast/query/node/column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { getColumnValue } from \"../../../resources/utils\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\n/**\n * Oracle data type mappings:\n * - VARCHAR -> VARCHAR2 (max 4000 bytes, or 32767 in 12c+ with extended strings)\n * - TEXT/LONGTEXT/MEDIUMTEXT/TINYTEXT -> CLOB\n * - INTEGER/INT -> NUMBER(10)\n * - BIGINT -> NUMBER(19)\n * - SMALLINT -> NUMBER(5)\n * - TINYINT -> NUMBER(3)\n * - FLOAT/REAL -> BINARY_FLOAT\n * - DOUBLE -> BINARY_DOUBLE\n * - BOOLEAN -> NUMBER(1)\n * - BYTEA/BINARY/BLOB -> BLOB\n * - JSON/JSONB -> CLOB (or JSON type in 21c+)\n * - UUID -> RAW(16) or VARCHAR2(36)\n * - AUTO_INCREMENT -> Use GENERATED AS IDENTITY (12c+) or sequence+trigger\n */\nclass OracleColumnTypeInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const colNode = node as ColumnTypeNode;\n if (colNode.isRawValue) {\n return { sql: colNode.column as string, bindings: [] };\n }\n\n const utils = new InterpreterUtils(this.model);\n const columnName = utils.formatStringColumn(\n \"oracledb\",\n getColumnValue(colNode.column),\n );\n\n const dt = colNode.dataType.toLowerCase();\n\n if (dt === \"char\") {\n const len = colNode.length ?? 1;\n return { sql: `${columnName} char(${len})`, bindings: [] };\n } else if (dt === \"varchar\") {\n const len = colNode.length ?? 255;\n return { sql: `${columnName} varchar2(${len})`, bindings: [] };\n } else if (\n dt === \"text\" ||\n dt === \"longtext\" ||\n dt === \"mediumtext\" ||\n dt === \"tinytext\"\n ) {\n return { sql: `${columnName} clob`, bindings: [] };\n } else if (dt === \"uuid\") {\n // Store UUID as VARCHAR2(36) for readability, or RAW(16) for efficiency\n return { sql: `${columnName} varchar2(36)`, bindings: [] };\n } else if (dt === \"ulid\") {\n return { sql: `${columnName} varchar2(26)`, bindings: [] };\n } else if (dt === \"bigint\") {\n if (colNode.autoIncrement) {\n // Oracle 12c+ supports GENERATED AS IDENTITY\n return {\n sql: `${columnName} number(19) generated by default as identity`,\n bindings: [],\n };\n }\n return { sql: `${columnName} number(19)`, bindings: [] };\n } else if (dt === \"tinyint\") {\n return { sql: `${columnName} number(3)`, bindings: [] };\n } else if (dt === \"smallint\") {\n return { sql: `${columnName} number(5)`, bindings: [] };\n } else if (dt === \"mediumint\") {\n return { sql: `${columnName} number(7)`, bindings: [] };\n } else if (dt === \"float\" || dt === \"real\") {\n return { sql: `${columnName} binary_float`, bindings: [] };\n } else if (dt === \"double\") {\n return { sql: `${columnName} binary_double`, bindings: [] };\n } else if (dt === \"decimal\" || dt === \"numeric\") {\n const precision = colNode.precision ?? 10;\n const scale = colNode.scale ?? 0;\n return {\n sql: `${columnName} number(${precision}, ${scale})`,\n bindings: [],\n };\n } else if (dt === \"date\") {\n // Oracle DATE includes time component\n return { sql: `${columnName} date`, bindings: [] };\n } else if (dt === \"year\") {\n return { sql: `${columnName} number(4)`, bindings: [] };\n } else if (dt === \"time\") {\n // Oracle doesn't have a TIME-only type, use INTERVAL or store in VARCHAR2\n return { sql: `${columnName} varchar2(8)`, bindings: [] };\n } else if (dt === \"datetime\" || dt === \"timestamp\") {\n const withTz = colNode.withTimezone ? \" with time zone\" : \"\";\n const p =\n typeof colNode.precision === \"number\" ? `(${colNode.precision})` : \"\";\n return {\n sql: `${columnName} timestamp${p}${withTz}`.trimEnd(),\n bindings: [],\n };\n } else if (dt === \"boolean\" || dt === \"bool\") {\n // Oracle doesn't have native BOOLEAN in SQL, use NUMBER(1)\n return { sql: `${columnName} number(1)`, bindings: [] };\n } else if (\n dt === \"bytea\" ||\n dt === \"binary\" ||\n dt === \"varbinary\" ||\n dt === \"blob\" ||\n dt === \"longblob\" ||\n dt === \"mediumblob\" ||\n dt === \"tinyblob\"\n ) {\n return { sql: `${columnName} blob`, bindings: [] };\n } else if (dt === \"json\" || dt === \"jsonb\") {\n // Oracle 21c+ has native JSON type, use CLOB for older versions\n return { sql: `${columnName} clob`, bindings: [] };\n } else if (dt === \"enum\") {\n if (colNode.enumValues && colNode.enumValues.length > 0) {\n const values = colNode.enumValues.map((v) => `'${v}'`).join(\", \");\n return {\n sql: `${columnName} varchar2(255) check (${columnName} in (${values}))`,\n bindings: [],\n };\n }\n return { sql: `${columnName} varchar2(255)`, bindings: [] };\n } else if (dt === \"integer\" || dt === \"int\") {\n if (colNode.autoIncrement) {\n // Oracle 12c+ supports GENERATED AS IDENTITY\n return {\n sql: `${columnName} number(10) generated by default as identity`,\n bindings: [],\n };\n }\n return { sql: `${columnName} number(10)`, bindings: [] };\n } else if (\n dt === \"geometry\" ||\n dt === \"point\" ||\n dt === \"linestring\" ||\n dt === \"polygon\" ||\n dt === \"multipoint\"\n ) {\n // Oracle Spatial uses SDO_GEOMETRY for all spatial types\n return { sql: `${columnName} sdo_geometry`, bindings: [] };\n }\n\n return {\n sql: `${columnName} ${dt} ${colNode.length ? `(${colNode.length})` : \"\"}`,\n bindings: [],\n };\n }\n}\n\nexport default new OracleColumnTypeInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\n/**\n * Oracle doesn't use AFTER constraint for column ordering in CREATE TABLE\n * This is a no-op interpreter\n */\nclass OracleAfterConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(_node: QueryNode) {\n return { sql: \"\", bindings: [] };\n }\n}\n\nexport default new OracleAfterConstraintInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { ConstraintNode } from \"../../../ast/query/node/constraint\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { getColumnValue } from \"../../../resources/utils\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass OracleConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const cNode = node as ConstraintNode;\n\n const utils = new InterpreterUtils(this.model);\n\n if (cNode.constraintType === \"primary_key\") {\n if (cNode.columns && cNode.columns.length) {\n const sqlPrefix = cNode.constraintName\n ? `constraint \"${cNode.constraintName}\" `\n : \"\";\n const cols = (cNode.columns ?? [])\n .map((c) => utils.formatStringColumn(\"oracledb\", getColumnValue(c)))\n .join(\", \");\n return { sql: `${sqlPrefix}primary key (${cols})`, bindings: [] };\n }\n return { sql: `primary key`, bindings: [] };\n }\n\n if (cNode.constraintType === \"unique\") {\n if (cNode.columns && cNode.columns.length > 0) {\n const colsArr = cNode.columns ?? [];\n const sqlPrefixU = cNode.constraintName\n ? `constraint \"${cNode.constraintName}\" `\n : \"\";\n const cols = colsArr\n .map((c) => utils.formatStringColumn(\"oracledb\", getColumnValue(c)))\n .join(\", \");\n // For inline constraints in CREATE TABLE, don't include column names\n if (!cNode.constraintName) {\n return { sql: `unique`, bindings: [] };\n }\n return { sql: `${sqlPrefixU}unique (${cols})`, bindings: [] };\n }\n return { sql: `unique`, bindings: [] };\n }\n\n if (cNode.constraintType === \"not_null\") {\n return { sql: `not null`, bindings: [] };\n }\n\n if (cNode.constraintType === \"null\") {\n return { sql: `null`, bindings: [] };\n }\n\n if (cNode.constraintType === \"default\") {\n if (cNode.defaultValue !== undefined) {\n const val = cNode.defaultValue;\n if (val instanceof RawNode) {\n return { sql: `default ${val.rawValue}`, bindings: [] };\n }\n if (val === \"NULL\" || val === null) {\n return { sql: `default null`, bindings: [] };\n }\n // Oracle uses 1/0 for boolean-like values\n if (val === \"TRUE\") {\n return { sql: `default 1`, bindings: [] };\n }\n if (val === \"FALSE\") {\n return { sql: `default 0`, bindings: [] };\n }\n if (typeof val === \"string\") {\n return { sql: `default '${val}'`, bindings: [] };\n }\n return { sql: `default ${val}`, bindings: [] };\n }\n return { sql: `default null`, bindings: [] };\n }\n\n if (cNode.constraintType === \"foreign_key\") {\n if (!cNode.columns || !cNode.columns.length) {\n return { sql: \"\", bindings: [] };\n }\n const cols = cNode.columns\n .map((c) => utils.formatStringColumn(\"oracledb\", getColumnValue(c)))\n .join(\", \");\n if (!cNode.references) {\n return { sql: \"\", bindings: [] };\n }\n const refTable = utils.formatStringTable(\n \"oracledb\",\n cNode.references.table,\n );\n const refCols = cNode.references.columns\n .map((c) => utils.formatStringColumn(\"oracledb\", getColumnValue(c)))\n .join(\", \");\n const sqlPrefix = cNode.constraintName\n ? `constraint \"${cNode.constraintName}\" `\n : \"\";\n let sql = `${sqlPrefix}foreign key (${cols}) references ${refTable}(${refCols})`;\n if (cNode.onDelete) {\n sql += ` on delete ${cNode.onDelete}`;\n }\n // Oracle doesn't support ON UPDATE in foreign key constraints\n return { sql, bindings: [] };\n }\n\n return { sql: \"\", bindings: [] };\n }\n}\n\nexport default new OracleConstraintInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { CreateTableNode } from \"../../../ast/query/node/create_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass OracleCreateTableInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const ctNode = node as CreateTableNode;\n\n const utils = new InterpreterUtils(this.model);\n const tableName = utils.formatStringTable(\"oracledb\", ctNode.table);\n\n if (!ctNode.children || !ctNode.children.length) {\n return { sql: `${tableName} ()`, bindings: [] };\n }\n\n const astParser = new AstParser(\n this.model,\n \"oracledb\" as SqlDataSourceType,\n );\n\n const parts: string[] = [];\n const bindings: any[] = [];\n\n for (const child of ctNode.children) {\n const { sql, bindings: childBindings } = astParser.parse([child]);\n\n if (child.folder === \"constraint\") {\n const last = parts.pop() ?? \"\";\n const inlineConstraintSql = sql;\n\n // Handle inline constraints: not null, null, and default\n if (\n /not null/i.test(inlineConstraintSql) ||\n /null/i.test(inlineConstraintSql) ||\n /default/i.test(inlineConstraintSql)\n ) {\n let combined = `${last} ${inlineConstraintSql}`.trim();\n combined = combined.replace(\n /(references\\s+\"[^\"]+\"\\s*\\([^)]*\\))\\s+not null/i,\n \"not null $1\",\n );\n // Oracle requires DEFAULT before CHECK constraint\n combined = combined.replace(\n /(check\\s*\\([^)]+\\))\\s+(default\\s+(?:'[^']*'|\\S+))/i,\n \"$2 $1\",\n );\n parts.push(combined);\n bindings.push(...childBindings);\n continue;\n }\n\n parts.push(last);\n parts.push(inlineConstraintSql);\n bindings.push(...childBindings);\n continue;\n }\n\n parts.push(sql);\n bindings.push(...childBindings);\n }\n\n for (const constraint of ctNode.namedConstraints) {\n const { sql, bindings: constraintBindings } = astParser.parse([\n constraint,\n ]);\n\n parts.push(sql);\n bindings.push(...constraintBindings);\n }\n\n const columnsSql = parts.join(\", \");\n // Oracle doesn't support IF NOT EXISTS directly, would need PL/SQL block\n const finalSql = `${tableName} (${columnsSql})`;\n return { sql: finalSql, bindings };\n }\n}\n\nexport default new OracleCreateTableInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { DeleteNode } from \"../../../ast/query/node/delete\";\nimport { FromNode } from \"../../../ast/query/node/from\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass OracleDeleteInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const deleteNode = node as DeleteNode;\n\n if (\n deleteNode.isRawValue &&\n typeof deleteNode.fromNode.table === \"string\"\n ) {\n return {\n sql: deleteNode.fromNode.table,\n bindings: [],\n };\n }\n\n const formattedTable = new InterpreterUtils(\n this.model,\n ).getFromForWriteOperations(\"oracledb\", deleteNode.fromNode as FromNode);\n\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n}\n\nexport default new OracleDeleteInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass OracleDistinctInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n // DISTINCT is handled by the parser directly\n return {\n sql: \"\",\n bindings: [],\n };\n }\n}\n\nexport default new OracleDistinctInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { DistinctOnNode } from \"../../../ast/query/node/distinct/distinct_on\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\n/**\n * Oracle does not support DISTINCT ON directly.\n * This is a PostgreSQL-specific feature.\n * For Oracle, you would need to use ROW_NUMBER() OVER (PARTITION BY ...) pattern.\n * This interpreter provides basic column formatting as a fallback.\n */\nclass OracleDistinctOnInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const distinctOnNode = node as DistinctOnNode;\n const columns = distinctOnNode.columns\n .map((col) =>\n new InterpreterUtils(this.model).formatStringColumn(\"oracledb\", col),\n )\n .join(\", \");\n return {\n sql: `(${columns})`,\n bindings: [],\n };\n }\n}\n\nexport default new OracleDistinctOnInterpreter();\n","import { DropTableNode } from \"../../../ast/query/node/drop_table/drop_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\n/**\n * Oracle DROP TABLE syntax:\n * - DROP TABLE table_name [CASCADE CONSTRAINTS] [PURGE]\n * - Oracle doesn't support IF EXISTS directly, would need PL/SQL block\n */\nclass OracleDropTableInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const dt = node as DropTableNode;\n const utils = new InterpreterUtils(this.model);\n const tableSql = utils.formatStringTable(\"oracledb\", dt.table);\n // Note: Oracle doesn't support IF EXISTS in standard SQL\n // The ifExists flag would require PL/SQL exception handling\n return { sql: `${tableSql} cascade constraints`, bindings: [] };\n }\n}\n\nexport default new OracleDropTableInterpreter();\n","import { CreateExtensionNode } from \"../../../ast/query/node/extension/create_extension\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass OracleCreateExtensionInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const ext = node as CreateExtensionNode;\n return {\n sql: `-- Oracle does not support extensions (extension: ${ext.extensionName})`,\n bindings: [],\n };\n }\n}\nexport default new OracleCreateExtensionInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { FromNode } from \"../../../ast/query/node/from\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass OracleFromInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const fromNode = node as FromNode;\n\n if (typeof fromNode.table === \"string\") {\n const interpreterUtils = new InterpreterUtils(this.model);\n\n if (fromNode.alias && fromNode.alias.length > 0) {\n const tableSql = interpreterUtils.formatStringTable(\n \"oracledb\",\n fromNode.table,\n );\n\n return {\n sql: `${tableSql} \"${fromNode.alias}\"`,\n bindings: [],\n };\n }\n\n const tableSql = interpreterUtils.formatStringTable(\n \"oracledb\",\n fromNode.table,\n );\n\n return { sql: tableSql, bindings: [] };\n }\n\n const subQueryNodes = Array.isArray(fromNode.table)\n ? fromNode.table\n : [fromNode.table];\n\n const astParser = new AstParser(\n this.model,\n \"oracledb\" as SqlDataSourceType,\n );\n const result = astParser.parse(subQueryNodes);\n\n const aliasSql =\n fromNode.alias && fromNode.alias.length ? ` \"${fromNode.alias}\"` : \"\";\n\n return {\n sql: `(${result.sql})${aliasSql}`,\n bindings: result.bindings,\n };\n }\n}\n\nexport default new OracleFromInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { GroupByNode } from \"../../../ast/query/node/group_by/group_by\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass OracleGroupByInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const groupByNode = node as GroupByNode;\n if (groupByNode.isRawValue) {\n return {\n sql: groupByNode.column,\n bindings: [],\n };\n }\n\n const columnSql = new InterpreterUtils(this.model).formatStringColumn(\n \"oracledb\",\n groupByNode.column,\n );\n\n return {\n sql: columnSql,\n bindings: [],\n };\n }\n}\n\nexport default new OracleGroupByInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { HavingNode } from \"../../../ast/query/node/having/having\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass OracleHavingInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const havingNode = node as HavingNode;\n if (havingNode.isRawValue) {\n return {\n sql: havingNode.column,\n bindings: havingNode.value as any[],\n };\n }\n\n const idx = havingNode.currParamIndex;\n let sql = \"\";\n let bindings: any[] = [];\n\n if (\n !(havingNode.value instanceof QueryNode) &&\n !Array.isArray(havingNode.value)\n ) {\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"oracledb\", havingNode.column)} ${havingNode.operator} :${idx}`;\n bindings = [havingNode.value];\n }\n\n if (Array.isArray(havingNode.value)) {\n const placeholders = havingNode.value\n .map((_, i) => `:${idx + i}`)\n .join(\", \");\n\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"oracledb\", havingNode.column)} ${havingNode.operator} (${placeholders})`;\n bindings = havingNode.value;\n }\n\n if (havingNode.isNegated) {\n sql = `not (${sql})`;\n }\n\n return { sql: sql.trim(), bindings };\n }\n}\n\nexport default new OracleHavingInterpreter();\n","import { CreateIndexNode } from \"../../../ast/query/node/index_op/create_index\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\n/**\n * Oracle CREATE INDEX syntax:\n * CREATE [UNIQUE] INDEX index_name ON table_name (column1, column2, ...)\n */\nclass OracleCreateIndexInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const ci = node as CreateIndexNode;\n const utils = new InterpreterUtils(this.model);\n const tableSql = utils.formatStringTable(\"oracledb\", ci.table);\n const cols = ci.columns.map((c) => `\"${c}\"`).join(\", \");\n const unique = ci.unique ? \"unique \" : \"\";\n return {\n sql: `${unique}\"${ci.indexName}\" on ${tableSql} (${cols})`,\n bindings: [],\n };\n }\n}\n\nexport default new OracleCreateIndexInterpreter();\n","import { DropIndexNode } from \"../../../ast/query/node/index_op/drop_index\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\n/**\n * Oracle DROP INDEX syntax:\n * DROP INDEX index_name\n * Note: Oracle doesn't support CASCADE for DROP INDEX\n */\nclass OracleDropIndexInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const di = node as DropIndexNode;\n return {\n sql: `\"${di.indexName}\"`,\n bindings: [],\n };\n }\n}\n\nexport default new OracleDropIndexInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { InsertNode } from \"../../../ast/query/node/insert\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass OracleInsertInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const insertNode = node as InsertNode;\n if (insertNode.isRawValue) {\n return {\n sql: insertNode.fromNode.table as string,\n bindings: [],\n };\n }\n\n const interpreterUtils = new InterpreterUtils(this.model);\n const formattedTable = interpreterUtils.getFromForWriteOperations(\n \"oracledb\",\n insertNode.fromNode,\n );\n\n if (!insertNode.records.length) {\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n\n const firstRecord = insertNode.records[0];\n const columns = Object.keys(firstRecord);\n if (!columns.length) {\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n\n const formattedColumns = columns\n .map((column) => interpreterUtils.formatStringColumn(\"oracledb\", column))\n .join(\", \");\n\n const allValues: any[] = [];\n const valuesClauses: string[] = [];\n let paramIndex = insertNode.currParamIndex;\n\n for (const record of insertNode.records) {\n const recordValues = columns.map((column) => record[column]);\n\n const placeholders: string[] = [];\n for (const value of recordValues) {\n if (value instanceof RawNode) {\n placeholders.push(value.rawValue);\n } else {\n allValues.push(value);\n placeholders.push(`:${paramIndex++}`);\n }\n }\n\n valuesClauses.push(`(${placeholders.join(\", \")})`);\n }\n\n // Oracle uses INSERT ALL for multiple rows or single INSERT INTO ... VALUES\n // NOTE: INSERT ALL doesn't work correctly with identity columns (auto-increment)\n // This is handled at the model_manager level by inserting one at a time\n let sql: string;\n if (insertNode.records.length === 1) {\n sql = `${formattedTable} (${formattedColumns}) values ${valuesClauses[0]}`;\n } else {\n // For multiple records, use INSERT ALL ... SELECT * FROM DUAL\n insertNode.keyword = \"insert\";\n paramIndex = insertNode.currParamIndex;\n const insertAllClauses: string[] = [];\n\n for (const record of insertNode.records) {\n const recordValues = columns.map((column) => record[column]);\n const placeholders: string[] = [];\n\n for (const value of recordValues) {\n if (value instanceof RawNode) {\n placeholders.push(value.rawValue);\n } else {\n placeholders.push(`:${paramIndex++}`);\n }\n }\n\n insertAllClauses.push(\n `into ${formattedTable} (${formattedColumns}) values (${placeholders.join(\", \")})`,\n );\n }\n\n sql = `all ${insertAllClauses.join(\" \")} select * from dual`;\n }\n\n return {\n sql,\n bindings: allValues,\n };\n }\n}\n\nexport default new OracleInsertInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { JoinNode } from \"../../../ast/query/node/join/join\";\nimport type { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass OracleJoinInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const joinNode = node as JoinNode;\n if (joinNode.isRawValue) {\n return {\n sql: joinNode.table,\n bindings: [],\n };\n }\n\n const utils = new InterpreterUtils(this.model);\n\n let leftColumnStr = joinNode.left;\n if (!leftColumnStr.includes(\".\")) {\n leftColumnStr = `${joinNode.table}.${leftColumnStr}`;\n }\n\n let rightColumnStr = joinNode.right;\n if (!rightColumnStr.includes(\".\")) {\n rightColumnStr = `${this.model.table}.${rightColumnStr}`;\n }\n\n const leftSql = utils.formatStringColumn(\"oracledb\", leftColumnStr);\n const rightSql = utils.formatStringColumn(\"oracledb\", rightColumnStr);\n const tableSql = utils.formatStringTable(\"oracledb\", joinNode.table);\n\n const sql = `${tableSql} on ${leftSql} ${joinNode.on?.operator} ${rightSql}`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new OracleJoinInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { LimitNode } from \"../../../ast/query/node/limit/limit\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\n/**\n * Oracle 12c+ uses FETCH FIRST n ROWS ONLY syntax for limit\n * This interpreter provides the value binding; the parser handles syntax\n */\nclass OracleLimitInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const limitNode = node as LimitNode;\n\n return {\n sql: `:${limitNode.currParamIndex}`,\n bindings: [limitNode.limit],\n };\n }\n}\n\nexport default new OracleLimitInterpreter();\n","import { LockNode } from \"../../../ast/query/node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\n\n/**\n * Oracle locking syntax:\n * - FOR UPDATE: locks rows for update\n * - FOR UPDATE NOWAIT: fails immediately if row is locked\n * - FOR UPDATE SKIP LOCKED: skips locked rows (Oracle 11g+)\n * - FOR UPDATE WAIT n: waits n seconds before failing\n * Note: Oracle doesn't have FOR SHARE, FOR NO KEY UPDATE, or FOR KEY SHARE\n */\nconst lockTypeToSql: Record<string, string> = {\n for_update: \"for update\",\n for_share: \"for update\", // Oracle doesn't have FOR SHARE, use FOR UPDATE\n for_no_key_update: \"for update\",\n for_key_share: \"for update\",\n};\n\nexport class OracleLockInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): { sql: string; bindings: any[] } {\n const lockNode = node as LockNode;\n let sql = lockTypeToSql[lockNode.lockType] || \"for update\";\n\n // Oracle uses SKIP LOCKED (11g+) and NOWAIT\n if (lockNode.skipLocked) {\n sql += \" skip locked\";\n }\n\n if (lockNode.noWait) {\n sql += \" nowait\";\n }\n\n return {\n sql,\n bindings: [],\n };\n }\n}\n\nexport default new OracleLockInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { OffsetNode } from \"../../../ast/query/node/offset/offset\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\n/**\n * Oracle 12c+ uses OFFSET n ROWS syntax\n * This interpreter provides the value binding; the parser handles syntax\n */\nclass OracleOffsetInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const offsetNode = node as OffsetNode;\n\n return {\n sql: `:${offsetNode.currParamIndex}`,\n bindings: [offsetNode.offset],\n };\n }\n}\n\nexport default new OracleOffsetInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { OnDuplicateNode } from \"../../../ast/query/node/on_duplicate\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\n/**\n * Oracle uses MERGE INTO statement for upsert operations\n * MERGE INTO target USING source ON (condition)\n * WHEN MATCHED THEN UPDATE SET ...\n * WHEN NOT MATCHED THEN INSERT (...) VALUES (...)\n *\n * This interpreter generates the ON conflict part similar to PostgreSQL\n * but the actual MERGE syntax construction happens elsewhere\n */\nclass OracleOnDuplicateInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const onDuplicateNode = node as OnDuplicateNode;\n\n if (onDuplicateNode.isRawValue) {\n return {\n sql: onDuplicateNode.table,\n bindings: [],\n };\n }\n\n const interpreterUtils = new InterpreterUtils(this.model);\n const formattedConflictColumns = onDuplicateNode.conflictColumns\n .map((column) => interpreterUtils.formatStringColumn(\"oracledb\", column))\n .join(\" AND \");\n\n if (onDuplicateNode.mode === \"ignore\") {\n // For ignore mode in Oracle MERGE, use WHEN NOT MATCHED THEN INSERT\n // and skip WHEN MATCHED clause\n return {\n sql: `on (${formattedConflictColumns})`,\n bindings: [],\n };\n }\n\n const updateSet = onDuplicateNode.columnsToUpdate\n .map(\n (column) =>\n `target.${interpreterUtils.formatStringColumn(\"oracledb\", column)} = source.${interpreterUtils.formatStringColumn(\"oracledb\", column)}`,\n )\n .join(\", \");\n\n // Oracle MERGE when matched update clause\n const sql = `on (${formattedConflictColumns}) when matched then update set ${updateSet}`;\n\n return {\n sql,\n bindings: [],\n };\n }\n}\n\nexport default new OracleOnDuplicateInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { OrderByNode } from \"../../../ast/query/node/order_by/order_by\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass OracleOrderByInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const orderByNode = node as OrderByNode;\n if (orderByNode.isRawValue) {\n return {\n sql: orderByNode.column,\n bindings: [],\n };\n }\n\n const columnSql = new InterpreterUtils(this.model).formatStringColumn(\n \"oracledb\",\n orderByNode.column,\n );\n const directionSql = orderByNode.direction.toLowerCase();\n\n return {\n sql: `${columnSql} ${directionSql}`,\n bindings: [],\n };\n }\n}\n\nexport default new OracleOrderByInterpreter();\n","import { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass OracleRawInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): { sql: string; bindings: any[] } {\n const rawNode = node as RawNode;\n return {\n sql: rawNode.rawValue,\n bindings: [],\n };\n }\n}\n\nexport default new OracleRawInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { ForeignKeyInfoNode } from \"../../../ast/query/node/schema/foreign_key_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\n/**\n * Oracle uses USER_CONSTRAINTS and USER_CONS_COLUMNS for foreign key metadata\n */\nclass OracleForeignKeyInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as ForeignKeyInfoNode;\n const table = node.table.toUpperCase();\n const sql = `SELECT\n c.constraint_name as name,\n cc.column_name as column_name,\n rc.table_name as referenced_table,\n rcc.column_name as referenced_column,\n c.delete_rule as on_delete\nFROM user_constraints c\nJOIN user_cons_columns cc ON c.constraint_name = cc.constraint_name\nJOIN user_constraints rc ON c.r_constraint_name = rc.constraint_name\nJOIN user_cons_columns rcc ON rc.constraint_name = rcc.constraint_name AND cc.position = rcc.position\nWHERE c.constraint_type = 'R'\n AND c.table_name = '${table}'\nORDER BY cc.position`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new OracleForeignKeyInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { IndexInfoNode } from \"../../../ast/query/node/schema/index_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\n/**\n * Oracle uses USER_INDEXES and USER_IND_COLUMNS for index metadata\n */\nclass OracleIndexInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as IndexInfoNode;\n const table = node.table.toUpperCase();\n const sql = `SELECT\n i.index_name as index_name,\n ic.column_name as column_name,\n CASE WHEN i.uniqueness = 'UNIQUE' THEN 1 ELSE 0 END as is_unique\nFROM user_indexes i\nJOIN user_ind_columns ic ON i.index_name = ic.index_name\nWHERE i.table_name = '${table}'\n AND i.index_name NOT LIKE 'SYS_%'\n AND NOT EXISTS (\n SELECT 1 FROM user_constraints c\n WHERE c.constraint_type = 'P'\n AND c.index_name = i.index_name\n )\nORDER BY i.index_name, ic.column_position`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new OracleIndexInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { PrimaryKeyInfoNode } from \"../../../ast/query/node/schema/primary_key_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\n/**\n * Oracle uses USER_CONSTRAINTS and USER_CONS_COLUMNS for primary key metadata\n */\nclass OraclePrimaryKeyInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as PrimaryKeyInfoNode;\n const table = node.table.toUpperCase();\n const sql = `SELECT\n c.constraint_name as name,\n cc.column_name as column_name\nFROM user_constraints c\nJOIN user_cons_columns cc ON c.constraint_name = cc.constraint_name\nWHERE c.constraint_type = 'P'\n AND c.table_name = '${table}'\nORDER BY cc.position`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new OraclePrimaryKeyInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { TableInfoNode } from \"../../../ast/query/node/schema/table_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\n/**\n * Oracle uses USER_TAB_COLUMNS or ALL_TAB_COLUMNS for column metadata\n */\nclass OracleTableInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as TableInfoNode;\n const table = node.table.toUpperCase();\n const sql = `SELECT\n column_name,\n data_type,\n CASE WHEN nullable = 'Y' THEN 'YES' ELSE 'NO' END as is_nullable,\n data_default as column_default,\n char_length as char_length,\n data_precision as numeric_precision,\n data_scale as numeric_scale\nFROM user_tab_columns\nWHERE table_name = '${table}'\nORDER BY column_id`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new OracleTableInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { SelectNode } from \"../../../ast/query/node/select/basic_select\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass OracleSelectInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const selectNode = node as SelectNode;\n if (selectNode.isRawValue) {\n return {\n sql: selectNode.column as string,\n bindings: [],\n };\n }\n\n const columnResult = this.formatColumn(\n selectNode.column,\n selectNode.sqlFunction,\n );\n const aliasSql = this.formatAlias(selectNode.alias);\n return {\n sql: `${columnResult.sql}${aliasSql}`,\n bindings: columnResult.bindings,\n };\n }\n\n private formatColumn(\n column: string | QueryNode | QueryNode[],\n sqlFunction?: string,\n ): ReturnType<typeof AstParser.prototype.parse> {\n if (typeof column === \"string\") {\n const col = new InterpreterUtils(this.model).formatStringColumn(\n \"oracledb\",\n column,\n );\n let sql = col;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}(${col})`;\n }\n return {\n sql,\n bindings: [],\n };\n }\n\n if (Array.isArray(column) && column.length > 0) {\n const astParser = new AstParser(\n this.model,\n \"oracledb\" as SqlDataSourceType,\n );\n const result = astParser.parse(column);\n let sql = `(${result.sql})`;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}${sql}`;\n }\n return {\n sql,\n bindings: result.bindings,\n };\n }\n\n if (!Array.isArray(column)) {\n const astParser = new AstParser(\n this.model,\n \"oracledb\" as SqlDataSourceType,\n );\n const result = astParser.parse([column]);\n let sql = `(${result.sql})`;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}${sql}`;\n }\n return {\n sql,\n bindings: result.bindings,\n };\n }\n\n const formattedColumns = column.map((col) => {\n if (typeof col === \"string\") {\n const formatted = new InterpreterUtils(this.model).formatStringColumn(\n \"oracledb\",\n col,\n );\n if (sqlFunction) {\n return `${sqlFunction.toLowerCase()}(${formatted})`;\n }\n return formatted;\n }\n\n const astParser = new AstParser(\n this.model,\n \"oracledb\" as SqlDataSourceType,\n );\n const result = astParser.parse([col]);\n let sql = `(${result.sql})`;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}${sql}`;\n }\n return sql;\n });\n\n return {\n sql: formattedColumns.join(\", \"),\n bindings: [],\n };\n }\n\n private formatAlias(alias?: string): string {\n if (alias && alias.length > 0) {\n return ` as \"${alias}\"`;\n }\n return \"\";\n }\n}\n\nexport default new OracleSelectInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { FromNode } from \"../../../ast/query/node/from\";\nimport { TruncateNode } from \"../../../ast/query/node/truncate\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass OracleTruncateInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const truncateNode = node as TruncateNode;\n\n if (truncateNode.isRawValue && typeof truncateNode.fromNode === \"string\") {\n return {\n sql: truncateNode.fromNode,\n bindings: [],\n };\n }\n\n const formattedTable = new InterpreterUtils(\n this.model,\n ).getFromForWriteOperations(\"oracledb\", truncateNode.fromNode as FromNode);\n\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n}\n\nexport default new OracleTruncateInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { UnionNode } from \"../../../ast/query/node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass OracleUnionInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const unionNode = node as UnionNode;\n const parser = new AstParser(this.model, \"oracledb\");\n const nodes = Array.isArray(unionNode.query)\n ? unionNode.query\n : [unionNode.query];\n\n const ast =\n typeof unionNode.query === \"string\"\n ? { sql: unionNode.query, bindings: [] }\n : parser.parse(\n nodes.filter(Boolean) as QueryNode[],\n unionNode.currParamIndex,\n );\n\n return {\n sql: ast.sql,\n bindings: ast.bindings,\n };\n }\n}\n\nexport default new OracleUnionInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { FromNode } from \"../../../ast/query/node/from\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { UpdateNode } from \"../../../ast/query/node/update\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass OracleUpdateInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const updateNode = node as UpdateNode;\n if (updateNode.isRawValue && typeof updateNode.fromNode === \"string\") {\n return {\n sql: updateNode.fromNode as string,\n bindings: updateNode.values,\n };\n }\n\n const interpreterUtils = new InterpreterUtils(this.model);\n const formattedTable = interpreterUtils.getFromForWriteOperations(\n \"oracledb\",\n updateNode.fromNode as FromNode,\n );\n\n if (!updateNode.columns.length || !updateNode.values.length) {\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n\n let paramIndex = updateNode.currParamIndex;\n const finalBindings: any[] = [];\n const setClause = updateNode.columns\n .map((column, index) => {\n const value = updateNode.values[index];\n\n if (value instanceof RawNode) {\n return `${interpreterUtils.formatStringColumn(\"oracledb\", column)} = ${value.rawValue}`;\n }\n\n finalBindings.push(value);\n return `${interpreterUtils.formatStringColumn(\"oracledb\", column)} = :${paramIndex++}`;\n })\n .join(\", \");\n\n return {\n sql: `${formattedTable} set ${setClause}`,\n bindings: finalBindings,\n };\n }\n}\n\nexport default new OracleUpdateInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport type { WhereNode } from \"../../../ast/query/node/where/where\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass OracleWhereInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const whereNode = node as WhereNode;\n if (whereNode.isRawValue) {\n return {\n sql: whereNode.column,\n bindings: (whereNode.value as any[]) ?? [],\n };\n }\n\n const idx = whereNode.currParamIndex;\n let sql = \"\";\n let bindings: any[] = [];\n\n if (this.isRawNode(whereNode.value)) {\n const formattedRight = this.formatRawIdentifierIfPossible(\n whereNode.value.rawValue,\n );\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"oracledb\", whereNode.column)} ${whereNode.operator} ${formattedRight}`;\n bindings = [];\n } else if (Array.isArray(whereNode.value)) {\n if (whereNode.operator.toLowerCase() === \"between\") {\n const placeholders = `:${idx} AND :${idx + 1}`;\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"oracledb\", whereNode.column)} between ${placeholders}`;\n bindings = whereNode.value;\n } else {\n const placeholders = whereNode.value\n .map((_, i) => `:${idx + i}`)\n .join(\", \");\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"oracledb\", whereNode.column)} ${whereNode.operator} (${placeholders})`;\n bindings = whereNode.value;\n }\n } else {\n if (whereNode.operator.includes(\"null\")) {\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"oracledb\", whereNode.column)} ${whereNode.operator}`;\n bindings = [];\n } else if (whereNode.value === undefined) {\n return { sql: \"\", bindings: [] };\n } else {\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"oracledb\", whereNode.column)} ${whereNode.operator} :${idx}`;\n bindings = [whereNode.value];\n }\n }\n\n if (whereNode.isNegated) {\n sql = `not (${sql})`;\n }\n\n return { sql: sql.trim(), bindings };\n }\n\n private isRawNode(value: any): value is RawNode {\n return (\n value &&\n typeof value === \"object\" &&\n \"rawValue\" in value &&\n value.isRawValue === true\n );\n }\n\n private formatRawIdentifierIfPossible(raw: string): string {\n const isIdentifier =\n /^[A-Za-z_][A-Za-z0-9_]*(\\.(\\*|[A-Za-z_][A-Za-z0-9_]*))?$/.test(raw);\n if (!isIdentifier) {\n return raw;\n }\n return new InterpreterUtils(this.model).formatStringColumn(\"oracledb\", raw);\n }\n}\n\nexport default new OracleWhereInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { WhereGroupNode } from \"../../../ast/query/node/where/where_group\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass OracleWhereGroupInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const groupNode = node as WhereGroupNode;\n if (!groupNode.nodes || !groupNode.nodes.length) {\n return { sql: \"\", bindings: [] };\n }\n\n const astParser = new AstParser(\n this.model,\n \"oracledb\" as SqlDataSourceType,\n );\n\n const { sql, bindings } = astParser.parse(\n groupNode.nodes,\n groupNode.currParamIndex,\n true,\n );\n\n return {\n sql: `(${sql})`,\n bindings,\n };\n }\n}\n\nexport default new OracleWhereGroupInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { WhereJsonNode } from \"../../../ast/query/node/where/where_json\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass OracleWhereJsonInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const whereJsonNode = node as WhereJsonNode;\n if (whereJsonNode.isRawValue) {\n return {\n sql: whereJsonNode.column,\n bindings: [],\n };\n }\n\n let sql = \"\";\n let bindings: any[] = [];\n\n const columnSql = new InterpreterUtils(this.model).formatStringColumn(\n \"oracledb\",\n whereJsonNode.column,\n );\n\n // Oracle 12c+ JSON support using JSON_EXISTS and JSON_EQUAL\n switch (whereJsonNode.jsonOperator) {\n case \"=\":\n // JSON_EQUAL for strict equality (Oracle 12.2+)\n sql = `JSON_EQUAL(${columnSql}, ?)`;\n bindings = [JSON.stringify(whereJsonNode.value)];\n break;\n case \"contains\":\n // JSON_EXISTS to check if JSON contains value\n sql = `JSON_EXISTS(${columnSql}, '$?(@ == $val)' PASSING ? AS \"val\")`;\n bindings = [JSON.stringify(whereJsonNode.value)];\n break;\n case \"not contains\":\n sql = `NOT JSON_EXISTS(${columnSql}, '$?(@ == $val)' PASSING ? AS \"val\")`;\n bindings = [JSON.stringify(whereJsonNode.value)];\n break;\n case \"raw\":\n sql = whereJsonNode.column;\n bindings = Array.isArray(whereJsonNode.value)\n ? whereJsonNode.value\n : [];\n break;\n }\n\n if (whereJsonNode.isNegated) {\n sql = `NOT (${sql})`;\n }\n\n return { sql: sql.trim(), bindings };\n }\n}\n\nexport default new OracleWhereJsonInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { WhereSubqueryNode } from \"../../../ast/query/node/where/where_subquery\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass OracleWhereSubqueryInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const subqueryNode = node as WhereSubqueryNode;\n\n if (this.isStringSubquery(subqueryNode.subquery)) {\n return this.handleStringSubquery(subqueryNode);\n }\n\n if (this.isArraySubquery(subqueryNode.subquery)) {\n return this.handleArraySubquery(subqueryNode);\n }\n\n return this.handleObjectSubquery(subqueryNode);\n }\n\n private isStringSubquery(\n subquery: string | QueryNode | QueryNode[],\n ): subquery is string {\n return typeof subquery === \"string\";\n }\n\n private isArraySubquery(\n subquery: string | QueryNode | QueryNode[],\n ): subquery is QueryNode[] {\n return Array.isArray(subquery);\n }\n\n private handleStringSubquery(\n subqueryNode: WhereSubqueryNode,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const sql = `${subqueryNode.column} ${subqueryNode.operator} (${subqueryNode.subquery})`;\n return { sql: sql.trim(), bindings: [] };\n }\n\n private handleArraySubquery(\n subqueryNode: WhereSubqueryNode,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const astParser = new AstParser(\n this.model,\n \"oracledb\" as SqlDataSourceType,\n );\n const { sql: subquerySql, bindings: subqueryBindings } = astParser.parse(\n subqueryNode.subquery as QueryNode[],\n subqueryNode.currParamIndex,\n );\n\n const sql = `${subqueryNode.column} ${subqueryNode.operator} (${subquerySql})`;\n return { sql: sql.trim(), bindings: subqueryBindings };\n }\n\n private handleObjectSubquery(\n subqueryNode: WhereSubqueryNode,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const astParser = new AstParser(\n this.model,\n \"oracledb\" as SqlDataSourceType,\n );\n const { sql: subquerySql, bindings: subqueryBindings } = astParser.parse(\n [subqueryNode.subquery as QueryNode],\n subqueryNode.currParamIndex,\n );\n\n const sql = `${subqueryNode.column} ${subqueryNode.operator} (${subquerySql})`;\n return { sql: sql.trim(), bindings: subqueryBindings };\n }\n}\n\nexport default new OracleWhereSubqueryInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { WithNode } from \"../../../ast/query/node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\n/**\n * Oracle supports CTEs (WITH clause) since 9i Release 2\n * Syntax: WITH alias AS (subquery), alias2 AS (subquery2) SELECT ...\n * MATERIALIZED hint is supported in Oracle 12c+\n */\nclass OracleWithInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(\n node: QueryNode | string,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const withNode = node as WithNode;\n const parser = new AstParser(this.model, \"oracledb\");\n const nodes = Array.isArray(withNode.body)\n ? withNode.body\n : [withNode.body];\n\n const ast = parser.parse(\n nodes.filter(Boolean) as QueryNode[],\n withNode.currParamIndex,\n );\n\n // Oracle 12c+ supports MATERIALIZED hint using /*+ MATERIALIZE */\n // but the standard AS MATERIALIZED syntax is not supported\n // Use subquery factoring optimization hints instead if needed\n const materializedClause =\n withNode.clause === \"materialized\" ? \" /*+ MATERIALIZE */\" : \"\";\n\n return {\n sql: `${withNode.alias} as (${materializedClause}${ast.sql})`,\n bindings: ast.bindings,\n };\n }\n}\n\nexport default new OracleWithInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { AddColumnNode } from \"../../../ast/query/node/alter_table/add_column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PgAddColumnInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const acNode = node as AddColumnNode;\n const ast = new AstParser(this.model, \"postgres\" as SqlDataSourceType);\n let { sql } = ast.parse([acNode.column]);\n\n const inlineConstraints = (acNode as any).inlineConstraints;\n if (inlineConstraints && inlineConstraints.length) {\n const constraintParts: string[] = [];\n\n for (const constraint of inlineConstraints) {\n const { sql: constraintSql } = ast.parse([constraint]);\n constraintParts.push(constraintSql);\n }\n\n if (constraintParts.length) {\n sql += ` ${constraintParts.join(\" \")}`;\n }\n }\n\n return { sql: `add column ${sql}`, bindings: [] };\n }\n}\nexport default new PgAddColumnInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { AddConstraintNode } from \"../../../ast/query/node/alter_table/add_constraint\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PgAddConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const acNode = node as AddConstraintNode;\n const ast = new AstParser(this.model, \"postgres\" as SqlDataSourceType);\n const { sql } = ast.parse([acNode.constraint]);\n return { sql: `add ${sql}`, bindings: [] };\n }\n}\nexport default new PgAddConstraintInterpreter();\n","import { AddPrimaryKeyNode } from \"../../../ast/query/node/alter_table/add_primary_key\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PgAddPrimaryKeyInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const pk = node as AddPrimaryKeyNode;\n const cols = pk.columns.map((c) => `\"${c}\"`).join(\", \");\n return { sql: `add primary key (${cols})`, bindings: [] };\n }\n}\nexport default new PgAddPrimaryKeyInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { AlterColumnTypeNode } from \"../../../ast/query/node/alter_table/alter_column_type\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PgAlterColumnTypeInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const a = node as AlterColumnTypeNode;\n const ast = new AstParser(this.model, \"postgres\" as SqlDataSourceType);\n const { sql } = ast.parse([a.newType]);\n const [, ...restTokens] = sql.trim().split(/\\s+/);\n const typeSql = restTokens.join(\" \");\n\n // Generate type change SQL\n let resultSql = `alter column \"${a.column}\" type ${typeSql}`;\n\n // Add constraint modifications\n if (a.options.nullable !== undefined) {\n const nullableSql = a.options.nullable\n ? `alter column \"${a.column}\" drop not null`\n : `alter column \"${a.column}\" set not null`;\n resultSql += `, ${nullableSql}`;\n }\n\n if (a.options.dropDefault) {\n resultSql += `, alter column \"${a.column}\" drop default`;\n } else if (a.options.default !== undefined) {\n let defaultValue = a.options.default;\n if (defaultValue === null) {\n defaultValue = \"null\";\n } else if (typeof defaultValue === \"string\") {\n if (defaultValue === \"NULL\") {\n defaultValue = \"null\";\n } else if (defaultValue === \"TRUE\" || defaultValue === \"FALSE\") {\n defaultValue = defaultValue.toLowerCase();\n } else {\n defaultValue = `'${defaultValue}'`;\n }\n }\n resultSql += `, alter column \"${a.column}\" set default ${defaultValue}`;\n }\n\n if (a.options.unique !== undefined) {\n if (a.options.unique) {\n resultSql += `, add constraint \"unique_${a.column}\" unique (\"${a.column}\")`;\n } else {\n resultSql += `, drop constraint \"unique_${a.column}\"`;\n }\n }\n\n return { sql: resultSql, bindings: [] };\n }\n}\nexport default new PgAlterColumnTypeInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { AlterTableNode } from \"../../../ast/query/node/alter_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresAlterTableInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const atNode = node as AlterTableNode;\n const utils = new InterpreterUtils(this.model);\n const tableName = utils.formatStringTable(\"postgres\", atNode.table);\n\n if (!atNode.children || !atNode.children.length) {\n return { sql: \"\", bindings: [] };\n }\n\n const astParser = new AstParser(\n this.model,\n \"postgres\" as SqlDataSourceType,\n );\n const parts: string[] = [];\n const bindings: any[] = [];\n\n for (const child of atNode.children) {\n const { sql, bindings: childBindings } = astParser.parse([child]);\n parts.push(sql.trim());\n bindings.push(...childBindings);\n }\n\n const stmt = parts.join(\", \");\n const ifExists = atNode.ifExists ? \"if exists \" : \"\";\n const finalSql = `${ifExists}${tableName} ${stmt}`;\n return { sql: finalSql, bindings };\n }\n}\n\nexport default new PostgresAlterTableInterpreter();\n","import { DropColumnNode } from \"../../../ast/query/node/alter_table/drop_column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PgDropColumnInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const d = node as DropColumnNode;\n return { sql: `drop column \"${d.column}\"`, bindings: [] };\n }\n}\nexport default new PgDropColumnInterpreter();\n","import { DropConstraintNode } from \"../../../ast/query/node/alter_table/drop_constraint\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PgDropConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const dNode = node as DropConstraintNode;\n return { sql: `drop constraint \"${dNode.constraintName}\"`, bindings: [] };\n }\n}\nexport default new PgDropConstraintInterpreter();\n","import { DropDefaultNode } from \"../../../ast/query/node/alter_table/drop_default\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresDropDefaultInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as DropDefaultNode;\n return { sql: `alter column \"${n.column}\" drop default`, bindings: [] };\n }\n}\nexport default new PostgresDropDefaultInterpreter();\n","import { DropNotNullNode } from \"../../../ast/query/node/alter_table/drop_not_null\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresDropNotNullInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as DropNotNullNode;\n return { sql: `alter column \"${n.column}\" drop not null`, bindings: [] };\n }\n}\nexport default new PostgresDropNotNullInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PgDropPrimaryKeyInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(_node: QueryNode) {\n // Not available in postgres\n return { sql: ``, bindings: [] };\n }\n}\nexport default new PgDropPrimaryKeyInterpreter();\n","import { RenameColumnNode } from \"../../../ast/query/node/alter_table/rename_column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PgRenameColumnInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const r = node as RenameColumnNode;\n return {\n sql: `rename column \"${r.oldName}\" to \"${r.newName}\"`,\n bindings: [],\n };\n }\n}\nexport default new PgRenameColumnInterpreter();\n","import { RenameTableNode } from \"../../../ast/query/node/alter_table/rename_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PgRenameTableInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const rt = node as RenameTableNode;\n return { sql: `\"${rt.newName}\"`, bindings: [] };\n }\n}\nexport default new PgRenameTableInterpreter();\n","import { SetDefaultNode } from \"../../../ast/query/node/alter_table/set_default\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresSetDefaultInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as SetDefaultNode;\n let val: string;\n\n if (n.defaultValue instanceof RawNode) {\n val = n.defaultValue.rawValue;\n } else if (n.defaultValue === \"NULL\") {\n val = \"null\";\n } else if (n.defaultValue === \"TRUE\" || n.defaultValue === \"FALSE\") {\n val = n.defaultValue.toLowerCase();\n } else if (\n typeof n.defaultValue === \"string\" &&\n n.defaultValue !== \"null\" &&\n n.defaultValue !== \"true\" &&\n n.defaultValue !== \"false\"\n ) {\n val = `'${n.defaultValue}'`;\n } else {\n val = String(n.defaultValue);\n }\n\n return {\n sql: `alter column \"${n.column}\" set default ${val}`,\n bindings: [],\n };\n }\n}\nexport default new PostgresSetDefaultInterpreter();\n","import { SetNotNullNode } from \"../../../ast/query/node/alter_table/set_not_null\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresSetNotNullInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as SetNotNullNode;\n return { sql: `alter column \"${n.column}\" set not null`, bindings: [] };\n }\n}\nexport default new PostgresSetNotNullInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { ColumnTypeNode } from \"../../../ast/query/node/column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { getColumnValue } from \"../../../resources/utils\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresColumnTypeInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const colNode = node as ColumnTypeNode;\n if (colNode.isRawValue) {\n return { sql: colNode.column as string, bindings: [] };\n }\n\n const utils = new InterpreterUtils(this.model);\n const columnName = utils.formatStringColumn(\n \"postgres\",\n getColumnValue(colNode.column),\n );\n\n const dt = colNode.dataType.toLowerCase();\n\n if (dt === \"char\") {\n const len = colNode.length ?? 1;\n return { sql: `${columnName} char(${len})`, bindings: [] };\n } else if (dt === \"varchar\") {\n const len = colNode.length ?? 255;\n return { sql: `${columnName} varchar(${len})`, bindings: [] };\n } else if (\n dt === \"text\" ||\n dt === \"longtext\" ||\n dt === \"mediumtext\" ||\n dt === \"tinytext\"\n ) {\n return { sql: `${columnName} text`, bindings: [] };\n } else if (dt === \"uuid\") {\n return { sql: `${columnName} uuid`, bindings: [] };\n } else if (dt === \"ulid\") {\n return { sql: `${columnName} varchar(26)`, bindings: [] };\n } else if (dt === \"bigint\") {\n if (colNode.autoIncrement) {\n return { sql: `${columnName} bigserial`, bindings: [] };\n }\n return { sql: `${columnName} bigint`, bindings: [] };\n } else if (dt === \"tinyint\") {\n return { sql: `${columnName} smallint`, bindings: [] };\n } else if (dt === \"smallint\") {\n return { sql: `${columnName} smallint`, bindings: [] };\n } else if (dt === \"mediumint\") {\n return { sql: `${columnName} integer`, bindings: [] };\n } else if (dt === \"float\" || dt === \"real\") {\n return { sql: `${columnName} real`, bindings: [] };\n } else if (dt === \"double\") {\n return { sql: `${columnName} double precision`, bindings: [] };\n } else if (dt === \"decimal\" || dt === \"numeric\") {\n const precision = colNode.precision ?? 10;\n const scale = colNode.scale ?? 0;\n return {\n sql: `${columnName} numeric(${precision}, ${scale})`,\n bindings: [],\n };\n } else if (dt === \"date\") {\n return { sql: `${columnName} date`, bindings: [] };\n } else if (dt === \"year\") {\n return { sql: `${columnName} smallint`, bindings: [] };\n } else if (dt === \"time\") {\n const p =\n typeof colNode.precision === \"number\" ? `(${colNode.precision})` : \"\";\n return { sql: `${columnName} time${p}`, bindings: [] };\n } else if (dt === \"datetime\" || dt === \"timestamp\") {\n const withTz = colNode.withTimezone\n ? \" with time zone\"\n : \" without time zone\";\n const p =\n typeof colNode.precision === \"number\" ? `(${colNode.precision})` : \"\";\n return {\n sql: `${columnName} timestamp${p}${withTz}`.trimEnd(),\n bindings: [],\n };\n } else if (dt === \"boolean\" || dt === \"bool\") {\n return { sql: `${columnName} boolean`, bindings: [] };\n } else if (\n dt === \"bytea\" ||\n dt === \"binary\" ||\n dt === \"varbinary\" ||\n dt === \"blob\" ||\n dt === \"longblob\" ||\n dt === \"mediumblob\" ||\n dt === \"tinyblob\"\n ) {\n return { sql: `${columnName} bytea`, bindings: [] };\n } else if (dt === \"json\") {\n return { sql: `${columnName} json`, bindings: [] };\n } else if (dt === \"jsonb\") {\n return { sql: `${columnName} jsonb`, bindings: [] };\n } else if (dt === \"enum\") {\n if (colNode.enumValues && colNode.enumValues.length > 0) {\n const values = colNode.enumValues.map((v) => `'${v}'`).join(\", \");\n return {\n sql: `${columnName} text check (${columnName} in (${values}))`,\n bindings: [],\n };\n }\n return { sql: `${columnName} text`, bindings: [] };\n } else if (dt === \"integer\" || dt === \"int\") {\n if (colNode.autoIncrement) {\n return { sql: `${columnName} serial`, bindings: [] };\n }\n\n return { sql: `${columnName} integer`, bindings: [] };\n } else if (dt === \"geometry\") {\n return { sql: `${columnName} geometry`, bindings: [] };\n } else if (dt === \"point\") {\n return { sql: `${columnName} point`, bindings: [] };\n } else if (dt === \"linestring\") {\n return { sql: `${columnName} linestring`, bindings: [] };\n } else if (dt === \"polygon\") {\n return { sql: `${columnName} polygon`, bindings: [] };\n } else if (dt === \"multipoint\") {\n return { sql: `${columnName} multipoint`, bindings: [] };\n }\n\n return {\n sql: `${columnName} ${dt} ${colNode.length ? `(${colNode.length})` : \"\"}`,\n bindings: [],\n };\n }\n}\n\nexport default new PostgresColumnTypeInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PgAfterConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(_node: QueryNode) {\n return { sql: \"\", bindings: [] };\n }\n}\nexport default new PgAfterConstraintInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { ConstraintNode } from \"../../../ast/query/node/constraint\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { getColumnValue } from \"../../../resources/utils\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const cNode = node as ConstraintNode;\n\n const utils = new InterpreterUtils(this.model);\n\n if (cNode.constraintType === \"primary_key\") {\n if (cNode.columns && cNode.columns.length) {\n const sqlPrefix = cNode.constraintName\n ? `constraint \"${cNode.constraintName}\" `\n : \"\";\n const cols = (cNode.columns ?? [])\n .map((c) => utils.formatStringColumn(\"postgres\", getColumnValue(c)))\n .join(\", \");\n return { sql: `${sqlPrefix}primary key (${cols})`, bindings: [] };\n }\n return { sql: `primary key`, bindings: [] };\n }\n\n if (cNode.constraintType === \"unique\") {\n if (cNode.columns && cNode.columns.length > 0) {\n const colsArr = cNode.columns ?? [];\n const sqlPrefixU = cNode.constraintName\n ? `constraint \"${cNode.constraintName}\" `\n : \"\";\n const cols = colsArr\n .map((c) => utils.formatStringColumn(\"postgres\", getColumnValue(c)))\n .join(\", \");\n // For inline constraints in CREATE TABLE, don't include column names\n if (!cNode.constraintName) {\n return { sql: `unique`, bindings: [] };\n }\n return { sql: `${sqlPrefixU}unique (${cols})`, bindings: [] };\n }\n return { sql: `unique`, bindings: [] };\n }\n\n if (cNode.constraintType === \"not_null\") {\n return { sql: `not null`, bindings: [] };\n }\n\n if (cNode.constraintType === \"null\") {\n return { sql: `null`, bindings: [] };\n }\n\n if (cNode.constraintType === \"default\") {\n if (cNode.defaultValue !== undefined) {\n const val = cNode.defaultValue;\n if (val instanceof RawNode) {\n return { sql: `default ${val.rawValue}`, bindings: [] };\n }\n if (val === \"NULL\" || val === null) {\n return { sql: `default null`, bindings: [] };\n }\n if (val === \"TRUE\" || val === \"FALSE\") {\n return { sql: `default ${val.toLowerCase()}`, bindings: [] };\n }\n if (typeof val === \"string\") {\n return { sql: `default '${val}'`, bindings: [] };\n }\n return { sql: `default ${val}`, bindings: [] };\n }\n return { sql: `default null`, bindings: [] };\n }\n\n if (cNode.constraintType === \"foreign_key\") {\n if (!cNode.columns || !cNode.columns.length) {\n return { sql: \"\", bindings: [] };\n }\n const cols = cNode.columns\n .map((c) => utils.formatStringColumn(\"postgres\", getColumnValue(c)))\n .join(\", \");\n if (!cNode.references) {\n return { sql: \"\", bindings: [] };\n }\n const refTable = utils.formatStringTable(\n \"postgres\",\n cNode.references.table,\n );\n const refCols = cNode.references.columns\n .map((c) => utils.formatStringColumn(\"postgres\", getColumnValue(c)))\n .join(\", \");\n const sqlPrefix = cNode.constraintName\n ? `constraint \"${cNode.constraintName}\" `\n : \"\";\n let sql = `${sqlPrefix}foreign key (${cols}) references ${refTable}(${refCols})`;\n if (cNode.onDelete) {\n sql += ` on delete ${cNode.onDelete}`;\n }\n if (cNode.onUpdate) {\n sql += ` on update ${cNode.onUpdate}`;\n }\n return { sql, bindings: [] };\n }\n\n return { sql: \"\", bindings: [] };\n }\n}\n\nexport default new PostgresConstraintInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { CreateTableNode } from \"../../../ast/query/node/create_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresCreateTableInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const ctNode = node as CreateTableNode;\n\n const utils = new InterpreterUtils(this.model);\n const tableName = utils.formatStringTable(\"postgres\", ctNode.table);\n\n if (!ctNode.children || !ctNode.children.length) {\n return { sql: `${tableName} ()`, bindings: [] };\n }\n\n const astParser = new AstParser(\n this.model,\n \"postgres\" as SqlDataSourceType,\n );\n\n const parts: string[] = [];\n const bindings: any[] = [];\n\n for (const child of ctNode.children) {\n const { sql, bindings: childBindings } = astParser.parse([child]);\n\n if (child.folder === \"constraint\") {\n const last = parts.pop() ?? \"\";\n const inlineConstraintSql = sql;\n\n // Handle inline constraints: not null, null, and default\n if (\n /not null/i.test(inlineConstraintSql) ||\n /null/i.test(inlineConstraintSql) ||\n /default/i.test(inlineConstraintSql)\n ) {\n let combined = `${last} ${inlineConstraintSql}`.trim();\n combined = combined.replace(\n /(references\\s+\"[^\"]+\"\\s*\\([^)]*\\))\\s+not null/i,\n \"not null $1\",\n );\n parts.push(combined);\n bindings.push(...childBindings);\n continue;\n }\n\n parts.push(last);\n parts.push(inlineConstraintSql);\n bindings.push(...childBindings);\n continue;\n }\n\n parts.push(sql);\n bindings.push(...childBindings);\n }\n\n for (const constraint of ctNode.namedConstraints) {\n const { sql, bindings: constraintBindings } = astParser.parse([\n constraint,\n ]);\n\n parts.push(sql);\n bindings.push(...constraintBindings);\n }\n\n const columnsSql = parts.join(\", \");\n const ifNotExists = ctNode.ifNotExists ? \"if not exists \" : \"\";\n const finalSql = `${ifNotExists}${tableName} (${columnsSql})`;\n return { sql: finalSql, bindings };\n }\n}\n\nexport default new PostgresCreateTableInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { DeleteNode } from \"../../../ast/query/node/delete\";\nimport { FromNode } from \"../../../ast/query/node/from\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresDeleteInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const deleteNode = node as DeleteNode;\n\n if (\n deleteNode.isRawValue &&\n typeof deleteNode.fromNode.table === \"string\"\n ) {\n return {\n sql: deleteNode.fromNode.table,\n bindings: [],\n };\n }\n\n const formattedTable = new InterpreterUtils(\n this.model,\n ).getFromForWriteOperations(\"postgres\", deleteNode.fromNode as FromNode);\n\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n}\n\nexport default new PostgresDeleteInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { Model } from \"../../../models/model\";\n\nclass PostgresDistinctInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n return {\n sql: \"\",\n bindings: [],\n };\n }\n}\n\nexport default new PostgresDistinctInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { DistinctOnNode } from \"../../../ast/query/node/distinct/distinct_on\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresDistinctOnInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const distinctOnNode = node as DistinctOnNode;\n const columns = distinctOnNode.columns\n .map((col) =>\n new InterpreterUtils(this.model).formatStringColumn(\"postgres\", col),\n )\n .join(\", \");\n return {\n sql: `(${columns})`,\n bindings: [],\n };\n }\n}\n\nexport default new PostgresDistinctOnInterpreter();\n","import { DropTableNode } from \"../../../ast/query/node/drop_table/drop_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PgDropTableInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const dt = node as DropTableNode;\n const utils = new InterpreterUtils(this.model);\n const tableSql = utils.formatStringTable(\"postgres\", dt.table);\n const exists = dt.ifExists ? \"if exists \" : \"\";\n return { sql: `${exists}${tableSql}`, bindings: [] };\n }\n}\nexport default new PgDropTableInterpreter();\n","import { CreateExtensionNode } from \"../../../ast/query/node/extension/create_extension\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresCreateExtensionInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const ext = node as CreateExtensionNode;\n const ifNotExists = ext.ifNotExists ? \"if not exists \" : \"\";\n return {\n sql: `${ifNotExists}\"${ext.extensionName}\"`,\n bindings: [],\n };\n }\n}\nexport default new PostgresCreateExtensionInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { FromNode } from \"../../../ast/query/node/from\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresFromInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const fromNode = node as FromNode;\n\n if (typeof fromNode.table === \"string\") {\n const interpreterUtils = new InterpreterUtils(this.model);\n\n if (fromNode.alias && fromNode.alias.length > 0) {\n const tableSql = interpreterUtils.formatStringTable(\n \"postgres\",\n fromNode.table,\n );\n\n return {\n sql: `${tableSql} as \"${fromNode.alias}\"`,\n bindings: [],\n };\n }\n\n const tableSql = interpreterUtils.formatStringTable(\n \"postgres\",\n fromNode.table,\n );\n\n return { sql: tableSql, bindings: [] };\n }\n\n const subQueryNodes = Array.isArray(fromNode.table)\n ? fromNode.table\n : [fromNode.table];\n\n const astParser = new AstParser(\n this.model,\n \"postgres\" as SqlDataSourceType,\n );\n const result = astParser.parse(subQueryNodes);\n\n const aliasSql =\n fromNode.alias && fromNode.alias.length ? ` as \"${fromNode.alias}\"` : \"\";\n\n return {\n sql: `(${result.sql})${aliasSql}`,\n bindings: result.bindings,\n };\n }\n}\n\nexport default new PostgresFromInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { GroupByNode } from \"../../../ast/query/node/group_by/group_by\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { Model } from \"../../../models/model\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresGroupByInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const groupByNode = node as GroupByNode;\n if (groupByNode.isRawValue) {\n return {\n sql: groupByNode.column,\n bindings: [],\n };\n }\n\n const columnSql = new InterpreterUtils(this.model).formatStringColumn(\n \"postgres\",\n groupByNode.column,\n );\n\n return {\n sql: columnSql,\n bindings: [],\n };\n }\n}\n\nexport default new PostgresGroupByInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { HavingNode } from \"../../../ast/query/node/having/having\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresHavingInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const havingNode = node as HavingNode;\n if (havingNode.isRawValue) {\n return {\n sql: havingNode.column,\n bindings: havingNode.value as any[],\n };\n }\n\n const idx = havingNode.currParamIndex;\n let sql = \"\";\n let bindings: any[] = [];\n\n if (\n !(havingNode.value instanceof QueryNode) &&\n !Array.isArray(havingNode.value)\n ) {\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"postgres\", havingNode.column)} ${havingNode.operator} $${idx}`;\n bindings = [havingNode.value];\n }\n\n if (Array.isArray(havingNode.value)) {\n const placeholders = havingNode.value\n .map((_, i) => `$${idx + i}`)\n .join(\", \");\n\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"postgres\", havingNode.column)} ${havingNode.operator} (${placeholders})`;\n bindings = havingNode.value;\n }\n\n if (havingNode.isNegated) {\n sql = `not (${sql})`;\n }\n\n return { sql: sql.trim(), bindings };\n }\n}\n\nexport default new PostgresHavingInterpreter();\n","import { CreateIndexNode } from \"../../../ast/query/node/index_op/create_index\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PgCreateIndexInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const ci = node as CreateIndexNode;\n const utils = new InterpreterUtils(this.model);\n const tableSql = utils.formatStringTable(\"postgres\", ci.table);\n const cols = ci.columns.map((c) => `\"${c}\"`).join(\", \");\n const unique = ci.unique ? \"unique \" : \"\";\n return {\n sql: `${unique}\\\"${ci.indexName}\\\" on ${tableSql} (${cols})`,\n bindings: [],\n };\n }\n}\nexport default new PgCreateIndexInterpreter();\n","import { DropIndexNode } from \"../../../ast/query/node/index_op/drop_index\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresDropIndexInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const di = node as DropIndexNode;\n return {\n sql: `\"${di.indexName}\" ${di.cascade ? \"cascade\" : \"\"}`,\n bindings: [],\n };\n }\n}\nexport default new PostgresDropIndexInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { InsertNode } from \"../../../ast/query/node/insert\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresInsertInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const insertNode = node as InsertNode;\n if (insertNode.isRawValue) {\n return {\n sql: insertNode.fromNode.table as string,\n bindings: [],\n };\n }\n\n const interpreterUtils = new InterpreterUtils(this.model);\n const formattedTable = interpreterUtils.getFromForWriteOperations(\n \"postgres\",\n insertNode.fromNode,\n );\n\n if (!insertNode.records.length) {\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n\n const firstRecord = insertNode.records[0];\n const columns = Object.keys(firstRecord);\n if (!columns.length) {\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n\n const formattedColumns = columns\n .map((column) => interpreterUtils.formatStringColumn(\"postgres\", column))\n .join(\", \");\n\n const allValues: any[] = [];\n const valuesClauses: string[] = [];\n let paramIndex = insertNode.currParamIndex;\n\n for (const record of insertNode.records) {\n const recordValues = columns.map((column) => record[column]);\n\n const placeholders: string[] = [];\n for (let i = 0; i < columns.length; i++) {\n const value = recordValues[i];\n\n if (value instanceof RawNode) {\n placeholders.push(value.rawValue);\n } else {\n allValues.push(value);\n placeholders.push(`$${paramIndex++}${this.formatTypeCast(value)}`);\n }\n }\n\n valuesClauses.push(`(${placeholders.join(\", \")})`);\n }\n\n let sql = `${formattedTable} (${formattedColumns}) values ${valuesClauses.join(\", \")}`;\n\n if (!insertNode.disableReturning) {\n if (insertNode.returning && insertNode.returning.length) {\n const returningCols = insertNode.returning\n .map((column) =>\n interpreterUtils.formatStringColumn(\"postgres\", column),\n )\n .join(\", \");\n sql += ` returning ${returningCols}`;\n } else {\n sql += \" returning *\";\n }\n }\n\n return {\n sql,\n bindings: allValues,\n };\n }\n\n private formatTypeCast(value: any): string {\n let typeCast = \"\";\n if (Buffer.isBuffer(value)) {\n typeCast = \"::bytea\";\n } else if (Array.isArray(value)) {\n typeCast = \"::array\";\n } else if (\n typeof value === \"object\" &&\n value !== null &&\n !(value instanceof Date)\n ) {\n typeCast = \"::jsonb\";\n } else if (typeof value === \"boolean\") {\n typeCast = \"::boolean\";\n } else if (typeof value === \"bigint\") {\n typeCast = \"::bigint\";\n }\n\n return typeCast;\n }\n}\n\nexport default new PostgresInsertInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { JoinNode } from \"../../../ast/query/node/join/join\";\nimport type { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresJoinInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const joinNode = node as JoinNode;\n if (joinNode.isRawValue) {\n return {\n sql: joinNode.table,\n bindings: [],\n };\n }\n\n const utils = new InterpreterUtils(this.model);\n\n let leftColumnStr = joinNode.left;\n if (!leftColumnStr.includes(\".\")) {\n leftColumnStr = `${joinNode.table}.${leftColumnStr}`;\n }\n\n let rightColumnStr = joinNode.right;\n if (!rightColumnStr.includes(\".\")) {\n rightColumnStr = `${this.model.table}.${rightColumnStr}`;\n }\n\n const leftSql = utils.formatStringColumn(\"postgres\", leftColumnStr);\n const rightSql = utils.formatStringColumn(\"postgres\", rightColumnStr);\n const tableSql = utils.formatStringTable(\"postgres\", joinNode.table);\n\n const sql = `${tableSql} on ${leftSql} ${joinNode.on?.operator} ${rightSql}`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new PostgresJoinInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { LimitNode } from \"../../../ast/query/node/limit/limit\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresLimitInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const limitNode = node as LimitNode;\n\n const idx = limitNode.currParamIndex;\n return {\n sql: `$${idx}`,\n bindings: [limitNode.limit],\n };\n }\n}\n\nexport default new PostgresLimitInterpreter();\n","import { LockNode } from \"../../../ast/query/node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\n\nconst lockTypeToSql: Record<string, string> = {\n for_update: \"for update\",\n for_share: \"for share\",\n for_no_key_update: \"for no key update\",\n for_key_share: \"for key share\",\n};\n\nexport class PostgresLockInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): { sql: string; bindings: any[] } {\n const lockNode = node as LockNode;\n let sql = lockTypeToSql[lockNode.lockType] || \"for update\";\n if (lockNode.skipLocked) {\n sql += \" skip locked\";\n }\n\n if (lockNode.noWait) {\n sql += \" nowait\";\n }\n return {\n sql,\n bindings: [],\n };\n }\n}\n\nexport default new PostgresLockInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { OffsetNode } from \"../../../ast/query/node/offset/offset\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresOffsetInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const offsetNode = node as OffsetNode;\n\n const idx = offsetNode.currParamIndex;\n return {\n sql: `$${idx}`,\n bindings: [offsetNode.offset],\n };\n }\n}\n\nexport default new PostgresOffsetInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { OnDuplicateNode } from \"../../../ast/query/node/on_duplicate\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresOnDuplicateInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const onDuplicateNode = node as OnDuplicateNode;\n\n if (onDuplicateNode.isRawValue) {\n return {\n sql: onDuplicateNode.table,\n bindings: [],\n };\n }\n\n const interpreterUtils = new InterpreterUtils(this.model);\n const formattedConflictColumns = onDuplicateNode.conflictColumns\n .map((column) => interpreterUtils.formatStringColumn(\"postgres\", column))\n .join(\", \");\n\n if (onDuplicateNode.mode === \"ignore\") {\n return {\n sql: `on conflict (${formattedConflictColumns}) do nothing`,\n bindings: [],\n };\n }\n\n const updateSet = onDuplicateNode.columnsToUpdate\n .map(\n (column) =>\n `${interpreterUtils.formatStringColumn(\"postgres\", column)} = excluded.${interpreterUtils.formatStringColumn(\"postgres\", column)}`,\n )\n .join(\", \");\n\n let sql = `on conflict (${formattedConflictColumns}) do update set ${updateSet}`;\n\n if (onDuplicateNode.returning && onDuplicateNode.returning.length) {\n const returningCols = onDuplicateNode.returning\n .map((column) =>\n interpreterUtils.formatStringColumn(\"postgres\", column),\n )\n .join(\", \");\n sql += ` returning ${returningCols}`;\n } else {\n sql += \" returning *\";\n }\n\n return {\n sql,\n bindings: [],\n };\n }\n}\n\nexport default new PostgresOnDuplicateInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { OrderByNode } from \"../../../ast/query/node/order_by/order_by\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { Model } from \"../../../models/model\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresOrderByInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const orderByNode = node as OrderByNode;\n if (orderByNode.isRawValue) {\n return {\n sql: orderByNode.column,\n bindings: [],\n };\n }\n\n const columnSql = new InterpreterUtils(this.model).formatStringColumn(\n \"postgres\",\n orderByNode.column,\n );\n const directionSql = orderByNode.direction.toLowerCase();\n\n return {\n sql: `${columnSql} ${directionSql}`,\n bindings: [],\n };\n }\n}\n\nexport default new PostgresOrderByInterpreter();\n","import { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresRawInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): { sql: string; bindings: any[] } {\n const rawNode = node as RawNode;\n return {\n sql: rawNode.rawValue,\n bindings: [],\n };\n }\n}\n\nexport default new PostgresRawInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { ForeignKeyInfoNode } from \"../../../ast/query/node/schema/foreign_key_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresForeignKeyInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as ForeignKeyInfoNode;\n const table = node.table;\n const sql = `SELECT\n tc.constraint_name as name,\n kcu.column_name as column_name,\n ccu.table_name as referenced_table,\n ccu.column_name as referenced_column,\n rc.update_rule as on_update,\n rc.delete_rule as on_delete\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema\n JOIN information_schema.constraint_column_usage ccu\n ON ccu.constraint_name = tc.constraint_name AND ccu.table_schema = tc.table_schema\n JOIN information_schema.referential_constraints rc\n ON rc.constraint_name = tc.constraint_name AND rc.constraint_schema = tc.table_schema\n WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_schema = current_schema() AND tc.table_name = '${table}'\n ORDER BY kcu.ordinal_position`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new PostgresForeignKeyInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { IndexInfoNode } from \"../../../ast/query/node/schema/index_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresIndexInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as IndexInfoNode;\n const table = node.table;\n const sql = `SELECT\n i.relname as index_name,\n a.attname as column_name,\n ix.indisunique as is_unique\n FROM\n pg_class t,\n pg_class i,\n pg_index ix,\n pg_attribute a,\n pg_namespace n\n WHERE\n t.oid = ix.indrelid\n AND i.oid = ix.indexrelid\n AND a.attrelid = t.oid\n AND a.attnum = ANY(ix.indkey)\n AND t.relkind = 'r'\n AND t.relname = '${table}'\n AND t.relnamespace = n.oid\n AND n.nspname = current_schema()\n AND i.relname NOT LIKE 'pk_%'`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new PostgresIndexInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { PrimaryKeyInfoNode } from \"../../../ast/query/node/schema/primary_key_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresPrimaryKeyInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as PrimaryKeyInfoNode;\n const table = node.table;\n const sql = `SELECT\n tc.constraint_name as name,\n kcu.column_name as column_name\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema\n WHERE tc.constraint_type = 'PRIMARY KEY' AND tc.table_schema = current_schema() AND tc.table_name = '${table}'\n ORDER BY kcu.ordinal_position`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new PostgresPrimaryKeyInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { TableInfoNode } from \"../../../ast/query/node/schema/table_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresTableInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as TableInfoNode;\n const table = node.table;\n const sql = `SELECT column_name,\n data_type,\n is_nullable,\n column_default,\n character_maximum_length AS char_length,\n numeric_precision AS numeric_precision,\n numeric_scale AS numeric_scale\nFROM information_schema.columns\nWHERE table_schema = current_schema()\n AND table_name = '${table}'\nORDER BY ordinal_position`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new PostgresTableInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { SelectNode } from \"../../../ast/query/node/select/basic_select\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresSelectInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const selectNode = node as SelectNode;\n if (selectNode.isRawValue) {\n return {\n sql: selectNode.column as string,\n bindings: [],\n };\n }\n\n const columnResult = this.formatColumn(\n selectNode.column,\n selectNode.sqlFunction,\n );\n const aliasSql = this.formatAlias(selectNode.alias);\n return {\n sql: `${columnResult.sql}${aliasSql}`,\n bindings: columnResult.bindings,\n };\n }\n\n private formatColumn(\n column: string | QueryNode | QueryNode[],\n sqlFunction?: string,\n ): ReturnType<typeof AstParser.prototype.parse> {\n if (typeof column === \"string\") {\n const col = new InterpreterUtils(this.model).formatStringColumn(\n \"postgres\",\n column,\n );\n let sql = col;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}(${col})`;\n }\n return {\n sql,\n bindings: [],\n };\n }\n\n if (Array.isArray(column) && column.length > 0) {\n const astParser = new AstParser(\n this.model,\n \"postgres\" as SqlDataSourceType,\n );\n const result = astParser.parse(column);\n let sql = `(${result.sql})`;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}${sql}`;\n }\n return {\n sql,\n bindings: result.bindings,\n };\n }\n\n if (!Array.isArray(column)) {\n const astParser = new AstParser(\n this.model,\n \"postgres\" as SqlDataSourceType,\n );\n const result = astParser.parse([column]);\n let sql = `(${result.sql})`;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}${sql}`;\n }\n return {\n sql,\n bindings: result.bindings,\n };\n }\n\n const formattedColumns = column.map((col) => {\n if (typeof col === \"string\") {\n const formatted = new InterpreterUtils(this.model).formatStringColumn(\n \"postgres\",\n col,\n );\n if (sqlFunction) {\n return `${sqlFunction.toLowerCase()}(${formatted})`;\n }\n return formatted;\n }\n\n const astParser = new AstParser(\n this.model,\n \"postgres\" as SqlDataSourceType,\n );\n const result = astParser.parse([col]);\n let sql = `(${result.sql})`;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}${sql}`;\n }\n return sql;\n });\n\n return {\n sql: formattedColumns.join(\", \"),\n bindings: [],\n };\n }\n\n private formatAlias(alias?: string): string {\n if (alias && alias.length > 0) {\n return ` as \"${alias}\"`;\n }\n return \"\";\n }\n}\n\nexport default new PostgresSelectInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { FromNode } from \"../../../ast/query/node/from\";\nimport { TruncateNode } from \"../../../ast/query/node/truncate\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresTruncateInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const truncateNode = node as TruncateNode;\n\n if (truncateNode.isRawValue && typeof truncateNode.fromNode === \"string\") {\n return {\n sql: truncateNode.fromNode,\n bindings: [],\n };\n }\n\n const formattedTable = new InterpreterUtils(\n this.model,\n ).getFromForWriteOperations(\"postgres\", truncateNode.fromNode as FromNode);\n\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n}\n\nexport default new PostgresTruncateInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { UnionNode } from \"../../../ast/query/node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { Model } from \"../../../models/model\";\n\nclass PostgresUnionInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const unionNode = node as UnionNode;\n const parser = new AstParser(this.model, \"postgres\");\n const nodes = Array.isArray(unionNode.query)\n ? unionNode.query\n : [unionNode.query];\n\n const ast =\n typeof unionNode.query === \"string\"\n ? { sql: unionNode.query, bindings: [] }\n : parser.parse(\n nodes.filter(Boolean) as QueryNode[],\n unionNode.currParamIndex,\n );\n\n return {\n sql: ast.sql,\n bindings: ast.bindings,\n };\n }\n}\n\nexport default new PostgresUnionInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { FromNode } from \"../../../ast/query/node/from\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { UpdateNode } from \"../../../ast/query/node/update\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresUpdateInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const updateNode = node as UpdateNode;\n if (updateNode.isRawValue && typeof updateNode.fromNode === \"string\") {\n return {\n sql: updateNode.fromNode as string,\n bindings: updateNode.values,\n };\n }\n\n const interpreterUtils = new InterpreterUtils(this.model);\n const formattedTable = interpreterUtils.getFromForWriteOperations(\n \"postgres\",\n updateNode.fromNode as FromNode,\n );\n\n if (!updateNode.columns.length || !updateNode.values.length) {\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n\n let rawNodeCount = 0;\n const finalBindings: any[] = [];\n const setClause = updateNode.columns\n .map((column, index) => {\n const idx = updateNode.currParamIndex + index - rawNodeCount;\n const value = updateNode.values[index];\n\n if (value instanceof RawNode) {\n rawNodeCount++;\n return `${interpreterUtils.formatStringColumn(\"postgres\", column)} = ${value.rawValue}`;\n }\n\n finalBindings.push(value);\n return `${interpreterUtils.formatStringColumn(\"postgres\", column)} = $${idx}${this.formatTypeCast(value)}`;\n })\n .join(\", \");\n\n return {\n sql: `${formattedTable} set ${setClause}`,\n bindings: finalBindings,\n };\n }\n\n private formatTypeCast(value: any): string {\n let typeCast = \"\";\n if (Buffer.isBuffer(value)) {\n typeCast = \"::bytea\";\n } else if (Array.isArray(value)) {\n typeCast = \"::array\";\n } else if (\n typeof value === \"object\" &&\n value !== null &&\n !(value instanceof Date)\n ) {\n typeCast = \"::jsonb\";\n } else if (typeof value === \"boolean\") {\n typeCast = \"::boolean\";\n } else if (typeof value === \"bigint\") {\n typeCast = \"::bigint\";\n }\n\n return typeCast;\n }\n}\n\nexport default new PostgresUpdateInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport type { WhereNode } from \"../../../ast/query/node/where/where\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresWhereInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const whereNode = node as WhereNode;\n if (whereNode.isRawValue) {\n return {\n sql: whereNode.column,\n bindings: (whereNode.value as any[]) ?? [],\n };\n }\n\n const idx = whereNode.currParamIndex;\n let sql = \"\";\n let bindings: any[] = [];\n\n if (this.isRawNode(whereNode.value)) {\n const formattedRight = this.formatRawIdentifierIfPossible(\n whereNode.value.rawValue,\n );\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"postgres\", whereNode.column)} ${whereNode.operator} ${formattedRight}`;\n bindings = [];\n } else if (Array.isArray(whereNode.value)) {\n if (whereNode.operator.toLowerCase() === \"between\") {\n const placeholders = `$${idx} AND $${idx + 1}`;\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"postgres\", whereNode.column)} between ${placeholders}`;\n bindings = whereNode.value;\n } else {\n const placeholders = whereNode.value\n .map((_, i) => `$${idx + i}`)\n .join(\", \");\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"postgres\", whereNode.column)} ${whereNode.operator} (${placeholders})`;\n bindings = whereNode.value;\n }\n } else {\n if (whereNode.operator.includes(\"null\")) {\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"postgres\", whereNode.column)} ${whereNode.operator}`;\n bindings = [];\n } else if (whereNode.value === undefined) {\n return { sql: \"\", bindings: [] };\n } else {\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"postgres\", whereNode.column)} ${whereNode.operator} $${idx}`;\n bindings = [whereNode.value];\n }\n }\n\n if (whereNode.isNegated) {\n sql = `not (${sql})`;\n }\n\n return { sql: sql.trim(), bindings };\n }\n\n private isRawNode(value: any): value is RawNode {\n return (\n value &&\n typeof value === \"object\" &&\n \"rawValue\" in value &&\n value.isRawValue === true\n );\n }\n\n private formatRawIdentifierIfPossible(raw: string): string {\n const isIdentifier =\n /^[A-Za-z_][A-Za-z0-9_]*(\\.(\\*|[A-Za-z_][A-Za-z0-9_]*))?$/.test(raw);\n if (!isIdentifier) {\n return raw;\n }\n return new InterpreterUtils(this.model).formatStringColumn(\"postgres\", raw);\n }\n}\n\nexport default new PostgresWhereInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { WhereGroupNode } from \"../../../ast/query/node/where/where_group\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresWhereGroupInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const groupNode = node as WhereGroupNode;\n if (!groupNode.nodes || !groupNode.nodes.length) {\n return { sql: \"\", bindings: [] };\n }\n\n const astParser = new AstParser(\n this.model,\n \"postgres\" as SqlDataSourceType,\n );\n\n const { sql, bindings } = astParser.parse(\n groupNode.nodes,\n groupNode.currParamIndex,\n true,\n );\n\n return {\n sql: `(${sql})`,\n bindings,\n };\n }\n}\n\nexport default new PostgresWhereGroupInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { WhereJsonNode } from \"../../../ast/query/node/where/where_json\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresWhereJsonInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const whereJsonNode = node as WhereJsonNode;\n if (whereJsonNode.isRawValue) {\n return {\n sql: whereJsonNode.column,\n bindings: [],\n };\n }\n\n const idx = whereJsonNode.currParamIndex;\n let sql = \"\";\n let bindings: any[] = [];\n\n const columnSql = new InterpreterUtils(this.model).formatStringColumn(\n \"postgres\",\n whereJsonNode.column,\n );\n\n switch (whereJsonNode.jsonOperator) {\n case \"=\":\n // Strict equality - both objects must be exactly equal\n sql = `${columnSql} = $${idx}::jsonb`;\n bindings = [JSON.stringify(whereJsonNode.value)];\n break;\n case \"contains\":\n sql = `${columnSql} @> $${idx}::jsonb`;\n bindings = [JSON.stringify(whereJsonNode.value)];\n break;\n case \"not contains\":\n sql = `${columnSql} @> $${idx}::jsonb`;\n bindings = [JSON.stringify(whereJsonNode.value)];\n break;\n case \"raw\":\n sql = whereJsonNode.column;\n bindings = Array.isArray(whereJsonNode.value)\n ? whereJsonNode.value\n : [];\n break;\n }\n\n if (whereJsonNode.isNegated) {\n sql = `NOT (${sql})`;\n }\n\n return { sql: sql.trim(), bindings };\n }\n}\n\nexport default new PostgresWhereJsonInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { WhereSubqueryNode } from \"../../../ast/query/node/where/where_subquery\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresWhereSubqueryInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const subqueryNode = node as WhereSubqueryNode;\n\n if (this.isStringSubquery(subqueryNode.subquery)) {\n return this.handleStringSubquery(subqueryNode);\n }\n\n if (this.isArraySubquery(subqueryNode.subquery)) {\n return this.handleArraySubquery(subqueryNode);\n }\n\n return this.handleObjectSubquery(subqueryNode);\n }\n\n private isStringSubquery(\n subquery: string | QueryNode | QueryNode[],\n ): subquery is string {\n return typeof subquery === \"string\";\n }\n\n private isArraySubquery(\n subquery: string | QueryNode | QueryNode[],\n ): subquery is QueryNode[] {\n return Array.isArray(subquery);\n }\n\n private handleStringSubquery(\n subqueryNode: WhereSubqueryNode,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const sql = `${subqueryNode.column} ${subqueryNode.operator} (${subqueryNode.subquery})`;\n return { sql: sql.trim(), bindings: [] };\n }\n\n private handleArraySubquery(\n subqueryNode: WhereSubqueryNode,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const astParser = new AstParser(\n this.model,\n \"postgres\" as SqlDataSourceType,\n );\n const { sql: subquerySql, bindings: subqueryBindings } = astParser.parse(\n subqueryNode.subquery as QueryNode[],\n subqueryNode.currParamIndex,\n );\n\n const sql = `${subqueryNode.column} ${subqueryNode.operator} (${subquerySql})`;\n return { sql: sql.trim(), bindings: subqueryBindings };\n }\n\n private handleObjectSubquery(\n subqueryNode: WhereSubqueryNode,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const astParser = new AstParser(\n this.model,\n \"postgres\" as SqlDataSourceType,\n );\n const { sql: subquerySql, bindings: subqueryBindings } = astParser.parse(\n [subqueryNode.subquery as QueryNode],\n subqueryNode.currParamIndex,\n );\n\n const sql = `${subqueryNode.column} ${subqueryNode.operator} (${subquerySql})`;\n return { sql: sql.trim(), bindings: subqueryBindings };\n }\n}\n\nexport default new PostgresWhereSubqueryInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { WithNode } from \"../../../ast/query/node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresWithInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(\n node: QueryNode | string,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const withNode = node as WithNode;\n const parser = new AstParser(this.model, \"postgres\");\n const nodes = Array.isArray(withNode.body)\n ? withNode.body\n : [withNode.body];\n\n const ast = parser.parse(\n nodes.filter(Boolean) as QueryNode[],\n withNode.currParamIndex,\n );\n\n const materializedClause =\n withNode.clause === \"materialized\" ? \" materialized\" : \"\";\n\n return {\n sql: `${withNode.alias} as${materializedClause} (${ast.sql})`,\n bindings: ast.bindings,\n };\n }\n}\n\nexport default new PostgresWithInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { AddColumnNode } from \"../../../ast/query/node/alter_table/add_column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteAddColumnInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const acNode = node as AddColumnNode;\n const ast = new AstParser(this.model, \"sqlite\" as SqlDataSourceType);\n let { sql } = ast.parse([acNode.column]);\n\n const inlineConstraints = (acNode as any).inlineConstraints;\n if (inlineConstraints && inlineConstraints.length > 0) {\n const constraintParts: string[] = [];\n\n for (const constraint of inlineConstraints) {\n const { sql: constraintSql } = ast.parse([constraint]);\n constraintParts.push(constraintSql);\n }\n\n if (constraintParts.length > 0) {\n sql += ` ${constraintParts.join(\" \")}`;\n }\n }\n\n return { sql: `add column ${sql}`, bindings: [] };\n }\n}\n\nexport default new SqliteAddColumnInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteAddConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(_node: QueryNode) {\n return { sql: \"\", bindings: [] };\n }\n}\nexport default new SqliteAddConstraintInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteAlterColumnTypeInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(_node: QueryNode) {\n return { sql: \"\", bindings: [] };\n }\n}\nexport default new SqliteAlterColumnTypeInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { AlterTableNode } from \"../../../ast/query/node/alter_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteAlterTableInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const atNode = node as AlterTableNode;\n const utils = new InterpreterUtils(this.model);\n const tableName = utils.formatStringTable(\"sqlite\", atNode.table);\n\n if (!atNode.children || !atNode.children.length) {\n return { sql: \"\", bindings: [] };\n }\n\n const astParser = new AstParser(this.model, \"sqlite\" as SqlDataSourceType);\n const parts: string[] = [];\n const bindings: any[] = [];\n\n let awaitingConstraints = false;\n for (const child of atNode.children) {\n const { sql, bindings: childBindings } = astParser.parse([child]);\n if (!sql || !sql.trim()) {\n continue;\n }\n\n if (child.file === \"add_column\") {\n parts.push(sql);\n awaitingConstraints = true;\n } else if (child.file === \"add_constraint\" && awaitingConstraints) {\n const last = parts.pop() ?? \"\";\n const cleanedSql = sql.replace(/^\\s*add\\s+/i, \"\").trimStart();\n parts.push(`${last} ${cleanedSql}`);\n } else if (\n child.file === \"set_not_null\" ||\n child.file === \"drop_not_null\"\n ) {\n // SQLite doesn't support these operations, skip them\n continue;\n } else if (\n child.file === \"set_default\" ||\n child.file === \"drop_default\"\n ) {\n // SQLite doesn't support these operations, skip them\n continue;\n } else {\n parts.push(sql);\n awaitingConstraints = false;\n }\n\n bindings.push(...childBindings);\n }\n\n const stmt = parts.join(\", \");\n const ifExists = atNode.ifExists ? \"if exists \" : \"\";\n\n if (!stmt.trim()) {\n return { sql: \"\", bindings: [] };\n }\n\n const finalSql = `${ifExists}${tableName} ${stmt}`;\n return { sql: finalSql, bindings };\n }\n}\n\nexport default new SqliteAlterTableInterpreter();\n","import { DropColumnNode } from \"../../../ast/query/node/alter_table/drop_column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteDropColumnInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const d = node as DropColumnNode;\n return { sql: `drop column \"${d.column}\"`, bindings: [] };\n }\n}\n\nexport default new SqliteDropColumnInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteDropConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(_node: QueryNode) {\n return { sql: \"\", bindings: [] };\n }\n}\nexport default new SqliteDropConstraintInterpreter();\n","import { DropDefaultNode } from \"../../../ast/query/node/alter_table/drop_default\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteDropDefaultInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as DropDefaultNode;\n return { sql: `alter column \"${n.column}\" drop default`, bindings: [] };\n }\n}\nexport default new SqliteDropDefaultInterpreter();\n","import { DropNotNullNode } from \"../../../ast/query/node/alter_table/drop_not_null\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteDropNotNullInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as DropNotNullNode;\n return { sql: `alter column \"${n.column}\" drop not null`, bindings: [] };\n }\n}\nexport default new SqliteDropNotNullInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteDropPrimaryKeyInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(_node: QueryNode) {\n // Not supported directly in SQLite (would require table rebuild)\n return { sql: ``, bindings: [] };\n }\n}\nexport default new SqliteDropPrimaryKeyInterpreter();\n","import { RenameColumnNode } from \"../../../ast/query/node/alter_table/rename_column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteRenameColumnInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const r = node as RenameColumnNode;\n return {\n sql: `rename column \"${r.oldName}\" to \"${r.newName}\"`,\n bindings: [],\n };\n }\n}\nexport default new SqliteRenameColumnInterpreter();\n","import { RenameTableNode } from \"../../../ast/query/node/alter_table/rename_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteRenameTableInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const rt = node as RenameTableNode;\n return { sql: `\"${rt.newName}\"`, bindings: [] };\n }\n}\nexport default new SqliteRenameTableInterpreter();\n","import { SetDefaultNode } from \"../../../ast/query/node/alter_table/set_default\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteSetDefaultInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as SetDefaultNode;\n let val: string;\n\n if (n.defaultValue instanceof RawNode) {\n val = n.defaultValue.rawValue;\n } else if (n.defaultValue === \"NULL\") {\n val = \"null\";\n } else if (n.defaultValue === \"TRUE\" || n.defaultValue === \"FALSE\") {\n val = n.defaultValue.toLowerCase();\n } else if (\n typeof n.defaultValue === \"string\" &&\n n.defaultValue !== \"null\" &&\n n.defaultValue !== \"true\" &&\n n.defaultValue !== \"false\"\n ) {\n val = `'${n.defaultValue}'`;\n } else {\n val = String(n.defaultValue);\n }\n\n return {\n sql: `alter column \"${n.column}\" set default ${val}`,\n bindings: [],\n };\n }\n}\nexport default new SqliteSetDefaultInterpreter();\n","import { SetNotNullNode } from \"../../../ast/query/node/alter_table/set_not_null\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteSetNotNullInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as SetNotNullNode;\n return { sql: `alter column \"${n.column}\" set not null`, bindings: [] };\n }\n}\nexport default new SqliteSetNotNullInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { ColumnTypeNode } from \"../../../ast/query/node/column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { getColumnValue } from \"../../../resources/utils\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteColumnTypeInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const colNode = node as ColumnTypeNode;\n if (colNode.isRawValue) {\n return { sql: colNode.column as string, bindings: [] };\n }\n\n const utils = new InterpreterUtils(this.model);\n const columnName = utils.formatStringColumn(\n \"sqlite\",\n getColumnValue(colNode.column),\n );\n const dt = colNode.dataType.toLowerCase();\n\n if (dt === \"char\" || dt === \"varchar\") {\n return { sql: `${columnName} text`, bindings: [] };\n } else if (dt === \"uuid\") {\n return { sql: `${columnName} varchar(36)`, bindings: [] };\n } else if (dt === \"ulid\") {\n return { sql: `${columnName} varchar(26)`, bindings: [] };\n }\n\n if (dt.includes(\"text\")) {\n return { sql: `${columnName} text`, bindings: [] };\n } else if (dt === \"integer\" || dt === \"bigint\" || dt === \"int\") {\n return { sql: `${columnName} integer`, bindings: [] };\n } else if (dt === \"tinyint\") {\n return { sql: `${columnName} integer`, bindings: [] };\n } else if (dt === \"smallint\") {\n return { sql: `${columnName} integer`, bindings: [] };\n } else if (dt === \"mediumint\") {\n return { sql: `${columnName} integer`, bindings: [] };\n }\n\n if (dt === \"float\" || dt === \"double\") {\n return { sql: `${columnName} real`, bindings: [] };\n } else if (dt === \"decimal\" || dt === \"numeric\") {\n const precision = colNode.precision ?? 10;\n const scale = colNode.scale ?? 0;\n return {\n sql: `${columnName} numeric(${precision}, ${scale})`,\n bindings: [],\n };\n }\n\n if (\n dt === \"date\" ||\n dt === \"datetime\" ||\n dt === \"timestamp\" ||\n dt === \"time\" ||\n dt === \"year\"\n ) {\n return { sql: `${columnName} text`, bindings: [] };\n } else if (dt === \"boolean\") {\n return { sql: `${columnName} integer`, bindings: [] };\n } else if (dt === \"json\" || dt === \"jsonb\") {\n return { sql: `${columnName} text`, bindings: [] };\n } else if (dt === \"enum\") {\n return { sql: `${columnName} text`, bindings: [] };\n } else if (\n dt === \"bytea\" ||\n dt === \"blob\" ||\n dt === \"binary\" ||\n dt === \"longblob\" ||\n dt === \"mediumblob\" ||\n dt === \"tinyblob\"\n ) {\n return { sql: `${columnName} blob`, bindings: [] };\n } else if (dt === \"integer\" || dt === \"int\") {\n if (colNode.autoIncrement) {\n return { sql: `${columnName} serial`, bindings: [] };\n }\n\n return { sql: `${columnName} integer`, bindings: [] };\n } else if (\n dt === \"geometry\" ||\n dt === \"point\" ||\n dt === \"linestring\" ||\n dt === \"polygon\" ||\n dt === \"multipoint\"\n ) {\n return { sql: `${columnName} ${dt}`, bindings: [] };\n }\n\n return {\n sql: `${columnName} ${dt} ${colNode.length ? `(${colNode.length})` : \"\"}`,\n bindings: [],\n };\n }\n}\n\nexport default new SqliteColumnTypeInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteAfterConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(_node: QueryNode) {\n return { sql: \"\", bindings: [] };\n }\n}\nexport default new SqliteAfterConstraintInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { ConstraintNode } from \"../../../ast/query/node/constraint\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { getColumnValue } from \"../../../resources/utils\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const cNode = node as ConstraintNode;\n const utils = new InterpreterUtils(this.model);\n const prefix = cNode.constraintName\n ? `constraint \"${cNode.constraintName}\" `\n : \"\";\n\n if (cNode.constraintType === \"primary_key\") {\n const autoIncrement = Boolean((cNode as any).autoIncrement);\n const columnType = ((cNode as any).columnType || \"\").toLowerCase();\n if (\n autoIncrement &&\n (columnType === \"integer\" || columnType === \"bigint\")\n ) {\n return { sql: `${prefix}primary key autoincrement`, bindings: [] };\n }\n return { sql: `${prefix}primary key`, bindings: [] };\n }\n\n if (cNode.constraintType === \"unique\") {\n if (cNode.columns && cNode.columns.length) {\n const cols = cNode.columns\n .map((c) => utils.formatStringColumn(\"sqlite\", getColumnValue(c)))\n .join(\", \");\n\n if (!cNode.constraintName) {\n return { sql: `unique`, bindings: [] };\n }\n return { sql: `${prefix}unique (${cols})`, bindings: [] };\n }\n return { sql: `unique`, bindings: [] };\n }\n\n if (cNode.constraintType === \"not_null\") {\n return { sql: `not null`, bindings: [] };\n }\n\n if (cNode.constraintType === \"null\") {\n return { sql: `null`, bindings: [] };\n }\n\n if (cNode.constraintType === \"default\") {\n const val = cNode.defaultValue;\n if (val instanceof RawNode) {\n return { sql: `default ${val.rawValue}`, bindings: [] };\n }\n if (val === \"NULL\" || val === null) {\n return { sql: `default null`, bindings: [] };\n }\n if (val === \"TRUE\" || val === \"FALSE\") {\n return { sql: `default ${val.toLowerCase()}`, bindings: [] };\n }\n if (typeof val === \"string\") {\n return { sql: `default '${val}'`, bindings: [] };\n }\n return { sql: `default ${val}`, bindings: [] };\n }\n\n if (cNode.constraintType === \"foreign_key\") {\n if (!cNode.references) {\n return { sql: \"\", bindings: [] };\n }\n const cols = (cNode.columns ?? [])\n .map((c) => utils.formatStringColumn(\"sqlite\", getColumnValue(c)))\n .join(\", \");\n const refTable = utils.formatStringTable(\n \"sqlite\",\n cNode.references.table,\n );\n const refCols = cNode.references.columns\n .map((c) => utils.formatStringColumn(\"sqlite\", getColumnValue(c)))\n .join(\", \");\n let sql = `${prefix}foreign key (${cols}) references ${refTable}(${refCols})`;\n if (cNode.onDelete) {\n sql += ` on delete ${cNode.onDelete}`;\n }\n if (cNode.onUpdate) {\n sql += ` on update ${cNode.onUpdate}`;\n }\n return { sql, bindings: [] };\n }\n\n return { sql: \"\", bindings: [] };\n }\n}\n\nexport default new SqliteConstraintInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { CreateTableNode } from \"../../../ast/query/node/create_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteCreateTableInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const ctNode = node as CreateTableNode;\n const utils = new InterpreterUtils(this.model);\n const tableName = utils.formatStringTable(\"sqlite\", ctNode.table);\n\n if (!ctNode.children || !ctNode.children.length) {\n return { sql: `${tableName} ()`, bindings: [] };\n }\n\n const astParser = new AstParser(this.model, \"sqlite\" as SqlDataSourceType);\n const parts: string[] = [];\n const bindings: any[] = [];\n\n for (const child of ctNode.children) {\n const { sql, bindings: childBindings } = astParser.parse([child]);\n\n if (child.folder === \"constraint\") {\n const last = parts.pop() ?? \"\";\n const inlineConstraintSql = sql;\n\n if (\n /not null/i.test(inlineConstraintSql) ||\n /null/i.test(inlineConstraintSql) ||\n /default/i.test(inlineConstraintSql) ||\n /primary key/i.test(inlineConstraintSql)\n ) {\n let combined = `${last} ${inlineConstraintSql}`.trim();\n combined = combined.replace(\n /(references\\s+\"[^\"]+\"\\s*\\([^)]*\\))\\s+not null/i,\n \"not null $1\",\n );\n\n parts.push(combined);\n bindings.push(...childBindings);\n continue;\n }\n\n parts.push(last);\n parts.push(inlineConstraintSql);\n bindings.push(...childBindings);\n continue;\n }\n\n parts.push(sql);\n bindings.push(...childBindings);\n }\n\n for (const constraint of ctNode.namedConstraints) {\n const { sql, bindings: constraintBindings } = astParser.parse([\n constraint,\n ]);\n\n parts.push(sql);\n bindings.push(...constraintBindings);\n }\n\n const columnsSql = parts.join(\", \");\n const ifNotExists = ctNode.ifNotExists ? \"if not exists \" : \"\";\n const finalSql = `${ifNotExists}${tableName} (${columnsSql})`;\n return { sql: finalSql, bindings };\n }\n}\n\nexport default new SqliteCreateTableInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { DeleteNode } from \"../../../ast/query/node/delete\";\nimport { FromNode } from \"../../../ast/query/node/from\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteDeleteInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const deleteNode = node as DeleteNode;\n\n if (\n deleteNode.isRawValue &&\n typeof deleteNode.fromNode.table === \"string\"\n ) {\n return {\n sql: deleteNode.fromNode.table,\n bindings: [],\n };\n }\n\n const formattedTable = new InterpreterUtils(\n this.model,\n ).getFromForWriteOperations(\"sqlite\", deleteNode.fromNode as FromNode);\n\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n}\n\nexport default new SqliteDeleteInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { Model } from \"../../../models/model\";\n\nclass SqliteDistinctInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n return {\n sql: \"distinct\",\n bindings: [],\n };\n }\n}\n\nexport default new SqliteDistinctInterpreter();\n","import logger from \"../../../../utils/logger\";\nimport { AstParser } from \"../../../ast/parser\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { Model } from \"../../../models/model\";\n\nclass SqliteDistinctInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n logger.warn(\"SQLite does not support DISTINCT ON\");\n return {\n sql: \"\",\n bindings: [],\n };\n }\n}\n\nexport default new SqliteDistinctInterpreter();\n","import { DropTableNode } from \"../../../ast/query/node/drop_table/drop_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteDropTableInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const dt = node as DropTableNode;\n const utils = new InterpreterUtils(this.model);\n const tableSql = utils.formatStringTable(\"sqlite\", dt.table);\n const exists = dt.ifExists ? \"if exists \" : \"\";\n return { sql: `${exists}${tableSql}`, bindings: [] };\n }\n}\nexport default new SqliteDropTableInterpreter();\n","import { CreateExtensionNode } from \"../../../ast/query/node/extension/create_extension\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteCreateExtensionInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const ext = node as CreateExtensionNode;\n return {\n sql: `-- SQLite extensions are loaded dynamically, not created (extension: ${ext.extensionName})`,\n bindings: [],\n };\n }\n}\nexport default new SqliteCreateExtensionInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { FromNode } from \"../../../ast/query/node/from\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteFromInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const fromNode = node as FromNode;\n\n if (typeof fromNode.table === \"string\") {\n const interpreterUtils = new InterpreterUtils(this.model);\n\n if (fromNode.alias && fromNode.alias.length > 0) {\n const tableSql = interpreterUtils.formatStringTable(\n \"sqlite\",\n fromNode.table,\n );\n\n return {\n sql: `${tableSql} as \"${fromNode.alias}\"`,\n bindings: [],\n };\n }\n\n const tableSql = interpreterUtils.formatStringTable(\n \"sqlite\",\n fromNode.table,\n );\n\n return { sql: tableSql, bindings: [] };\n }\n\n const subQueryNodes = Array.isArray(fromNode.table)\n ? fromNode.table\n : [fromNode.table];\n\n const astParser = new AstParser(this.model, \"sqlite\" as SqlDataSourceType);\n const result = astParser.parse(subQueryNodes);\n\n const aliasSql =\n fromNode.alias && fromNode.alias.length ? ` as \"${fromNode.alias}\"` : \"\";\n\n return {\n sql: `(${result.sql})${aliasSql}`,\n bindings: result.bindings,\n };\n }\n}\n\nexport default new SqliteFromInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { GroupByNode } from \"../../../ast/query/node/group_by/group_by\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { Model } from \"../../../models/model\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteGroupByInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const groupByNode = node as GroupByNode;\n if (groupByNode.isRawValue) {\n return {\n sql: groupByNode.column,\n bindings: [],\n };\n }\n\n const columnSql = new InterpreterUtils(this.model).formatStringColumn(\n \"sqlite\",\n groupByNode.column,\n );\n\n return {\n sql: columnSql,\n bindings: [],\n };\n }\n}\n\nexport default new SqliteGroupByInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { HavingNode } from \"../../../ast/query/node/having/having\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteHavingInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const havingNode = node as HavingNode;\n if (havingNode.isRawValue) {\n return {\n sql: havingNode.column,\n bindings: havingNode.value as any[],\n };\n }\n\n const idx = havingNode.currParamIndex;\n let sql = \"\";\n let bindings: any[] = [];\n\n if (\n !(havingNode.value instanceof QueryNode) &&\n !Array.isArray(havingNode.value)\n ) {\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"sqlite\", havingNode.column)} ${havingNode.operator} $${idx}`;\n bindings = [havingNode.value];\n }\n\n if (Array.isArray(havingNode.value)) {\n const placeholders = havingNode.value\n .map((_, i) => `$${idx + i}`)\n .join(\", \");\n\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"sqlite\", havingNode.column)} ${havingNode.operator} (${placeholders})`;\n bindings = havingNode.value;\n }\n\n if (havingNode.isNegated) {\n sql = `not (${sql})`;\n }\n\n return { sql: sql.trim(), bindings };\n }\n}\n\nexport default new SqliteHavingInterpreter();\n","import { CreateIndexNode } from \"../../../ast/query/node/index_op/create_index\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteCreateIndexInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const ci = node as CreateIndexNode;\n const utils = new InterpreterUtils(this.model);\n const tableSql = utils.formatStringTable(\"sqlite\", ci.table);\n const cols = ci.columns.map((c) => `\"${c}\"`).join(\", \");\n const unique = ci.unique ? \"unique \" : \"\";\n return {\n sql: `${unique}\\\"${ci.indexName}\\\" on ${tableSql} (${cols})`,\n bindings: [],\n };\n }\n}\nexport default new SqliteCreateIndexInterpreter();\n","import { DropIndexNode } from \"../../../ast/query/node/index_op/drop_index\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteDropIndexInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const di = node as DropIndexNode;\n return { sql: ` \\\"${di.indexName}\\\"`, bindings: [] };\n }\n}\nexport default new SqliteDropIndexInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { InsertNode } from \"../../../ast/query/node/insert\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteInsertInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const insertNode = node as InsertNode;\n if (insertNode.isRawValue) {\n return {\n sql: insertNode.fromNode.table as string,\n bindings: [],\n };\n }\n\n const interpreterUtils = new InterpreterUtils(this.model);\n const formattedTable = interpreterUtils.getFromForWriteOperations(\n \"sqlite\",\n insertNode.fromNode,\n );\n\n if (!insertNode.records.length) {\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n\n const firstRecord = insertNode.records[0];\n const columns = Object.keys(firstRecord);\n\n if (!columns.length) {\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n\n const formattedColumns = columns\n .map((column) => interpreterUtils.formatStringColumn(\"sqlite\", column))\n .join(\", \");\n\n const allValues: any[] = [];\n const valuesClauses: string[] = [];\n\n for (const record of insertNode.records) {\n const recordValues = columns.map((column) => record[column]);\n\n const placeholders: string[] = [];\n for (const value of recordValues) {\n if (value instanceof RawNode) {\n placeholders.push(value.rawValue);\n } else {\n allValues.push(value);\n placeholders.push(\"?\");\n }\n }\n\n valuesClauses.push(`(${placeholders.join(\", \")})`);\n }\n\n const sql = `${formattedTable} (${formattedColumns}) VALUES ${valuesClauses.join(\", \")}`;\n\n return {\n sql,\n bindings: allValues,\n };\n }\n}\n\nexport default new SqliteInsertInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { JoinNode } from \"../../../ast/query/node/join/join\";\nimport type { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteJoinInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const joinNode = node as JoinNode;\n if (joinNode.isRawValue) {\n return {\n sql: joinNode.table,\n bindings: [],\n };\n }\n\n const utils = new InterpreterUtils(this.model);\n\n let leftColumnStr = joinNode.left;\n if (!leftColumnStr.includes(\".\")) {\n leftColumnStr = `${joinNode.table}.${leftColumnStr}`;\n }\n\n let rightColumnStr = joinNode.right;\n if (!rightColumnStr.includes(\".\")) {\n rightColumnStr = `${this.model.table}.${rightColumnStr}`;\n }\n\n const leftSql = utils.formatStringColumn(\"sqlite\", leftColumnStr);\n const rightSql = utils.formatStringColumn(\"sqlite\", rightColumnStr);\n const tableSql = utils.formatStringTable(\"sqlite\", joinNode.table);\n\n const sql = `${tableSql} on ${leftSql} ${joinNode.on?.operator} ${rightSql}`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new SqliteJoinInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { LimitNode } from \"../../../ast/query/node/limit/limit\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteLimitInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const limitNode = node as LimitNode;\n\n return {\n sql: `?`,\n bindings: [limitNode.limit],\n };\n }\n}\n\nexport default new SqliteLimitInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\n\nexport class SqliteLockInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): { sql: string; bindings: any[] } {\n // SQLite does not support FOR UPDATE/SHARE in the same way as other DBs\n return {\n sql: \"\",\n bindings: [],\n };\n }\n}\n\nexport default new SqliteLockInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { OffsetNode } from \"../../../ast/query/node/offset/offset\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteOffsetInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const offsetNode = node as OffsetNode;\n\n return {\n sql: `?`,\n bindings: [offsetNode.offset],\n };\n }\n}\n\nexport default new SqliteOffsetInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { OnDuplicateNode } from \"../../../ast/query/node/on_duplicate\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteOnDuplicateInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const onDuplicateNode = node as OnDuplicateNode;\n\n if (onDuplicateNode.isRawValue) {\n return {\n sql: onDuplicateNode.table,\n bindings: [],\n };\n }\n\n const interpreterUtils = new InterpreterUtils(this.model);\n const formattedConflictColumns = onDuplicateNode.conflictColumns\n .map((column) => interpreterUtils.formatStringColumn(\"sqlite\", column))\n .join(\", \");\n\n if (onDuplicateNode.mode === \"ignore\") {\n return {\n sql: `ON CONFLICT (${formattedConflictColumns}) DO NOTHING`,\n bindings: [],\n };\n }\n\n const updateSet = onDuplicateNode.columnsToUpdate\n .map(\n (column) =>\n `${interpreterUtils.formatStringColumn(\"sqlite\", column)} = EXCLUDED.${interpreterUtils.formatStringColumn(\"sqlite\", column)}`,\n )\n .join(\", \");\n\n return {\n sql: `ON CONFLICT (${formattedConflictColumns}) DO UPDATE SET ${updateSet}`,\n bindings: [],\n };\n }\n}\n\nexport default new SqliteOnDuplicateInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { OrderByNode } from \"../../../ast/query/node/order_by/order_by\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteOrderByInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const orderByNode = node as OrderByNode;\n if (orderByNode.isRawValue) {\n return {\n sql: orderByNode.column,\n bindings: [],\n };\n }\n\n const columnSql = new InterpreterUtils(this.model).formatStringColumn(\n \"sqlite\",\n orderByNode.column,\n );\n const directionSql = orderByNode.direction.toLowerCase();\n\n return {\n sql: `${columnSql} ${directionSql}`,\n bindings: [],\n };\n }\n}\n\nexport default new SqliteOrderByInterpreter();\n","import { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteRawInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): { sql: string; bindings: any[] } {\n const rawNode = node as RawNode;\n return {\n sql: rawNode.rawValue,\n bindings: [],\n };\n }\n}\n\nexport default new SqliteRawInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { ForeignKeyInfoNode } from \"../../../ast/query/node/schema/foreign_key_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteForeignKeyInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as ForeignKeyInfoNode;\n const table = node.table;\n const sql = `PRAGMA foreign_key_list(${table})`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new SqliteForeignKeyInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { IndexInfoNode } from \"../../../ast/query/node/schema/index_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteIndexInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as IndexInfoNode;\n const table = node.table;\n const sql = `PRAGMA index_list(${table})`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new SqliteIndexInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { PrimaryKeyInfoNode } from \"../../../ast/query/node/schema/primary_key_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqlitePrimaryKeyInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as PrimaryKeyInfoNode;\n const table = node.table;\n const sql = `SELECT\n 'PRIMARY' as name,\n name as column_name\n FROM pragma_table_info('${table}')\n WHERE pk > 0\n ORDER BY pk`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new SqlitePrimaryKeyInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { TableInfoNode } from \"../../../ast/query/node/schema/table_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteTableInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as TableInfoNode;\n const table = node.table;\n const sql = `PRAGMA table_info(${table})`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new SqliteTableInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { SelectNode } from \"../../../ast/query/node/select/basic_select\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteSelectInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const selectNode = node as SelectNode;\n if (selectNode.isRawValue) {\n return {\n sql: selectNode.column as string,\n bindings: [],\n };\n }\n\n const columnResult = this.formatColumn(\n selectNode.column,\n selectNode.sqlFunction,\n );\n const aliasSql = this.formatAlias(selectNode.alias);\n return {\n sql: `${columnResult.sql}${aliasSql}`,\n bindings: columnResult.bindings,\n };\n }\n\n private formatColumn(\n column: string | QueryNode | QueryNode[],\n sqlFunction?: string,\n ): ReturnType<typeof AstParser.prototype.parse> {\n if (typeof column === \"string\") {\n const col = new InterpreterUtils(this.model).formatStringColumn(\n \"sqlite\",\n column,\n );\n let sql = col;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}(${col})`;\n }\n return {\n sql,\n bindings: [],\n };\n }\n\n if (Array.isArray(column) && column.length > 0) {\n const astParser = new AstParser(\n this.model,\n \"sqlite\" as SqlDataSourceType,\n );\n const result = astParser.parse(column);\n let sql = `(${result.sql})`;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}${sql}`;\n }\n return {\n sql,\n bindings: result.bindings,\n };\n }\n\n if (!Array.isArray(column)) {\n const astParser = new AstParser(\n this.model,\n \"sqlite\" as SqlDataSourceType,\n );\n const result = astParser.parse([column]);\n let sql = `(${result.sql})`;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}${sql}`;\n }\n return {\n sql,\n bindings: result.bindings,\n };\n }\n\n const formattedColumns = column.map((col) => {\n if (typeof col === \"string\") {\n const formatted = new InterpreterUtils(this.model).formatStringColumn(\n \"sqlite\",\n col,\n );\n if (sqlFunction) {\n return `${sqlFunction.toLowerCase()}(${formatted})`;\n }\n return formatted;\n }\n\n const astParser = new AstParser(\n this.model,\n \"sqlite\" as SqlDataSourceType,\n );\n const result = astParser.parse([col]);\n let sql = `(${result.sql})`;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}${sql}`;\n }\n return sql;\n });\n\n return {\n sql: formattedColumns.join(\", \"),\n bindings: [],\n };\n }\n\n private formatAlias(alias?: string): string {\n if (alias && alias.length > 0) {\n return ` as \"${alias}\"`;\n }\n return \"\";\n }\n}\n\nexport default new SqliteSelectInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { FromNode } from \"../../../ast/query/node/from\";\nimport { TruncateNode } from \"../../../ast/query/node/truncate\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteTruncateInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const truncateNode = node as TruncateNode;\n\n if (truncateNode.isRawValue && typeof truncateNode.fromNode === \"string\") {\n truncateNode.keyword = \"\";\n\n return {\n sql: truncateNode.fromNode,\n bindings: [],\n };\n }\n\n const formattedTable = new InterpreterUtils(\n this.model,\n ).getFromForWriteOperations(\"sqlite\", truncateNode.fromNode as FromNode);\n\n truncateNode.keyword = \"DELETE FROM\";\n\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n}\n\nexport default new SqliteTruncateInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { UnionNode } from \"../../../ast/query/node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { Model } from \"../../../models/model\";\n\nclass SqliteUnionInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const unionNode = node as UnionNode;\n const parser = new AstParser(this.model, \"sqlite\");\n const nodes = Array.isArray(unionNode.query)\n ? unionNode.query\n : [unionNode.query];\n\n const ast =\n typeof unionNode.query === \"string\"\n ? { sql: unionNode.query, bindings: [] }\n : parser.parse(\n nodes.filter(Boolean) as QueryNode[],\n unionNode.currParamIndex,\n );\n\n return {\n sql: ast.sql,\n bindings: ast.bindings,\n };\n }\n}\n\nexport default new SqliteUnionInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { FromNode } from \"../../../ast/query/node/from\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { UpdateNode } from \"../../../ast/query/node/update\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteUpdateInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const updateNode = node as UpdateNode;\n if (updateNode.isRawValue && typeof updateNode.fromNode === \"string\") {\n return {\n sql: updateNode.fromNode as string,\n bindings: updateNode.values,\n };\n }\n\n const interpreterUtils = new InterpreterUtils(this.model);\n const formattedTable = interpreterUtils.getFromForWriteOperations(\n \"sqlite\",\n updateNode.fromNode as FromNode,\n );\n\n if (!updateNode.columns.length || !updateNode.values.length) {\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n\n const finalBindings: any[] = [];\n const setClause = updateNode.columns\n .map((column, index) => {\n const value = updateNode.values[index];\n if (value instanceof RawNode) {\n return `${interpreterUtils.formatStringColumn(\"sqlite\", column)} = ${value.rawValue}`;\n }\n\n finalBindings.push(value);\n return `${interpreterUtils.formatStringColumn(\"sqlite\", column)} = ?`;\n })\n .join(\", \");\n\n return {\n sql: `${formattedTable} set ${setClause}`,\n bindings: finalBindings,\n };\n }\n}\n\nexport default new SqliteUpdateInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport type { WhereNode } from \"../../../ast/query/node/where/where\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteWhereInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const whereNode = node as WhereNode;\n if (whereNode.isRawValue) {\n return {\n sql: whereNode.column,\n bindings: (whereNode.value as any[]) ?? [],\n };\n }\n\n let sql = \"\";\n let bindings: any[] = [];\n\n if (this.isRawNode(whereNode.value)) {\n const formattedRight = this.formatRawIdentifierIfPossible(\n whereNode.value.rawValue,\n );\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"sqlite\", whereNode.column)} ${whereNode.operator} ${formattedRight}`;\n bindings = [];\n } else if (Array.isArray(whereNode.value)) {\n if (whereNode.operator.toLowerCase() === \"between\") {\n const placeholders = `? AND ?`;\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"sqlite\", whereNode.column)} between ${placeholders}`;\n bindings = whereNode.value;\n } else {\n const placeholders = whereNode.value.map((_) => `?`).join(\", \");\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"sqlite\", whereNode.column)} ${whereNode.operator} (${placeholders})`;\n bindings = whereNode.value;\n }\n } else {\n if (whereNode.operator.includes(\"null\")) {\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"sqlite\", whereNode.column)} ${whereNode.operator}`;\n bindings = [];\n } else if (whereNode.value === undefined) {\n return { sql: \"\", bindings: [] };\n } else {\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"sqlite\", whereNode.column)} ${whereNode.operator} ?`;\n bindings = [whereNode.value];\n }\n }\n\n if (whereNode.isNegated) {\n sql = `not (${sql})`;\n }\n\n return { sql: sql.trim(), bindings };\n }\n\n private isRawNode(value: any): value is RawNode {\n return (\n value &&\n typeof value === \"object\" &&\n \"rawValue\" in value &&\n value.isRawValue === true\n );\n }\n\n private formatRawIdentifierIfPossible(raw: string): string {\n const isIdentifier =\n /^[A-Za-z_][A-Za-z0-9_]*(\\.(\\*|[A-Za-z_][A-Za-z0-9_]*))?$/.test(raw);\n if (!isIdentifier) {\n return raw;\n }\n return new InterpreterUtils(this.model).formatStringColumn(\"sqlite\", raw);\n }\n}\n\nexport default new SqliteWhereInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { WhereGroupNode } from \"../../../ast/query/node/where/where_group\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { Model } from \"../../../models/model\";\n\nclass SqliteWhereGroupInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const groupNode = node as WhereGroupNode;\n if (!groupNode.nodes || groupNode.nodes.length === 0) {\n return { sql: \"\", bindings: [] };\n }\n\n const astParser = new AstParser(this.model, \"sqlite\" as SqlDataSourceType);\n const { sql, bindings } = astParser.parse(\n groupNode.nodes,\n groupNode.currParamIndex,\n true,\n );\n\n return {\n sql: `(${sql})`,\n bindings,\n };\n }\n}\n\nexport default new SqliteWhereGroupInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { WhereJsonNode } from \"../../../ast/query/node/where/where_json\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteWhereJsonInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const whereJsonNode = node as WhereJsonNode;\n if (whereJsonNode.isRawValue) {\n return {\n sql: whereJsonNode.column,\n bindings: [],\n };\n }\n\n let sql = \"\";\n let bindings: any[] = [];\n\n const columnSql = new InterpreterUtils(this.model).formatStringColumn(\n \"sqlite\",\n whereJsonNode.column,\n );\n\n switch (whereJsonNode.jsonOperator) {\n case \"=\":\n sql = `json(${columnSql}) = json(?)`;\n bindings = [JSON.stringify(whereJsonNode.value)];\n break;\n case \"contains\":\n sql = `json(${columnSql}) = json(?)`;\n bindings = [JSON.stringify(whereJsonNode.value)];\n break;\n case \"not contains\":\n sql = `json(${columnSql}) = json(?)`;\n bindings = [JSON.stringify(whereJsonNode.value)];\n break;\n case \"raw\":\n sql = whereJsonNode.column;\n bindings = Array.isArray(whereJsonNode.value)\n ? whereJsonNode.value\n : [];\n break;\n }\n\n if (whereJsonNode.isNegated) {\n sql = `NOT (${sql})`;\n }\n\n return { sql: sql.trim(), bindings };\n }\n}\n\nexport default new SqliteWhereJsonInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { WhereSubqueryNode } from \"../../../ast/query/node/where/where_subquery\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteWhereSubqueryInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const subqueryNode = node as WhereSubqueryNode;\n\n if (this.isStringSubquery(subqueryNode.subquery)) {\n return this.handleStringSubquery(subqueryNode);\n }\n\n if (this.isArraySubquery(subqueryNode.subquery)) {\n return this.handleArraySubquery(subqueryNode);\n }\n\n return this.handleObjectSubquery(subqueryNode);\n }\n\n private isStringSubquery(\n subquery: string | QueryNode | QueryNode[],\n ): subquery is string {\n return typeof subquery === \"string\";\n }\n\n private isArraySubquery(\n subquery: string | QueryNode | QueryNode[],\n ): subquery is QueryNode[] {\n return Array.isArray(subquery);\n }\n\n private handleStringSubquery(\n subqueryNode: WhereSubqueryNode,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const sql = `${subqueryNode.column} ${subqueryNode.operator} (${subqueryNode.subquery})`;\n return { sql: sql.trim(), bindings: [] };\n }\n\n private handleArraySubquery(\n subqueryNode: WhereSubqueryNode,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const astParser = new AstParser(this.model, \"sqlite\" as SqlDataSourceType);\n const { sql: subquerySql, bindings: subqueryBindings } = astParser.parse(\n subqueryNode.subquery as QueryNode[],\n subqueryNode.currParamIndex,\n );\n\n const sql = `${subqueryNode.column} ${subqueryNode.operator} (${subquerySql})`;\n return { sql: sql.trim(), bindings: subqueryBindings };\n }\n\n private handleObjectSubquery(\n subqueryNode: WhereSubqueryNode,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const astParser = new AstParser(this.model, \"sqlite\" as SqlDataSourceType);\n const { sql: subquerySql, bindings: subqueryBindings } = astParser.parse(\n [subqueryNode.subquery as QueryNode],\n subqueryNode.currParamIndex,\n );\n\n const sql = `${subqueryNode.column} ${subqueryNode.operator} (${subquerySql})`;\n return { sql: sql.trim(), bindings: subqueryBindings };\n }\n}\n\nexport default new SqliteWhereSubqueryInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { WithNode } from \"../../../ast/query/node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteWithInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const withNode = node as WithNode;\n const parser = new AstParser(this.model, \"sqlite\");\n const nodes = Array.isArray(withNode.body)\n ? withNode.body\n : [withNode.body];\n\n const ast = parser.parse(\n nodes.filter(Boolean) as QueryNode[],\n withNode.currParamIndex,\n );\n\n return {\n sql: `${withNode.alias} as (${ast.sql})`,\n bindings: ast.bindings,\n };\n }\n}\n\nexport default new SqliteWithInterpreter();\n","import mssql_alter_table_add_column from '../interpreter/mssql/alter_table/add_column';\nimport mssql_alter_table_add_constraint from '../interpreter/mssql/alter_table/add_constraint';\nimport mssql_alter_table_add_primary_key from '../interpreter/mssql/alter_table/add_primary_key';\nimport mssql_alter_table_alter_column_type from '../interpreter/mssql/alter_table/alter_column_type';\nimport mssql_alter_table_alter_table from '../interpreter/mssql/alter_table/alter_table';\nimport mssql_alter_table_drop_column from '../interpreter/mssql/alter_table/drop_column';\nimport mssql_alter_table_drop_constraint from '../interpreter/mssql/alter_table/drop_constraint';\nimport mssql_alter_table_drop_default from '../interpreter/mssql/alter_table/drop_default';\nimport mssql_alter_table_drop_not_null from '../interpreter/mssql/alter_table/drop_not_null';\nimport mssql_alter_table_drop_primary_key from '../interpreter/mssql/alter_table/drop_primary_key';\nimport mssql_alter_table_rename_column from '../interpreter/mssql/alter_table/rename_column';\nimport mssql_alter_table_rename_table from '../interpreter/mssql/alter_table/rename_table';\nimport mssql_alter_table_set_default from '../interpreter/mssql/alter_table/set_default';\nimport mssql_alter_table_set_not_null from '../interpreter/mssql/alter_table/set_not_null';\nimport mssql_column_column_type from '../interpreter/mssql/column/column_type';\nimport mssql_constraint_after from '../interpreter/mssql/constraint/after';\nimport mssql_constraint_constraint from '../interpreter/mssql/constraint/constraint';\nimport mssql_create_table_create_table from '../interpreter/mssql/create_table/create_table';\nimport mssql_delete_delete from '../interpreter/mssql/delete/delete';\nimport mssql_distinct_distinct from '../interpreter/mssql/distinct/distinct';\nimport mssql_distinct_distinct_on from '../interpreter/mssql/distinct/distinct_on';\nimport mssql_drop_table_drop_table from '../interpreter/mssql/drop_table/drop_table';\nimport mssql_extension_create_extension from '../interpreter/mssql/extension/create_extension';\nimport mssql_from_from from '../interpreter/mssql/from/from';\nimport mssql_group_by_group_by from '../interpreter/mssql/group_by/group_by';\nimport mssql_having_having from '../interpreter/mssql/having/having';\nimport mssql_index_op_create_index from '../interpreter/mssql/index_op/create_index';\nimport mssql_index_op_drop_index from '../interpreter/mssql/index_op/drop_index';\nimport mssql_insert_insert from '../interpreter/mssql/insert/insert';\nimport mssql_join_join from '../interpreter/mssql/join/join';\nimport mssql_limit_limit from '../interpreter/mssql/limit/limit';\nimport mssql_lock_lock from '../interpreter/mssql/lock/lock';\nimport mssql_offset_offset from '../interpreter/mssql/offset/offset';\nimport mssql_on_duplicate_on_duplicate from '../interpreter/mssql/on_duplicate/on_duplicate';\nimport mssql_order_by_order_by from '../interpreter/mssql/order_by/order_by';\nimport mssql_raw_raw from '../interpreter/mssql/raw/raw';\nimport mssql_schema_foreign_key_info from '../interpreter/mssql/schema/foreign_key_info';\nimport mssql_schema_index_info from '../interpreter/mssql/schema/index_info';\nimport mssql_schema_primary_key_info from '../interpreter/mssql/schema/primary_key_info';\nimport mssql_schema_table_info from '../interpreter/mssql/schema/table_info';\nimport mssql_select_select from '../interpreter/mssql/select/select';\nimport mssql_truncate_truncate from '../interpreter/mssql/truncate/truncate';\nimport mssql_union_union from '../interpreter/mssql/union/union';\nimport mssql_update_update from '../interpreter/mssql/update/update';\nimport mssql_where_where from '../interpreter/mssql/where/where';\nimport mssql_where_where_group from '../interpreter/mssql/where/where_group';\nimport mssql_where_where_json from '../interpreter/mssql/where/where_json';\nimport mssql_where_where_subquery from '../interpreter/mssql/where/where_subquery';\nimport mssql_with_with from '../interpreter/mssql/with/with';\nimport mysql_alter_table_add_column from '../interpreter/mysql/alter_table/add_column';\nimport mysql_alter_table_add_constraint from '../interpreter/mysql/alter_table/add_constraint';\nimport mysql_alter_table_add_primary_key from '../interpreter/mysql/alter_table/add_primary_key';\nimport mysql_alter_table_alter_column_type from '../interpreter/mysql/alter_table/alter_column_type';\nimport mysql_alter_table_alter_table from '../interpreter/mysql/alter_table/alter_table';\nimport mysql_alter_table_drop_column from '../interpreter/mysql/alter_table/drop_column';\nimport mysql_alter_table_drop_constraint from '../interpreter/mysql/alter_table/drop_constraint';\nimport mysql_alter_table_drop_default from '../interpreter/mysql/alter_table/drop_default';\nimport mysql_alter_table_drop_not_null from '../interpreter/mysql/alter_table/drop_not_null';\nimport mysql_alter_table_drop_primary_key from '../interpreter/mysql/alter_table/drop_primary_key';\nimport mysql_alter_table_rename_column from '../interpreter/mysql/alter_table/rename_column';\nimport mysql_alter_table_rename_table from '../interpreter/mysql/alter_table/rename_table';\nimport mysql_alter_table_set_default from '../interpreter/mysql/alter_table/set_default';\nimport mysql_alter_table_set_not_null from '../interpreter/mysql/alter_table/set_not_null';\nimport mysql_column_column_type from '../interpreter/mysql/column/column_type';\nimport mysql_constraint_after from '../interpreter/mysql/constraint/after';\nimport mysql_constraint_constraint from '../interpreter/mysql/constraint/constraint';\nimport mysql_create_table_create_table from '../interpreter/mysql/create_table/create_table';\nimport mysql_delete_delete from '../interpreter/mysql/delete/delete';\nimport mysql_distinct_distinct from '../interpreter/mysql/distinct/distinct';\nimport mysql_distinct_distinct_on from '../interpreter/mysql/distinct/distinct_on';\nimport mysql_drop_table_drop_table from '../interpreter/mysql/drop_table/drop_table';\nimport mysql_extension_create_extension from '../interpreter/mysql/extension/create_extension';\nimport mysql_from_from from '../interpreter/mysql/from/from';\nimport mysql_group_by_group_by from '../interpreter/mysql/group_by/group_by';\nimport mysql_having_having from '../interpreter/mysql/having/having';\nimport mysql_index_op_create_index from '../interpreter/mysql/index_op/create_index';\nimport mysql_index_op_drop_index from '../interpreter/mysql/index_op/drop_index';\nimport mysql_insert_insert from '../interpreter/mysql/insert/insert';\nimport mysql_join_join from '../interpreter/mysql/join/join';\nimport mysql_limit_limit from '../interpreter/mysql/limit/limit';\nimport mysql_lock_lock from '../interpreter/mysql/lock/lock';\nimport mysql_offset_offset from '../interpreter/mysql/offset/offset';\nimport mysql_on_duplicate_on_duplicate from '../interpreter/mysql/on_duplicate/on_duplicate';\nimport mysql_order_by_order_by from '../interpreter/mysql/order_by/order_by';\nimport mysql_raw_raw from '../interpreter/mysql/raw/raw';\nimport mysql_schema_foreign_key_info from '../interpreter/mysql/schema/foreign_key_info';\nimport mysql_schema_index_info from '../interpreter/mysql/schema/index_info';\nimport mysql_schema_primary_key_info from '../interpreter/mysql/schema/primary_key_info';\nimport mysql_schema_table_info from '../interpreter/mysql/schema/table_info';\nimport mysql_select_select from '../interpreter/mysql/select/select';\nimport mysql_truncate_truncate from '../interpreter/mysql/truncate/truncate';\nimport mysql_union_union from '../interpreter/mysql/union/union';\nimport mysql_update_update from '../interpreter/mysql/update/update';\nimport mysql_where_where from '../interpreter/mysql/where/where';\nimport mysql_where_where_group from '../interpreter/mysql/where/where_group';\nimport mysql_where_where_json from '../interpreter/mysql/where/where_json';\nimport mysql_where_where_subquery from '../interpreter/mysql/where/where_subquery';\nimport mysql_with_with from '../interpreter/mysql/with/with';\nimport oracledb_alter_table_add_column from '../interpreter/oracledb/alter_table/add_column';\nimport oracledb_alter_table_add_constraint from '../interpreter/oracledb/alter_table/add_constraint';\nimport oracledb_alter_table_add_primary_key from '../interpreter/oracledb/alter_table/add_primary_key';\nimport oracledb_alter_table_alter_column_type from '../interpreter/oracledb/alter_table/alter_column_type';\nimport oracledb_alter_table_alter_table from '../interpreter/oracledb/alter_table/alter_table';\nimport oracledb_alter_table_drop_column from '../interpreter/oracledb/alter_table/drop_column';\nimport oracledb_alter_table_drop_constraint from '../interpreter/oracledb/alter_table/drop_constraint';\nimport oracledb_alter_table_drop_default from '../interpreter/oracledb/alter_table/drop_default';\nimport oracledb_alter_table_drop_not_null from '../interpreter/oracledb/alter_table/drop_not_null';\nimport oracledb_alter_table_drop_primary_key from '../interpreter/oracledb/alter_table/drop_primary_key';\nimport oracledb_alter_table_rename_column from '../interpreter/oracledb/alter_table/rename_column';\nimport oracledb_alter_table_rename_table from '../interpreter/oracledb/alter_table/rename_table';\nimport oracledb_alter_table_set_default from '../interpreter/oracledb/alter_table/set_default';\nimport oracledb_alter_table_set_not_null from '../interpreter/oracledb/alter_table/set_not_null';\nimport oracledb_column_column_type from '../interpreter/oracledb/column/column_type';\nimport oracledb_constraint_after from '../interpreter/oracledb/constraint/after';\nimport oracledb_constraint_constraint from '../interpreter/oracledb/constraint/constraint';\nimport oracledb_create_table_create_table from '../interpreter/oracledb/create_table/create_table';\nimport oracledb_delete_delete from '../interpreter/oracledb/delete/delete';\nimport oracledb_distinct_distinct from '../interpreter/oracledb/distinct/distinct';\nimport oracledb_distinct_distinct_on from '../interpreter/oracledb/distinct/distinct_on';\nimport oracledb_drop_table_drop_table from '../interpreter/oracledb/drop_table/drop_table';\nimport oracledb_extension_create_extension from '../interpreter/oracledb/extension/create_extension';\nimport oracledb_from_from from '../interpreter/oracledb/from/from';\nimport oracledb_group_by_group_by from '../interpreter/oracledb/group_by/group_by';\nimport oracledb_having_having from '../interpreter/oracledb/having/having';\nimport oracledb_index_op_create_index from '../interpreter/oracledb/index_op/create_index';\nimport oracledb_index_op_drop_index from '../interpreter/oracledb/index_op/drop_index';\nimport oracledb_insert_insert from '../interpreter/oracledb/insert/insert';\nimport oracledb_join_join from '../interpreter/oracledb/join/join';\nimport oracledb_limit_limit from '../interpreter/oracledb/limit/limit';\nimport oracledb_lock_lock from '../interpreter/oracledb/lock/lock';\nimport oracledb_offset_offset from '../interpreter/oracledb/offset/offset';\nimport oracledb_on_duplicate_on_duplicate from '../interpreter/oracledb/on_duplicate/on_duplicate';\nimport oracledb_order_by_order_by from '../interpreter/oracledb/order_by/order_by';\nimport oracledb_raw_raw from '../interpreter/oracledb/raw/raw';\nimport oracledb_schema_foreign_key_info from '../interpreter/oracledb/schema/foreign_key_info';\nimport oracledb_schema_index_info from '../interpreter/oracledb/schema/index_info';\nimport oracledb_schema_primary_key_info from '../interpreter/oracledb/schema/primary_key_info';\nimport oracledb_schema_table_info from '../interpreter/oracledb/schema/table_info';\nimport oracledb_select_select from '../interpreter/oracledb/select/select';\nimport oracledb_truncate_truncate from '../interpreter/oracledb/truncate/truncate';\nimport oracledb_union_union from '../interpreter/oracledb/union/union';\nimport oracledb_update_update from '../interpreter/oracledb/update/update';\nimport oracledb_where_where from '../interpreter/oracledb/where/where';\nimport oracledb_where_where_group from '../interpreter/oracledb/where/where_group';\nimport oracledb_where_where_json from '../interpreter/oracledb/where/where_json';\nimport oracledb_where_where_subquery from '../interpreter/oracledb/where/where_subquery';\nimport oracledb_with_with from '../interpreter/oracledb/with/with';\nimport postgres_alter_table_add_column from '../interpreter/postgres/alter_table/add_column';\nimport postgres_alter_table_add_constraint from '../interpreter/postgres/alter_table/add_constraint';\nimport postgres_alter_table_add_primary_key from '../interpreter/postgres/alter_table/add_primary_key';\nimport postgres_alter_table_alter_column_type from '../interpreter/postgres/alter_table/alter_column_type';\nimport postgres_alter_table_alter_table from '../interpreter/postgres/alter_table/alter_table';\nimport postgres_alter_table_drop_column from '../interpreter/postgres/alter_table/drop_column';\nimport postgres_alter_table_drop_constraint from '../interpreter/postgres/alter_table/drop_constraint';\nimport postgres_alter_table_drop_default from '../interpreter/postgres/alter_table/drop_default';\nimport postgres_alter_table_drop_not_null from '../interpreter/postgres/alter_table/drop_not_null';\nimport postgres_alter_table_drop_primary_key from '../interpreter/postgres/alter_table/drop_primary_key';\nimport postgres_alter_table_rename_column from '../interpreter/postgres/alter_table/rename_column';\nimport postgres_alter_table_rename_table from '../interpreter/postgres/alter_table/rename_table';\nimport postgres_alter_table_set_default from '../interpreter/postgres/alter_table/set_default';\nimport postgres_alter_table_set_not_null from '../interpreter/postgres/alter_table/set_not_null';\nimport postgres_column_column_type from '../interpreter/postgres/column/column_type';\nimport postgres_constraint_after from '../interpreter/postgres/constraint/after';\nimport postgres_constraint_constraint from '../interpreter/postgres/constraint/constraint';\nimport postgres_create_table_create_table from '../interpreter/postgres/create_table/create_table';\nimport postgres_delete_delete from '../interpreter/postgres/delete/delete';\nimport postgres_distinct_distinct from '../interpreter/postgres/distinct/distinct';\nimport postgres_distinct_distinct_on from '../interpreter/postgres/distinct/distinct_on';\nimport postgres_drop_table_drop_table from '../interpreter/postgres/drop_table/drop_table';\nimport postgres_extension_create_extension from '../interpreter/postgres/extension/create_extension';\nimport postgres_from_from from '../interpreter/postgres/from/from';\nimport postgres_group_by_group_by from '../interpreter/postgres/group_by/group_by';\nimport postgres_having_having from '../interpreter/postgres/having/having';\nimport postgres_index_op_create_index from '../interpreter/postgres/index_op/create_index';\nimport postgres_index_op_drop_index from '../interpreter/postgres/index_op/drop_index';\nimport postgres_insert_insert from '../interpreter/postgres/insert/insert';\nimport postgres_join_join from '../interpreter/postgres/join/join';\nimport postgres_limit_limit from '../interpreter/postgres/limit/limit';\nimport postgres_lock_lock from '../interpreter/postgres/lock/lock';\nimport postgres_offset_offset from '../interpreter/postgres/offset/offset';\nimport postgres_on_duplicate_on_duplicate from '../interpreter/postgres/on_duplicate/on_duplicate';\nimport postgres_order_by_order_by from '../interpreter/postgres/order_by/order_by';\nimport postgres_raw_raw from '../interpreter/postgres/raw/raw';\nimport postgres_schema_foreign_key_info from '../interpreter/postgres/schema/foreign_key_info';\nimport postgres_schema_index_info from '../interpreter/postgres/schema/index_info';\nimport postgres_schema_primary_key_info from '../interpreter/postgres/schema/primary_key_info';\nimport postgres_schema_table_info from '../interpreter/postgres/schema/table_info';\nimport postgres_select_select from '../interpreter/postgres/select/select';\nimport postgres_truncate_truncate from '../interpreter/postgres/truncate/truncate';\nimport postgres_union_union from '../interpreter/postgres/union/union';\nimport postgres_update_update from '../interpreter/postgres/update/update';\nimport postgres_where_where from '../interpreter/postgres/where/where';\nimport postgres_where_where_group from '../interpreter/postgres/where/where_group';\nimport postgres_where_where_json from '../interpreter/postgres/where/where_json';\nimport postgres_where_where_subquery from '../interpreter/postgres/where/where_subquery';\nimport postgres_with_with from '../interpreter/postgres/with/with';\nimport sqlite_alter_table_add_column from '../interpreter/sqlite/alter_table/add_column';\nimport sqlite_alter_table_add_constraint from '../interpreter/sqlite/alter_table/add_constraint';\nimport sqlite_alter_table_alter_column_type from '../interpreter/sqlite/alter_table/alter_column_type';\nimport sqlite_alter_table_alter_table from '../interpreter/sqlite/alter_table/alter_table';\nimport sqlite_alter_table_drop_column from '../interpreter/sqlite/alter_table/drop_column';\nimport sqlite_alter_table_drop_constraint from '../interpreter/sqlite/alter_table/drop_constraint';\nimport sqlite_alter_table_drop_default from '../interpreter/sqlite/alter_table/drop_default';\nimport sqlite_alter_table_drop_not_null from '../interpreter/sqlite/alter_table/drop_not_null';\nimport sqlite_alter_table_drop_primary_key from '../interpreter/sqlite/alter_table/drop_primary_key';\nimport sqlite_alter_table_rename_column from '../interpreter/sqlite/alter_table/rename_column';\nimport sqlite_alter_table_rename_table from '../interpreter/sqlite/alter_table/rename_table';\nimport sqlite_alter_table_set_default from '../interpreter/sqlite/alter_table/set_default';\nimport sqlite_alter_table_set_not_null from '../interpreter/sqlite/alter_table/set_not_null';\nimport sqlite_column_column_type from '../interpreter/sqlite/column/column_type';\nimport sqlite_constraint_after from '../interpreter/sqlite/constraint/after';\nimport sqlite_constraint_constraint from '../interpreter/sqlite/constraint/constraint';\nimport sqlite_create_table_create_table from '../interpreter/sqlite/create_table/create_table';\nimport sqlite_delete_delete from '../interpreter/sqlite/delete/delete';\nimport sqlite_distinct_distinct from '../interpreter/sqlite/distinct/distinct';\nimport sqlite_distinct_distinct_on from '../interpreter/sqlite/distinct/distinct_on';\nimport sqlite_drop_table_drop_table from '../interpreter/sqlite/drop_table/drop_table';\nimport sqlite_extension_create_extension from '../interpreter/sqlite/extension/create_extension';\nimport sqlite_from_from from '../interpreter/sqlite/from/from';\nimport sqlite_group_by_group_by from '../interpreter/sqlite/group_by/group_by';\nimport sqlite_having_having from '../interpreter/sqlite/having/having';\nimport sqlite_index_op_create_index from '../interpreter/sqlite/index_op/create_index';\nimport sqlite_index_op_drop_index from '../interpreter/sqlite/index_op/drop_index';\nimport sqlite_insert_insert from '../interpreter/sqlite/insert/insert';\nimport sqlite_join_join from '../interpreter/sqlite/join/join';\nimport sqlite_limit_limit from '../interpreter/sqlite/limit/limit';\nimport sqlite_lock_lock from '../interpreter/sqlite/lock/lock';\nimport sqlite_offset_offset from '../interpreter/sqlite/offset/offset';\nimport sqlite_on_duplicate_on_duplicate from '../interpreter/sqlite/on_duplicate/on_duplicate';\nimport sqlite_order_by_order_by from '../interpreter/sqlite/order_by/order_by';\nimport sqlite_raw_raw from '../interpreter/sqlite/raw/raw';\nimport sqlite_schema_foreign_key_info from '../interpreter/sqlite/schema/foreign_key_info';\nimport sqlite_schema_index_info from '../interpreter/sqlite/schema/index_info';\nimport sqlite_schema_primary_key_info from '../interpreter/sqlite/schema/primary_key_info';\nimport sqlite_schema_table_info from '../interpreter/sqlite/schema/table_info';\nimport sqlite_select_select from '../interpreter/sqlite/select/select';\nimport sqlite_truncate_truncate from '../interpreter/sqlite/truncate/truncate';\nimport sqlite_union_union from '../interpreter/sqlite/union/union';\nimport sqlite_update_update from '../interpreter/sqlite/update/update';\nimport sqlite_where_where from '../interpreter/sqlite/where/where';\nimport sqlite_where_where_group from '../interpreter/sqlite/where/where_group';\nimport sqlite_where_where_json from '../interpreter/sqlite/where/where_json';\nimport sqlite_where_where_subquery from '../interpreter/sqlite/where/where_subquery';\nimport sqlite_with_with from '../interpreter/sqlite/with/with';\n\nexport const interpreterMap = {\n mssql: {\n alter_table: {\n add_column: mssql_alter_table_add_column,\n add_constraint: mssql_alter_table_add_constraint,\n add_primary_key: mssql_alter_table_add_primary_key,\n alter_column_type: mssql_alter_table_alter_column_type,\n alter_table: mssql_alter_table_alter_table,\n drop_column: mssql_alter_table_drop_column,\n drop_constraint: mssql_alter_table_drop_constraint,\n drop_default: mssql_alter_table_drop_default,\n drop_not_null: mssql_alter_table_drop_not_null,\n drop_primary_key: mssql_alter_table_drop_primary_key,\n rename_column: mssql_alter_table_rename_column,\n rename_table: mssql_alter_table_rename_table,\n set_default: mssql_alter_table_set_default,\n set_not_null: mssql_alter_table_set_not_null,\n },\n column: {\n column_type: mssql_column_column_type,\n },\n constraint: {\n after: mssql_constraint_after,\n constraint: mssql_constraint_constraint,\n },\n create_table: {\n create_table: mssql_create_table_create_table,\n },\n delete: {\n delete: mssql_delete_delete,\n },\n distinct: {\n distinct: mssql_distinct_distinct,\n distinct_on: mssql_distinct_distinct_on,\n },\n drop_table: {\n drop_table: mssql_drop_table_drop_table,\n },\n extension: {\n create_extension: mssql_extension_create_extension,\n },\n from: {\n from: mssql_from_from,\n },\n group_by: {\n group_by: mssql_group_by_group_by,\n },\n having: {\n having: mssql_having_having,\n },\n index_op: {\n create_index: mssql_index_op_create_index,\n drop_index: mssql_index_op_drop_index,\n },\n insert: {\n insert: mssql_insert_insert,\n },\n join: {\n join: mssql_join_join,\n },\n limit: {\n limit: mssql_limit_limit,\n },\n lock: {\n lock: mssql_lock_lock,\n },\n offset: {\n offset: mssql_offset_offset,\n },\n on_duplicate: {\n on_duplicate: mssql_on_duplicate_on_duplicate,\n },\n order_by: {\n order_by: mssql_order_by_order_by,\n },\n raw: {\n raw: mssql_raw_raw,\n },\n schema: {\n foreign_key_info: mssql_schema_foreign_key_info,\n index_info: mssql_schema_index_info,\n primary_key_info: mssql_schema_primary_key_info,\n table_info: mssql_schema_table_info,\n },\n select: {\n select: mssql_select_select,\n },\n truncate: {\n truncate: mssql_truncate_truncate,\n },\n union: {\n union: mssql_union_union,\n },\n update: {\n update: mssql_update_update,\n },\n where: {\n where: mssql_where_where,\n where_group: mssql_where_where_group,\n where_json: mssql_where_where_json,\n where_subquery: mssql_where_where_subquery,\n },\n with: {\n with: mssql_with_with,\n },\n },\n mysql: {\n alter_table: {\n add_column: mysql_alter_table_add_column,\n add_constraint: mysql_alter_table_add_constraint,\n add_primary_key: mysql_alter_table_add_primary_key,\n alter_column_type: mysql_alter_table_alter_column_type,\n alter_table: mysql_alter_table_alter_table,\n drop_column: mysql_alter_table_drop_column,\n drop_constraint: mysql_alter_table_drop_constraint,\n drop_default: mysql_alter_table_drop_default,\n drop_not_null: mysql_alter_table_drop_not_null,\n drop_primary_key: mysql_alter_table_drop_primary_key,\n rename_column: mysql_alter_table_rename_column,\n rename_table: mysql_alter_table_rename_table,\n set_default: mysql_alter_table_set_default,\n set_not_null: mysql_alter_table_set_not_null,\n },\n column: {\n column_type: mysql_column_column_type,\n },\n constraint: {\n after: mysql_constraint_after,\n constraint: mysql_constraint_constraint,\n },\n create_table: {\n create_table: mysql_create_table_create_table,\n },\n delete: {\n delete: mysql_delete_delete,\n },\n distinct: {\n distinct: mysql_distinct_distinct,\n distinct_on: mysql_distinct_distinct_on,\n },\n drop_table: {\n drop_table: mysql_drop_table_drop_table,\n },\n extension: {\n create_extension: mysql_extension_create_extension,\n },\n from: {\n from: mysql_from_from,\n },\n group_by: {\n group_by: mysql_group_by_group_by,\n },\n having: {\n having: mysql_having_having,\n },\n index_op: {\n create_index: mysql_index_op_create_index,\n drop_index: mysql_index_op_drop_index,\n },\n insert: {\n insert: mysql_insert_insert,\n },\n join: {\n join: mysql_join_join,\n },\n limit: {\n limit: mysql_limit_limit,\n },\n lock: {\n lock: mysql_lock_lock,\n },\n offset: {\n offset: mysql_offset_offset,\n },\n on_duplicate: {\n on_duplicate: mysql_on_duplicate_on_duplicate,\n },\n order_by: {\n order_by: mysql_order_by_order_by,\n },\n raw: {\n raw: mysql_raw_raw,\n },\n schema: {\n foreign_key_info: mysql_schema_foreign_key_info,\n index_info: mysql_schema_index_info,\n primary_key_info: mysql_schema_primary_key_info,\n table_info: mysql_schema_table_info,\n },\n select: {\n select: mysql_select_select,\n },\n truncate: {\n truncate: mysql_truncate_truncate,\n },\n union: {\n union: mysql_union_union,\n },\n update: {\n update: mysql_update_update,\n },\n where: {\n where: mysql_where_where,\n where_group: mysql_where_where_group,\n where_json: mysql_where_where_json,\n where_subquery: mysql_where_where_subquery,\n },\n with: {\n with: mysql_with_with,\n },\n },\n oracledb: {\n alter_table: {\n add_column: oracledb_alter_table_add_column,\n add_constraint: oracledb_alter_table_add_constraint,\n add_primary_key: oracledb_alter_table_add_primary_key,\n alter_column_type: oracledb_alter_table_alter_column_type,\n alter_table: oracledb_alter_table_alter_table,\n drop_column: oracledb_alter_table_drop_column,\n drop_constraint: oracledb_alter_table_drop_constraint,\n drop_default: oracledb_alter_table_drop_default,\n drop_not_null: oracledb_alter_table_drop_not_null,\n drop_primary_key: oracledb_alter_table_drop_primary_key,\n rename_column: oracledb_alter_table_rename_column,\n rename_table: oracledb_alter_table_rename_table,\n set_default: oracledb_alter_table_set_default,\n set_not_null: oracledb_alter_table_set_not_null,\n },\n column: {\n column_type: oracledb_column_column_type,\n },\n constraint: {\n after: oracledb_constraint_after,\n constraint: oracledb_constraint_constraint,\n },\n create_table: {\n create_table: oracledb_create_table_create_table,\n },\n delete: {\n delete: oracledb_delete_delete,\n },\n distinct: {\n distinct: oracledb_distinct_distinct,\n distinct_on: oracledb_distinct_distinct_on,\n },\n drop_table: {\n drop_table: oracledb_drop_table_drop_table,\n },\n extension: {\n create_extension: oracledb_extension_create_extension,\n },\n from: {\n from: oracledb_from_from,\n },\n group_by: {\n group_by: oracledb_group_by_group_by,\n },\n having: {\n having: oracledb_having_having,\n },\n index_op: {\n create_index: oracledb_index_op_create_index,\n drop_index: oracledb_index_op_drop_index,\n },\n insert: {\n insert: oracledb_insert_insert,\n },\n join: {\n join: oracledb_join_join,\n },\n limit: {\n limit: oracledb_limit_limit,\n },\n lock: {\n lock: oracledb_lock_lock,\n },\n offset: {\n offset: oracledb_offset_offset,\n },\n on_duplicate: {\n on_duplicate: oracledb_on_duplicate_on_duplicate,\n },\n order_by: {\n order_by: oracledb_order_by_order_by,\n },\n raw: {\n raw: oracledb_raw_raw,\n },\n schema: {\n foreign_key_info: oracledb_schema_foreign_key_info,\n index_info: oracledb_schema_index_info,\n primary_key_info: oracledb_schema_primary_key_info,\n table_info: oracledb_schema_table_info,\n },\n select: {\n select: oracledb_select_select,\n },\n truncate: {\n truncate: oracledb_truncate_truncate,\n },\n union: {\n union: oracledb_union_union,\n },\n update: {\n update: oracledb_update_update,\n },\n where: {\n where: oracledb_where_where,\n where_group: oracledb_where_where_group,\n where_json: oracledb_where_where_json,\n where_subquery: oracledb_where_where_subquery,\n },\n with: {\n with: oracledb_with_with,\n },\n },\n postgres: {\n alter_table: {\n add_column: postgres_alter_table_add_column,\n add_constraint: postgres_alter_table_add_constraint,\n add_primary_key: postgres_alter_table_add_primary_key,\n alter_column_type: postgres_alter_table_alter_column_type,\n alter_table: postgres_alter_table_alter_table,\n drop_column: postgres_alter_table_drop_column,\n drop_constraint: postgres_alter_table_drop_constraint,\n drop_default: postgres_alter_table_drop_default,\n drop_not_null: postgres_alter_table_drop_not_null,\n drop_primary_key: postgres_alter_table_drop_primary_key,\n rename_column: postgres_alter_table_rename_column,\n rename_table: postgres_alter_table_rename_table,\n set_default: postgres_alter_table_set_default,\n set_not_null: postgres_alter_table_set_not_null,\n },\n column: {\n column_type: postgres_column_column_type,\n },\n constraint: {\n after: postgres_constraint_after,\n constraint: postgres_constraint_constraint,\n },\n create_table: {\n create_table: postgres_create_table_create_table,\n },\n delete: {\n delete: postgres_delete_delete,\n },\n distinct: {\n distinct: postgres_distinct_distinct,\n distinct_on: postgres_distinct_distinct_on,\n },\n drop_table: {\n drop_table: postgres_drop_table_drop_table,\n },\n extension: {\n create_extension: postgres_extension_create_extension,\n },\n from: {\n from: postgres_from_from,\n },\n group_by: {\n group_by: postgres_group_by_group_by,\n },\n having: {\n having: postgres_having_having,\n },\n index_op: {\n create_index: postgres_index_op_create_index,\n drop_index: postgres_index_op_drop_index,\n },\n insert: {\n insert: postgres_insert_insert,\n },\n join: {\n join: postgres_join_join,\n },\n limit: {\n limit: postgres_limit_limit,\n },\n lock: {\n lock: postgres_lock_lock,\n },\n offset: {\n offset: postgres_offset_offset,\n },\n on_duplicate: {\n on_duplicate: postgres_on_duplicate_on_duplicate,\n },\n order_by: {\n order_by: postgres_order_by_order_by,\n },\n raw: {\n raw: postgres_raw_raw,\n },\n schema: {\n foreign_key_info: postgres_schema_foreign_key_info,\n index_info: postgres_schema_index_info,\n primary_key_info: postgres_schema_primary_key_info,\n table_info: postgres_schema_table_info,\n },\n select: {\n select: postgres_select_select,\n },\n truncate: {\n truncate: postgres_truncate_truncate,\n },\n union: {\n union: postgres_union_union,\n },\n update: {\n update: postgres_update_update,\n },\n where: {\n where: postgres_where_where,\n where_group: postgres_where_where_group,\n where_json: postgres_where_where_json,\n where_subquery: postgres_where_where_subquery,\n },\n with: {\n with: postgres_with_with,\n },\n },\n sqlite: {\n alter_table: {\n add_column: sqlite_alter_table_add_column,\n add_constraint: sqlite_alter_table_add_constraint,\n alter_column_type: sqlite_alter_table_alter_column_type,\n alter_table: sqlite_alter_table_alter_table,\n drop_column: sqlite_alter_table_drop_column,\n drop_constraint: sqlite_alter_table_drop_constraint,\n drop_default: sqlite_alter_table_drop_default,\n drop_not_null: sqlite_alter_table_drop_not_null,\n drop_primary_key: sqlite_alter_table_drop_primary_key,\n rename_column: sqlite_alter_table_rename_column,\n rename_table: sqlite_alter_table_rename_table,\n set_default: sqlite_alter_table_set_default,\n set_not_null: sqlite_alter_table_set_not_null,\n },\n column: {\n column_type: sqlite_column_column_type,\n },\n constraint: {\n after: sqlite_constraint_after,\n constraint: sqlite_constraint_constraint,\n },\n create_table: {\n create_table: sqlite_create_table_create_table,\n },\n delete: {\n delete: sqlite_delete_delete,\n },\n distinct: {\n distinct: sqlite_distinct_distinct,\n distinct_on: sqlite_distinct_distinct_on,\n },\n drop_table: {\n drop_table: sqlite_drop_table_drop_table,\n },\n extension: {\n create_extension: sqlite_extension_create_extension,\n },\n from: {\n from: sqlite_from_from,\n },\n group_by: {\n group_by: sqlite_group_by_group_by,\n },\n having: {\n having: sqlite_having_having,\n },\n index_op: {\n create_index: sqlite_index_op_create_index,\n drop_index: sqlite_index_op_drop_index,\n },\n insert: {\n insert: sqlite_insert_insert,\n },\n join: {\n join: sqlite_join_join,\n },\n limit: {\n limit: sqlite_limit_limit,\n },\n lock: {\n lock: sqlite_lock_lock,\n },\n offset: {\n offset: sqlite_offset_offset,\n },\n on_duplicate: {\n on_duplicate: sqlite_on_duplicate_on_duplicate,\n },\n order_by: {\n order_by: sqlite_order_by_order_by,\n },\n raw: {\n raw: sqlite_raw_raw,\n },\n schema: {\n foreign_key_info: sqlite_schema_foreign_key_info,\n index_info: sqlite_schema_index_info,\n primary_key_info: sqlite_schema_primary_key_info,\n table_info: sqlite_schema_table_info,\n },\n select: {\n select: sqlite_select_select,\n },\n truncate: {\n truncate: sqlite_truncate_truncate,\n },\n union: {\n union: sqlite_union_union,\n },\n update: {\n update: sqlite_update_update,\n },\n where: {\n where: sqlite_where_where,\n where_group: sqlite_where_where_group,\n where_json: sqlite_where_where_json,\n where_subquery: sqlite_where_where_subquery,\n },\n with: {\n with: sqlite_with_with,\n },\n },\n} as any;\n","import type { Interpreter } from \"../interpreter/interpreter\";\nimport { Model } from \"../models/model\";\nimport { SqlDataSourceType } from \"../sql_data_source_types\";\nimport { interpreterMap } from \"./interpreter_map\";\nimport type { AstParserType } from \"./parser_types\";\nimport { QueryNode } from \"./query/query\";\n\nexport class AstParser {\n private readonly dbType: SqlDataSourceType;\n private readonly model: typeof Model;\n\n constructor(model: typeof Model, dbType: SqlDataSourceType) {\n this.dbType = dbType;\n this.model = model;\n }\n\n parse(\n nodes: (QueryNode | null)[],\n startBindingIndex: number = 1,\n isNestedCondition: boolean = false,\n ): AstParserType {\n if (!nodes.length) {\n return {\n sql: \"\",\n bindings: [],\n };\n }\n\n const distinctOnNode = nodes.find(\n (node): node is QueryNode & { columns: string[] } =>\n !!node && node.folder === \"distinctOn\",\n );\n const distinctNode =\n !distinctOnNode &&\n nodes.find(\n (node): node is QueryNode => !!node && node.folder === \"distinct\",\n );\n\n // For MSSQL, extract lock node to inject as table hints after FROM clause\n const lockNode =\n this.dbType === \"mssql\"\n ? (nodes.find(\n (\n node,\n ): node is QueryNode & {\n lockType: string;\n skipLocked?: boolean;\n noWait?: boolean;\n } => !!node && node.folder === \"lock\",\n ) ?? null)\n : null;\n const mssqlTableHints = lockNode ? this.getMssqlTableHints(lockNode) : \"\";\n\n const filteredNodes = nodes.filter(\n (node): node is QueryNode =>\n node !== null &&\n node.folder !== \"distinct\" &&\n node.folder !== \"distinctOn\",\n );\n\n const hasOffset = filteredNodes.some((n) => n.folder === \"offset\");\n const hasOrderBy = filteredNodes.some((n) => n.folder === \"order_by\");\n const limitNode = filteredNodes.find((n) => n.folder === \"limit\") as\n | (QueryNode & { limit: number })\n | undefined;\n const offsetNode = filteredNodes.find((n) => n.folder === \"offset\") as\n | (QueryNode & { offset: number })\n | undefined;\n const useMssqlTop =\n this.dbType === \"mssql\" && limitNode && !hasOffset && !hasOrderBy;\n const useMssqlOffsetFetch =\n this.dbType === \"mssql\" && !useMssqlTop && (limitNode || offsetNode);\n // Oracle 12c+ uses standard OFFSET/FETCH syntax like MSSQL\n const useOracleOffsetFetch =\n this.dbType === \"oracledb\" && (limitNode || offsetNode);\n\n const sqlParts: string[] = [];\n const allBindings: any[] = [];\n let currentSqlKeyword: string | null = null;\n\n if (useMssqlTop && limitNode) {\n allBindings.push(limitNode.limit);\n }\n\n for (let i = 0; i < filteredNodes.length; i++) {\n const node = filteredNodes[i];\n\n if (useMssqlTop && node.folder === \"limit\") {\n continue;\n }\n\n if (\n useMssqlOffsetFetch &&\n (node.folder === \"limit\" || node.folder === \"offset\")\n ) {\n continue;\n }\n\n if (\n useOracleOffsetFetch &&\n (node.folder === \"limit\" || node.folder === \"offset\")\n ) {\n continue;\n }\n\n node.currParamIndex = startBindingIndex + allBindings.length;\n\n const interpreter: Interpreter =\n interpreterMap[this.mapCommonDbType(this.dbType)][node.folder][\n node.file\n ];\n\n if (!interpreter) {\n throw new Error(\n `Interpreter not found for ${this.dbType} ${node.keyword}`,\n );\n }\n\n interpreter.model = this.model;\n const sqlStatement = interpreter.toSql(node);\n\n if (!sqlStatement.sql || !sqlStatement.sql.trim().length) {\n continue;\n }\n\n const nextNode = filteredNodes[i + 1];\n const isLastOfType = !nextNode || nextNode.keyword !== node.keyword;\n const chainWith = isLastOfType ? \"\" : nextNode.chainsWith;\n\n if (\n node.folder === \"lock\" ||\n node.folder === \"on_duplicate\" ||\n node.folder === \"schema\"\n ) {\n sqlParts.push(`${sqlStatement.sql}${chainWith}`);\n allBindings.push(...sqlStatement.bindings);\n currentSqlKeyword = node.keyword;\n continue;\n }\n\n if (\n currentSqlKeyword !== node.keyword ||\n node.canKeywordBeSeenMultipleTimes\n ) {\n if (isNestedCondition) {\n sqlParts.push(`${sqlStatement.sql}${chainWith}`);\n } else {\n let keywordToEmit = node.keyword;\n if (node.folder === \"with\") {\n // MSSQL doesn't use RECURSIVE keyword - recursion is implicit\n if (this.dbType !== \"mssql\") {\n let j = i;\n let hasRecursive = false;\n while (\n j < filteredNodes.length &&\n filteredNodes[j].keyword === node.keyword\n ) {\n const candidate = filteredNodes[j] as any;\n if (\n candidate.folder === \"with\" &&\n candidate.clause === \"recursive\"\n ) {\n hasRecursive = true;\n break;\n }\n j++;\n }\n if (hasRecursive) {\n keywordToEmit = `${keywordToEmit} recursive`;\n }\n }\n }\n\n if (keywordToEmit === \"select\") {\n const topClause = useMssqlTop ? `top (@${startBindingIndex}) ` : \"\";\n if (distinctOnNode) {\n const columns = Array.isArray((distinctOnNode as any).columns)\n ? (distinctOnNode as any).columns.join(\", \")\n : \"\";\n sqlParts.push(\n `select ${topClause}distinct on (${columns}) ${sqlStatement.sql}${chainWith}`,\n );\n } else if (distinctNode) {\n sqlParts.push(\n `select ${topClause}distinct ${sqlStatement.sql}${chainWith}`,\n );\n } else {\n sqlParts.push(\n `select ${topClause}${sqlStatement.sql}${chainWith}`,\n );\n }\n } else if (keywordToEmit === \"from\" && mssqlTableHints) {\n // For MSSQL, inject table hints after the FROM clause table name\n sqlParts.push(\n `${keywordToEmit} ${sqlStatement.sql}${mssqlTableHints}${chainWith}`,\n );\n } else {\n sqlParts.push(`${keywordToEmit} ${sqlStatement.sql}${chainWith}`);\n }\n }\n currentSqlKeyword = node.keyword;\n } else {\n sqlParts.push(`${sqlStatement.sql}${chainWith}`);\n }\n\n allBindings.push(...sqlStatement.bindings);\n }\n\n if (useMssqlOffsetFetch) {\n if (!hasOrderBy) {\n sqlParts.push(\"order by (select null)\");\n }\n\n const offsetVal = offsetNode?.offset ?? 0;\n allBindings.push(offsetVal);\n const offsetParamIdx = startBindingIndex + allBindings.length - 1;\n let paginationSql = `offset @${offsetParamIdx} rows`;\n\n if (limitNode) {\n allBindings.push(limitNode.limit);\n const limitParamIdx = startBindingIndex + allBindings.length - 1;\n paginationSql += ` fetch next @${limitParamIdx} rows only`;\n }\n\n sqlParts.push(paginationSql);\n }\n\n if (useOracleOffsetFetch) {\n if (!hasOrderBy) {\n sqlParts.push(\"order by null\");\n }\n\n const offsetVal = offsetNode?.offset ?? 0;\n allBindings.push(offsetVal);\n const offsetParamIdx = startBindingIndex + allBindings.length - 1;\n let paginationSql = `offset :${offsetParamIdx} rows`;\n\n if (limitNode) {\n allBindings.push(limitNode.limit);\n const limitParamIdx = startBindingIndex + allBindings.length - 1;\n paginationSql += ` fetch next :${limitParamIdx} rows only`;\n }\n\n sqlParts.push(paginationSql);\n }\n\n const finalSql = sqlParts.join(\" \");\n\n return {\n sql: finalSql,\n bindings: allBindings,\n };\n }\n\n /**\n * Map the database type to a common type if shares the same driver (e.g. mysql and mariadb)\n */\n private mapCommonDbType(dbType: SqlDataSourceType) {\n switch (dbType) {\n case \"mariadb\":\n return \"mysql\";\n case \"cockroachdb\":\n return \"postgres\";\n default:\n return dbType;\n }\n }\n\n /**\n * @description Generates MSSQL table hints from lock node\n * MSSQL uses WITH (UPDLOCK), WITH (HOLDLOCK), etc. as table hints\n * READPAST is the MSSQL equivalent of SKIP LOCKED\n */\n private getMssqlTableHints(\n lockNode: QueryNode & {\n lockType: string;\n skipLocked?: boolean;\n noWait?: boolean;\n },\n ): string {\n const hints: string[] = [];\n\n switch (lockNode.lockType) {\n case \"UPDATE\":\n hints.push(\"UPDLOCK\");\n break;\n case \"SHARE\":\n hints.push(\"HOLDLOCK\");\n break;\n case \"NO_KEY_UPDATE\":\n hints.push(\"UPDLOCK\");\n break;\n case \"KEY_SHARE\":\n hints.push(\"HOLDLOCK\");\n break;\n }\n\n if (lockNode.skipLocked) {\n hints.push(\"READPAST\");\n }\n\n // NOWAIT is handled via SET LOCK_TIMEOUT 0, not as a table hint\n // but we can add NOWAIT hint for newer MSSQL versions\n if (lockNode.noWait) {\n hints.push(\"NOWAIT\");\n }\n\n return hints.length > 0 ? ` with (${hints.join(\", \")})` : \"\";\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class ForeignKeyInfoNode extends QueryNode {\n table: string;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"schema\";\n file = \"foreign_key_info\";\n\n constructor(table: string) {\n super(\"schema\");\n this.table = table;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class IndexInfoNode extends QueryNode {\n table: string;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"schema\";\n file = \"index_info\";\n\n constructor(table: string) {\n super(\"schema\");\n this.table = table;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class PrimaryKeyInfoNode extends QueryNode {\n table: string;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"schema\";\n file = \"primary_key_info\";\n\n constructor(table: string) {\n super(\"schema\");\n this.table = table;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class TableInfoNode extends QueryNode {\n table: string;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"schema\";\n file = \"table_info\";\n\n constructor(table: string) {\n super(\"schema\");\n this.table = table;\n }\n}\n","import { QueryNode } from \"../../query\";\nimport { ColumnTypeNode } from \"../column\";\n\nexport class AddColumnNode extends QueryNode {\n column: ColumnTypeNode;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"alter_table\";\n file = \"add_column\";\n\n constructor(column: ColumnTypeNode) {\n super(\"\");\n this.column = column;\n }\n}\n","import { QueryNode } from \"../../query\";\nimport { ConstraintNode } from \"../constraint\";\n\nexport class AddConstraintNode extends QueryNode {\n constraint: ConstraintNode;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"alter_table\";\n file = \"add_constraint\";\n\n constructor(constraint: ConstraintNode) {\n super(\"\");\n this.constraint = constraint;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class AddPrimaryKeyNode extends QueryNode {\n columns: string[];\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"alter_table\";\n file = \"add_primary_key\";\n\n constructor(columns: string[]) {\n super(\"\");\n this.columns = columns;\n }\n}\n","import { QueryNode } from \"../../query\";\nimport { ColumnTypeNode } from \"../column\";\n\nexport interface AlterColumnOptions {\n nullable?: boolean;\n unique?: boolean;\n default?: string | number | boolean | null;\n dropDefault?: boolean;\n}\n\nexport class AlterColumnTypeNode extends QueryNode {\n column: string;\n newType: ColumnTypeNode;\n options: AlterColumnOptions;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"alter_table\";\n file = \"alter_column_type\";\n\n constructor(\n column: string,\n newType: ColumnTypeNode,\n options: AlterColumnOptions = {},\n ) {\n super(\"\");\n this.column = column;\n this.newType = newType;\n this.options = options;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class AlterTableNode extends QueryNode {\n table: string;\n children: QueryNode[];\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"alter_table\";\n file = \"alter_table\";\n ifExists: boolean;\n\n constructor(\n table: string,\n children: QueryNode[] = [],\n ifExists: boolean = false,\n ) {\n super(\"alter table\");\n this.table = table;\n this.children = children;\n this.ifExists = ifExists;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class DropColumnNode extends QueryNode {\n column: string;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"alter_table\";\n file = \"drop_column\";\n constructor(column: string) {\n super(\"\");\n this.column = column;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class DropConstraintNode extends QueryNode {\n constraintName: string;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"alter_table\";\n file = \"drop_constraint\";\n\n constructor(name: string) {\n super(\"\");\n this.constraintName = name;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class DropDefaultNode extends QueryNode {\n column: string;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"alter_table\";\n file = \"drop_default\";\n\n constructor(column: string) {\n super(\"\");\n this.column = column;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class DropNotNullNode extends QueryNode {\n column: string;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"alter_table\";\n file = \"drop_not_null\";\n\n constructor(column: string) {\n super(\"\");\n this.column = column;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class DropPrimaryKeyNode extends QueryNode {\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"alter_table\";\n file = \"drop_primary_key\";\n table?: string;\n\n constructor(table?: string) {\n super(\"\");\n this.table = table;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class RenameColumnNode extends QueryNode {\n oldName: string;\n newName: string;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"alter_table\";\n file = \"rename_column\";\n constructor(oldName: string, newName: string) {\n super(\"\");\n this.oldName = oldName;\n this.newName = newName;\n }\n}\n","import { QueryNode } from \"../../query\";\nimport { RawNode } from \"../raw/raw_node\";\n\nexport class SetDefaultNode extends QueryNode {\n column: string;\n defaultValue: string | RawNode;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"alter_table\";\n file = \"set_default\";\n\n constructor(column: string, defaultValue: string | RawNode) {\n super(\"\");\n this.column = column;\n this.defaultValue = defaultValue;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class SetNotNullNode extends QueryNode {\n column: string;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"alter_table\";\n file = \"set_not_null\";\n\n constructor(column: string) {\n super(\"\");\n this.column = column;\n }\n}\n","import { QueryNode } from \"../../query\";\nimport { RawNode } from \"../raw/raw_node\";\n\nexport type ConstraintType =\n | \"primary_key\"\n | \"foreign_key\"\n | \"unique\"\n | \"not_null\"\n | \"null\"\n | \"default\";\n\nexport class ConstraintNode extends QueryNode {\n constraintType: ConstraintType;\n columns?: (string | (() => string))[];\n references?: { table: string; columns: (string | (() => string))[] };\n constraintName?: string;\n onDelete?: \"cascade\" | \"restrict\" | \"set null\" | \"no action\";\n onUpdate?: \"cascade\" | \"restrict\" | \"set null\" | \"no action\";\n defaultValue?: string | RawNode | undefined;\n checkExpression?: string;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"constraint\";\n file = \"constraint\";\n\n constructor(\n constraintType: ConstraintType,\n args: {\n columns?: string[];\n references?: { table: string; columns: string[] };\n constraintName?: string;\n onDelete?: \"cascade\" | \"restrict\" | \"set null\" | \"no action\";\n onUpdate?: \"cascade\" | \"restrict\" | \"set null\" | \"no action\";\n defaultValue?: string | RawNode | undefined;\n checkExpression?: string;\n } = {},\n isRawValue: boolean = false,\n ) {\n super(\"\");\n this.constraintType = constraintType;\n this.columns = args.columns;\n this.references = args.references;\n this.constraintName = args.constraintName;\n this.onDelete = args.onDelete;\n this.onUpdate = args.onUpdate;\n this.defaultValue = args.defaultValue;\n this.checkExpression = args.checkExpression;\n this.isRawValue = isRawValue;\n }\n}\n","import { QueryNode } from \"../../query\";\nimport { ConstraintNode } from \"../constraint\";\n\nexport class CreateTableNode extends QueryNode {\n table: string;\n children: QueryNode[];\n namedConstraints: ConstraintNode[];\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"create_table\";\n file = \"create_table\";\n ifNotExists: boolean;\n\n constructor(\n table: string,\n children: QueryNode[] = [],\n namedConstraints: ConstraintNode[] = [],\n ifNotExists: boolean = false,\n ) {\n super(\"create table\");\n this.table = table;\n this.children = children;\n this.namedConstraints = namedConstraints;\n this.ifNotExists = ifNotExists;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class DropTableNode extends QueryNode {\n table: string;\n ifExists: boolean;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"drop_table\";\n file = \"drop_table\";\n\n constructor(table: string, ifExists: boolean = false) {\n super(\"drop table\");\n this.table = table;\n this.ifExists = ifExists;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class CreateExtensionNode extends QueryNode {\n extensionName: string;\n ifNotExists: boolean;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"extension\";\n file = \"create_extension\";\n\n constructor(extensionName: string, ifNotExists: boolean = true) {\n super(\"create extension\");\n this.extensionName = extensionName;\n this.ifNotExists = ifNotExists;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class CreateIndexNode extends QueryNode {\n table: string;\n columns: string[];\n indexName: string;\n unique: boolean;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"index_op\";\n file = \"create_index\";\n\n constructor(\n table: string,\n columns: string[],\n indexName: string,\n unique = false,\n ) {\n super(\"create index\");\n this.table = table;\n this.columns = columns;\n this.indexName = indexName;\n this.unique = unique;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class DropIndexNode extends QueryNode {\n indexName: string;\n table?: string; // required for mysql\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n cascade = false;\n folder = \"index_op\";\n file = \"drop_index\";\n\n constructor(indexName: string, table?: string, cascade?: boolean) {\n super(\"drop index\");\n this.indexName = indexName;\n this.table = table;\n this.cascade = cascade ?? false;\n }\n}\n","import { QueryNode } from \"../../query\";\nimport { FromNode } from \"../from\";\n\nexport class TruncateNode extends QueryNode {\n fromNode: FromNode | string;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"truncate\";\n file = \"truncate\";\n\n constructor(fromNode: FromNode | string, isRawValue: boolean = false) {\n super(\"truncate\", isRawValue);\n this.fromNode = fromNode;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class ColumnTypeNode extends QueryNode {\n column: string | (() => string);\n dataType: string;\n length?: number;\n precision?: number;\n scale?: number;\n enumValues?: readonly string[];\n autoIncrement?: boolean;\n withTimezone?: boolean;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"column\";\n file = \"column_type\";\n isRawValue = false;\n\n constructor(\n column: string,\n dataType: string,\n opts: {\n length?: number;\n precision?: number;\n scale?: number;\n enumValues?: readonly string[];\n withTimezone?: boolean;\n autoIncrement?: boolean;\n isRawValue?: boolean;\n } = {},\n ) {\n super(\"\");\n this.column = column;\n this.dataType = dataType;\n this.length = opts.length;\n this.precision = opts.precision;\n this.scale = opts.scale;\n this.enumValues = opts.enumValues;\n this.withTimezone = opts.withTimezone;\n this.autoIncrement = opts.autoIncrement;\n this.isRawValue = opts.isRawValue ?? false;\n }\n}\n","import { QueryNode } from \"../../query\";\n\ntype LockType =\n | \"for_update\"\n | \"for_share\"\n | \"for_no_key_update\"\n | \"for_key_share\";\n\nexport class LockNode extends QueryNode {\n lockType: LockType;\n skipLocked: boolean;\n noWait: boolean;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"lock\";\n file = \"lock\";\n\n constructor(\n lockType: LockType,\n skipLocked: boolean = false,\n noWait: boolean = false,\n ) {\n super(\"lock\");\n this.lockType = lockType;\n this.skipLocked = skipLocked;\n this.noWait = noWait;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class UnionNode extends QueryNode {\n query: QueryNode | QueryNode[] | string;\n isAll: boolean;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"union\";\n file = \"union\";\n\n constructor(query: QueryNode | QueryNode[] | string, isAll: boolean = false) {\n super(isAll ? \"union all\" : \"union\");\n this.query = query;\n this.isAll = isAll;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class WithNode extends QueryNode {\n alias: string;\n body: QueryNode | QueryNode[];\n clause: string;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"with\";\n file = \"with\";\n\n constructor(clause: string, alias: string, body: QueryNode | QueryNode[]) {\n if (clause === \"normal\") {\n clause = \"\";\n }\n\n super(\"with\");\n this.alias = alias;\n this.body = body;\n this.clause = clause;\n }\n}\n","import { QueryNode } from \"../../ast/query/query\";\n\nexport abstract class BaseBuilder {\n protected nodes: QueryNode[];\n\n constructor(nodes: QueryNode[]) {\n this.nodes = nodes;\n }\n\n getNodes(): QueryNode[] {\n return this.nodes;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class AfterConstraintNode extends QueryNode {\n column: string;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"constraint\";\n file = \"after\";\n\n constructor(column: string) {\n super(\"\");\n this.column = column;\n }\n}\n","import { ColumnTypeNode } from \"../../ast/query/node/column\";\nimport { ConstraintNode } from \"../../ast/query/node/constraint\";\nimport { AfterConstraintNode } from \"../../ast/query/node/constraint/after\";\nimport { RawNode } from \"../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../ast/query/query\";\nimport {\n getDefaultFkConstraintName,\n getDefaultPrimaryKeyConstraintName,\n getDefaultUniqueConstraintName,\n} from \"../../models/decorators/model_decorators_constants\";\nimport { getColumnValue } from \"../../resources/utils\";\nimport { SqlDataSourceType } from \"../../sql_data_source_types\";\nimport { BaseBuilder } from \"./base_builder\";\nimport {\n CommonConstraintOptions,\n CreateTableContext,\n ForeignKeyOptions,\n PrimaryKeyOptions,\n} from \"./schema_types\";\n\nexport class ConstraintBuilder extends BaseBuilder {\n private readonly columnNode: ColumnTypeNode;\n private readonly tableName?: string;\n private namedConstraints: QueryNode[];\n private context: CreateTableContext;\n private sqlType: SqlDataSourceType;\n\n constructor(\n sqlType: SqlDataSourceType,\n nodes: QueryNode[],\n columnNode: ColumnTypeNode,\n tableName?: string,\n namedConstraints: QueryNode[] = [],\n context: CreateTableContext = \"create_table\",\n ) {\n super(nodes);\n this.columnNode = columnNode;\n this.tableName = tableName;\n this.namedConstraints = namedConstraints;\n this.context = context;\n this.sqlType = sqlType;\n }\n\n // #region primary key\n /**\n * @description Adds a primary key constraint to the column, if no constraint name is provided, it will be generated using the standard pattern: pk_${table}_${column}\n * @param options is the options for the primary key constraint\n */\n primaryKey(options?: PrimaryKeyOptions): this {\n const defaultName = getDefaultPrimaryKeyConstraintName(\n this.tableName as string,\n getColumnValue(this.columnNode.column),\n );\n\n if (this.context === \"alter_table\") {\n this.nodes.push(\n new ConstraintNode(\"primary_key\", {\n columns: [getColumnValue(this.columnNode.column)],\n constraintName: options?.constraintName ?? defaultName,\n }),\n );\n\n return this;\n }\n\n if (this.sqlType === \"sqlite\") {\n return this.handleSqliteAutoIncrement(\n options || { constraintName: defaultName },\n );\n }\n\n this.namedConstraints.push(\n new ConstraintNode(\"primary_key\", {\n columns: [getColumnValue(this.columnNode.column)],\n constraintName: options?.constraintName ?? defaultName,\n }),\n );\n\n return this;\n }\n\n // #endregion\n\n // #region foreign key\n\n /**\n * @description Adds a foreign key constraint to the column, if no constraint name is provided, it will be generated using the standard pattern: fk_${table}_${leftColumn}_${rightColumn}\n * @param references is the table and column name to reference, e.g. \"users.id\"\n * @param options is the options for the foreign key constraint\n */\n foreignKey(\n references: `${string}.${string}`,\n options?: ForeignKeyOptions,\n ): this {\n const [table, cols] = references.split(\".\");\n const refCols = cols.split(\",\");\n const name =\n options?.constraintName ??\n getDefaultFkConstraintName(\n this.tableName ?? \"\",\n getColumnValue(this.columnNode.column),\n refCols[0],\n );\n\n if (this.context === \"alter_table\") {\n this.nodes.push(\n new ConstraintNode(\"foreign_key\", {\n columns: [getColumnValue(this.columnNode.column)],\n references: { table, columns: refCols },\n constraintName: name,\n onDelete: options?.onDelete,\n onUpdate: options?.onUpdate,\n }),\n );\n\n return this;\n }\n\n this.namedConstraints.push(\n new ConstraintNode(\"foreign_key\", {\n columns: [getColumnValue(this.columnNode.column)],\n references: { table, columns: refCols },\n constraintName: name,\n onDelete: options?.onDelete,\n onUpdate: options?.onUpdate,\n }),\n );\n\n return this;\n }\n\n /**\n * @description Sets the column to auto increment\n */\n increment(): this {\n this.columnNode.autoIncrement = true;\n return this;\n }\n\n // #endregion\n\n // #region not nullable\n /**\n * @description Sets the column to not nullable\n */\n notNullable(): this {\n this.nodes.push(\n new ConstraintNode(\"not_null\", {\n columns: [getColumnValue(this.columnNode.column)],\n }),\n );\n return this;\n }\n\n // #endregion\n\n // #region nullable\n /**\n * @description Sets the column to nullable, by default it already is nullable, this method is only used for alter table\n */\n nullable(): this {\n this.nodes.push(\n new ConstraintNode(\"null\", {\n columns: [getColumnValue(this.columnNode.column)],\n }),\n );\n\n return this;\n }\n\n // #endregion\n\n // #region default\n /**\n * @description Sets the default value for the column\n * @param value is the default value for the column\n * @oracle not supported must be defined manually in a separate statement\n */\n default(value: string | number | boolean | null | RawNode): this {\n let defaultVal: string | undefined | RawNode;\n\n if (value instanceof RawNode) {\n defaultVal = value;\n } else if (value === null) {\n defaultVal = \"NULL\";\n } else if (typeof value === \"boolean\") {\n defaultVal = value ? \"TRUE\" : \"FALSE\";\n } else if (value !== undefined) {\n defaultVal = value.toString();\n }\n\n this.nodes.push(\n new ConstraintNode(\"default\", {\n defaultValue: defaultVal,\n }),\n );\n\n return this;\n }\n\n // #endregion\n\n // #region unique\n /**\n * @description Sets the column to unique\n * @param options is the options for the unique constraint\n */\n unique(options?: CommonConstraintOptions): this {\n if (this.context === \"alter_table\") {\n this.nodes.push(\n new ConstraintNode(\"unique\", {\n columns: [getColumnValue(this.columnNode.column)],\n constraintName:\n options?.constraintName ??\n getDefaultUniqueConstraintName(\n this.tableName ?? \"\",\n getColumnValue(this.columnNode.column),\n ),\n }),\n );\n\n return this;\n }\n\n this.namedConstraints.push(\n new ConstraintNode(\"unique\", {\n columns: [getColumnValue(this.columnNode.column)],\n constraintName:\n options?.constraintName ||\n getDefaultUniqueConstraintName(\n this.tableName ?? \"\",\n getColumnValue(this.columnNode.column),\n ),\n }),\n );\n\n return this;\n }\n // #endregion\n\n // #region after\n /**\n * @description Sets the column to be after another column\n * @param columnName is the name of the column to be after\n * @mysql only\n */\n after(columnName: string): this {\n this.nodes.push(new AfterConstraintNode(columnName));\n return this;\n }\n\n // #endregion\n\n // Sqlite is special, it doesn't support auto increment on primary key table wise, so we need to handle it inline in column definition\n private handleSqliteAutoIncrement(options?: PrimaryKeyOptions): this {\n this.nodes.push(\n new ConstraintNode(\"primary_key\", {\n columns: [getColumnValue(this.columnNode.column)],\n constraintName: options?.constraintName,\n autoIncrement: this.columnNode.autoIncrement,\n columnType: \"integer\",\n } as any),\n );\n return this;\n }\n}\n","import { ColumnTypeNode } from \"../../ast/query/node/column\";\nimport { RawNode } from \"../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../ast/query/query\";\nimport { SqlDataSourceType } from \"../../sql_data_source_types\";\nimport { BaseBuilder } from \"./base_builder\";\nimport { ConstraintBuilder } from \"./constraint_builder\";\n\nexport class CreateTableBuilder extends BaseBuilder {\n private tableName?: string;\n private namedConstraints: QueryNode[];\n private context: \"alter_table\" | \"create_table\" = \"create_table\";\n private sqlType: SqlDataSourceType;\n\n constructor(\n sqlType: SqlDataSourceType,\n nodes: QueryNode[],\n tableName?: string,\n context?: \"alter_table\" | \"create_table\",\n ) {\n super(nodes);\n this.tableName = tableName;\n this.namedConstraints = [];\n this.context = context ?? \"create_table\";\n this.sqlType = sqlType;\n }\n\n private build(node: ColumnTypeNode): ConstraintBuilder {\n this.nodes.push(node);\n return new ConstraintBuilder(\n this.sqlType,\n this.nodes,\n node,\n this.tableName,\n this.namedConstraints,\n this.context,\n );\n }\n\n /**\n * @description Adds a raw statement to define a default value as is\n * @example\n * ```ts\n * table.varchar(\"name\").default(table.rawStatement(\"CURRENT_TIMESTAMP\"));\n * ```\n */\n rawStatement(value: string): RawNode {\n return new RawNode(value);\n }\n\n // #region string\n /**\n * Fixed-length character string\n * @mysql Supported as CHAR(length)\n * @postgres Supported as CHAR(length)\n * @sqlite Supported as TEXT (length ignored)\n */\n char(name: string, length: number = 1): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"char\", { length });\n return this.build(node);\n }\n\n /**\n * Variable-length character string\n * @mysql Supported as VARCHAR(length)\n * @postgres Supported as VARCHAR(length)\n * @sqlite Supported as TEXT (length ignored)\n */\n varchar(name: string, length: number = 255): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"varchar\", { length });\n return this.build(node);\n }\n\n /**\n * @alias varchar\n */\n string(name: string, length: number = 255): ConstraintBuilder {\n return this.varchar(name, length);\n }\n\n /**\n * Text types with various sizes\n * @mysql Supported as TEXT, MEDIUMTEXT, LONGTEXT, TINYTEXT\n * @postgres All mapped to TEXT\n * @sqlite All mapped to TEXT\n */\n text(\n name: string,\n type: \"longtext\" | \"mediumtext\" | \"tinytext\" = \"longtext\",\n ): ConstraintBuilder {\n const node = new ColumnTypeNode(name, type);\n return this.build(node);\n }\n\n /**\n * @mysql LONGTEXT\n * @postgres TEXT\n * @sqlite TEXT\n */\n longtext(name: string): ConstraintBuilder {\n return this.text(name, \"longtext\");\n }\n\n /**\n * @mysql MEDIUMTEXT\n * @postgres TEXT\n * @sqlite TEXT\n */\n mediumtext(name: string): ConstraintBuilder {\n return this.text(name, \"mediumtext\");\n }\n\n /**\n * @mysql TINYTEXT\n * @postgres TEXT\n * @sqlite TEXT\n */\n tinytext(name: string): ConstraintBuilder {\n return this.text(name, \"tinytext\");\n }\n\n /**\n * UUID identifier\n * @mysql VARCHAR(36)\n * @postgres UUID (native type)\n * @sqlite VARCHAR(36)\n */\n uuid(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"uuid\");\n return this.build(node);\n }\n\n /**\n * ULID (Universally Unique Lexicographically Sortable Identifier)\n * @mysql VARCHAR(26)\n * @postgres VARCHAR(26)\n * @sqlite VARCHAR(26)\n */\n ulid(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"ulid\");\n return this.build(node);\n }\n\n // #endregion\n\n // #region number\n /**\n * Integer type\n * @mysql INT (with optional auto_increment)\n * @postgres INTEGER (with optional SERIAL for auto_increment)\n * @sqlite INTEGER (with optional autoincrement)\n */\n integer(name: string, length: number = 255): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"integer\", { length });\n return this.build(node);\n }\n\n /**\n * Small integer type\n * @mysql TINYINT\n * @postgres SMALLINT\n * @sqlite INTEGER\n */\n tinyint(name: string, length: number = 255): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"tinyint\", { length });\n return this.build(node);\n }\n\n /**\n * Small integer type\n * @mysql SMALLINT\n * @postgres SMALLINT\n * @sqlite INTEGER\n */\n smallint(name: string, length: number = 255): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"smallint\", { length });\n return this.build(node);\n }\n\n /**\n * Medium integer type\n * @mysql MEDIUMINT\n * @postgres INTEGER\n * @sqlite INTEGER\n */\n mediumint(name: string, length: number = 255): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"mediumint\", { length });\n return this.build(node);\n }\n\n /**\n * Large integer type\n * @mysql BIGINT (with optional auto_increment)\n * @postgres BIGINT (with optional BIGSERIAL for auto_increment)\n * @sqlite INTEGER\n */\n biginteger(name: string, length: number = 255): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"bigint\", { length });\n return this.build(node);\n }\n\n /**\n * @alias biginteger\n */\n bigint(name: string, length: number = 255): ConstraintBuilder {\n return this.biginteger(name, length);\n }\n\n /**\n * Single precision floating point\n * @mysql FLOAT\n * @postgres REAL\n * @sqlite REAL\n */\n float(name: string, precision: number = 10): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"float\", { precision });\n return this.build(node);\n }\n\n /**\n * Double precision floating point\n * @mysql DOUBLE\n * @postgres DOUBLE PRECISION\n * @sqlite REAL\n */\n double(name: string, precision: number = 10): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"double\", { precision });\n return this.build(node);\n }\n\n /**\n * Real number type\n * @mysql DOUBLE (alias)\n * @postgres REAL\n * @sqlite REAL\n */\n real(name: string, precision: number = 10): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"real\", { precision });\n return this.build(node);\n }\n\n /**\n * Exact decimal number\n * @mysql DECIMAL(precision, scale)\n * @postgres NUMERIC(precision, scale)\n * @sqlite NUMERIC(precision, scale)\n */\n decimal(\n name: string,\n precision: number = 10,\n scale: number = 2,\n ): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"decimal\", { precision, scale });\n return this.build(node);\n }\n\n /**\n * Exact numeric type (alias for decimal)\n * @mysql NUMERIC(precision, scale)\n * @postgres NUMERIC(precision, scale)\n * @sqlite NUMERIC(precision, scale)\n */\n numeric(\n name: string,\n precision: number = 10,\n scale: number = 2,\n ): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"numeric\", { precision, scale });\n return this.build(node);\n }\n\n // #endregion\n\n // #region incremental integers\n /**\n * @description Short for integer.increment\n * @mysql INTEGER (with auto_increment)\n * @postgres INTEGER (with SERIAL for auto_increment)\n * @sqlite INTEGER (with autoincrement)\n */\n increment(\n name: string,\n length: number = 255,\n ): Omit<ConstraintBuilder, \"increment\"> {\n return this.integer(name, length).increment();\n }\n\n /**\n * @description Short for biginteger.increment\n * @mysql BIGINT (with auto_increment)\n * @postgres BIGINT (with BIGSERIAL for auto_increment)\n * @sqlite INTEGER\n */\n bigIncrement(\n name: string,\n length: number = 255,\n ): Omit<ConstraintBuilder, \"increment\"> {\n return this.biginteger(name, length).increment();\n }\n\n // #endregion\n\n // #region date\n /**\n * Date type\n * @mysql DATE\n * @postgres DATE\n * @sqlite TEXT\n */\n date(name: string, precision?: number): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"date\", { precision });\n return this.build(node);\n }\n\n /**\n * Time type\n * @mysql TIME(precision)\n * @postgres TIME(precision)\n * @sqlite TEXT\n */\n time(name: string, precision?: number): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"time\", { precision });\n return this.build(node);\n }\n\n /**\n * Year type\n * @mysql YEAR\n * @postgres SMALLINT\n * @sqlite TEXT\n */\n year(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"year\");\n return this.build(node);\n }\n\n /**\n * Date and time type\n * @mysql DATETIME(precision)\n * @postgres TIMESTAMP(precision) WITHOUT TIME ZONE\n * @sqlite TEXT\n */\n datetime(\n name: string,\n options?: { withTimezone?: boolean; precision?: number },\n ): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"datetime\", {\n withTimezone: options?.withTimezone ?? false,\n precision: options?.precision,\n });\n return this.build(node);\n }\n\n /**\n * Timestamp type\n * @mysql TIMESTAMP(precision)\n * @postgres TIMESTAMP(precision) WITH/WITHOUT TIME ZONE\n * @sqlite TEXT\n */\n timestamp(\n name: string,\n options?: { withTimezone?: boolean; precision?: number },\n ): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"timestamp\", {\n withTimezone: options?.withTimezone ?? false,\n precision: options?.precision,\n });\n return this.build(node);\n }\n\n // #endregion\n\n // #region boolean\n /**\n * Boolean type\n * @mysql BOOLEAN\n * @postgres BOOLEAN\n * @sqlite INTEGER\n */\n boolean(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"boolean\");\n return this.build(node);\n }\n\n // #endregion\n\n // #region binary\n /**\n * Fixed-length binary data\n * @mysql BINARY(length)\n * @postgres BYTEA\n * @sqlite BLOB\n */\n binary(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"binary\");\n return this.build(node);\n }\n\n /**\n * Variable-length binary data\n * @mysql VARBINARY(length)\n * @postgres BYTEA\n * @sqlite BLOB\n */\n varbinary(name: string, length: number = 255): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"varbinary\", { length });\n return this.build(node);\n }\n\n /**\n * Binary large object\n * @mysql BLOB\n * @postgres BYTEA\n * @sqlite BLOB\n */\n blob(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"blob\");\n return this.build(node);\n }\n\n /**\n * Small binary large object\n * @mysql TINYBLOB\n * @postgres BYTEA\n * @sqlite BLOB\n */\n tinyblob(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"tinyblob\");\n return this.build(node);\n }\n\n /**\n * Medium binary large object\n * @mysql MEDIUMBLOB\n * @postgres BYTEA\n * @sqlite BLOB\n */\n mediumblob(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"mediumblob\");\n return this.build(node);\n }\n\n /**\n * Large binary large object\n * @mysql LONGBLOB\n * @postgres BYTEA\n * @sqlite BLOB\n */\n longblob(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"longblob\");\n return this.build(node);\n }\n\n // #endregion\n\n // #region json\n\n /**\n * JSON data type\n * @mysql JSON (MySQL 5.7+)\n * @postgres JSON\n * @sqlite TEXT (not supported, stored as text)\n */\n json(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"json\");\n return this.build(node);\n }\n\n /**\n * Binary JSON data type\n * @mysql Not supported (falls back to JSON)\n * @postgres JSONB\n * @sqlite TEXT (not supported, stored as text)\n */\n jsonb(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"jsonb\");\n return this.build(node);\n }\n\n // #endregion\n\n // #region enum\n /**\n * Enumeration type\n * @mysql ENUM(values)\n * @postgres TEXT with CHECK constraint\n * @sqlite TEXT\n */\n enum(name: string, values: readonly string[]): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"enum\", { enumValues: values });\n return this.build(node);\n }\n\n // #endregion\n\n // #region custom\n /**\n * Custom column type\n * @mysql Custom type as specified\n * @postgres Custom type as specified\n * @sqlite Custom type as specified\n */\n custom(name: string, type: string, length?: number): ConstraintBuilder {\n const node = new ColumnTypeNode(name, type, { length });\n return this.build(node);\n }\n\n /**\n * Raw column type\n * @mysql Custom type as specified\n * @postgres Custom type as specified\n * @sqlite Custom type as specified\n * @example\n * ```ts\n * qb.rawColumn(\"name varchar(255)\");\n * ```\n */\n rawColumn(raw: string): ConstraintBuilder {\n const node = new ColumnTypeNode(raw, \"\", { isRawValue: true });\n return this.build(node);\n }\n\n // #region spatial\n\n /**\n * Geometry data type\n * @mysql GEOMETRY\n * @postgres GEOMETRY (must have PostGIS extension)\n * @sqlite GEOMETRY must have SpatiaLite extension\n */\n geometry(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"geometry\");\n return this.build(node);\n }\n\n /**\n * Point data type\n * @mysql POINT\n * @postgres POINT\n * @sqlite POINT must have SpatiaLite extension\n */\n point(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"point\");\n return this.build(node);\n }\n\n /**\n * Linestring data type\n * @mysql LINESTRING\n * @postgres LINESTRING\n * @sqlite LINESTRING must have SpatiaLite extension\n */\n linestring(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"linestring\");\n return this.build(node);\n }\n\n /**\n * Polygon data type\n * @mysql POLYGON\n * @postgres POLYGON\n * @sqlite POLYGON must have SpatiaLite extension\n */\n polygon(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"polygon\");\n return this.build(node);\n }\n\n /**\n * MultiPoint data type\n * @mysql MULTIPOINT\n * @postgres MULTIPOINT\n * @sqlite MULTIPOINT must have SpatiaLite extension\n */\n multiPoint(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"multiPoint\");\n return this.build(node);\n }\n\n // #endregion\n\n getNamedConstraints(): QueryNode[] {\n return this.namedConstraints;\n }\n}\n","import { HysteriaError } from \"../../../errors/hysteria_error\";\nimport { ConstraintNode } from \"../../ast/query/node\";\nimport {\n AddColumnNode,\n AddPrimaryKeyNode,\n AlterColumnTypeNode,\n DropColumnNode,\n DropDefaultNode,\n RenameColumnNode,\n SetDefaultNode,\n} from \"../../ast/query/node/alter_table\";\nimport { AddConstraintNode } from \"../../ast/query/node/alter_table/add_constraint\";\nimport { DropConstraintNode } from \"../../ast/query/node/alter_table/drop_constraint\";\nimport { DropNotNullNode } from \"../../ast/query/node/alter_table/drop_not_null\";\nimport { DropPrimaryKeyNode } from \"../../ast/query/node/alter_table/drop_primary_key\";\nimport { SetNotNullNode } from \"../../ast/query/node/alter_table/set_not_null\";\nimport { ColumnTypeNode } from \"../../ast/query/node/column\";\nimport { RawNode } from \"../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../ast/query/query\";\nimport {\n getDefaultFkConstraintName,\n getDefaultUniqueConstraintName,\n} from \"../../models/decorators/model_decorators_constants\";\nimport { getColumnValue } from \"../../resources/utils\";\nimport { SqlDataSourceType } from \"../../sql_data_source_types\";\nimport { BaseBuilder } from \"./base_builder\";\nimport { ConstraintBuilder } from \"./constraint_builder\";\nimport { CreateTableBuilder } from \"./create_table\";\nimport { CommonConstraintOptions, ForeignKeyOptions } from \"./schema_types\";\n\nexport class AlterTableBuilder extends BaseBuilder {\n private table: string;\n private sqlType: SqlDataSourceType;\n\n constructor(table: string, nodes: QueryNode[], sqlType: SqlDataSourceType) {\n super(nodes);\n this.table = table;\n this.sqlType = sqlType;\n }\n\n /**\n * @description Adds a raw statement to define a default value as is\n * @example\n * ```ts\n * table.varchar(\"name\").default(table.rawStatement(\"CURRENT_TIMESTAMP\"));\n * ```\n */\n rawStatement(value: string): RawNode {\n return new RawNode(value);\n }\n\n /**\n * @description Adds a column to the table\n * @param cb is the callback that will be used to build the column\n * @mssql Auto-generates default constraint names (DF__table__col__xxxxx) which are hard to drop later\n */\n addColumn(cb: (col: CreateTableBuilder) => ConstraintBuilder): void {\n let tempNodes: QueryNode[] = [];\n const builder = new CreateTableBuilder(\n this.sqlType,\n tempNodes,\n this.table,\n \"alter_table\",\n );\n const constraints = cb(builder);\n if (!tempNodes.length) {\n return;\n }\n\n const namedConstraints: QueryNode[] = builder.getNamedConstraints();\n const columnNodes = tempNodes.filter((n) => n.folder === \"column\");\n tempNodes = tempNodes.concat(namedConstraints);\n\n if (columnNodes.length !== 1) {\n throw new Error(\"addColumn callback must define exactly one column\");\n }\n\n const colNode = columnNodes[0] as ColumnTypeNode;\n\n const inlineConstraints = constraints.getNodes().filter((n: QueryNode) => {\n const constraintNode = n as ConstraintNode;\n return (\n constraintNode.constraintType === \"not_null\" ||\n constraintNode.constraintType === \"null\" ||\n constraintNode.constraintType === \"default\"\n );\n });\n\n const addColumnNode = new AddColumnNode(colNode);\n (addColumnNode as any).inlineConstraints = inlineConstraints;\n this.nodes.push(addColumnNode);\n\n const namedConstraintNodes = constraints\n .getNodes()\n .filter((n: QueryNode) => {\n const constraintNode = n as ConstraintNode;\n return (\n constraintNode.constraintType === \"unique\" ||\n constraintNode.constraintType === \"foreign_key\" ||\n constraintNode.constraintType === \"primary_key\"\n );\n });\n\n namedConstraintNodes.forEach((n) => {\n this.nodes.push(new AddConstraintNode(n as ConstraintNode));\n });\n }\n\n /**\n * @description Alters a column, can generate multiple sql statements depending on the constraints\n * @throws HysteriaError if sqlite database\n * @mssql Cannot alter columns with DEFAULT/CHECK constraints or indexes - drop them first\n */\n alterColumn(columnBuilder: (col: CreateTableBuilder) => ConstraintBuilder) {\n if (this.sqlType === \"sqlite\") {\n throw new HysteriaError(\n \"AlterTableBuilder::alterColumn\",\n \"SQLITE_NOT_SUPPORTED\",\n new Error(\"sqlite does not support alter table statements\"),\n );\n }\n\n const tempNodes: QueryNode[] = [];\n const builder = new CreateTableBuilder(\n this.sqlType,\n tempNodes,\n this.table,\n \"alter_table\",\n );\n\n const constraints = columnBuilder(builder);\n if (!tempNodes.length) {\n return;\n }\n\n const columnNodes = tempNodes.filter((n) => n.folder === \"column\");\n if (columnNodes.length !== 1) {\n throw new Error(\"alterColumn callback must define exactly one column\");\n }\n\n const colNode = columnNodes[0] as ColumnTypeNode;\n const columnName = getColumnValue(colNode.column);\n const isNullable = constraints.getNodes().find((n: QueryNode) => {\n const constraintNode = n as ConstraintNode;\n return constraintNode.constraintType === \"null\";\n }) as ConstraintNode;\n\n const isNotNullable = constraints.getNodes().find((n: QueryNode) => {\n const constraintNode = n as ConstraintNode;\n return constraintNode.constraintType === \"not_null\";\n }) as ConstraintNode | undefined;\n\n const nullableNode: ConstraintNode | undefined =\n isNotNullable || isNullable;\n const hasDefault = constraints.getNodes().find((n: QueryNode) => {\n const constraintNode = n as ConstraintNode;\n return constraintNode.constraintType === \"default\";\n }) as ConstraintNode | undefined;\n\n // Always push type change node\n this.nodes.push(\n new AlterColumnTypeNode(getColumnValue(columnName), colNode, {}),\n );\n\n // Nullability\n if (nullableNode) {\n if (nullableNode.constraintType === \"not_null\") {\n this.nodes.push(new SetNotNullNode(getColumnValue(columnName)));\n } else if (nullableNode.constraintType === \"null\") {\n this.nodes.push(new DropNotNullNode(getColumnValue(columnName)));\n }\n }\n\n // Default\n if (hasDefault) {\n if (\n hasDefault.defaultValue === undefined ||\n hasDefault.defaultValue === null\n ) {\n this.nodes.push(new DropDefaultNode(getColumnValue(columnName)));\n } else {\n this.nodes.push(\n new SetDefaultNode(\n getColumnValue(columnName),\n hasDefault.defaultValue,\n ),\n );\n }\n }\n\n // wrap related constraint nodes\n constraints.getNodes().forEach((n: QueryNode) => {\n const constraintNode = n as ConstraintNode;\n switch (constraintNode.constraintType) {\n case \"primary_key\":\n this.addPrimaryKey(getColumnValue(columnName));\n break;\n case \"unique\":\n this.unique(getColumnValue(columnName), {\n constraintName: constraintNode.constraintName,\n });\n break;\n case \"foreign_key\":\n this.foreignKey(\n getColumnValue(columnName),\n constraintNode.references?.table ?? \"\",\n getColumnValue(constraintNode.references?.columns?.[0] ?? \"\"),\n {\n constraintName: constraintNode.constraintName,\n onDelete: constraintNode.onDelete,\n onUpdate: constraintNode.onUpdate,\n },\n );\n break;\n }\n });\n }\n\n /**\n * @description Drops a column\n * @mssql Must drop all dependent constraints and indexes before dropping the column\n */\n dropColumn(name: string) {\n this.nodes.push(new DropColumnNode(name));\n }\n\n /**\n * @description Renames a column\n * @mssql Uses sp_rename procedure; does not update references in views/procedures/triggers\n */\n renameColumn(oldName: string, newName: string) {\n this.nodes.push(new RenameColumnNode(oldName, newName));\n }\n\n /**\n * @description Drops a default value from a column\n * @sqlite not supported and will throw error\n * @mssql Requires constraint name; use dropConstraint() with name from sys.default_constraints\n */\n dropDefault(columnName: string) {\n if (this.sqlType === \"sqlite\") {\n throw new HysteriaError(\n \"AlterTableBuilder::alterColumn\",\n \"SQLITE_NOT_SUPPORTED\",\n new Error(\"sqlite does not support alter table statements\"),\n );\n }\n\n this.nodes.push(new DropDefaultNode(columnName));\n }\n\n /**\n * @description Adds a primary key constraint to a column\n * @param columnName is the column name to add the primary key to\n * @sqlite not supported and will throw error\n * @mssql Column must be NOT NULL before adding primary key\n */\n addPrimaryKey(columnName: string) {\n if (this.sqlType === \"sqlite\") {\n throw new HysteriaError(\n \"AlterTableBuilder::alterColumn\",\n \"SQLITE_NOT_SUPPORTED\",\n new Error(\"sqlite does not support alter table statements\"),\n );\n }\n\n this.nodes.push(new AddPrimaryKeyNode([columnName]));\n }\n\n /**\n * @description Raw non type safe way builder to add a constraint\n * @sqlite not supported and will throw error\n * @mssql UNIQUE does not allow multiple NULLs (unlike PostgreSQL)\n */\n addConstraint(...options: ConstructorParameters<typeof ConstraintNode>) {\n if (this.sqlType === \"sqlite\") {\n throw new HysteriaError(\n \"AlterTableBuilder::alterColumn\",\n \"SQLITE_NOT_SUPPORTED\",\n new Error(\"sqlite does not support alter table statements\"),\n );\n }\n\n this.nodes.push(new AddConstraintNode(new ConstraintNode(...options)));\n }\n\n /**\n * @description Adds a foreign key constraint to a column\n * @param columnName is the column name in the current table\n * @param foreignTable is the referenced table name\n * @param foreignColumn is the referenced column name\n * @param options optional foreign key options (constraintName, onDelete, onUpdate)\n * @sqlite not supported and will throw error\n */\n foreignKey(\n columnName: string,\n foreignTable: string,\n foreignColumn: string,\n options?: ForeignKeyOptions,\n ) {\n if (this.sqlType === \"sqlite\") {\n throw new HysteriaError(\n \"AlterTableBuilder::alterColumn\",\n \"SQLITE_NOT_SUPPORTED\",\n new Error(\"sqlite does not support alter table statements\"),\n );\n }\n\n this.nodes.push(\n new AddConstraintNode(\n new ConstraintNode(\"foreign_key\", {\n columns: [columnName],\n references: { table: foreignTable, columns: [foreignColumn] },\n constraintName:\n options?.constraintName ??\n getDefaultFkConstraintName(this.table, columnName, foreignColumn),\n onDelete: options?.onDelete,\n onUpdate: options?.onUpdate,\n }),\n ),\n );\n }\n\n /**\n * @description Adds a unique constraint to a column\n * @description By default generates a constraint name using standard pattern: uq_${table}_${column}\n * @param columnName is the column name in the current table\n * @param options optional constraint options (constraintName)\n * @sqlite not supported and will throw error\n */\n unique(columnName: string, options?: CommonConstraintOptions) {\n if (this.sqlType === \"sqlite\") {\n throw new HysteriaError(\n \"AlterTableBuilder::alterColumn\",\n \"SQLITE_NOT_SUPPORTED\",\n new Error(\"sqlite does not support alter table statements\"),\n );\n }\n\n this.nodes.push(\n new AddConstraintNode(\n new ConstraintNode(\"unique\", {\n columns: [columnName],\n constraintName:\n options?.constraintName ??\n getDefaultUniqueConstraintName(this.table, columnName),\n }),\n ),\n );\n }\n\n /**\n * @description Drops a foreign key by column name and referenced column, generates constraint name using standard pattern: fk_${table}_${leftColumn}_${rightColumn}\n * @description If a custom constraint name was used to generate the foreign key, use `dropConstraint` instead\n * @param leftColumn is the current model column name (e.g. userId)\n * @param rightColumn is the referenced model column name (e.g. id)\n * @sqlite not supported and will throw error\n */\n dropForeignKey(leftColumn: string, rightColumn: string) {\n if (this.sqlType === \"sqlite\") {\n throw new HysteriaError(\n \"AlterTableBuilder::dropPrimaryKey\",\n \"SQLITE_NOT_SUPPORTED\",\n new Error(\"sqlite does not support alter table statements\"),\n );\n }\n\n const defaultConstraintName = getDefaultFkConstraintName(\n this.table,\n leftColumn,\n rightColumn,\n );\n this.nodes.push(new DropConstraintNode(defaultConstraintName));\n }\n\n /**\n * @description Drops a unique constraint by column name, generates constraint name using standard pattern: uq_${table}_${column}\n * @description If a custom constraint name was used to generate the unique constraint, use `dropConstraint` instead\n * @param columnName is the current model column name (e.g. userId)\n * @sqlite not supported and will throw error\n * @cockroachdb not supported\n */\n dropUnique(columnName: string, options?: CommonConstraintOptions) {\n if (this.sqlType === \"sqlite\") {\n throw new HysteriaError(\n \"AlterTableBuilder::dropUnique\",\n \"SQLITE_NOT_SUPPORTED\",\n new Error(\"sqlite does not support alter table statements\"),\n );\n }\n\n if (this.sqlType === \"cockroachdb\") {\n throw new HysteriaError(\n \"AlterTableBuilder::dropUnique\",\n \"COCKROACHDB_NOT_SUPPORTED\",\n new Error(\"cockroachdb does not support alter table statements\"),\n );\n }\n\n const defaultConstraintName =\n options?.constraintName ??\n getDefaultUniqueConstraintName(this.table, columnName);\n\n this.nodes.push(new DropConstraintNode(defaultConstraintName));\n }\n\n /**\n * @description Drops a constraint by constraint name\n * @sqlite not supported and will throw error\n */\n dropConstraint(constraintName: string) {\n if (this.sqlType === \"sqlite\") {\n throw new HysteriaError(\n \"AlterTableBuilder::dropConstraint\",\n \"SQLITE_NOT_SUPPORTED\",\n new Error(\"sqlite does not support alter table statements\"),\n );\n }\n\n this.nodes.push(new DropConstraintNode(constraintName));\n }\n\n /**\n * @description Drops the primary key constraint\n * @postgres not supported, use `dropConstraint` instead with the pk constraint name\n * @sqlite not supported and will throw error\n * @throws HysteriaError if postgres and table is not provided\n * @mssql Foreign keys referencing this primary key must be dropped first\n */\n dropPrimaryKey(table?: string) {\n if (this.sqlType === \"sqlite\") {\n throw new HysteriaError(\n \"AlterTableBuilder::dropPrimaryKey\",\n \"SQLITE_NOT_SUPPORTED\",\n new Error(\"sqlite does not support alter table statements\"),\n );\n }\n\n if (this.sqlType === \"postgres\" && !table) {\n throw new HysteriaError(\n \"AlterTableBuilder::dropPrimaryKey\",\n \"POSTGRES_TABLE_REQUIRED\",\n new Error(\"postgres requires the table name\"),\n );\n }\n\n this.nodes.push(new DropPrimaryKeyNode(table));\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { env } from \"../../../env/env\";\nimport { HysteriaError } from \"../../../errors/hysteria_error\";\nimport { AstParser } from \"../../ast/parser\";\nimport {\n AddPrimaryKeyNode,\n AlterTableNode,\n DropConstraintNode,\n DropPrimaryKeyNode,\n RenameTableNode,\n} from \"../../ast/query/node/alter_table\";\nimport { AddConstraintNode } from \"../../ast/query/node/alter_table/add_constraint\";\nimport { ConstraintNode } from \"../../ast/query/node/constraint\";\nimport { CreateTableNode } from \"../../ast/query/node/create_table\";\nimport { DropTableNode } from \"../../ast/query/node/drop_table\";\nimport { CreateExtensionNode } from \"../../ast/query/node/extension/create_extension\";\nimport { CreateIndexNode, DropIndexNode } from \"../../ast/query/node/index_op\";\nimport { RawNode } from \"../../ast/query/node/raw/raw_node\";\nimport { TruncateNode } from \"../../ast/query/node/truncate\";\nimport { QueryNode } from \"../../ast/query/query\";\nimport {\n getDefaultFkConstraintName,\n getDefaultIndexName,\n getDefaultUniqueConstraintName,\n} from \"../../models/decorators/model_decorators_constants\";\nimport { Model } from \"../../models/model\";\nimport type { SqlDataSourceType } from \"../../sql_data_source_types\";\nimport { AlterTableBuilder } from \"./alter_table\";\nimport { CreateTableBuilder } from \"./create_table\";\nimport {\n CommonConstraintOptions,\n CommonPostgresExtensions,\n} from \"./schema_types\";\n\nexport default class Schema {\n queryStatements: string[];\n sqlType: SqlDataSourceType;\n\n constructor(sqlType?: SqlDataSourceType) {\n this.sqlType = (sqlType || env.DB_TYPE) as SqlDataSourceType;\n\n if (!this.sqlType) {\n throw new HysteriaError(\n \"Schema::constructor\",\n \"ENV_NOT_SET\",\n new Error(\"env not set, please set DB_TYPE in .env file\"),\n );\n }\n\n this.queryStatements = [];\n }\n\n /**\n * @description Adds a raw statement to define a default value as is\n * @example\n * ```ts\n * schema.rawStatement(\"CURRENT_TIMESTAMP\");\n * schema.alterTable(\"users\", (table) => {\n * table.timestamp(\"created_at\").default(this.schema.rawStatement(\"CURRENT_TIMESTAMP\"));\n * });\n * ```\n */\n rawStatement(value: string) {\n return new RawNode(value);\n }\n\n /**\n * @description Add raw query to the migration\n */\n rawQuery(query: string): void {\n this.queryStatements.push(query);\n }\n\n /**\n * @description Runs the sql in the given file, throws error if file does not exist or is not .sql or .txt\n * @description File is splitted by semicolons and each statement is executed separately and in order\n */\n runFile(filePath: string): void {\n if (!fs.existsSync(filePath)) {\n throw new HysteriaError(\n \"Schema::runFile\",\n `FILE_NOT_FOUND_OR_NOT_ACCESSIBLE`,\n );\n }\n\n const file = path.basename(filePath);\n const fileExtension = path.extname(file);\n if (fileExtension !== \".sql\" && fileExtension !== \".txt\") {\n throw new HysteriaError(\"Schema::runFile\", `FILE_NOT_A_SQL_OR_TXT_FILE`);\n }\n\n const query = fs.readFileSync(filePath, \"utf-8\");\n\n const statements = query\n .split(\";\")\n .map((stmt) => stmt.trim())\n .filter((stmt) => stmt.length > 0 && !stmt.startsWith(\"--\"));\n\n for (const statement of statements) {\n this.rawQuery(statement);\n }\n }\n\n /**\n * @description Create table constructor\n * @mssql Does not support ifNotExists option\n */\n createTable(\n table: string,\n cb: (table: CreateTableBuilder) => void,\n options?: { ifNotExists?: boolean },\n ): void {\n const tableBuilder = new CreateTableBuilder(this.sqlType, [], table);\n cb(tableBuilder);\n\n const nodes = tableBuilder.getNodes();\n const astParser = new AstParser(\n {\n table: table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model,\n this.sqlType,\n );\n\n const createTableNode = new CreateTableNode(\n table,\n nodes,\n tableBuilder.getNamedConstraints() as ConstraintNode[],\n options?.ifNotExists,\n );\n\n const frag = astParser.parse([createTableNode]).sql;\n const stmt = frag.startsWith(\"create table\")\n ? frag\n : `create table ${frag}`;\n this.rawQuery(stmt);\n }\n\n /**\n * @description Alter table constructor\n * @mssql Limited support - cannot modify columns with constraints; see AlterTableBuilder methods for details\n */\n alterTable(table: string, cb: (t: AlterTableBuilder) => void): void {\n const nodes: QueryNode[] = [];\n const builder = new AlterTableBuilder(table, nodes, this.sqlType);\n cb(builder);\n\n if (!nodes.length) {\n return;\n }\n\n const astParser = this.generateAstInstance({\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n\n let group: QueryNode[] = [];\n const flushGroup = () => {\n if (!group.length) {\n return;\n }\n\n const nodeGroup = new AlterTableNode(table, group);\n const frag = astParser.parse([nodeGroup]).sql;\n if (!frag || !frag.trim()) {\n return;\n }\n\n const stmt = frag.startsWith(\"alter table\")\n ? frag\n : `alter table ${frag}`;\n this.rawQuery(stmt);\n group = [];\n };\n\n for (const child of nodes) {\n if (\n child.file === \"add_constraint\" &&\n group.length &&\n (group[0] as any).file === \"add_column\"\n ) {\n // merge with current add column group\n group.push(child);\n } else {\n flushGroup();\n group.push(child);\n }\n }\n flushGroup();\n }\n\n /**\n * @description Drop table in the database\n */\n dropTable(table: string, ifExists: boolean = false): void {\n const node = new DropTableNode(table, ifExists);\n const astParser = this.generateAstInstance({\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n this.rawQuery(astParser.parse([node]).sql);\n }\n\n /**\n * @description Rename table in the database\n * @mssql Uses sp_rename procedure; does not update references in views/procedures/triggers\n */\n renameTable(oldTable: string, newTable: string): void {\n const node = new AlterTableNode(oldTable, [new RenameTableNode(newTable)]);\n const astParser = this.generateAstInstance({\n table: oldTable,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n\n this.rawQuery(astParser.parse([node]).sql);\n }\n\n /**\n * @description Truncate table\n */\n truncateTable(table: string): void {\n const node = new TruncateNode(table, true);\n const astParser = this.generateAstInstance({\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n this.rawQuery(astParser.parse([node]).sql);\n }\n\n /**\n * @description Create index on table\n */\n createIndex(\n table: string,\n columns: string[] | string,\n options: CommonConstraintOptions,\n ): void {\n if (!Array.isArray(columns)) {\n columns = [columns];\n }\n\n const indexName =\n options.constraintName || getDefaultIndexName(table, columns.join(\"_\"));\n const node = new CreateIndexNode(table, columns, indexName);\n const astParser = this.generateAstInstance({\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n this.rawQuery(astParser.parse([node]).sql);\n }\n\n /**\n * @description Drop index on table\n * @mysql requires table name for index drop\n */\n dropIndex(indexName: string, table?: string): void {\n const node = new DropIndexNode(indexName, table);\n const astParser = this.generateAstInstance({\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n this.rawQuery(astParser.parse([node]).sql);\n }\n\n /**\n * @description Adds a primary key to a table\n */\n addPrimaryKey(table: string, columns: string[]): void {\n const node = new AddPrimaryKeyNode(columns);\n const astParser = this.generateAstInstance({\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n this.rawQuery(astParser.parse([node]).sql);\n }\n\n /**\n * @description Adds a UNIQUE constraint to a table\n */\n addUnique(\n table: string,\n columns: string[] | string,\n options?: CommonConstraintOptions,\n ): void {\n const cols = Array.isArray(columns) ? columns : [columns];\n const constraintName =\n options?.constraintName ??\n getDefaultUniqueConstraintName(table, cols.join(\"_\"));\n\n const constraint = new ConstraintNode(\"unique\", {\n columns: cols,\n constraintName,\n });\n\n const alterNode = new AlterTableNode(table, [\n new AddConstraintNode(constraint),\n ]);\n\n const astParser = this.generateAstInstance({\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n\n this.rawQuery(astParser.parse([alterNode]).sql);\n }\n\n /**\n * @description Drops a foreign key from a table, uses a standard constraint name pattern: fk_${table}_${leftColumn}_${rightColumn}\n * @description If a custom constraint name was used to generate the foreign key, use `dropConstraint` instead\n */\n dropForeignKey(table: string, leftColumn: string, rightColumn: string): void {\n const constraintName = getDefaultFkConstraintName(\n table,\n leftColumn,\n rightColumn,\n );\n\n const dropNode = new DropConstraintNode(constraintName);\n const alterNode = new AlterTableNode(table, [dropNode]);\n\n const astParser = this.generateAstInstance({\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n\n this.rawQuery(astParser.parse([alterNode]).sql);\n }\n\n /**\n * @description Drops a UNIQUE constraint from a table\n * @description If no constraintName is provided, it computes the default name using columns\n */\n dropUnique(\n table: string,\n columnsOrConstraintName: string | string[],\n options?: CommonConstraintOptions,\n ): void {\n const computedName = Array.isArray(columnsOrConstraintName)\n ? getDefaultUniqueConstraintName(table, columnsOrConstraintName.join(\"_\"))\n : getDefaultUniqueConstraintName(table, columnsOrConstraintName);\n\n const constraintName = options?.constraintName ?? computedName;\n\n const dropNode = new DropConstraintNode(constraintName);\n const alterNode = new AlterTableNode(table, [dropNode]);\n\n const astParser = this.generateAstInstance({\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n\n this.rawQuery(astParser.parse([alterNode]).sql);\n }\n\n /**\n * @description Drops a primary key from a table\n */\n dropPrimaryKey(table: string): void {\n const node = new DropPrimaryKeyNode();\n const astParser = this.generateAstInstance({\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n this.rawQuery(astParser.parse([node]).sql);\n }\n\n /**\n * @description Adds a foreign key to a table\n */\n addConstraint(\n table: string,\n ...options: ConstructorParameters<typeof ConstraintNode>\n ): void {\n const constraint = new ConstraintNode(...options);\n\n const alterNode = new AlterTableNode(table, [\n new AddConstraintNode(constraint),\n ]);\n\n const astParser = this.generateAstInstance({\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n this.rawQuery(astParser.parse([alterNode]).sql);\n }\n\n /**\n * @description Drops a constraint from a table\n */\n dropConstraint(table: string, constraintName: string): void {\n const node = new DropConstraintNode(constraintName);\n const astParser = this.generateAstInstance({\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n this.rawQuery(astParser.parse([node]).sql);\n }\n\n /**\n * @description Create database extension, only supported for postgres\n * @postgres Supports extensions like PostGIS, uuid-ossp, hstore, etc.\n * @mysql Extensions are not supported - outputs a comment\n * @sqlite Extensions are loaded dynamically - outputs a comment\n * @mssql Extensions are not supported - outputs a comment\n * @oracledb Extensions are not supported - outputs a comment\n */\n createExtension(\n extensionName: CommonPostgresExtensions,\n ifNotExists?: boolean,\n ): void;\n createExtension(extensionName: string, ifNotExists?: boolean): void;\n createExtension(\n extensionName: string | CommonPostgresExtensions,\n ifNotExists: boolean = true,\n ): void {\n const node = new CreateExtensionNode(extensionName, ifNotExists);\n const astParser = this.generateAstInstance({\n table: \"\",\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n this.rawQuery(astParser.parse([node]).sql);\n }\n\n private generateAstInstance(model: typeof Model): AstParser {\n return new AstParser(model, this.sqlType);\n }\n}\n","import { format } from \"sql-formatter\";\nimport { convertCase } from \"../../../utils/case_utils\";\nimport {\n getDefaultFkConstraintName,\n getDefaultPrimaryKeyConstraintName,\n} from \"../../models/decorators/model_decorators_constants\";\nimport {\n ColumnType,\n LazyRelationType,\n} from \"../../models/decorators/model_decorators_types\";\nimport { Model } from \"../../models/model\";\nimport { RelationEnum } from \"../../models/relations/relation\";\nimport { getColumnValue } from \"../../resources/utils\";\nimport { SqlDataSource } from \"../../sql_data_source\";\nimport { CreateTableBuilder } from \"../schema/create_table\";\nimport Schema from \"../schema/schema\";\nimport { OnUpdateOrDelete } from \"../schema/schema_types\";\nimport { DropOrderResolver } from \"./drop_order_resolver\";\nimport {\n ExecutionPhase,\n GenerateTableDiffReturnType,\n MigrationOperation,\n OperationType,\n} from \"./schema_diff_types\";\n\nexport class MigrationOperationGenerator {\n private sql: SqlDataSource;\n private models: (typeof Model)[];\n private dropResolver: DropOrderResolver;\n\n constructor(sql: SqlDataSource) {\n this.sql = sql;\n this.models = Object.values(this.sql.models);\n this.dropResolver = new DropOrderResolver(sql);\n }\n\n /**\n * Generates migration operations organized by execution phase\n */\n generateOperations(\n changes: GenerateTableDiffReturnType,\n ): MigrationOperation[] {\n const operations: MigrationOperation[] = [];\n\n // Phase 1: Structure Creation (No Dependencies)\n operations.push(...this.generateStructureCreationOperations(changes));\n\n // Phase 2: Constraint Creation (Simple Order)\n operations.push(...this.generateConstraintCreationOperations(changes));\n\n // Phase 3: Destructive Operations (Smart Dependency Resolution)\n operations.push(...this.generateDestructiveOperations(changes));\n\n // Handle column modifications (mixed operations)\n operations.push(...this.generateColumnModificationOperations(changes));\n\n const fkKey = (op: MigrationOperation) =>\n op.table && op.constraint ? `${op.table}::${op.constraint}` : undefined;\n const addSet = new Set(\n operations\n .filter((o) => o.type === OperationType.ADD_FOREIGN_KEY)\n .map((o) => fkKey(o))\n .filter(Boolean) as string[],\n );\n const dropSet = new Set(\n operations\n .filter((o) => o.type === OperationType.DROP_FOREIGN_KEY)\n .map((o) => fkKey(o))\n .filter(Boolean) as string[],\n );\n const churn = new Set<string>([...addSet].filter((k) => dropSet.has(k)));\n const filtered = operations.filter((o) => {\n const key = fkKey(o);\n if (!key) {\n return true;\n }\n if (\n churn.has(key) &&\n (o.type === OperationType.ADD_FOREIGN_KEY ||\n o.type === OperationType.DROP_FOREIGN_KEY)\n ) {\n return false;\n }\n return true;\n });\n\n return filtered;\n }\n\n /**\n * Phase 1: Structure Creation Operations\n */\n private generateStructureCreationOperations(\n changes: GenerateTableDiffReturnType,\n ): MigrationOperation[] {\n const operations: MigrationOperation[] = [];\n\n // 1. Create tables (no FK constraints)\n for (const table of changes.tablesToAdd) {\n const createTableSql = this.sql.createTable(table.table, (builder) => {\n for (const column of table.columns) {\n if (Array.isArray(column.type)) {\n builder.enum(column.databaseName, column.type);\n continue;\n }\n\n column.type &&\n this.executeBuilderMethod(\n table.table,\n builder,\n column,\n [\n column.databaseName,\n column.length,\n column.precision && !column.withTimezone\n ? column.precision\n : undefined,\n column.scale,\n column.withTimezone\n ? {\n withTimezone: column.withTimezone,\n precision: column.precision,\n }\n : undefined,\n ].filter(Boolean),\n true,\n );\n }\n });\n\n operations.push({\n type: OperationType.CREATE_TABLE,\n phase: ExecutionPhase.STRUCTURE_CREATION,\n table: table.table,\n data: table,\n dependencies: [],\n sqlStatements: [createTableSql],\n });\n }\n\n // 2. Add columns\n for (const column of changes.columnsToAdd) {\n const addColumnSql = this.generateAddColumnViaAlter(column);\n operations.push({\n type: OperationType.ADD_COLUMN,\n phase: ExecutionPhase.STRUCTURE_CREATION,\n table: column.table,\n column: column.column.databaseName,\n data: column,\n dependencies: [`table.${column.table}`],\n sqlStatements: addColumnSql,\n });\n }\n\n return operations;\n }\n\n /**\n * Phase 2: Constraint Creation Operations\n */\n private generateConstraintCreationOperations(\n changes: GenerateTableDiffReturnType,\n ): MigrationOperation[] {\n const operations: MigrationOperation[] = [];\n\n // 0. Drop UNIQUE constraints first (e.g., rename cases)\n for (const uq of changes.uniquesToDrop || []) {\n const dropSql = this.sql.alterTable(uq.table, (t) => {\n t.dropConstraint(uq.name);\n });\n operations.push({\n type: OperationType.DROP_CONSTRAINT,\n phase: ExecutionPhase.CONSTRAINT_CREATION,\n table: uq.table,\n constraint: uq.name,\n data: uq,\n dependencies: [`table.${uq.table}`],\n sqlStatements: dropSql,\n });\n }\n\n // 1. Drop indexes first (rename cases), but skip ones already handled as unique constraints\n const uniqueDrops = new Set(\n (changes.uniquesToDrop || []).map((u) => u.name),\n );\n for (const idx of changes.indexesToDrop) {\n if (uniqueDrops.has(idx.index)) {\n continue;\n }\n\n const schema = new Schema(this.sql.getDbType());\n schema.dropIndex(idx.index, idx.table);\n const dropIndexSql = schema.queryStatements[0];\n operations.push({\n type: OperationType.DROP_INDEX,\n phase: ExecutionPhase.CONSTRAINT_CREATION,\n table: idx.table,\n index: idx.index,\n data: idx,\n dependencies: [`table.${idx.table}`],\n sqlStatements: [dropIndexSql],\n });\n }\n\n // 1. Add PRIMARY KEY constraints\n for (const primaryKey of changes.primaryKeysToAdd) {\n const model = this.models.find((m) => m.table === primaryKey.table);\n const modelPrimaryKeyColumn = model\n ?.getColumns()\n .find((col) => col.columnName === primaryKey.columns[0]);\n const constraintName =\n modelPrimaryKeyColumn?.primaryKeyConstraintName ||\n getDefaultPrimaryKeyConstraintName(\n primaryKey.table,\n primaryKey.columns[0],\n );\n\n const addPrimaryKeySql = this.sql.alterTable(primaryKey.table, (t) => {\n const pkConstraintName =\n constraintName ||\n getDefaultPrimaryKeyConstraintName(\n primaryKey.table,\n primaryKey.columns[0],\n );\n t.addConstraint(\"primary_key\", {\n columns: [primaryKey.columns[0]],\n constraintName: pkConstraintName,\n });\n });\n\n operations.push({\n type: OperationType.ADD_PRIMARY_KEY,\n phase: ExecutionPhase.CONSTRAINT_CREATION,\n table: primaryKey.table,\n constraint: constraintName,\n data: primaryKey,\n dependencies: [`table.${primaryKey.table}`],\n sqlStatements: addPrimaryKeySql,\n });\n }\n\n // 3. Add FOREIGN KEY constraints\n for (const relation of changes.relationsToAdd) {\n if (relation.relation.type === RelationEnum.manyToMany) {\n continue;\n }\n\n const addForeignKeySql = this.generateAddRelationViaAlter(relation);\n const effectiveConstraintName = this.computeFkConstraintName(relation);\n\n operations.push({\n type: OperationType.ADD_FOREIGN_KEY,\n phase: ExecutionPhase.CONSTRAINT_CREATION,\n table: relation.table,\n constraint: effectiveConstraintName,\n data: relation,\n dependencies: this.getForeignKeyDependencies(relation) as any,\n sqlStatements: addForeignKeySql,\n });\n }\n\n // 4. Add UNIQUE constraints (after drops)\n for (const uq of changes.uniquesToAdd || []) {\n const model = this.models.find((m) => m.table === uq.table);\n const columns = (uq.columns || []).map((col) => {\n const mc = model?.getColumns().find((c) => c.columnName === col);\n return mc?.databaseName || col;\n });\n const addUqSql = this.sql.alterTable(uq.table, (t) => {\n t.addConstraint(\"unique\", {\n columns,\n constraintName: uq.name || \"mandatory\",\n });\n });\n operations.push({\n type: OperationType.ADD_UNIQUE_CONSTRAINT,\n phase: ExecutionPhase.CONSTRAINT_CREATION,\n table: uq.table,\n constraint: uq.name || \"mandatory\",\n data: uq,\n dependencies: [`table.${uq.table}`],\n sqlStatements: addUqSql,\n });\n }\n\n // 5. Create indexes (after drops)\n for (const index of changes.indexesToAdd) {\n const createIndexSql = this.generateCreateIndexSql(index);\n operations.push({\n type: OperationType.CREATE_INDEX,\n phase: ExecutionPhase.CONSTRAINT_CREATION,\n table: index.table,\n index: index.index,\n data: index,\n dependencies: [`table.${index.table}`],\n sqlStatements: [createIndexSql],\n });\n }\n\n return operations;\n }\n\n private computeFkConstraintName(relationData: {\n table: string;\n relation: LazyRelationType;\n }): string | undefined {\n // If explicitly provided, use it\n const explicit = getColumnValue(relationData.relation.constraintName);\n if (explicit) {\n return explicit;\n }\n\n // Determine referenced table\n let referencesTable = relationData.table;\n if (relationData.relation.type === RelationEnum.belongsTo) {\n referencesTable = relationData.relation.model().table;\n } else if (\n relationData.relation.type === RelationEnum.manyToMany &&\n relationData.relation.manyToManyOptions\n ) {\n referencesTable = getColumnValue(\n relationData.relation.manyToManyOptions.throughModel,\n );\n }\n\n // Determine source column database name\n const model = this.models.find((m) => m.table === relationData.table);\n const modelColumns = model?.getColumns() || [];\n let sourceColumnName = relationData.relation.columnName;\n if (relationData.relation.type === RelationEnum.belongsTo) {\n const fkModelCol = modelColumns.find(\n (c) => c.columnName === relationData.relation.foreignKey,\n );\n sourceColumnName =\n fkModelCol?.databaseName ||\n (relationData.relation.foreignKey as string);\n } else {\n const mc = modelColumns.find((c) => c.columnName === sourceColumnName);\n sourceColumnName = mc?.databaseName || sourceColumnName;\n }\n\n return getDefaultFkConstraintName(\n relationData.table,\n sourceColumnName,\n referencesTable,\n );\n }\n\n /**\n * Phase 3: Destructive Operations (Smart Dependency Resolution)\n */\n private generateDestructiveOperations(\n changes: GenerateTableDiffReturnType,\n ): MigrationOperation[] {\n return this.dropResolver.generateDropOperations(changes);\n }\n\n /**\n * Handle column modifications (mixed operations)\n */\n private generateColumnModificationOperations(\n changes: GenerateTableDiffReturnType,\n ): MigrationOperation[] {\n const operations: MigrationOperation[] = [];\n\n // Handle column modifications\n for (const column of changes.columnsToModify || []) {\n const modifySql = this.generateModifyColumnViaAlter(column);\n operations.push({\n type: OperationType.MODIFY_COLUMN,\n phase: ExecutionPhase.DESTRUCTIVE_OPERATIONS,\n table: column.table,\n column: column.dbColumns.name,\n data: column,\n dependencies: [],\n sqlStatements: modifySql,\n });\n }\n\n return operations;\n }\n\n /**\n * Gets dependencies for foreign key operations\n */\n private getForeignKeyDependencies(relation: {\n table: string;\n relation: LazyRelationType;\n }): string[] {\n const dependencies: string[] = [];\n\n if (relation.relation.type === RelationEnum.belongsTo) {\n const relatedModel = relation.relation.model();\n dependencies.push(`table.${relatedModel.table}`);\n\n // Add dependency on the referenced column\n const pkName = relatedModel.primaryKey || \"id\";\n const pkColumn = relatedModel\n .getColumns()\n .find((c: ColumnType) => c.columnName === pkName);\n if (pkColumn) {\n dependencies.push(\n `column.${relatedModel.table}.${pkColumn.databaseName}`,\n );\n }\n } else if (\n relation.relation.type === RelationEnum.manyToMany &&\n relation.relation.manyToManyOptions\n ) {\n const throughTable = getColumnValue(\n relation.relation.manyToManyOptions.throughModel,\n );\n dependencies.push(`table.${throughTable}`);\n }\n\n // Add dependency on the source table and column\n dependencies.push(`table.${relation.table}`);\n\n const model = this.models.find((m) => m.table === relation.table);\n if (model) {\n const sourceColumn = model\n .getColumns()\n .find(\n (c: ColumnType) =>\n c.columnName === relation.relation.columnName ||\n c.databaseName === relation.relation.columnName,\n );\n if (sourceColumn) {\n dependencies.push(\n `column.${relation.table}.${sourceColumn.databaseName}`,\n );\n }\n }\n\n return dependencies;\n }\n\n /**\n * Executes builder method for column creation\n */\n private executeBuilderMethod(\n table: string,\n builder: CreateTableBuilder,\n column: ColumnType,\n args: unknown[],\n applyConstraints: boolean = true,\n ) {\n const b = (builder[column.type as keyof typeof builder] as any)(...args);\n if (!applyConstraints) {\n return b;\n }\n\n if (column.isPrimary) {\n b.primaryKey({\n constraintName:\n column.primaryKeyConstraintName ||\n getDefaultPrimaryKeyConstraintName(table, column.columnName),\n });\n }\n\n if (column.constraints?.default !== undefined) {\n b.default(column.constraints.default);\n }\n\n if (column.constraints?.nullable === false) {\n b.notNullable();\n } else if (column.constraints?.nullable === true) {\n b.nullable();\n }\n\n return b;\n }\n\n /**\n * Generates ADD COLUMN SQL via ALTER TABLE\n */\n private generateAddColumnViaAlter(columnData: {\n table: string;\n column: ColumnType;\n }): string[] {\n const args = [\n columnData.column.databaseName,\n columnData.column.length,\n columnData.column.precision && !columnData.column.withTimezone\n ? columnData.column.precision\n : undefined,\n columnData.column.scale,\n columnData.column.withTimezone\n ? {\n withTimezone: columnData.column.withTimezone,\n precision: columnData.column.precision,\n }\n : undefined,\n ].filter(Boolean);\n\n return this.sql.alterTable(columnData.table, (t) => {\n t.addColumn((b) => {\n // First create the column without constraints\n const columnBuilder = this.executeBuilderMethod(\n columnData.table,\n b,\n columnData.column,\n args,\n false,\n );\n\n // Then apply constraints separately\n if (columnData.column.constraints?.default !== undefined) {\n columnBuilder.default(columnData.column.constraints.default);\n }\n\n if (columnData.column.constraints?.nullable === false) {\n columnBuilder.notNullable();\n } else if (columnData.column.constraints?.nullable === true) {\n columnBuilder.nullable();\n }\n\n return columnBuilder;\n });\n });\n }\n\n /**\n * Generates MODIFY COLUMN SQL via ALTER TABLE\n */\n private generateModifyColumnViaAlter(columnData: {\n table: string;\n dbColumns: any;\n modelColumn: ColumnType;\n }): string[] {\n if (this.sql.getDbType() === \"sqlite\") {\n return [];\n }\n\n // Generate type changes with constraints\n const args = [\n columnData.modelColumn.databaseName,\n columnData.modelColumn.length,\n columnData.modelColumn.precision && !columnData.modelColumn.withTimezone\n ? columnData.modelColumn.precision\n : undefined,\n columnData.modelColumn.scale,\n columnData.modelColumn.withTimezone\n ? {\n withTimezone: columnData.modelColumn.withTimezone,\n precision: columnData.modelColumn.precision,\n }\n : undefined,\n ].filter(Boolean);\n\n const alterColumnSql = this.sql.alterTable(columnData.table, (t) => {\n t.alterColumn((b) => {\n const columnBuilder = this.executeBuilderMethod(\n columnData.table,\n b,\n columnData.modelColumn,\n args,\n false,\n );\n\n // Add constraints based on the model column\n if (columnData.modelColumn.constraints?.default !== undefined) {\n columnBuilder.default(columnData.modelColumn.constraints.default);\n }\n\n if (columnData.modelColumn.constraints?.nullable === false) {\n columnBuilder.notNullable();\n } else if (columnData.modelColumn.constraints?.nullable === true) {\n columnBuilder.nullable();\n }\n\n return columnBuilder;\n });\n });\n\n return alterColumnSql;\n }\n\n /**\n * Generates CREATE INDEX SQL using schema builder\n */\n private generateCreateIndexSql(indexData: {\n table: string;\n index: string;\n }): string {\n const model = this.models.find((m) => m.table === indexData.table);\n const indexDef = model\n ?.getIndexes()\n .find((idx) => idx.name === indexData.index);\n const cols = (indexDef?.columns || []).map((col) => {\n const mc = model?.getColumns().find((c) => c.columnName === col);\n return mc?.databaseName || col;\n });\n\n const schema = new Schema(this.sql.getDbType());\n schema.createIndex(indexData.table, cols, {\n constraintName: indexData.index,\n });\n\n // Return the generated SQL\n return schema.queryStatements[0] || \"\";\n }\n\n /**\n * Generates ADD FOREIGN KEY SQL via ALTER TABLE\n */\n private generateAddRelationViaAlter(relationData: {\n table: string;\n relation: LazyRelationType;\n }): string[] {\n let referencesTable = relationData.table;\n let referencesColumn = relationData.relation.foreignKey;\n\n if (relationData.relation.type === RelationEnum.belongsTo) {\n referencesTable = relationData.relation.model().table;\n referencesColumn = relationData.relation.model().primaryKey || \"id\";\n } else if (\n relationData.relation.type === RelationEnum.manyToMany &&\n relationData.relation.manyToManyOptions\n ) {\n referencesTable = getColumnValue(\n relationData.relation.manyToManyOptions.throughModel,\n );\n referencesColumn = getColumnValue(\n relationData.relation.manyToManyOptions.rightForeignKey,\n );\n\n if (!referencesColumn || referencesColumn === \"undefined\") {\n referencesColumn = relationData.relation.model().primaryKey || \"id\";\n }\n }\n\n const constraintName =\n typeof relationData.relation.constraintName === \"string\"\n ? (relationData.relation.constraintName as string)\n : undefined;\n let foreignKeyColumn = getColumnValue(referencesColumn);\n\n if (relationData.relation.type === RelationEnum.belongsTo) {\n const relatedModel = relationData.relation.model();\n const primaryKeyName = relatedModel.primaryKey;\n const relatedModelColumns = relatedModel.getColumns();\n const relatedModelPKColumn = relatedModelColumns.find(\n (col) => col.columnName === primaryKeyName,\n );\n\n if (relatedModelPKColumn) {\n foreignKeyColumn = relatedModelPKColumn.databaseName;\n } else {\n const databaseCaseConvention =\n relatedModel?.databaseCaseConvention || \"preserve\";\n foreignKeyColumn = convertCase(primaryKeyName, databaseCaseConvention);\n }\n } else if (\n relationData.relation.type === RelationEnum.manyToMany &&\n relationData.relation.manyToManyOptions\n ) {\n const relatedModel = relationData.relation.model();\n\n if (typeof foreignKeyColumn === \"string\" && foreignKeyColumn) {\n const relatedModelColumns = relatedModel.getColumns();\n const specifiedColumn = relatedModelColumns.find(\n (col) => col.columnName === foreignKeyColumn,\n );\n\n if (specifiedColumn) {\n foreignKeyColumn = specifiedColumn.databaseName;\n } else {\n const primaryKeyName = relatedModel.primaryKey || \"id\";\n const relatedModelPKColumn = relatedModelColumns.find(\n (col) => col.columnName === primaryKeyName,\n );\n\n if (relatedModelPKColumn) {\n foreignKeyColumn = relatedModelPKColumn.databaseName;\n } else {\n const databaseCaseConvention =\n relatedModel?.databaseCaseConvention || \"preserve\";\n foreignKeyColumn = convertCase(\n foreignKeyColumn || primaryKeyName,\n databaseCaseConvention,\n );\n }\n }\n } else {\n const primaryKeyName = relatedModel.primaryKey || \"id\";\n const relatedModelColumns = relatedModel.getColumns();\n const relatedModelPKColumn = relatedModelColumns.find(\n (col) => col.columnName === primaryKeyName,\n );\n\n if (relatedModelPKColumn) {\n foreignKeyColumn = relatedModelPKColumn.databaseName;\n } else {\n const databaseCaseConvention =\n relatedModel?.databaseCaseConvention || \"preserve\";\n foreignKeyColumn = convertCase(\n primaryKeyName,\n databaseCaseConvention,\n );\n }\n }\n }\n\n const model = this.models.find((m) => m.table === relationData.table);\n const modelColumns = model?.getColumns() || [];\n\n let sourceColumnName = relationData.relation.columnName;\n\n const modelColumn = modelColumns.find(\n (col) => col.columnName === sourceColumnName,\n );\n\n if (modelColumn) {\n sourceColumnName = modelColumn.databaseName;\n } else {\n const databaseCaseConvention =\n model?.databaseCaseConvention || \"preserve\";\n sourceColumnName = convertCase(sourceColumnName, databaseCaseConvention);\n }\n\n if (relationData.relation.type === RelationEnum.belongsTo) {\n const foreignKeyColumn = modelColumns.find(\n (col) => col.columnName === relationData.relation.foreignKey,\n );\n\n if (foreignKeyColumn) {\n sourceColumnName = foreignKeyColumn.databaseName;\n } else {\n const databaseCaseConvention =\n model?.databaseCaseConvention || \"preserve\";\n sourceColumnName = convertCase(\n relationData.relation.foreignKey,\n databaseCaseConvention,\n );\n }\n } else if (\n relationData.relation.type === RelationEnum.manyToMany &&\n relationData.relation.manyToManyOptions\n ) {\n const leftKey = relationData.relation.manyToManyOptions.leftForeignKey;\n const leftKeyStr = getColumnValue(leftKey);\n\n const leftKeyColumn = modelColumns.find(\n (col) => col.columnName === leftKeyStr,\n );\n\n if (leftKeyColumn) {\n sourceColumnName = leftKeyColumn.databaseName;\n } else {\n const databaseCaseConvention =\n model?.databaseCaseConvention || \"preserve\";\n sourceColumnName = convertCase(leftKeyStr, databaseCaseConvention);\n }\n }\n\n const onDelete = relationData.relation.onDelete?.toLowerCase() as\n | OnUpdateOrDelete\n | undefined;\n const onUpdate = relationData.relation.onUpdate?.toLowerCase() as\n | OnUpdateOrDelete\n | undefined;\n\n return this.sql.alterTable(relationData.table, (t) => {\n const fkConstraintName =\n constraintName ||\n getDefaultFkConstraintName(\n relationData.table,\n sourceColumnName,\n referencesTable,\n );\n\n t.addConstraint(\"foreign_key\", {\n columns: [sourceColumnName],\n references: {\n table: referencesTable,\n columns: [foreignKeyColumn],\n },\n constraintName: fkConstraintName,\n onDelete,\n onUpdate,\n });\n });\n }\n\n /**\n * Formats SQL statements consistently\n */\n formatSqlStatements(operations: MigrationOperation[]): MigrationOperation[] {\n return operations.map((operation) => ({\n ...operation,\n sqlStatements: operation.sqlStatements.map((statement) =>\n format(statement, {\n ...this.sql.inputDetails.queryFormatOptions,\n })\n .replace(/\\n/g, \" \")\n .replace(/\\s+/g, \" \"),\n ),\n }));\n }\n}\n","import { Model } from \"../../models/model\";\nimport { RelationEnum } from \"../../models/relations/relation\";\nimport { SqlDataSource } from \"../../sql_data_source\";\nimport {\n DropDependencies,\n ExecutionPhase,\n MigrationOperation,\n OperationType,\n} from \"./schema_diff_types\";\n\nexport class DropOrderResolver {\n private sql: SqlDataSource;\n private models: (typeof Model)[];\n\n constructor(sql: SqlDataSource) {\n this.sql = sql;\n this.models = Object.values(this.sql.models);\n }\n\n /**\n * Builds dependency graph for objects being dropped\n */\n buildDropDependencies(changes: any): DropDependencies {\n const foreignKeys = new Map<string, string[]>();\n const tables = new Map<string, string[]>();\n const constraints = new Map<string, string[]>();\n\n // Build foreign key dependencies\n for (const relation of changes.relationsToDrop || []) {\n const fkId = `${relation.table}.${relation.relation.name}`;\n const dependencies: string[] = [];\n\n // Foreign keys depend on the referenced table\n if (relation.relation.referencedTable) {\n dependencies.push(`table.${relation.relation.referencedTable}`);\n }\n\n // Foreign keys depend on the columns they reference\n if (relation.relation.referencedColumns) {\n for (const col of relation.relation.referencedColumns) {\n dependencies.push(\n `column.${relation.relation.referencedTable}.${col}`,\n );\n }\n }\n\n foreignKeys.set(fkId, dependencies);\n }\n\n // Build table dependencies\n for (const table of changes.tablesToDrop || []) {\n const tableId = `table.${table.table}`;\n const dependencies: string[] = [];\n\n // Find all foreign keys that reference this table\n for (const model of this.models) {\n const relations = model.getRelations();\n for (const relation of relations) {\n if (relation.type === RelationEnum.belongsTo) {\n const relatedModel = relation.model();\n if (relatedModel.table === table.table) {\n dependencies.push(`fk.${model.table}.${relation.constraintName}`);\n }\n }\n }\n }\n\n tables.set(tableId, dependencies);\n }\n\n // Build constraint dependencies\n for (const column of changes.columnsToDrop || []) {\n const columnId = `column.${column.table}.${column.column}`;\n const dependencies: string[] = [];\n\n // Find constraints that depend on this column\n const model = this.models.find((m) => m.table === column.table);\n if (model) {\n const modelColumn = model\n .getColumns()\n .find((c) => c.databaseName === column.column);\n if (modelColumn) {\n // Primary key constraints\n if (modelColumn.isPrimary) {\n dependencies.push(`pk.${column.table}`);\n }\n\n // Foreign key constraints\n const relations = model.getRelations();\n for (const relation of relations) {\n if (relation.columnName === modelColumn.columnName) {\n dependencies.push(\n `fk.${column.table}.${relation.constraintName}`,\n );\n }\n }\n }\n }\n\n constraints.set(columnId, dependencies);\n }\n\n return { foreignKeys, tables, constraints };\n }\n\n /**\n * Performs reverse topological sort for safe DROP ordering\n */\n topologicalSortReverse<T>(\n items: Map<string, T[]>,\n getDependencies: (item: string) => string[],\n ): string[] {\n const visited = new Set<string>();\n const temp = new Set<string>();\n const result: string[] = [];\n\n const visit = (item: string) => {\n if (temp.has(item)) {\n throw new Error(`Circular dependency detected: ${item}`);\n }\n\n if (visited.has(item)) {\n return;\n }\n\n temp.add(item);\n const dependencies = getDependencies(item);\n for (const dep of dependencies) {\n visit(dep);\n }\n temp.delete(item);\n visited.add(item);\n result.push(item);\n };\n\n for (const item of items.keys()) {\n if (!visited.has(item)) {\n visit(item);\n }\n }\n\n return result;\n }\n\n /**\n * Generates drop operations in the correct order\n */\n generateDropOperations(changes: any): MigrationOperation[] {\n const dropDeps = this.buildDropDependencies(changes);\n const operations: MigrationOperation[] = [];\n\n // Sort foreign keys in reverse dependency order\n const sortedFKs = this.topologicalSortReverse(\n dropDeps.foreignKeys,\n (fk) => dropDeps.foreignKeys.get(fk) || [],\n );\n\n // Add foreign key drop operations\n for (const fkId of sortedFKs) {\n const [table, constraintName] = fkId.split(\".\");\n const relation = changes.relationsToDrop?.find(\n (r: any) => r.table === table && r.relation.name === constraintName,\n );\n\n if (relation) {\n operations.push({\n type: OperationType.DROP_FOREIGN_KEY,\n phase: ExecutionPhase.DESTRUCTIVE_OPERATIONS,\n table,\n constraint: constraintName,\n data: relation,\n dependencies: dropDeps.foreignKeys.get(fkId) || [],\n sqlStatements: this.generateDropForeignKeySql(relation),\n });\n }\n }\n\n // Sort tables in reverse dependency order\n const sortedTables = this.topologicalSortReverse(\n dropDeps.tables,\n (table) => dropDeps.tables.get(table) || [],\n );\n\n // Add constraint drop operations for columns being dropped\n for (const column of changes.columnsToDrop || []) {\n const columnId = `column.${column.table}.${column.column}`;\n const dependencies = dropDeps.constraints.get(columnId) || [];\n\n for (const constraint of dependencies) {\n if (constraint.startsWith(\"pk.\")) {\n operations.push({\n type: OperationType.DROP_CONSTRAINT,\n phase: ExecutionPhase.DESTRUCTIVE_OPERATIONS,\n table: column.table,\n constraint: \"PRIMARY KEY\",\n data: { type: \"primary_key\", table: column.table },\n dependencies: [columnId],\n sqlStatements: this.generateDropPrimaryKeySql(column.table),\n });\n } else if (constraint.startsWith(\"unique.\")) {\n operations.push({\n type: OperationType.DROP_CONSTRAINT,\n phase: ExecutionPhase.DESTRUCTIVE_OPERATIONS,\n table: column.table,\n constraint: `UNIQUE_${column.column}`,\n data: {\n type: \"unique\",\n table: column.table,\n column: column.column,\n },\n dependencies: [columnId],\n sqlStatements: this.generateDropUniqueConstraintSql(\n column.table,\n column.column,\n ),\n });\n }\n }\n }\n\n // Add column drop operations\n for (const column of changes.columnsToDrop || []) {\n operations.push({\n type: OperationType.DROP_COLUMN,\n phase: ExecutionPhase.DESTRUCTIVE_OPERATIONS,\n table: column.table,\n column: column.column,\n data: column,\n dependencies: [],\n sqlStatements: this.generateDropColumnSql(column),\n });\n }\n\n // Add table drop operations\n for (const tableId of sortedTables) {\n const tableName = tableId.replace(\"table.\", \"\");\n const table = changes.tablesToDrop?.find(\n (t: any) => t.table === tableName,\n );\n\n if (table) {\n operations.push({\n type: OperationType.DROP_TABLE,\n phase: ExecutionPhase.DESTRUCTIVE_OPERATIONS,\n table: tableName,\n data: table,\n dependencies: dropDeps.tables.get(tableId) || [],\n sqlStatements: this.generateDropTableSql(table),\n });\n }\n }\n\n return operations;\n }\n\n /**\n * Analyzes impact of column/table drops on constraints\n */\n analyzeConstraintImpact(changes: any): Map<string, string[]> {\n const impact = new Map<string, string[]>();\n\n for (const column of changes.columnsToDrop || []) {\n const affectedConstraints: string[] = [];\n const model = this.models.find((m) => m.table === column.table);\n\n if (model) {\n const modelColumn = model\n .getColumns()\n .find((c) => c.databaseName === column.column);\n if (modelColumn) {\n // Check primary key constraints\n if (modelColumn.isPrimary) {\n affectedConstraints.push(`PRIMARY KEY on ${column.table}`);\n }\n\n // Check foreign key constraints\n const relations = model.getRelations();\n for (const relation of relations) {\n if (relation.columnName === modelColumn.columnName) {\n affectedConstraints.push(\n `FOREIGN KEY ${relation.constraintName} on ${column.table}`,\n );\n }\n }\n }\n }\n\n impact.set(`${column.table}.${column.column}`, affectedConstraints);\n }\n\n return impact;\n }\n\n /**\n * Detects operations requiring DROP+CREATE sequences\n */\n detectMixedOperations(changes: any): any[] {\n const mixedOps: any[] = [];\n\n // Column modifications that affect constraints\n for (const column of changes.columnsToModify || []) {\n const model = this.models.find((m) => m.table === column.table);\n if (model) {\n const modelColumn = model\n .getColumns()\n .find((c) => c.databaseName === column.dbColumns.name);\n if (modelColumn) {\n const hasConstraintChanges = this.hasConstraintChanges(\n column.dbColumns,\n column.modelColumn,\n );\n if (hasConstraintChanges) {\n mixedOps.push({\n type: \"column_modification_with_constraints\",\n table: column.table,\n column: column.dbColumns.name,\n description: `Column ${column.dbColumns.name} modification requires constraint recreation`,\n });\n }\n }\n }\n }\n\n // Primary key modifications\n for (const pk of changes.primaryKeysToModify || []) {\n mixedOps.push({\n type: \"primary_key_modification\",\n table: pk.table,\n description: `Primary key modification on ${pk.table} requires FK recreation`,\n });\n }\n\n return mixedOps;\n }\n\n private hasConstraintChanges(dbColumn: any, modelColumn: any): boolean {\n // Check if nullable constraint changed\n if (dbColumn.isNullable !== !modelColumn.constraints?.nullable) {\n return true;\n }\n\n // Check if unique constraint changed\n if (dbColumn.isUnique !== !!modelColumn.constraints?.unique) {\n return true;\n }\n\n // Check if default value changed\n if (dbColumn.defaultValue !== modelColumn.constraints?.default) {\n return true;\n }\n\n return false;\n }\n\n private generateDropForeignKeySql(relation: any): string[] {\n if (this.sql.getDbType() === \"sqlite\") {\n return [];\n }\n if (!relation.relation.name) {\n return [];\n }\n return this.sql.alterTable(relation.table, (t) => {\n t.dropConstraint(relation.relation.name);\n });\n }\n\n private generateDropPrimaryKeySql(table: string): string[] {\n if (this.sql.getDbType() === \"sqlite\") {\n return [];\n }\n return this.sql.alterTable(table, (t) => {\n t.dropPrimaryKey();\n });\n }\n\n private generateDropUniqueConstraintSql(\n table: string,\n column: string,\n ): string[] {\n if (this.sql.getDbType() === \"sqlite\") {\n return [];\n }\n return this.sql.alterTable(table, (t) => {\n t.dropConstraint(`UNIQUE_${column}`);\n });\n }\n\n private generateDropColumnSql(column: any): string[] {\n return this.sql.alterTable(column.table, (t) => {\n t.dropColumn(column.column);\n });\n }\n\n private generateDropTableSql(table: any): string[] {\n return [`DROP TABLE ${table.table}`];\n }\n}\n","export type SupportedSqlDialect =\n | \"oracledb\"\n | \"postgres\"\n | \"cockroachdb\"\n | \"mysql\"\n | \"mariadb\"\n | \"sqlite\"\n | \"mssql\";\n\nfunction compactWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction stripLengthSuffix(value: string): string {\n return value.replace(/\\s*\\([^)]*\\)/g, \"\").trim();\n}\n\nexport function normalizeColumnType(\n dialect: SupportedSqlDialect,\n rawType: string,\n): string {\n const lowered = compactWhitespace(rawType.toLowerCase());\n const base = stripLengthSuffix(lowered);\n\n switch (dialect) {\n case \"sqlite\": {\n const rules: Array<{ test: (s: string) => boolean; normalized: string }> =\n [\n { test: (s) => s === \"increment\", normalized: \"integer\" },\n { test: (s) => s === \"bigincrement\", normalized: \"integer\" },\n { test: (s) => s.includes(\"int\"), normalized: \"integer\" },\n { test: (s) => s.includes(\"char\"), normalized: \"varchar\" },\n { test: (s) => s.includes(\"text\"), normalized: \"text\" },\n { test: (s) => s.includes(\"clob\"), normalized: \"text\" },\n { test: (s) => s.includes(\"date\"), normalized: \"text\" },\n { test: (s) => s.includes(\"time\"), normalized: \"text\" },\n { test: (s) => s.includes(\"timestamp\"), normalized: \"text\" },\n { test: (s) => s.includes(\"datetime\"), normalized: \"text\" },\n { test: (s) => s.includes(\"blob\"), normalized: \"blob\" },\n {\n test: (s) =>\n s.includes(\"real\") || s.includes(\"floa\") || s.includes(\"doub\"),\n normalized: \"real\",\n },\n { test: (s) => s.includes(\"numeric\"), normalized: \"numeric\" },\n { test: (s) => s.includes(\"bool\"), normalized: \"integer\" },\n { test: (s) => s.includes(\"uuid\"), normalized: \"varchar\" },\n { test: (s) => s.includes(\"ulid\"), normalized: \"varchar\" },\n { test: (s) => s.includes(\"jsonb\"), normalized: \"text\" },\n { test: (s) => s.includes(\"json\"), normalized: \"text\" },\n ];\n\n for (const rule of rules) {\n if (rule.test(base)) {\n return rule.normalized;\n }\n }\n\n return base;\n }\n\n case \"mysql\":\n case \"mariadb\": {\n if (base.endsWith(\"text\") || base === \"text\") return \"text\";\n switch (base) {\n case \"int\":\n case \"integer\":\n case \"increment\":\n return \"integer\";\n case \"tinyint\":\n return \"tinyint\";\n case \"smallint\":\n return \"smallint\";\n case \"mediumint\":\n return \"mediumint\";\n case \"bigint\":\n case \"bigincrement\":\n return \"bigint\";\n case \"float\":\n return \"float\";\n case \"double\":\n case \"double precision\":\n return \"double\";\n case \"real\":\n return \"double\";\n case \"decimal\":\n case \"numeric\":\n return \"numeric\";\n case \"varchar\":\n case \"character varying\":\n return \"varchar\";\n case \"char\":\n case \"character\":\n return \"char\";\n case \"uuid\":\n return \"varchar\";\n case \"ulid\":\n return \"varchar\";\n case \"date\":\n return \"date\";\n case \"datetime\":\n return \"datetime\";\n case \"timestamp\":\n return \"timestamp\";\n case \"time\":\n return \"time\";\n case \"year\":\n return \"year\";\n case \"jsonb\":\n return \"json\";\n case \"json\":\n return \"json\";\n case \"enum\":\n return \"enum\";\n case \"binary\":\n return \"binary\";\n case \"varbinary\":\n return \"varbinary\";\n case \"tinyblob\":\n return \"tinyblob\";\n case \"mediumblob\":\n return \"mediumblob\";\n case \"longblob\":\n return \"longblob\";\n case \"blob\":\n return \"blob\";\n case \"boolean\":\n case \"bool\":\n return \"boolean\";\n default:\n return base;\n }\n }\n\n case \"postgres\":\n case \"cockroachdb\": {\n if (base.endsWith(\"text\") || base === \"text\") return \"text\";\n if (base.startsWith(\"timestamp\")) return \"timestamp\";\n if (base.startsWith(\"time\")) return \"time\";\n if (base === \"datetime\") return \"timestamp\";\n switch (base) {\n case \"character varying\":\n return \"varchar\";\n case \"character\":\n return \"char\";\n case \"ulid\":\n return \"varchar\";\n case \"double precision\":\n return \"double\";\n case \"real\":\n return \"real\";\n case \"float\":\n return \"real\";\n case \"integer\":\n case \"int4\":\n case \"int\":\n case \"increment\":\n case \"serial\":\n return \"integer\";\n case \"mediumint\":\n return \"integer\";\n case \"bigint\":\n case \"int8\":\n case \"bigincrement\":\n case \"bigserial\":\n return \"bigint\";\n case \"smallint\":\n case \"int2\":\n return \"smallint\";\n case \"tinyint\":\n return \"smallint\";\n case \"uuid\":\n return \"uuid\";\n case \"year\":\n return \"smallint\";\n case \"bytea\":\n return \"bytea\";\n case \"binary\":\n case \"varbinary\":\n case \"blob\":\n case \"tinyblob\":\n case \"mediumblob\":\n case \"longblob\":\n return \"bytea\";\n case \"boolean\":\n case \"bool\":\n return \"boolean\";\n case \"numeric\":\n case \"decimal\":\n return \"numeric\";\n case \"jsonb\":\n return \"jsonb\";\n case \"json\":\n return \"json\";\n case \"date\":\n return \"date\";\n default:\n return base;\n }\n }\n\n case \"mssql\": {\n if (base.endsWith(\"text\") || base === \"text\" || base === \"ntext\")\n return \"text\";\n if (base.startsWith(\"datetime2\")) return \"datetime2\";\n if (base.startsWith(\"datetimeoffset\")) return \"datetimeoffset\";\n switch (base) {\n case \"int\":\n case \"integer\":\n case \"increment\":\n return \"int\";\n case \"tinyint\":\n return \"tinyint\";\n case \"smallint\":\n return \"smallint\";\n case \"bigint\":\n case \"bigincrement\":\n return \"bigint\";\n case \"float\":\n return \"float\";\n case \"real\":\n return \"real\";\n case \"double\":\n case \"double precision\":\n return \"float\";\n case \"decimal\":\n case \"numeric\":\n return \"decimal\";\n case \"money\":\n return \"money\";\n case \"smallmoney\":\n return \"smallmoney\";\n case \"varchar\":\n case \"character varying\":\n return \"varchar\";\n case \"nvarchar\":\n return \"nvarchar\";\n case \"char\":\n case \"character\":\n return \"char\";\n case \"nchar\":\n return \"nchar\";\n case \"uuid\":\n case \"uniqueidentifier\":\n return \"uniqueidentifier\";\n case \"ulid\":\n return \"varchar\";\n case \"date\":\n return \"date\";\n case \"datetime\":\n return \"datetime\";\n case \"smalldatetime\":\n return \"smalldatetime\";\n case \"time\":\n return \"time\";\n case \"timestamp\":\n return \"datetime2\";\n case \"binary\":\n return \"binary\";\n case \"varbinary\":\n case \"blob\":\n case \"tinyblob\":\n case \"mediumblob\":\n case \"longblob\":\n case \"bytea\":\n return \"varbinary\";\n case \"image\":\n return \"image\";\n case \"bit\":\n case \"boolean\":\n case \"bool\":\n return \"bit\";\n case \"json\":\n case \"jsonb\":\n return \"nvarchar\";\n case \"xml\":\n return \"xml\";\n case \"sql_variant\":\n return \"sql_variant\";\n default:\n return base;\n }\n }\n\n case \"oracledb\": {\n // Oracle data types normalization\n if (base.endsWith(\"clob\") || base === \"clob\" || base === \"nclob\")\n return \"clob\";\n if (base.startsWith(\"timestamp\")) return \"timestamp\";\n if (base.startsWith(\"interval\")) return \"interval\";\n switch (base) {\n case \"varchar2\":\n case \"nvarchar2\":\n case \"character varying\":\n return \"varchar2\";\n case \"char\":\n case \"nchar\":\n case \"character\":\n return \"char\";\n case \"number\":\n case \"numeric\":\n case \"decimal\":\n case \"integer\":\n case \"int\":\n case \"smallint\":\n case \"tinyint\":\n case \"mediumint\":\n case \"bigint\":\n return \"number\";\n case \"binary_float\":\n case \"float\":\n case \"real\":\n return \"binary_float\";\n case \"binary_double\":\n case \"double\":\n case \"double precision\":\n return \"binary_double\";\n case \"date\":\n return \"date\";\n case \"blob\":\n case \"raw\":\n case \"long raw\":\n case \"bytea\":\n case \"binary\":\n case \"varbinary\":\n return \"blob\";\n case \"json\":\n case \"jsonb\":\n return \"clob\";\n case \"boolean\":\n case \"bool\":\n return \"number\";\n case \"uuid\":\n case \"ulid\":\n return \"varchar2\";\n default:\n return base;\n }\n }\n default:\n return base;\n }\n}\n","import {\n getDefaultFkConstraintName,\n getDefaultForeignKey,\n} from \"../../models/decorators/model_decorators_constants\";\nimport {\n ColumnType,\n LazyRelationType,\n} from \"../../models/decorators/model_decorators_types\";\nimport { Model } from \"../../models/model\";\nimport { RelationEnum } from \"../../models/relations/relation\";\nimport { getColumnValue } from \"../../resources/utils\";\nimport {\n TableColumnInfo,\n TableForeignKeyInfo,\n TableIndexInfo,\n TablePrimaryKeyInfo,\n} from \"../../schema_introspection_types\";\nimport { SqlDataSource } from \"../../sql_data_source\";\nimport { MigrationOperationGenerator } from \"./migration_operation_generator\";\nimport {\n ExecutionPhase,\n GenerateTableDiffReturnType,\n RelationsToAdd,\n} from \"./schema_diff_types\";\nimport { normalizeColumnType } from \"./type_normalizer\";\n\nexport class SchemaDiff {\n private sql: SqlDataSource;\n private models: (typeof Model)[];\n private data: GenerateTableDiffReturnType;\n private readonly emptyStatements = [/alter table \".*\"$/];\n\n private constructor(sql: SqlDataSource) {\n this.sql = sql;\n this.models = Object.values(this.sql.models);\n this.data = {\n columnsToAdd: [],\n columnsToDrop: [],\n columnsToModify: [],\n indexesToAdd: [],\n indexesToDrop: [],\n uniquesToAdd: [],\n uniquesToDrop: [],\n tablesToAdd: [],\n relationsToAdd: [],\n relationsToDrop: [],\n relationsToModify: [],\n primaryKeysToAdd: [],\n primaryKeysToDrop: [],\n primaryKeysToModify: [],\n };\n }\n\n static async makeDiff(sql: SqlDataSource): Promise<SchemaDiff> {\n const diff = new SchemaDiff(sql);\n await Promise.all(\n diff.models.map(async (model) => {\n const databaseData = await diff.sql.getTableSchema(model.table);\n const modelData = {\n // Ignore columns that don't declare a type\n columns: model\n .getColumns()\n .filter((c) => c?.type !== undefined && c?.type !== null),\n indexes: model.getIndexes(),\n relations: model.getRelations(),\n };\n\n // Table not present in the database\n if (!databaseData.columns.length) {\n diff.data.tablesToAdd.push({\n table: model.table,\n columns: modelData.columns,\n });\n\n for (const index of modelData.indexes) {\n if (\n !databaseData.indexes\n .map((dbIndex) => dbIndex.name)\n .includes(index.name)\n ) {\n diff.data.indexesToAdd.push({\n table: model.table,\n index: index.name,\n });\n }\n }\n\n const modelUniques = (model as typeof Model).getUniques?.() || [];\n for (const uq of modelUniques) {\n diff.data.uniquesToAdd!.push({\n table: model.table,\n name: uq.name || \"mandatory\",\n columns: uq.columns,\n });\n }\n\n for (const relation of modelData.relations) {\n if (relation.type !== RelationEnum.belongsTo) {\n continue;\n }\n\n const expectedConstraintName = getColumnValue(\n relation.constraintName,\n );\n\n const dbRelation = databaseData.foreignKeys.find(\n (fk) => fk.name === expectedConstraintName,\n );\n\n if (!dbRelation) {\n diff.data.relationsToAdd.push({\n table: model.table,\n relation: relation,\n onDelete: relation.onDelete,\n onUpdate: relation.onUpdate,\n });\n }\n }\n\n return;\n }\n\n // Columns to add\n for (const column of modelData.columns) {\n const existsInDb = databaseData.columns.some(\n (dbColumn) =>\n dbColumn.name === column.databaseName ||\n dbColumn.name === column.columnName,\n );\n if (!existsInDb) {\n diff.data.columnsToAdd.push({\n table: model.table,\n column: column,\n });\n }\n }\n\n // Columns to drop\n for (const column of databaseData.columns) {\n const existsInModel = modelData.columns.some(\n (modelColumn) =>\n modelColumn.databaseName === column.name ||\n modelColumn.columnName === column.name,\n );\n if (!existsInModel) {\n diff.data.columnsToDrop.push({\n table: model.table,\n column: column.name,\n });\n }\n }\n\n // Indexes to add\n for (const index of modelData.indexes) {\n if (\n !databaseData.indexes\n .map((dbIndex) => dbIndex.name)\n .includes(index.name)\n ) {\n diff.data.indexesToAdd.push({\n table: model.table,\n index: index.name,\n });\n }\n }\n\n // Unique constraints to add (via decorator)\n const modelUniques = (model as typeof Model).getUniques?.() || [];\n for (const uq of modelUniques) {\n const exists = databaseData.indexes.some(\n (dbIndex) => dbIndex.name === uq.name && dbIndex.isUnique,\n );\n if (!exists) {\n diff.data.uniquesToAdd!.push({\n table: model.table,\n name: uq.name || \"mandatory\",\n columns: uq.columns,\n });\n }\n }\n\n // Indexes to drop (ignore unique indexes managed by constraints)\n for (const index of databaseData.indexes) {\n if (index.isUnique) {\n continue;\n }\n\n const existsInModel = modelData.indexes\n .map((modelIndex) => modelIndex.name)\n .includes(index.name);\n if (existsInModel) {\n continue;\n }\n\n diff.data.indexesToDrop.push({\n table: model.table,\n index: index.name,\n });\n }\n\n // Unique constraints to drop (not present in model uniques but unique in DB)\n for (const dbIndex of databaseData.indexes) {\n if (!dbIndex.isUnique) {\n continue;\n }\n const existsInModel = ((model as typeof Model).getUniques?.() || [])\n .map((u) => u.name)\n .includes(dbIndex.name);\n if (!existsInModel) {\n diff.data.uniquesToDrop!.push({\n table: model.table,\n name: dbIndex.name,\n });\n }\n }\n\n // Columns to modify\n for (const column of modelData.columns) {\n const dbColumn = databaseData.columns.find(\n (dbCol) =>\n dbCol.name === column.databaseName ||\n dbCol.name === column.columnName,\n );\n\n if (!dbColumn) {\n continue;\n }\n\n const hasStructChange = !diff.areColumnsEqual(\n dbColumn,\n column,\n databaseData.indexes,\n );\n const defaultChange = diff.getDefaultChange({\n table: model.table,\n dbColumns: dbColumn,\n modelColumn: column,\n });\n\n if (hasStructChange || defaultChange) {\n diff.data.columnsToModify.push({\n table: model.table,\n dbColumns: dbColumn,\n modelColumn: column,\n });\n }\n }\n\n // Relations to add\n for (const relation of modelData.relations) {\n if (\n relation.type !== RelationEnum.belongsTo &&\n relation.type !== RelationEnum.manyToMany\n ) {\n continue;\n }\n\n if (\n relation.type === RelationEnum.manyToMany &&\n relation.manyToManyOptions\n ) {\n const throughTable = getColumnValue(\n relation.manyToManyOptions.throughModel,\n );\n\n // Add the left side (this model)\n diff.data.relationsToAdd.push({\n table: throughTable,\n relation: {\n type: RelationEnum.belongsTo,\n model: () => model,\n columnName: getColumnValue(\n relation.manyToManyOptions.leftForeignKey,\n ),\n foreignKey: relation.manyToManyOptions.leftForeignKey,\n constraintName: relation.constraintName\n ? getColumnValue(relation.constraintName)\n : getDefaultFkConstraintName(\n throughTable,\n getColumnValue(\n relation.manyToManyOptions.leftForeignKey ||\n getDefaultForeignKey(model.table),\n ),\n model.table,\n ),\n onDelete: relation.onDelete,\n onUpdate: relation.onUpdate,\n },\n onDelete: relation.onDelete,\n onUpdate: relation.onUpdate,\n });\n continue;\n }\n\n const expectedName = getColumnValue(relation.constraintName);\n if (\n expectedName &&\n databaseData.foreignKeys.some((fk) => fk.name === expectedName)\n ) {\n continue;\n }\n\n const dbRelation = databaseData.foreignKeys.find((fk) =>\n diff.relationMatchesDbRelation(model, relation, fk),\n );\n\n if (!dbRelation) {\n diff.data.relationsToAdd.push({\n table: model.table,\n relation: relation,\n onDelete: relation.onDelete,\n onUpdate: relation.onUpdate,\n });\n }\n }\n\n // Relations to drop\n const modelExpectedFkNames = new Set(\n modelData.relations\n .filter((rel) => rel.type === RelationEnum.belongsTo)\n .map((rel) => {\n const srcCol = getColumnValue(rel.foreignKey) || rel.columnName;\n const mc = model\n .getColumns()\n .find((c) => c.columnName === srcCol);\n const srcDb = mc?.databaseName || srcCol;\n return (\n getColumnValue(rel.constraintName) ||\n getDefaultFkConstraintName(\n model.table,\n srcDb,\n rel.model().table,\n )\n );\n }),\n );\n\n for (const dbRelation of databaseData.foreignKeys) {\n if (dbRelation.name && modelExpectedFkNames.has(dbRelation.name)) {\n continue;\n }\n\n const modelRelation = modelData.relations.find((rel) => {\n if (\n rel.type !== RelationEnum.belongsTo &&\n rel.type !== RelationEnum.manyToMany\n ) {\n return false;\n }\n return diff.relationMatchesDbRelation(\n model,\n rel as any,\n dbRelation,\n );\n });\n\n if (!modelRelation) {\n diff.data.relationsToDrop.push({\n table: model.table,\n relation: dbRelation,\n });\n }\n }\n\n // Relations to modify\n for (const modelRelation of modelData.relations) {\n if (\n modelRelation.type !== RelationEnum.belongsTo &&\n modelRelation.type !== RelationEnum.manyToMany\n ) {\n continue;\n }\n\n const dbRelation = databaseData.foreignKeys.find((fk) =>\n diff.relationMatchesDbRelation(model, modelRelation, fk),\n );\n\n if (\n dbRelation &&\n !diff.areRelationsEqual(dbRelation, modelRelation)\n ) {\n diff.data.relationsToModify.push({\n table: model.table,\n dbRelation: dbRelation,\n modelRelation: modelRelation,\n onDelete: modelRelation.onDelete,\n onUpdate: modelRelation.onUpdate,\n });\n }\n }\n\n // Primary key to add\n const modelPrimaryKey = model.primaryKey;\n if (modelPrimaryKey && !databaseData.primaryKey) {\n diff.data.primaryKeysToAdd.push({\n table: model.table,\n columns: [modelPrimaryKey],\n });\n }\n\n // Primary key to drop\n if (databaseData.primaryKey && !modelPrimaryKey) {\n diff.data.primaryKeysToDrop.push({\n table: model.table,\n columns: databaseData.primaryKey.columns,\n name: databaseData.primaryKey.name,\n });\n }\n\n // Primary key to modify\n if (modelPrimaryKey && databaseData.primaryKey) {\n const modelPrimaryKeyColumn = model\n .getColumns()\n .find((col) => col.columnName === modelPrimaryKey);\n\n if (\n modelPrimaryKeyColumn &&\n !diff.arePrimaryKeysEqual(\n databaseData.primaryKey,\n modelPrimaryKeyColumn,\n )\n ) {\n diff.data.primaryKeysToModify.push({\n table: model.table,\n dbPrimaryKey: databaseData.primaryKey,\n modelPrimaryKey: modelPrimaryKey,\n });\n }\n }\n }),\n );\n\n await diff.processManyToMany();\n\n await diff.removeFkChurnByName();\n\n return diff;\n }\n\n getSqlStatements(): string[] {\n const operations = this.getSqlStatementsByPhase();\n return Object.values(operations).flat();\n }\n\n /**\n * Gets all SQL statements organized by execution phase\n * This is the single API to get all migration SQL statements\n */\n private getSqlStatementsByPhase(): Record<ExecutionPhase, string[]> {\n const operationGenerator = new MigrationOperationGenerator(this.sql);\n const operations = operationGenerator.generateOperations(this.data);\n const formattedOperations =\n operationGenerator.formatSqlStatements(operations);\n\n const statementsByPhase: Record<ExecutionPhase, string[]> = {\n [ExecutionPhase.STRUCTURE_CREATION]: [],\n [ExecutionPhase.CONSTRAINT_CREATION]: [],\n [ExecutionPhase.DESTRUCTIVE_OPERATIONS]: [],\n };\n\n for (const operation of formattedOperations) {\n statementsByPhase[operation.phase].push(...operation.sqlStatements);\n }\n\n return statementsByPhase;\n }\n\n private areColumnsEqual(\n dbColumn: TableColumnInfo,\n modelColumn: ColumnType,\n dbIndexes: TableIndexInfo[] = [],\n ): boolean {\n // Only provided types in the model are chosen for the diff\n let baseCondition = dbColumn.name === modelColumn.databaseName;\n\n const dialect = this.sql.getDbType();\n const normalizedDbType = normalizeColumnType(dialect, dbColumn.dataType);\n const normalizedModelType =\n typeof modelColumn.type === \"string\"\n ? normalizeColumnType(dialect, modelColumn.type)\n : undefined;\n\n if (normalizedModelType) {\n baseCondition &&= normalizedDbType === normalizedModelType;\n }\n\n if (modelColumn.length != null && dbColumn.length != null) {\n baseCondition &&= dbColumn.length === modelColumn.length;\n }\n\n const isFloatingType =\n normalizedModelType === \"real\" ||\n normalizedModelType === \"double\" ||\n normalizedModelType === \"float\";\n\n if (modelColumn.precision != null && dbColumn.precision != null) {\n if (\n (dialect === \"postgres\" || dialect === \"cockroachdb\") &&\n isFloatingType\n ) {\n // Ignore precision differences for floating types in Postgres/Cockroach\n } else {\n baseCondition &&= dbColumn.precision === modelColumn.precision;\n }\n }\n\n if (modelColumn.scale != null && dbColumn.scale != null) {\n if (\n (dialect === \"postgres\" || dialect === \"cockroachdb\") &&\n isFloatingType\n ) {\n // Ignore scale differences for floating types in Postgres/Cockroach\n } else {\n baseCondition &&= dbColumn.scale === modelColumn.scale;\n }\n }\n\n if (typeof modelColumn.type === \"string\") {\n const isTimestampLike =\n normalizedModelType === \"timestamp\" || normalizedModelType === \"time\";\n if (isTimestampLike) {\n if (\n modelColumn.withTimezone !== undefined &&\n dbColumn.withTimezone !== undefined\n ) {\n baseCondition &&=\n !!dbColumn.withTimezone === !!modelColumn.withTimezone;\n }\n }\n }\n\n // Check nullable constraint changes\n if (modelColumn.constraints?.nullable !== undefined) {\n const modelNullable = modelColumn.constraints.nullable;\n const dbNullable = dbColumn.isNullable;\n const nullableMatch = modelNullable === dbNullable;\n baseCondition = baseCondition && nullableMatch;\n }\n\n return baseCondition;\n }\n\n private areRelationsEqual(\n dbRelation: TableForeignKeyInfo,\n modelRelation: LazyRelationType,\n ): boolean {\n const expectedConstraintName = getColumnValue(modelRelation.constraintName);\n\n let baseCondition = expectedConstraintName\n ? dbRelation.name === expectedConstraintName\n : true;\n if (modelRelation.type === RelationEnum.belongsTo) {\n const relatedModel = modelRelation.model();\n const pkName = relatedModel.primaryKey || \"id\";\n const pkColumn = relatedModel\n .getColumns()\n .find((c) => c.columnName === pkName);\n const expectedRefTable = relatedModel.table;\n const expectedRefColumn = pkColumn?.databaseName || pkName;\n\n baseCondition =\n baseCondition &&\n dbRelation.referencedTable === expectedRefTable &&\n !!dbRelation.referencedColumns &&\n dbRelation.referencedColumns.length === 1 &&\n dbRelation.referencedColumns[0] === expectedRefColumn;\n } else if (\n modelRelation.type === RelationEnum.manyToMany &&\n modelRelation.manyToManyOptions\n ) {\n const expectedThroughTable = getColumnValue(\n modelRelation.manyToManyOptions.throughModel,\n );\n baseCondition =\n baseCondition && dbRelation.referencedTable === expectedThroughTable;\n }\n\n const dbOnDelete = dbRelation.onDelete?.toLowerCase();\n const dbOnUpdate = dbRelation.onUpdate?.toLowerCase();\n const modelOnDelete = modelRelation.onDelete?.toLowerCase();\n const modelOnUpdate = modelRelation.onUpdate?.toLowerCase();\n\n if (modelOnDelete) {\n baseCondition &&= dbOnDelete === modelOnDelete;\n }\n\n if (modelOnUpdate) {\n baseCondition &&= dbOnUpdate === modelOnUpdate;\n }\n\n return baseCondition;\n }\n\n private relationMatchesDbRelation(\n model: typeof Model,\n modelRelation: LazyRelationType,\n dbRelation: TableForeignKeyInfo,\n ): boolean {\n let relatedModel: typeof Model | undefined;\n const mr: any = modelRelation as any;\n if (mr && mr.model) {\n if (typeof mr.model === \"function\" && mr.model.table) {\n relatedModel = mr.model as typeof Model;\n } else if (typeof mr.model === \"function\") {\n try {\n const v = mr.model();\n if (v && v.table) {\n relatedModel = v as typeof Model;\n }\n } catch (_) {}\n }\n }\n\n if (!relatedModel) {\n return false;\n }\n const expectedReferencedTable =\n modelRelation.type === RelationEnum.belongsTo\n ? relatedModel.table\n : modelRelation.type === RelationEnum.manyToMany &&\n modelRelation.manyToManyOptions\n ? getColumnValue(modelRelation.manyToManyOptions.throughModel)\n : undefined;\n\n if (\n expectedReferencedTable &&\n dbRelation.referencedTable !== expectedReferencedTable\n ) {\n return false;\n }\n\n const fkName = getColumnValue(modelRelation.constraintName);\n if (fkName && dbRelation.name && fkName !== dbRelation.name) {\n return false;\n }\n\n const modelColumns = model.getColumns();\n const relationType = (mr.type as RelationEnum) || RelationEnum.belongsTo;\n let localColumn =\n relationType === RelationEnum.belongsTo\n ? getColumnValue(mr.foreignKey)\n : mr.columnName;\n const mc = modelColumns.find((c) => c.columnName === localColumn);\n if (mc) {\n localColumn = mc.databaseName;\n }\n\n const referencedPkName = relatedModel.primaryKey || \"id\";\n const relatedPk = relatedModel\n .getColumns()\n .find((c) => c.columnName === referencedPkName);\n const referencedColumn = relatedPk?.databaseName || referencedPkName;\n\n return (\n dbRelation.columns.length === 1 &&\n dbRelation.columns[0] === localColumn &&\n dbRelation.referencedColumns.length === 1 &&\n dbRelation.referencedColumns[0] === referencedColumn\n );\n }\n\n private arePrimaryKeysEqual(\n dbPrimaryKey: TablePrimaryKeyInfo,\n modelPrimaryKeyColumn: ColumnType,\n ): boolean {\n if (dbPrimaryKey.columns.length !== 1) {\n return false;\n }\n\n const dbPrimaryKeyColumn = dbPrimaryKey.columns[0];\n const columnsMatch =\n dbPrimaryKeyColumn === modelPrimaryKeyColumn.databaseName;\n\n const constraintNamesMatch =\n !dbPrimaryKey.name ||\n !modelPrimaryKeyColumn.primaryKeyConstraintName ||\n dbPrimaryKey.name === modelPrimaryKeyColumn.primaryKeyConstraintName;\n\n return columnsMatch && constraintNamesMatch;\n }\n private getDefaultChange(columnData: {\n table: string;\n dbColumns: TableColumnInfo;\n modelColumn: ColumnType;\n }): \"set\" | \"drop\" | false {\n const dialect = this.sql.getDbType();\n const normalizedDbType = normalizeColumnType(\n dialect,\n columnData.dbColumns.dataType,\n );\n const normalizedModelType =\n typeof columnData.modelColumn.type === \"string\"\n ? normalizeColumnType(dialect, columnData.modelColumn.type)\n : undefined;\n if (normalizedModelType && normalizedDbType !== normalizedModelType) {\n return false;\n }\n if (\n columnData.modelColumn.length != null &&\n columnData.dbColumns.length != null &&\n columnData.dbColumns.length !== columnData.modelColumn.length\n ) {\n return false;\n }\n if (\n columnData.modelColumn.precision != null &&\n columnData.dbColumns.precision != null &&\n columnData.dbColumns.precision !== columnData.modelColumn.precision\n ) {\n return false;\n }\n if (\n columnData.modelColumn.scale != null &&\n columnData.dbColumns.scale != null &&\n columnData.dbColumns.scale !== columnData.modelColumn.scale\n ) {\n return false;\n }\n if (\n typeof columnData.modelColumn.type === \"string\" &&\n (normalizedModelType === \"timestamp\" || normalizedModelType === \"time\") &&\n columnData.modelColumn.withTimezone !== undefined &&\n columnData.dbColumns.withTimezone !== undefined &&\n !!columnData.dbColumns.withTimezone !==\n !!columnData.modelColumn.withTimezone\n ) {\n return false;\n }\n const modelHasDefault =\n columnData.modelColumn.constraints?.default !== undefined;\n const dbHasDefault =\n columnData.dbColumns.defaultValue !== null &&\n columnData.dbColumns.defaultValue !== undefined;\n if (modelHasDefault && !dbHasDefault) {\n return \"set\";\n }\n if (!modelHasDefault && dbHasDefault) {\n return \"drop\";\n }\n if (modelHasDefault && dbHasDefault) {\n const dbDefault = String(columnData.dbColumns.defaultValue);\n const modelDefault = String(\n columnData.modelColumn.constraints?.default as any,\n );\n\n const dbNorm = this.normalizeDefaultValue(\n dialect,\n normalizedDbType,\n dbDefault,\n );\n const modelNorm = this.normalizeDefaultValue(\n dialect,\n normalizedModelType || normalizedDbType,\n modelDefault,\n );\n return dbNorm !== modelNorm ? \"set\" : false;\n }\n return false;\n }\n\n private normalizeDefaultValue(\n dialect: ReturnType<SqlDataSource[\"getDbType\"]>,\n dataType: string | undefined,\n value: string,\n ): string {\n let v = String(value).trim();\n if (!v) {\n return v;\n }\n if (dialect === \"postgres\" || dialect === \"cockroachdb\") {\n // Special handling for JSON/JSONB default values\n if (dataType === \"json\" || dataType === \"jsonb\") {\n try {\n // Remove PostgreSQL type annotations and quotes\n v = v.replace(/^\\((.*)\\)$/s, \"$1\");\n v = v.replace(/::(jsonb?|[a-zA-Z_ ]+[\\[\\]]*)/g, \"\");\n\n // Remove outer quotes if present\n const singleQuoted = v.match(/^'(.*)'$/s);\n if (singleQuoted) {\n v = singleQuoted[1];\n }\n\n // For empty object representations\n if (v === \"{}\" || v === \"\") {\n return \"{}\";\n }\n\n // Parse and re-stringify to normalize JSON format\n const parsed = JSON.parse(v);\n return JSON.stringify(parsed);\n } catch (_) {\n // If parsing fails, continue with regular normalization\n }\n }\n\n // Regular normalization for non-JSON types\n v = v.replace(/^\\((.*)\\)$/s, \"$1\");\n v = v.replace(/::[a-zA-Z_ ]+[\\[\\]]*/g, \"\");\n const singleQuoted = v.match(/^'(.*)'$/s);\n if (singleQuoted) {\n v = singleQuoted[1];\n }\n if (/^true$/i.test(v)) {\n return \"true\";\n }\n if (/^false$/i.test(v)) {\n return \"false\";\n }\n if (/^null$/i.test(v)) {\n return \"null\";\n }\n if (/^\\d+(?:\\.\\d+)?$/.test(v)) {\n return v;\n }\n return v;\n }\n if (dialect === \"mysql\" || dialect === \"mariadb\") {\n v = v.replace(/^\\((.*)\\)$/s, \"$1\");\n const singleQuoted = v.match(/^'(.*)'$/s);\n if (singleQuoted) {\n v = singleQuoted[1];\n }\n if (/^current_timestamp(?:\\(\\d+\\))?$/i.test(v)) {\n return \"current_timestamp\";\n }\n return v;\n }\n if (dialect === \"sqlite\") {\n v = v.replace(/^\\((.*)\\)$/s, \"$1\");\n const singleQuoted = v.match(/^'(.*)'$/s);\n if (singleQuoted) {\n v = singleQuoted[1];\n }\n return v.toLowerCase();\n }\n return v;\n }\n\n private async processManyToMany(): Promise<void> {\n const processed = new Set<string>();\n for (const model of this.models) {\n const relations = model.getRelations();\n for (const relation of relations) {\n if (\n relation.type !== RelationEnum.manyToMany ||\n !relation.manyToManyOptions\n ) {\n continue;\n }\n if (relation.manyToManyOptions.wasModelProvided) {\n continue;\n }\n\n const throughTable = getColumnValue(\n relation.manyToManyOptions.throughModel,\n );\n if (processed.has(throughTable)) {\n continue;\n }\n processed.add(throughTable);\n\n const leftModel = this.models.find(\n (m) => m.table === relation?.manyToManyOptions?.primaryModel,\n );\n const rightModel = relation.model();\n if (!leftModel || !rightModel) {\n continue;\n }\n\n const leftPkName = leftModel.primaryKey || \"id\";\n const rightPkName = rightModel.primaryKey || \"id\";\n const leftPk = leftModel\n .getColumns()\n .find((c) => c.columnName === leftPkName);\n const rightPk = rightModel\n .getColumns()\n .find((c) => c.columnName === rightPkName);\n if (!leftPk || !rightPk) {\n continue;\n }\n\n const leftFkName =\n getColumnValue(relation.manyToManyOptions.leftForeignKey) ||\n leftPkName;\n const rightFkName =\n getColumnValue(relation.manyToManyOptions.rightForeignKey) ||\n rightPkName;\n\n const dbThrough = await this.sql.getTableSchema(throughTable);\n if (!dbThrough.columns.length) {\n this.data.tablesToAdd.push({\n table: throughTable,\n columns: [\n this.clonePkAsColumn(leftPk, leftFkName),\n this.clonePkAsColumn(rightPk, rightFkName),\n ],\n });\n\n this.pushM2mFkRelations({\n throughTable,\n leftModel,\n rightModel,\n leftFkName,\n rightFkName,\n onDelete: relation.onDelete,\n onUpdate: relation.onUpdate,\n constraintName: undefined,\n });\n continue;\n }\n\n const leftExpected = this.clonePkAsColumn(leftPk, leftFkName);\n const rightExpected = this.clonePkAsColumn(rightPk, rightFkName);\n const leftDbCol = dbThrough.columns.find((c) => c.name === leftFkName);\n const rightDbCol = dbThrough.columns.find(\n (c) => c.name === rightFkName,\n );\n const leftColOk = leftDbCol\n ? this.areColumnsEqual(leftDbCol, leftExpected, dbThrough.indexes)\n : false;\n const rightColOk = rightDbCol\n ? this.areColumnsEqual(rightDbCol, rightExpected, dbThrough.indexes)\n : false;\n\n // Drop old FK-bound columns that do not match the expected names\n for (const fk of dbThrough.foreignKeys) {\n const isLeft = fk.referencedTable === leftModel.table;\n const isRight = fk.referencedTable === rightModel.table;\n if (!isLeft && !isRight) {\n continue;\n }\n const expectedName = isLeft ? leftFkName : rightFkName;\n const actualName = fk.columns[0];\n if (actualName && actualName !== expectedName) {\n this.data.relationsToDrop.push({\n table: throughTable,\n relation: fk,\n });\n if (actualName !== leftFkName && actualName !== rightFkName) {\n this.data.columnsToDrop.push({\n table: throughTable,\n column: actualName,\n });\n }\n }\n }\n\n // Add missing columns (dedup when both sides are the same name)\n const pendingAddColumns: Record<string, ColumnType> = {};\n if (!leftColOk) {\n pendingAddColumns[leftExpected.databaseName] = leftExpected;\n }\n if (!rightColOk) {\n pendingAddColumns[rightExpected.databaseName] =\n pendingAddColumns[rightExpected.databaseName] || rightExpected;\n }\n for (const name of Object.keys(pendingAddColumns)) {\n this.data.columnsToAdd.push({\n table: throughTable,\n column: pendingAddColumns[name],\n });\n }\n\n const leftExpectedRel = this.buildBelongsToRelation(\n throughTable,\n () => leftModel,\n leftFkName,\n leftPkName,\n undefined,\n relation.onDelete,\n relation.onUpdate,\n );\n const rightExpectedRel = this.buildBelongsToRelation(\n throughTable,\n relation.model,\n rightFkName,\n rightPkName,\n undefined,\n relation.onDelete,\n relation.onUpdate,\n );\n\n const leftDbFk = dbThrough.foreignKeys.find(\n (fk) =>\n fk.referencedTable === leftModel.table &&\n fk.columns.length === 1 &&\n fk.columns[0] === leftFkName,\n );\n const rightDbFk = dbThrough.foreignKeys.find(\n (fk) =>\n fk.referencedTable === rightModel.table &&\n fk.columns.length === 1 &&\n fk.columns[0] === rightFkName,\n );\n if (!leftDbFk) {\n const conflictLeft = dbThrough.foreignKeys.find(\n (fk) => fk.referencedTable === leftModel.table,\n );\n if (conflictLeft) {\n this.data.relationsToDrop.push({\n table: throughTable,\n relation: conflictLeft,\n });\n }\n this.data.relationsToAdd.push(leftExpectedRel as RelationsToAdd);\n }\n if (!rightDbFk) {\n const conflictRight = dbThrough.foreignKeys.find(\n (fk) => fk.referencedTable === rightModel.table,\n );\n if (conflictRight) {\n this.data.relationsToDrop.push({\n table: throughTable,\n relation: conflictRight,\n });\n }\n this.data.relationsToAdd.push(rightExpectedRel as RelationsToAdd);\n }\n }\n }\n }\n\n private async removeFkChurnByName(): Promise<void> {\n const tablesNeedingCheck = new Set<string>();\n for (const rel of this.data.relationsToAdd) {\n tablesNeedingCheck.add(rel.table);\n }\n for (const rel of this.data.relationsToDrop) {\n tablesNeedingCheck.add(rel.table);\n }\n\n const tableToDbFks = new Map<string, Set<string>>();\n for (const table of tablesNeedingCheck) {\n const schema = await this.sql.getTableSchema(table);\n const names = new Set(\n (schema.foreignKeys || [])\n .map((fk) => fk.name)\n .filter(Boolean) as string[],\n );\n tableToDbFks.set(table, names);\n }\n\n const modelExpectedByTable = new Map<string, Set<string>>();\n for (const model of this.models) {\n const rels = model.getRelations();\n const expected = new Set<string>();\n for (const rel of rels) {\n if (rel.type !== RelationEnum.belongsTo) {\n continue;\n }\n const srcColRaw = (rel as any).foreignKey || rel.columnName;\n const mc = model.getColumns().find((c) => c.columnName === srcColRaw);\n const srcDb = mc?.databaseName || srcColRaw;\n const name =\n getColumnValue((rel as any).constraintName) ||\n getDefaultFkConstraintName(model.table, srcDb, rel.model().table);\n expected.add(name);\n }\n modelExpectedByTable.set(model.table, expected);\n }\n\n this.data.relationsToAdd = await Promise.all(\n this.data.relationsToAdd.map(async (r) => {\n const dbSchema = await this.sql.getTableSchema(r.table);\n const model = this.models.find((m) => m.table === r.table);\n const modelCols = model?.getColumns() || [];\n\n let sourceCol = (r.relation as any).columnName;\n if (r.relation.type === RelationEnum.belongsTo) {\n const fkModelCol = modelCols.find(\n (c) => c.columnName === (r.relation as any).foreignKey,\n );\n sourceCol =\n fkModelCol?.databaseName || (r.relation as any).foreignKey;\n } else {\n const mc = modelCols.find((c) => c.columnName === sourceCol);\n sourceCol = mc?.databaseName || sourceCol;\n }\n\n let referencedTable = r.table;\n let referencedCol = (r.relation as any).foreignKey;\n if (r.relation.type === RelationEnum.belongsTo) {\n const relModel = r.relation.model();\n referencedTable = relModel.table;\n const pkName = relModel.primaryKey || \"id\";\n const pkCol = relModel\n .getColumns()\n .find((c) => c.columnName === pkName);\n referencedCol = pkCol?.databaseName || pkName;\n }\n\n const candidateCols = new Set<string>(\n [sourceCol, (r.relation as any).columnName].filter(\n Boolean,\n ) as string[],\n );\n const existsStructurally = dbSchema.foreignKeys.some((fk) => {\n if (fk.columns.length !== 1 || fk.referencedColumns.length !== 1) {\n return false;\n }\n const colMatch = candidateCols.has(fk.columns[0]);\n const refTableMatch = fk.referencedTable === referencedTable;\n const refColMatch = fk.referencedColumns[0] === referencedCol;\n return colMatch && refTableMatch && refColMatch;\n });\n\n const expectedName =\n getColumnValue((r.relation as any).constraintName) ||\n getDefaultFkConstraintName(r.table, sourceCol, referencedTable);\n const dbFks = tableToDbFks.get(r.table) || new Set<string>();\n\n if (existsStructurally || (expectedName && dbFks.has(expectedName))) {\n return null;\n }\n\n if (\n r.relation.type === RelationEnum.manyToMany &&\n r.relation.manyToManyOptions\n ) {\n const through = getColumnValue(\n r.relation.manyToManyOptions.throughModel,\n );\n const leftKey = getColumnValue(\n r.relation.manyToManyOptions.leftForeignKey,\n );\n const rightKey = getColumnValue(\n r.relation.manyToManyOptions.rightForeignKey,\n );\n const leftMatch =\n r.table === through &&\n r.relation.columnName === leftKey &&\n r.relation.model().table === model?.table;\n const rightMatch =\n r.table === through &&\n r.relation.columnName === rightKey &&\n r.relation.model().table !== model?.table;\n\n const dbThrough = await this.sql.getTableSchema(through);\n const leftOk = dbThrough.foreignKeys.some(\n (fk) =>\n fk.columns.length === 1 &&\n fk.columns[0] === leftKey &&\n fk.referencedTable === (model?.table || \"\"),\n );\n const rightOk = dbThrough.foreignKeys.some(\n (fk) =>\n fk.columns.length === 1 &&\n fk.columns[0] === rightKey &&\n fk.referencedTable === r.relation.model().table,\n );\n if ((leftMatch && leftOk) || (rightMatch && rightOk)) {\n return null;\n }\n }\n\n return r;\n }),\n ).then((arr) => arr.filter(Boolean) as typeof this.data.relationsToAdd);\n\n this.data.relationsToDrop = await Promise.all(\n this.data.relationsToDrop.map(async (r) => {\n const model = this.models.find((m) => m.table === r.table);\n if (!model) {\n return r;\n }\n const rels = model.getRelations();\n const modelCols = model.getColumns();\n const matches = rels.some((rel: any) => {\n if (rel.type !== RelationEnum.belongsTo) {\n return false;\n }\n const mc = modelCols.find((c) => c.columnName === rel.foreignKey);\n const srcCol = mc?.databaseName || rel.foreignKey;\n const relModel = rel.model();\n const pkName = relModel.primaryKey || \"id\";\n const pkCol = relModel\n .getColumns()\n .find((c: any) => c.columnName === pkName);\n const refCol = pkCol?.databaseName || pkName;\n return (\n r.relation.columns.length === 1 &&\n r.relation.columns[0] === srcCol &&\n r.relation.referencedTable === relModel.table &&\n r.relation.referencedColumns.length === 1 &&\n r.relation.referencedColumns[0] === refCol\n );\n });\n return matches ? null : r;\n }),\n ).then((arr) => arr.filter(Boolean) as typeof this.data.relationsToDrop);\n }\n\n private clonePkAsColumn(pk: ColumnType, columnName: string): ColumnType {\n return {\n columnName,\n databaseName: columnName,\n isPrimary: false,\n type: pk.type,\n length: pk.length,\n precision: pk.precision,\n scale: pk.scale,\n withTimezone: pk.withTimezone,\n constraints: { nullable: false },\n } as ColumnType;\n }\n\n private pushM2mFkRelations(input: {\n throughTable: string;\n leftModel: typeof Model;\n rightModel: typeof Model;\n leftFkName: string;\n rightFkName: string;\n onDelete?: string;\n onUpdate?: string;\n constraintName?: string | (() => string);\n }): void {\n const leftRelation = this.buildBelongsToRelation(\n input.throughTable,\n () => input.leftModel,\n input.leftFkName,\n input.leftModel.primaryKey || \"id\",\n input.constraintName,\n input.onDelete,\n input.onUpdate,\n );\n const rightRelation = this.buildBelongsToRelation(\n input.throughTable,\n () => input.rightModel,\n input.rightFkName,\n input.rightModel.primaryKey || \"id\",\n input.constraintName,\n input.onDelete,\n input.onUpdate,\n );\n this.data.relationsToAdd.push(leftRelation as RelationsToAdd);\n this.data.relationsToAdd.push(rightRelation as RelationsToAdd);\n }\n\n private buildBelongsToRelation(\n table: string,\n relatedModel: () => typeof Model,\n sourceColumnName: string,\n relatedPkName: string,\n constraintName?: string | (() => string),\n onDelete?: string,\n onUpdate?: string,\n ) {\n const constraint = constraintName\n ? getColumnValue(constraintName)\n : getDefaultFkConstraintName(\n table,\n sourceColumnName,\n relatedModel().table,\n );\n return {\n table,\n relation: {\n type: RelationEnum.belongsTo,\n model: relatedModel,\n columnName: sourceColumnName,\n foreignKey: sourceColumnName,\n constraintName: constraint,\n onDelete: onDelete,\n onUpdate: onUpdate,\n },\n onDelete,\n onUpdate,\n } as const;\n }\n}\n","import { QueryNode } from \"../../query\";\nimport { FromNode } from \"../from\";\n\nexport class DeleteNode extends QueryNode {\n fromNode: FromNode;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"delete\";\n file = \"delete\";\n\n constructor(fromNode: FromNode, isRawValue: boolean = false) {\n super(\"delete from\", isRawValue);\n this.fromNode = fromNode;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class FromNode extends QueryNode {\n table: string | QueryNode | QueryNode[];\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"from\";\n file = \"from\";\n alias?: string;\n\n constructor(table: string | QueryNode | QueryNode[], alias?: string) {\n super(\"from\");\n this.table = table;\n this.alias = alias;\n }\n}\n","import { QueryNode } from \"../../query\";\nimport { FromNode } from \"../from\";\n\nexport class InsertNode extends QueryNode {\n fromNode: FromNode;\n records: Record<string, any>[];\n returning?: string[];\n disableReturning: boolean;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"insert\";\n file = \"insert\";\n\n constructor(\n fromNode: FromNode,\n records: Record<string, any>[] = [],\n returning?: string[],\n disableReturning: boolean = false,\n isRawValue: boolean = false,\n ) {\n super(\"insert into\", isRawValue);\n this.fromNode = fromNode;\n this.records = records;\n this.returning = returning;\n this.disableReturning = disableReturning;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class OnDuplicateNode extends QueryNode {\n table: string;\n conflictColumns: string[];\n columnsToUpdate: string[];\n returning?: string[];\n mode: \"update\" | \"ignore\";\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"on_duplicate\";\n file = \"on_duplicate\";\n\n constructor(\n table: string,\n conflictColumns: string[],\n columnsToUpdate: string[],\n mode: \"update\" | \"ignore\" = \"update\",\n returning?: string[],\n isRawValue: boolean = false,\n ) {\n super(\"on duplicate\", isRawValue);\n this.table = table;\n this.conflictColumns = conflictColumns;\n this.columnsToUpdate = columnsToUpdate;\n this.mode = mode;\n this.returning = returning;\n }\n}\n","import { QueryNode } from \"../../query\";\nimport { RawNode } from \"../raw/raw_node\";\nimport { FromNode } from \"../from\";\n\nexport class UpdateNode extends QueryNode {\n fromNode: FromNode;\n columns: string[];\n values: (any | RawNode)[];\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"update\";\n file = \"update\";\n\n constructor(\n fromNode: FromNode,\n columns: string[] = [],\n values: (any | RawNode)[] = [],\n isRawValue: boolean = false,\n ) {\n super(\"update\", isRawValue);\n this.fromNode = fromNode;\n this.columns = columns;\n this.values = values;\n }\n}\n","import { QueryNode } from \"../../query\";\nimport { RawNode } from \"../raw/raw_node\";\n\nexport type BaseValues = string | number | boolean | undefined | null | RawNode;\n\nexport type BinaryOperatorType =\n | \"=\"\n | \"!=\"\n | \"<>\"\n | \">\"\n | \"<\"\n | \">=\"\n | \"<=\"\n | \"is\"\n | \"is not\"\n | \"like\"\n | \"not like\"\n | \"is null\"\n | \"is not null\"\n | \"ilike\"\n | \"in\"\n | \"not in\"\n | \"between\"\n | \"not between\"\n | \"regexp\"\n | \"not regexp\"\n | \"not ilike\";\n\nexport class WhereNode extends QueryNode {\n column: string;\n isNegated: boolean;\n operator: BinaryOperatorType;\n value: BaseValues | BaseValues[];\n chainsWith: \"and\" | \"or\" = \"and\";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"where\";\n file = \"where\";\n\n constructor(\n column: string,\n chainsWith: \"and\" | \"or\",\n isNegated: boolean = false,\n operator: BinaryOperatorType,\n value: BaseValues | BaseValues[],\n isRawValue: boolean = false,\n ) {\n super(\"where\", isRawValue);\n this.column = column;\n this.chainsWith = ` ${chainsWith}` as \"and\" | \"or\";\n this.isNegated = isNegated;\n this.operator = operator;\n this.value = value;\n }\n}\n","import { QueryNode } from \"../../query\";\nimport type { WhereNode } from \"./where\";\nimport type { WhereSubqueryNode } from \"./where_subquery\";\n\nexport type WhereNodeType =\n | \"where\"\n | \"raw_where\"\n | \"where_group\"\n | \"where_subquery\";\n\nexport class WhereGroupNode extends QueryNode {\n nodes: (WhereNode | WhereGroupNode | WhereSubqueryNode)[];\n chainsWith: \"and\" | \"or\";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"where\";\n file = \"where_group\";\n\n constructor(\n nodes: (WhereNode | WhereGroupNode | WhereSubqueryNode)[],\n chainsWith: \"and\" | \"or\" = \"and\",\n ) {\n super(\"where\");\n this.nodes = nodes;\n this.chainsWith = ` ${chainsWith}` as \"and\" | \"or\";\n }\n}\n","import { WhereNode } from \"./where\";\n\nexport type JsonOperatorType =\n | \"=\" // Basic equality\n | \"!=\" // Not equal\n | \"contains\" // JSON contains\n | \"not contains\" // JSON doesn't contain\n | \"raw\"; // Raw JSON expression\n\nexport class WhereJsonNode extends WhereNode {\n value: any[];\n jsonOperator: JsonOperatorType;\n file = \"where_json\";\n\n constructor(\n column: string,\n chainsWith: \"and\" | \"or\",\n isNegated: boolean = false,\n operator: JsonOperatorType,\n value: any[],\n isRawValue: boolean = false,\n ) {\n // Use the basic operator from WhereNode, but we'll override it in interpreters\n super(column, chainsWith, isNegated, \"=\", value as any, isRawValue);\n this.jsonOperator = operator;\n this.value = value;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport type SubqueryOperatorType =\n | \"in\"\n | \"not in\"\n | \"exists\"\n | \"not exists\"\n | \"between\"\n | \"not between\"\n | \">\"\n | \"<\"\n | \">=\"\n | \"<=\";\n\nexport class WhereSubqueryNode extends QueryNode {\n column: string;\n operator: SubqueryOperatorType;\n subquery: string | QueryNode | QueryNode[];\n chainsWith: \"and\" | \"or\";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"where\";\n file = \"where_subquery\";\n\n constructor(\n column: string,\n operator: SubqueryOperatorType,\n subquery: string | QueryNode | QueryNode[],\n chainsWith: \"and\" | \"or\" = \"and\",\n ) {\n super(\"where\");\n this.column = column;\n this.operator = operator;\n this.subquery = subquery;\n this.chainsWith = ` ${chainsWith}` as \"and\" | \"or\";\n }\n}\n","import { PassThrough } from \"node:stream\";\nimport { DriverNotFoundError } from \"../../drivers/driver_constants\";\nimport { HysteriaError } from \"../../errors/hysteria_error\";\nimport { log, logMessage } from \"../../utils/logger\";\nimport { Model } from \"../models/model\";\nimport { AnnotatedModel } from \"../models/model_query_builder/model_query_builder_types\";\nimport { StreamOptions } from \"../query_builder/query_builder_types\";\nimport { SqlDataSource } from \"../sql_data_source\";\nimport {\n ConnectionPolicies,\n GetConnectionReturnType,\n MssqlPoolInstance,\n MysqlConnectionInstance,\n PgPoolClientInstance,\n SqlDataSourceType,\n} from \"../sql_data_source_types\";\nimport {\n Returning,\n SqlLiteOptions,\n SqlRunnerReturnType,\n} from \"./sql_runner_types\";\nimport { promisifySqliteQuery, SQLiteStream } from \"./sql_runner_utils\";\nimport {\n convertDateStringToDateForOracle,\n processOracleRow,\n} from \"../../utils/oracle_utils\";\n\nexport const execSql = async <\n S extends SqlDataSource,\n M extends Model,\n T extends Returning,\n D extends SqlDataSourceType = ReturnType<S[\"getDbType\"]>,\n>(\n query: string,\n params: any[],\n sqlDataSource: S,\n sqlType: D,\n returning: T = \"rows\" as T,\n options?: {\n sqlLiteOptions?: SqlLiteOptions<M>;\n shouldNotLog?: boolean;\n },\n): Promise<SqlRunnerReturnType<T, D>> => {\n if (!options?.shouldNotLog) {\n log(query, sqlDataSource.logs, params);\n }\n\n switch (sqlType) {\n case \"mysql\":\n case \"mariadb\":\n const mysqlDriver =\n (sqlDataSource.sqlConnection as GetConnectionReturnType<\"mysql\">) ??\n sqlDataSource.getPool();\n\n const mysqlResult = await withRetry(\n () => mysqlDriver.query(query, params),\n sqlDataSource.inputDetails.connectionPolicies?.retry,\n sqlDataSource.logs,\n );\n\n if (returning === \"affectedRows\") {\n return (mysqlResult[0] as { affectedRows: number })\n .affectedRows as SqlRunnerReturnType<T, D>;\n }\n\n if (returning === \"raw\") {\n return mysqlResult as SqlRunnerReturnType<T, D>;\n }\n\n return mysqlResult[0] as SqlRunnerReturnType<T, D>;\n case \"postgres\":\n case \"cockroachdb\":\n const pgDriver =\n (sqlDataSource.sqlConnection as GetConnectionReturnType<\"postgres\">) ??\n sqlDataSource.getPool();\n\n const pgResult = await withRetry(\n () => pgDriver.query(query, params),\n sqlDataSource.inputDetails.connectionPolicies?.retry,\n sqlDataSource.logs,\n );\n\n if (returning === \"rows\") {\n return pgResult.rows as SqlRunnerReturnType<T, D>;\n }\n\n if (returning === \"raw\") {\n return pgResult as SqlRunnerReturnType<T, D>;\n }\n\n return pgResult.rowCount as number as SqlRunnerReturnType<T, D>;\n case \"sqlite\":\n const sqliteResult = await withRetry(\n () =>\n promisifySqliteQuery<M>(query, params, sqlDataSource, {\n typeofModel: options?.sqlLiteOptions?.typeofModel,\n mode: options?.sqlLiteOptions?.mode || \"fetch\",\n models: options?.sqlLiteOptions?.models,\n }),\n sqlDataSource.inputDetails.connectionPolicies?.retry,\n sqlDataSource.logs,\n );\n\n if (returning === \"raw\") {\n return !Array.isArray(sqliteResult)\n ? ([sqliteResult] as SqlRunnerReturnType<T, D>)\n : (sqliteResult as SqlRunnerReturnType<T, D>);\n }\n\n return sqliteResult as SqlRunnerReturnType<T, D>;\n case \"mssql\":\n const mssqlPool = sqlDataSource.getPool() as MssqlPoolInstance;\n const mssqlRequest = sqlDataSource.sqlConnection\n ? (\n sqlDataSource.sqlConnection as GetConnectionReturnType<\"mssql\">\n ).request()\n : mssqlPool.request();\n\n params.forEach((param, index) => {\n mssqlRequest.input(`p${index}`, param);\n });\n\n let mssqlParamIdx = 0;\n const mssqlQuery = query.replace(\n /\\?|@(\\d+)/g,\n () => `@p${mssqlParamIdx++}`,\n );\n\n const mssqlResult = await withRetry(\n () => mssqlRequest.query(mssqlQuery),\n sqlDataSource.inputDetails.connectionPolicies?.retry,\n sqlDataSource.logs,\n );\n\n if (returning === \"affectedRows\") {\n return mssqlResult.rowsAffected[0] as SqlRunnerReturnType<T, D>;\n }\n\n if (returning === \"raw\") {\n return mssqlResult as SqlRunnerReturnType<T, D>;\n }\n\n return mssqlResult.recordset as SqlRunnerReturnType<T, D>;\n case \"oracledb\":\n const ORACLE_OUT_FORMAT_OBJECT = 4002 as const;\n\n let oracledbConnection: GetConnectionReturnType<\"oracledb\"> | null = null;\n const isInTransaction = !!sqlDataSource.sqlConnection;\n try {\n oracledbConnection = sqlDataSource.sqlConnection\n ? (sqlDataSource.sqlConnection as GetConnectionReturnType<\"oracledb\">)\n : ((await sqlDataSource.getConnection()) as GetConnectionReturnType<\"oracledb\">);\n\n const oracleParams = params.map(convertDateStringToDateForOracle);\n\n const oracledbResult = await withRetry(\n () =>\n (oracledbConnection as GetConnectionReturnType<\"oracledb\">).execute(\n query,\n oracleParams,\n {\n outFormat: ORACLE_OUT_FORMAT_OBJECT,\n autoCommit: !isInTransaction,\n },\n ),\n sqlDataSource.inputDetails.connectionPolicies?.retry,\n sqlDataSource.logs,\n );\n\n if (returning === \"affectedRows\") {\n return oracledbResult.rowsAffected as SqlRunnerReturnType<T, D>;\n }\n\n if (returning === \"raw\") {\n return oracledbResult as SqlRunnerReturnType<T, D>;\n }\n\n // Oracle returns column names in UPPERCASE - normalize to lowercase\n // Also convert any Lob objects (CLOB/BLOB) to strings/buffers\n const normalizedRows = await Promise.all(\n (oracledbResult.rows as any[])?.map(async (row) => {\n const processedRow = await processOracleRow(row);\n const normalizedRow: Record<string, any> = {};\n for (const key in processedRow) {\n normalizedRow[key.toLowerCase()] = processedRow[key];\n }\n return normalizedRow;\n }) ?? [],\n );\n\n return normalizedRows as SqlRunnerReturnType<T, D>;\n } finally {\n if (oracledbConnection && !isInTransaction) {\n await oracledbConnection.close();\n }\n }\n default:\n throw new HysteriaError(\n \"ExecSql\",\n `UNSUPPORTED_DATABASE_TYPE_${sqlType}`,\n );\n }\n};\n\nexport const execSqlStreaming = async <\n M extends Model,\n T extends \"generator\" | \"stream\" = \"generator\",\n A extends Record<string, any> = {},\n R extends Record<string, any> = {},\n>(\n query: string,\n params: any[],\n sqlDataSource: SqlDataSource,\n options: StreamOptions = {},\n events: {\n onData?: (\n passThrough: PassThrough & AsyncGenerator<AnnotatedModel<M, A, R>>,\n row: any,\n ) => void | Promise<void>;\n },\n): Promise<PassThrough & AsyncGenerator<AnnotatedModel<M, A, R>>> => {\n const sqlType = sqlDataSource.type as SqlDataSourceType;\n\n switch (sqlType) {\n case \"mariadb\":\n case \"mysql\": {\n const pool = sqlDataSource.getPool() as MysqlConnectionInstance;\n const conn =\n (sqlDataSource.sqlConnection as GetConnectionReturnType<\"mysql\">) ??\n (await pool.getConnection());\n const passThrough = new PassThrough({\n objectMode: options.objectMode ?? true,\n highWaterMark: options.highWaterMark,\n }) as PassThrough & AsyncGenerator<AnnotatedModel<M, A, R>>;\n\n const rawConn = conn.connection as any;\n const mysqlStream = rawConn.query(query, params).stream({\n highWaterMark: options.highWaterMark,\n objectMode: options.objectMode ?? true,\n });\n\n let pending = 0;\n let ended = false;\n let hasError = false;\n\n const tryRelease = () => {\n try {\n conn.release();\n } catch {}\n };\n\n mysqlStream.on(\"data\", (row: any) => {\n if (events.onData) {\n pending++;\n Promise.resolve(events.onData(passThrough, row))\n .then(() => {\n pending--;\n if (ended && pending === 0 && !hasError) {\n tryRelease();\n passThrough.end();\n }\n })\n .catch((err: any) => {\n hasError = true;\n tryRelease();\n passThrough.destroy(err);\n });\n return;\n }\n\n passThrough.write(row);\n });\n\n mysqlStream.on(\"end\", () => {\n ended = true;\n if (pending === 0 && !hasError) {\n tryRelease();\n passThrough.end();\n }\n });\n\n mysqlStream.on(\"error\", (err: any) => {\n hasError = true;\n tryRelease();\n passThrough.destroy(err);\n });\n\n passThrough.on(\"close\", () => {\n tryRelease();\n });\n\n return passThrough;\n }\n\n case \"cockroachdb\":\n case \"postgres\": {\n const pgPool = sqlDataSource.getPool() as PgPoolClientInstance;\n const pgDriver =\n (sqlDataSource.sqlConnection as GetConnectionReturnType<\"postgres\">) ??\n (await pgPool.connect());\n\n const pgQueryStreamDriver = await import(\"pg-query-stream\").catch(() => {\n throw new DriverNotFoundError(\"pg-query-stream\");\n });\n\n const passThrough = new PassThrough({\n objectMode: options.objectMode || true,\n highWaterMark: options.highWaterMark,\n }) as PassThrough & AsyncGenerator<AnnotatedModel<M, A, R>>;\n\n const streamQuery = new pgQueryStreamDriver.default(query, params, {\n highWaterMark: options.highWaterMark,\n rowMode: options.rowMode,\n batchSize: options.batchSize,\n types: options.types,\n });\n\n const pgStream = pgDriver.query(streamQuery);\n\n let pending = 0;\n let ended = false;\n let hasError = false;\n\n const tryRelease = (err?: any) => {\n try {\n pgDriver.release(err);\n } catch {}\n };\n\n pgStream.on(\"data\", (row: any) => {\n if (events.onData) {\n pending++;\n Promise.resolve(events.onData(passThrough, row))\n .then(() => {\n pending--;\n if (ended && pending === 0 && !hasError) {\n tryRelease();\n passThrough.end();\n }\n })\n .catch((err: any) => {\n hasError = true;\n tryRelease(err);\n passThrough.destroy(err);\n });\n return;\n }\n\n passThrough.write(row);\n });\n\n pgStream.on(\"end\", () => {\n ended = true;\n if (pending === 0 && !hasError) {\n tryRelease();\n passThrough.end();\n }\n });\n\n pgStream.on(\"error\", (err: any) => {\n hasError = true;\n tryRelease(err);\n passThrough.destroy(err);\n });\n\n return passThrough;\n }\n\n case \"sqlite\": {\n const sqliteDriver =\n (sqlDataSource.sqlConnection as GetConnectionReturnType<\"sqlite\">) ??\n sqlDataSource.getPool();\n const stream = new SQLiteStream(sqliteDriver, query, params, {\n onData: events.onData as (\n _passThrough: any,\n row: any,\n ) => void | Promise<void>,\n });\n\n return stream as unknown as PassThrough &\n AsyncGenerator<AnnotatedModel<M, A, R>>;\n }\n\n case \"mssql\": {\n const mssqlDriver =\n (sqlDataSource.sqlConnection as GetConnectionReturnType<\"mssql\">) ??\n sqlDataSource.getPool();\n const passThrough = new PassThrough({\n objectMode: options.objectMode ?? true,\n highWaterMark: options.highWaterMark,\n }) as PassThrough & AsyncGenerator<AnnotatedModel<M, A, R>>;\n\n const mssqlRequest = mssqlDriver.request();\n mssqlRequest.stream = true;\n\n params.forEach((param, index) => {\n mssqlRequest.input(`p${index}`, param);\n });\n\n let mssqlParamIdx = 0;\n const mssqlQuery = query.replace(\n /\\?|@(\\d+)/g,\n () => `@p${mssqlParamIdx++}`,\n );\n\n let pending = 0;\n let ended = false;\n let hasError = false;\n\n mssqlRequest.on(\"row\", (row: any) => {\n if (hasError) return;\n\n if (events.onData) {\n pending++;\n Promise.resolve(events.onData(passThrough, row))\n .then(() => {\n pending--;\n if (ended && pending === 0 && !hasError) {\n passThrough.end();\n }\n })\n .catch((err: any) => {\n hasError = true;\n passThrough.destroy(err);\n });\n return;\n }\n\n passThrough.write(row);\n });\n\n mssqlRequest.on(\"error\", (err: any) => {\n hasError = true;\n passThrough.destroy(err);\n });\n\n mssqlRequest.on(\"done\", () => {\n ended = true;\n if (pending === 0 && !hasError) {\n passThrough.end();\n }\n });\n\n mssqlRequest.query(mssqlQuery);\n\n return passThrough;\n }\n\n case \"oracledb\": {\n // OracleDB supports result set streaming via queryStream\n const oraclePool = sqlDataSource.getPool();\n const oracleConnection =\n (sqlDataSource.sqlConnection as GetConnectionReturnType<\"oracledb\">) ??\n (await (oraclePool as any).getConnection());\n\n const passThrough = new PassThrough({\n objectMode: options.objectMode ?? true,\n highWaterMark: options.highWaterMark,\n }) as PassThrough & AsyncGenerator<AnnotatedModel<M, A, R>>;\n\n const ORACLE_STREAM_OUT_FORMAT_OBJECT = 4002 as const;\n\n const oracleStreamParams = params.map(convertDateStringToDateForOracle);\n const oracleStream = oracleConnection.queryStream(\n query,\n oracleStreamParams,\n {\n outFormat: ORACLE_STREAM_OUT_FORMAT_OBJECT,\n },\n );\n\n let pending = 0;\n let ended = false;\n let hasError = false;\n\n const tryRelease = async () => {\n try {\n await oracleConnection.close();\n } catch {}\n };\n\n oracleStream.on(\"data\", (row: any) => {\n if (hasError) return;\n\n // Oracle returns column names in UPPERCASE - normalize to lowercase\n const normalizedRow: Record<string, any> = {};\n for (const key in row) {\n normalizedRow[key.toLowerCase()] = row[key];\n }\n\n if (events.onData) {\n pending++;\n Promise.resolve(events.onData(passThrough, normalizedRow))\n .then(() => {\n pending--;\n if (ended && pending === 0 && !hasError) {\n tryRelease();\n passThrough.end();\n }\n })\n .catch((err: any) => {\n hasError = true;\n tryRelease();\n passThrough.destroy(err);\n });\n return;\n }\n\n passThrough.write(normalizedRow);\n });\n\n oracleStream.on(\"end\", () => {\n ended = true;\n if (pending === 0 && !hasError) {\n tryRelease();\n passThrough.end();\n }\n });\n\n oracleStream.on(\"error\", (err: any) => {\n hasError = true;\n tryRelease();\n passThrough.destroy(err);\n });\n\n return passThrough;\n }\n\n default:\n throw new HysteriaError(\n \"ExecSqlStreaming\",\n `UNSUPPORTED_DATABASE_TYPE_${sqlType}`,\n );\n }\n};\n\nasync function withRetry<T>(\n fn: () => Promise<T>,\n retryConfig: ConnectionPolicies[\"retry\"] = { maxRetries: 0, delay: 0 },\n logs: boolean = false,\n): Promise<T> {\n let retries = 0;\n const maxRetries = retryConfig.maxRetries || 0;\n const delay = retryConfig.delay || 0;\n\n async function attempt(): Promise<T> {\n try {\n return fn();\n } catch (err: any) {\n if (\n !Object.prototype.hasOwnProperty.call(err, \"code\") ||\n err.code !== \"ECONNREFUSED\"\n ) {\n throw err;\n }\n\n if (retries < maxRetries) {\n retries++;\n logMessage(\n `Retrying sql in ${delay}ms (attempt ${retries}/${maxRetries})`,\n \"info\",\n logs,\n );\n\n await new Promise((resolve) => setTimeout(resolve, delay));\n return attempt();\n }\n\n throw err;\n }\n }\n\n return attempt();\n}\n","import { PassThrough, Readable } from \"node:stream\";\nimport { HysteriaError } from \"../../errors/hysteria_error\";\nimport { AstParser } from \"../ast/parser\";\nimport { FromNode } from \"../ast/query/node/from\";\nimport { InsertNode } from \"../ast/query/node/insert\";\nimport { InterpreterUtils } from \"../interpreter/interpreter_utils\";\nimport { Model } from \"../models/model\";\nimport { AnnotatedModel } from \"../models/model_query_builder/model_query_builder_types\";\nimport { SqlDataSource } from \"../sql_data_source\";\nimport { SqliteConnectionInstance } from \"../sql_data_source_types\";\nimport { SqlLiteOptions } from \"./sql_runner_types\";\n\nexport class SQLiteStream extends Readable {\n private db: SqliteConnectionInstance;\n private query: string;\n private params: any[];\n private started: boolean;\n private events: {\n onData?: (\n _passThrough: PassThrough & AsyncGenerator<AnnotatedModel<Model, {}, {}>>,\n row: any,\n ) => void | Promise<void>;\n };\n\n constructor(\n db: SqliteConnectionInstance,\n query: string,\n params: any[] = [],\n events: {\n onData?: (\n _passThrough: PassThrough &\n AsyncGenerator<AnnotatedModel<Model, {}, {}>>,\n row: any,\n ) => void | Promise<void>;\n },\n ) {\n super({ objectMode: true });\n this.db = db;\n this.query = query;\n this.params = params;\n this.started = false;\n this.events = events;\n }\n\n _read(): void {\n if (this.started) {\n return;\n }\n\n this.started = true;\n this.readRows();\n }\n\n private readRows(): void {\n let pending = 0;\n let ended = false;\n let hasError = false;\n\n this.db.each(\n this.query,\n this.params,\n (err: any, row: any) => {\n if (err) {\n hasError = true;\n this.emit(\"error\", err);\n return;\n }\n\n pending++;\n\n let wroteFlag = false;\n let wroteValue: any;\n\n const mockPassThrough = {\n write: (v: any) => {\n wroteFlag = true;\n wroteValue = v;\n },\n } as PassThrough & AsyncGenerator<AnnotatedModel<Model, {}, {}>>;\n\n Promise.resolve(this.events.onData?.(mockPassThrough, row))\n .then(() => {\n if (hasError) {\n return;\n }\n\n if (wroteFlag) {\n this.push(wroteValue);\n return;\n }\n\n this.push(row);\n })\n .catch((err: any) => {\n hasError = true;\n this.emit(\"error\", err);\n })\n .finally(() => {\n pending--;\n if (ended && pending === 0 && !hasError) {\n this.push(null);\n }\n });\n },\n (err: any) => {\n if (err) {\n hasError = true;\n this.emit(\"error\", err);\n return;\n }\n\n ended = true;\n if (pending === 0 && !hasError) {\n this.push(null);\n }\n },\n );\n }\n}\n\nexport const promisifySqliteQuery = <T extends Model>(\n query: string,\n params: any,\n sqlDataSource: SqlDataSource,\n options: SqlLiteOptions<T>,\n): Promise<number | T | T[]> => {\n const isTransactional = [\n \"begin\",\n \"begin transaction\",\n \"commit\",\n \"rollback\",\n ].includes(query.trim().toLowerCase());\n\n const sqliteDriver =\n options.customConnection ??\n (sqlDataSource.getPool() as SqliteConnectionInstance);\n\n if (isTransactional) {\n return new Promise<number>((resolve, reject) => {\n sqliteDriver.run(query, params, function (this: any, err) {\n if (err) {\n reject(err);\n }\n resolve(this.changes);\n });\n });\n }\n\n if (options.mode === \"fetch\") {\n return new Promise<T[]>((resolve, reject) => {\n sqliteDriver.all(query, params, (err, rows) => {\n if (err) {\n reject(err);\n }\n\n if (!rows || !rows.length) {\n resolve([] as T[]);\n }\n\n resolve(rows as T[]);\n });\n });\n }\n\n const typeofModel = options?.typeofModel;\n if (!typeofModel) {\n return new Promise<number>((resolve, reject) => {\n sqliteDriver.run(query, params, function (this: any, err) {\n if (err) {\n reject(new Error(err.message));\n } else {\n resolve(this.changes as number);\n }\n });\n });\n }\n\n const primaryKeyName = typeofModel.primaryKey as string;\n const table = typeofModel.table;\n if (options.mode === \"insertOne\" || options.mode === \"insertMany\") {\n if (options.mode === \"insertOne\") {\n return new Promise<T[]>((resolve, reject) => {\n sqliteDriver.run(query, params, function (this: any, err: any) {\n if (err) {\n return reject(err);\n }\n\n const inputModel =\n options.models &&\n Array.isArray(options.models) &&\n options.models.length\n ? options.models[0]\n : null;\n\n if (!primaryKeyName) {\n resolve([inputModel] as T[]);\n return;\n }\n\n const lastID = inputModel?.[primaryKeyName as keyof T] || this.lastID;\n\n if (!lastID) {\n return reject(\n new HysteriaError(\n \"SqlRunnerUtils::promisifySqliteQuery\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n ),\n );\n }\n\n const selectQuery = `SELECT * FROM ${table} WHERE ${primaryKeyName} = ?`;\n sqliteDriver.get(selectQuery, [lastID], (err: any, row: T) => {\n if (err) {\n return reject(err);\n }\n\n resolve([row] as T[]);\n });\n });\n });\n }\n\n if (!Array.isArray(options.models)) {\n throw new HysteriaError(\n \"SqlRunnerUtils::massiveInsert models should be an array, report to the maintainers.\",\n \"DEVELOPMENT_ERROR\",\n );\n }\n\n const models = options.models as T[];\n\n if (!primaryKeyName) {\n return new Promise<T[]>((resolve, reject) => {\n sqliteDriver.run(query, params, function (err: any) {\n if (err) {\n return reject(err);\n }\n resolve(models as T[]);\n });\n });\n }\n\n let finalResult: T[] = [];\n return new Promise<T[]>(async (resolve, reject) => {\n try {\n const insertPromises = models.map(async (model) => {\n const interpreterUtils = new InterpreterUtils(typeofModel);\n\n const { columns: preparedColumns, values: preparedValues } =\n await interpreterUtils.prepareColumns(\n Object.keys(model),\n Object.values(model),\n \"insert\",\n );\n\n const preparedModel = Object.fromEntries(\n preparedColumns.map((column, index) => [\n column,\n preparedValues[index],\n ]),\n );\n\n const astParser = new AstParser(\n typeofModel,\n sqlDataSource.getDbType(),\n );\n\n const { sql: query, bindings: params } = astParser.parse([\n new InsertNode(new FromNode(typeofModel.table), [preparedModel]),\n ]);\n\n return new Promise<T>((resolve, reject) => {\n sqliteDriver.run(query, params, function (err: any) {\n if (err) {\n return reject(err);\n }\n\n const lastID = model[primaryKeyName as keyof T] || this.lastID;\n\n if (!lastID) {\n return reject(\n new HysteriaError(\n \"SqlRunnerUtils::promisifySqliteQuery\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n ),\n );\n }\n\n const selectQuery = `SELECT * FROM ${table} WHERE ${primaryKeyName} = ?`;\n sqliteDriver.get(selectQuery, [lastID], (err: any, row: T) => {\n if (err) {\n return reject(err);\n }\n\n resolve(row as T);\n });\n });\n });\n });\n\n finalResult = await Promise.all(insertPromises);\n resolve(finalResult);\n } catch (err) {\n reject(err);\n }\n });\n }\n\n return new Promise<number>((resolve, reject) => {\n (sqliteDriver as SqliteConnectionInstance).run(\n query,\n params,\n function (this: { changes: number }, err: Error | null) {\n if (err) {\n reject(new Error(err.message));\n } else {\n resolve(this.changes as number);\n }\n },\n );\n });\n};\n","const DATETIME_REGEX = /^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$/;\nconst DATE_ONLY_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nexport const convertDateStringToDateForOracle = (value: any): any => {\n if (typeof value !== \"string\") {\n return value;\n }\n\n if (DATETIME_REGEX.test(value)) {\n return new Date(value.replace(\" \", \"T\") + \"Z\");\n }\n\n if (DATE_ONLY_REGEX.test(value)) {\n return new Date(value + \"T00:00:00Z\");\n }\n\n return value;\n};\n\n/**\n * Converts Oracle Lob objects to strings/buffers\n * Oracle returns CLOB/BLOB as Lob stream objects that need to be read\n * CLOB type = 2017, BLOB type = 2019\n */\nconst convertOracleLobToValue = async (lob: any): Promise<string | Buffer> => {\n return new Promise((resolve, reject) => {\n const isClob = lob.type === 2017;\n if (isClob) {\n let data = \"\";\n lob.setEncoding(\"utf8\");\n lob.on(\"data\", (chunk: string) => {\n data += chunk;\n });\n lob.on(\"end\", () => resolve(data));\n lob.on(\"error\", reject);\n } else {\n const chunks: Buffer[] = [];\n lob.on(\"data\", (chunk: Buffer) => {\n chunks.push(chunk);\n });\n lob.on(\"end\", () => resolve(Buffer.concat(chunks)));\n lob.on(\"error\", reject);\n }\n });\n};\n\n/**\n * Process Oracle row to convert any Lob objects to their string/buffer values\n */\nexport const processOracleRow = async (\n row: Record<string, any>,\n): Promise<Record<string, any>> => {\n const processedRow: Record<string, any> = {};\n for (const key in row) {\n const value = row[key];\n if (\n value &&\n typeof value === \"object\" &&\n value.constructor?.name === \"Lob\"\n ) {\n processedRow[key] = await convertOracleLobToValue(value);\n } else {\n processedRow[key] = value;\n }\n }\n return processedRow;\n};\n","type WithPerformanceResult<R = any> = [string, R];\n\n/**\n * @description executes the async function with a timer to check how long it took\n * @param `returnType` of the performance in milliseconds or seconds\n * @param `fix` Number of digits in the decimal part of the performance result\n * @returns An array with the millis or seconds that the function took as first element, and the result of the async function as second element\n */\nexport const withPerformance =\n <A extends any[], R>(\n fn: (...args: A) => Promise<R>,\n returnType: \"millis\" | \"seconds\" = \"millis\",\n fix = 3,\n ) =>\n async (...args: A): Promise<WithPerformanceResult<R>> => {\n const start = performance.now();\n const res = await fn(...args);\n const elapsed = performance.now() - start;\n\n const value = returnType === \"millis\" ? elapsed : elapsed / 1000;\n return [value.toFixed(fix), res];\n };\n","import { QueryNode } from \"../../query\";\n\nexport class SelectNode extends QueryNode {\n column: string | QueryNode | QueryNode[];\n alias?: string;\n sqlFunction?: string;\n chainsWith = \", \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"select\";\n file = \"select\";\n\n constructor(\n column: string | QueryNode | QueryNode[],\n alias?: string,\n sqlFunction?: string,\n isRaw?: boolean,\n ) {\n super(\"select\");\n this.column = column;\n this.alias = alias;\n this.sqlFunction = sqlFunction;\n this.isRawValue = isRaw ?? false;\n }\n}\n","import { HysteriaError } from \"../../../errors/hysteria_error\";\nimport { SqlDataSource } from \"../../sql_data_source\";\nimport { SqlDataSourceType } from \"../../sql_data_source_types\";\nimport { getRelations } from \"../decorators/model_decorators\";\nimport { Model } from \"../model\";\nimport { Relation } from \"../relations/relation\";\nimport { ModelRelation } from \"./model_manager_types\";\n\nexport default class SqlModelManagerUtils<T extends Model> {\n protected dbType: SqlDataSourceType;\n protected sqlDataSource: SqlDataSource;\n protected modelRelations: Relation[];\n protected modelRelationsMap: Map<string, Relation>;\n\n constructor(\n typeofModel: typeof Model,\n dbType: SqlDataSourceType,\n sqlDataSource: SqlDataSource,\n ) {\n this.dbType = dbType;\n this.sqlDataSource = sqlDataSource;\n this.modelRelations = getRelations(typeofModel);\n this.modelRelationsMap = new Map(\n this.modelRelations.map((relation) => [relation.columnName, relation]),\n );\n }\n\n getRelationFromModel(relation: ModelRelation<T>): Relation {\n const modelRelation = this.modelRelationsMap.get(relation.toString());\n if (!modelRelation) {\n throw new HysteriaError(\n \"SqlModelManagerUtils::getRelationFromModel\",\n `RELATION_NOT_FOUND_IN_MODEL_${relation.toString()}`,\n );\n }\n\n return modelRelation;\n }\n}\n","import { Model } from \"./models/model\";\nimport { AnnotatedModel } from \"./models/model_query_builder/model_query_builder_types\";\n\nexport type PaginationMetadata = {\n perPage: number;\n currentPage: number;\n firstPage: number;\n isEmpty: boolean;\n total: number;\n lastPage: number;\n hasMorePages: boolean;\n hasPages: boolean;\n};\n\nexport type CursorPaginationMetadata = {\n perPage: number;\n firstPage: number;\n isEmpty: boolean;\n total: number;\n};\n\nexport type PaginatedData<\n T extends Model,\n A extends object = {},\n R extends object = {},\n> = {\n paginationMetadata: PaginationMetadata;\n data: AnnotatedModel<T, A, R>[];\n};\n\nexport type CursorPaginatedData<\n T extends Model,\n A extends object = {},\n R extends object = {},\n> = {\n paginationMetadata: CursorPaginationMetadata;\n data: AnnotatedModel<T, A, R>[];\n};\n\nexport function getPaginationMetadata(\n page: number,\n limit: number,\n total: number,\n): PaginationMetadata {\n return {\n total: total,\n perPage: limit,\n currentPage: page,\n firstPage: 1,\n isEmpty: total === 0,\n lastPage: Math.max(1, Math.ceil(total / limit)),\n hasMorePages: page < Math.max(1, Math.ceil(total / limit)),\n hasPages: total > limit,\n };\n}\n\nexport function getCursorPaginationMetadata(\n limit: number,\n total: number,\n): CursorPaginationMetadata {\n return {\n perPage: limit,\n total: total,\n firstPage: 1,\n isEmpty: total === 0,\n };\n}\n","export type PickMethods<T, K extends keyof T> = {\n [P in K]: T[P];\n};\n\nexport const coerceToNumber = (value: string | number): number => {\n if (typeof value === \"number\") {\n return value;\n }\n\n return parseFloat(value);\n};\n","import { QueryNode } from \"../../query\";\n\nexport type BaseValues = string | number | boolean | null;\n\nexport type BinaryOperatorType =\n | \"=\"\n | \"!=\"\n | \"<>\"\n | \">\"\n | \"<\"\n | \">=\"\n | \"<=\"\n | \"like\"\n | \"ilike\"\n | \"in\";\n\nexport class HavingNode extends QueryNode {\n column: string;\n isNegated: boolean;\n operator: BinaryOperatorType;\n value: BaseValues | BaseValues[];\n chainsWith: \"and\" | \"or\" = \"and\";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"having\";\n file = \"having\";\n\n constructor(\n column: string,\n chainsWith: \"and\" | \"or\",\n isNegated: boolean = false,\n operator: BinaryOperatorType,\n value: BaseValues | BaseValues[],\n isRawValue: boolean = false,\n ) {\n super(\"having\", isRawValue);\n this.column = column;\n this.chainsWith = `${chainsWith} ` as \"and\" | \"or\";\n this.isNegated = isNegated;\n this.operator = operator;\n this.value = value;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class DistinctNode extends QueryNode {\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"distinct\";\n file = \"distinct\";\n\n constructor() {\n super(\"distinct\");\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class DistinctOnNode extends QueryNode {\n columns: string[];\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"distinctOn\";\n file = \"distinct_on\";\n\n constructor(columns: string[]) {\n super(\"select\");\n this.columns = columns;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class JoinNode extends QueryNode {\n table: string;\n left: string;\n right: string;\n on?: { left?: string; right?: string; operator: string };\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"join\";\n file = \"join\";\n type: \"inner\" | \"left\" | \"right\" | \"full\" | \"cross\" | \"natural\" = \"inner\";\n\n constructor(\n table: string,\n left: string,\n right: string,\n type: \"inner\" | \"left\" | \"right\" | \"full\" | \"cross\" | \"natural\" = \"inner\",\n on: { left?: string; right?: string; operator: string },\n isRawValue: boolean = false,\n ) {\n super(`${type} join`, isRawValue);\n this.table = table;\n this.left = left;\n this.right = right;\n this.on = on;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class GroupByNode extends QueryNode {\n column: string;\n chainsWith = \", \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"group_by\";\n file = \"group_by\";\n\n constructor(column: string, isRawValue: boolean = false) {\n super(\"group by\", isRawValue);\n this.column = column;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class LimitNode extends QueryNode {\n limit: number;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"limit\";\n file = \"limit\";\n\n constructor(limit: number) {\n super(\"limit\");\n this.limit = limit;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class OffsetNode extends QueryNode {\n offset: number;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"offset\";\n file = \"offset\";\n\n constructor(offset: number) {\n super(\"offset\");\n this.offset = offset;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class OrderByNode extends QueryNode {\n column: string;\n direction: \"asc\" | \"desc\";\n chainsWith = \", \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"order_by\";\n file = \"order_by\";\n\n constructor(\n column: string,\n direction: \"asc\" | \"desc\" = \"asc\",\n isRawValue: boolean = false,\n ) {\n super(\"order by\", isRawValue);\n this.column = column;\n this.direction = direction;\n }\n}\n","import logger from \"../../utils/logger\";\nimport { GroupByNode } from \"../ast/query/node/group_by/group_by\";\nimport { LimitNode } from \"../ast/query/node/limit/limit\";\nimport { OffsetNode } from \"../ast/query/node/offset/offset\";\nimport { OrderByNode } from \"../ast/query/node/order_by/order_by\";\nimport { ColumnType } from \"../models/decorators/model_decorators_types\";\nimport { Model } from \"../models/model\";\nimport type {\n ModelKey,\n OrderByChoices,\n} from \"../models/model_manager/model_manager_types\";\nimport { SqlDataSource } from \"../sql_data_source\";\nimport { SelectableColumn } from \"./query_builder_types\";\n\nexport abstract class FooterQueryBuilder<T extends Model> {\n protected sqlDataSource: SqlDataSource;\n protected model: typeof Model;\n protected groupByNodes: GroupByNode[];\n protected orderByNodes: OrderByNode[];\n protected limitNode: LimitNode | null;\n protected offsetNode: OffsetNode | null;\n protected modelColumns: ColumnType[];\n protected modelColumnsMap: Map<string, ColumnType>;\n protected logs: boolean;\n\n protected constructor(model: typeof Model, sqlDataSource: SqlDataSource) {\n this.model = model;\n this.sqlDataSource = sqlDataSource;\n this.groupByNodes = [];\n this.orderByNodes = [];\n this.limitNode = null;\n this.offsetNode = null;\n this.logs = this.sqlDataSource.logs;\n const getColumnsFn = (this.model as any)?.getColumns;\n this.modelColumns =\n typeof getColumnsFn === \"function\" ? getColumnsFn.call(this.model) : [];\n this.modelColumnsMap = new Map(\n this.modelColumns.map((modelColumn) => [\n modelColumn.columnName,\n modelColumn,\n ]),\n );\n }\n\n /**\n * @description Clears the group by query\n */\n clearGroupBy(): this {\n this.groupByNodes = [];\n return this;\n }\n\n /**\n * @description Clears the order by query\n */\n clearOrderBy(): this {\n this.orderByNodes = [];\n return this;\n }\n\n /**\n * @description Clears the limit query\n */\n clearLimit(): this {\n this.limitNode = null;\n return this;\n }\n\n /**\n * @description Clears the offset query\n */\n clearOffset(): this {\n this.offsetNode = null;\n return this;\n }\n\n /**\n * @description Adds a group by query\n */\n groupBy(...columns: ModelKey<T>[]): this;\n groupBy<S extends string>(...columns: SelectableColumn<S>[]): this;\n groupBy(...columns: (ModelKey<T> | SelectableColumn<string>)[]): this {\n columns.forEach((column) => {\n this.groupByNodes.push(new GroupByNode(column as string));\n });\n\n return this;\n }\n\n /**\n * @description Adds a raw group by query, GROUP BY clause is not necessary and will be added automatically\n */\n groupByRaw(query: string): this {\n this.groupByNodes.push(new GroupByNode(query, true));\n return this;\n }\n\n /**\n * @description Adds an order by query\n */\n orderBy(column: ModelKey<T>, order: OrderByChoices): this;\n orderBy<S extends string>(\n column: SelectableColumn<S>,\n order: OrderByChoices,\n ): this;\n orderBy(\n column: ModelKey<T> | SelectableColumn<string>,\n order: OrderByChoices,\n ): this {\n this.orderByNodes.push(new OrderByNode(column as string, order));\n return this;\n }\n\n /**\n * @description Adds a raw order by query, ORDER BY clause is not necessary and will be added automatically\n */\n orderByRaw(query: string): this {\n this.orderByNodes.push(new OrderByNode(query, \"asc\", true));\n return this;\n }\n\n /**\n * @description Adds a limit query\n */\n limit(limit: number): this {\n if (typeof limit !== \"number\") {\n logger.warn(\n `${this.model.name}::limit Non numeric value provided to \\`limit\\``,\n );\n }\n\n this.limitNode = new LimitNode(limit);\n return this;\n }\n\n /**\n * @description Adds an offset query\n */\n offset(offset: number): this {\n if (typeof offset !== \"number\") {\n logger.warn(\n `${this.model.name}::offset Non numeric value provided to \\`offset\\``,\n );\n }\n\n this.offsetNode = new OffsetNode(offset);\n return this;\n }\n}\n","import { HysteriaError } from \"../../errors/hysteria_error\";\nimport { JoinNode } from \"../ast/query/node/join\";\nimport { BinaryOperatorType } from \"../ast/query/node/where\";\nimport { Model } from \"../models/model\";\nimport { ModelKey } from \"../models/model_manager/model_manager_types\";\nimport { SqlDataSource } from \"../sql_data_source\";\nimport { FooterQueryBuilder } from \"./footer_query_builder\";\nimport { JoinableColumn } from \"./query_builder_types\";\n\nexport abstract class JoinQueryBuilder<\n T extends Model,\n> extends FooterQueryBuilder<T> {\n protected joinNodes: JoinNode[];\n protected constructor(model: typeof Model, sqlDataSource: SqlDataSource) {\n super(model, sqlDataSource);\n this.joinNodes = [];\n }\n\n /**\n * @description Clear the join query\n */\n clearJoin(): this {\n this.joinNodes = [];\n return this;\n }\n\n /**\n * @description Join a table with the current model, join clause is not necessary and will be added automatically\n */\n joinRaw(query: string): this {\n this.joinNodes.push(\n new JoinNode(\n query,\n \"\",\n \"\",\n \"inner\",\n {\n operator: \"=\",\n },\n true,\n ),\n );\n return this;\n }\n\n /**\n * @description Join a table with the current model, join clause is not necessary and will be added automatically\n */\n leftJoinRaw(query: string): this {\n this.joinNodes.push(\n new JoinNode(\n query,\n \"\",\n \"\",\n \"left\",\n {\n operator: \"=\",\n },\n true,\n ),\n );\n return this;\n }\n\n /**\n * @description Join a table with the current model, join clause is not necessary and will be added automatically\n */\n rightJoinRaw(query: string): this {\n this.joinNodes.push(\n new JoinNode(\n query,\n \"\",\n \"\",\n \"right\",\n {\n operator: \"=\",\n },\n true,\n ),\n );\n return this;\n }\n\n /**\n * @description Join a table with the current model, join clause is not necessary and will be added automatically\n */\n fullJoinRaw(query: string): this {\n this.joinNodes.push(\n new JoinNode(query, \"\", \"\", \"full\", { operator: \"=\" }, true),\n );\n\n return this;\n }\n\n /**\n * @description Join a table with the current model, join clause is not necessary and will be added automatically\n */\n crossJoinRaw(query: string): this {\n this.joinNodes.push(\n new JoinNode(query, \"\", \"\", \"cross\", { operator: \"=\" }, true),\n );\n\n return this;\n }\n\n /**\n * @description Join a table with the current model, join clause is not necessary and will be added automatically\n */\n naturalJoinRaw(query: string): this {\n this.joinNodes.push(\n new JoinNode(query, \"\", \"\", \"natural\", { operator: \"=\" }, true),\n );\n\n return this;\n }\n\n /**\n * @alias join\n * @param relationTable - The table to join\n * @param referencingColumn - The column to reference from the relation table, must be in the format of `table.column`\n * @param primaryColumn - The primary column of the current model, default is caller model primary key if using a Model, if using a Raw Query Builder you must provide the key for the primary table, must be in the format of `table.column`\n * @param operator - The comparison operator to use in the ON clause (default: \"=\")\n */\n innerJoin(\n relationTable: string,\n referencingColumn: JoinableColumn,\n primaryColumn: JoinableColumn,\n operator?: BinaryOperatorType,\n ): this;\n innerJoin(\n relationTable: string,\n referencingColumn: JoinableColumn,\n primaryColumn?: JoinableColumn,\n operator?: BinaryOperatorType,\n ): this;\n innerJoin<R extends typeof Model>(\n relationModel: R,\n referencingColumn: ModelKey<InstanceType<R>>,\n primaryColumn: ModelKey<T>,\n operator?: BinaryOperatorType,\n ): this;\n innerJoin<R extends typeof Model>(\n relationModel: R,\n referencingColumn: ModelKey<InstanceType<R>>,\n primaryColumn?: ModelKey<T>,\n operator?: BinaryOperatorType,\n ): this;\n innerJoin<R extends typeof Model>(\n relationTable: string | R,\n referencingColumnOrPrimaryColumn:\n | JoinableColumn\n | ModelKey<InstanceType<R>>\n | ModelKey<T>,\n primaryColumn?: JoinableColumn | ModelKey<T>,\n operator?: BinaryOperatorType,\n ): this {\n let primaryColumnValue: string | ModelKey<T> | undefined = primaryColumn;\n const op: BinaryOperatorType | undefined = operator;\n\n if (!primaryColumnValue) {\n if (!this.model.primaryKey) {\n throw new HysteriaError(\n \"JoinQueryBuilder::join\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n primaryColumnValue = `${this.model.table}.${this.model.primaryKey}`;\n }\n\n this.join(\n typeof relationTable === \"string\" ? relationTable : relationTable.table,\n referencingColumnOrPrimaryColumn as JoinableColumn,\n primaryColumnValue as JoinableColumn,\n op,\n );\n\n return this;\n }\n\n /**\n * @description Join a table with the current model\n * @param relationTable - The table to join\n * @param referencingColumn - The column to reference from the relation table, must be in the format of `table.column`\n * @param primaryColumn - The primary column of the current model, default is caller model primary key if using a Model, if using a Raw Query Builder you must provide the key for the primary table, must be in the format of `table.column`\n * @param operator - The comparison operator to use in the ON clause (default: \"=\")\n */\n join(\n relationTable: string,\n referencingColumn: JoinableColumn,\n primaryColumn: JoinableColumn,\n operator?: BinaryOperatorType,\n ): this;\n join(\n relationTable: string,\n referencingColumn: JoinableColumn,\n primaryColumn?: JoinableColumn,\n operator?: BinaryOperatorType,\n ): this;\n join<R extends typeof Model>(\n relationModel: R,\n referencingColumn: ModelKey<InstanceType<R>>,\n primaryColumn: ModelKey<T>,\n operator?: BinaryOperatorType,\n ): this;\n join<R extends typeof Model>(\n relationModel: R,\n referencingColumn: ModelKey<InstanceType<R>>,\n primaryColumn?: ModelKey<T>,\n operator?: BinaryOperatorType,\n ): this;\n join<R extends typeof Model>(\n relationTable: string | R,\n referencingColumnOrPrimaryColumn:\n | JoinableColumn\n | ModelKey<InstanceType<R>>\n | ModelKey<T>,\n primaryColumn?: JoinableColumn | ModelKey<T>,\n operator?: BinaryOperatorType,\n ): this {\n let primaryColumnValue: string | ModelKey<T> | undefined = primaryColumn;\n const op: BinaryOperatorType | undefined = operator;\n\n if (!primaryColumnValue) {\n if (!this.model.primaryKey) {\n throw new HysteriaError(\n \"JoinQueryBuilder::join\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n primaryColumnValue = `${this.model.table}.${this.model.primaryKey}`;\n }\n\n this.joinNodes.push(\n new JoinNode(\n typeof relationTable === \"string\" ? relationTable : relationTable.table,\n referencingColumnOrPrimaryColumn as string,\n primaryColumnValue as string,\n \"inner\",\n {\n operator: op || \"=\",\n },\n ),\n );\n return this;\n }\n\n /**\n * @description Join a table with the current model\n * @param relationTable - The table to join\n * @param referencingColumn - The column to reference from the relation table, must be in the format of `table.column`\n * @param primaryColumn - The primary column of the current model, default is caller model primary key if using a Model, if using a Raw Query Builder you must provide the key for the primary table, must be in the format of `table.column`\n * @param operator - The comparison operator to use in the ON clause (default: \"=\")\n */\n leftJoin(\n relationTable: string,\n referencingColumn: JoinableColumn,\n primaryColumn: JoinableColumn,\n operator?: BinaryOperatorType,\n ): this;\n leftJoin(\n relationTable: string,\n referencingColumn: JoinableColumn,\n primaryColumn?: JoinableColumn,\n operator?: BinaryOperatorType,\n ): this;\n leftJoin<R extends typeof Model>(\n relationModel: R,\n referencingColumn: ModelKey<InstanceType<R>>,\n primaryColumn: ModelKey<T>,\n operator?: BinaryOperatorType,\n ): this;\n leftJoin<R extends typeof Model>(\n relationModel: R,\n referencingColumn: ModelKey<InstanceType<R>>,\n primaryColumn?: ModelKey<T>,\n operator?: BinaryOperatorType,\n ): this;\n leftJoin<R extends typeof Model>(\n relationTable: string | R,\n referencingColumnOrPrimaryColumn:\n | JoinableColumn\n | ModelKey<InstanceType<R>>\n | ModelKey<T>,\n primaryColumn?: JoinableColumn | ModelKey<T>,\n operator?: BinaryOperatorType,\n ): this {\n let primaryColumnValue: string | ModelKey<T> | undefined = primaryColumn;\n const op: BinaryOperatorType | undefined = operator;\n\n if (!primaryColumnValue) {\n if (!this.model.primaryKey) {\n throw new HysteriaError(\n \"JoinQueryBuilder::join\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n primaryColumnValue = `${this.model.table}.${this.model.primaryKey}`;\n }\n\n this.joinNodes.push(\n new JoinNode(\n typeof relationTable === \"string\" ? relationTable : relationTable.table,\n referencingColumnOrPrimaryColumn as string,\n primaryColumnValue as string,\n \"left\",\n {\n operator: op || \"=\",\n },\n ),\n );\n return this;\n }\n\n /**\n * @description Join a table with the current model\n * @param relationTable - The table to join\n * @param referencingColumn - The column to reference from the relation table\n * @param primaryColumn - The primary column of the current model, default is caller model primary key if using A Model, if using a Raw Query Builder you must provide the key for the primary table\n * @param operator - The comparison operator to use in the ON clause (default: \"=\")\n */\n rightJoin(\n relationTable: string,\n referencingColumnOrPrimaryColumn: JoinableColumn,\n primaryColumn: JoinableColumn,\n operator?: BinaryOperatorType,\n ): this;\n rightJoin(\n relationTable: string,\n referencingColumnOrPrimaryColumn: JoinableColumn,\n primaryColumn?: JoinableColumn,\n operator?: BinaryOperatorType,\n ): this;\n rightJoin<R extends typeof Model>(\n relationTable: string | R,\n referencingColumnOrPrimaryColumn:\n | ModelKey<InstanceType<R>>\n | JoinableColumn\n | ModelKey<T>,\n primaryColumn?: JoinableColumn | ModelKey<T>,\n operator?: BinaryOperatorType,\n ): this {\n let primaryColumnValue: string | ModelKey<T> | undefined = primaryColumn;\n const op: BinaryOperatorType | undefined = operator;\n\n if (!primaryColumnValue) {\n if (!this.model.primaryKey) {\n throw new HysteriaError(\n \"JoinQueryBuilder::join\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n primaryColumnValue = `${this.model.table}.${this.model.primaryKey}`;\n }\n\n this.joinNodes.push(\n new JoinNode(\n typeof relationTable === \"string\" ? relationTable : relationTable.table,\n referencingColumnOrPrimaryColumn as string,\n primaryColumnValue as string,\n \"right\",\n {\n operator: op || \"=\",\n },\n ),\n );\n return this;\n }\n\n /**\n * @description Perform a FULL OUTER JOIN with another table\n * @param relationTable - The table to join\n * @param referencingColumn - The column to reference from the relation table\n * @param primaryColumn - The primary column of the current model\n * @param operator - The comparison operator to use in the ON clause (default: \"=\")\n */\n fullJoin(\n relationTable: string,\n referencingColumnOrPrimaryColumn: JoinableColumn,\n primaryColumn: JoinableColumn,\n operator?: BinaryOperatorType,\n ): this;\n fullJoin(\n relationTable: string,\n referencingColumnOrPrimaryColumn: JoinableColumn,\n primaryColumn?: JoinableColumn,\n operator?: BinaryOperatorType,\n ): this;\n fullJoin<R extends typeof Model>(\n relationTable: string | R,\n referencingColumnOrPrimaryColumn:\n | ModelKey<InstanceType<R>>\n | JoinableColumn\n | ModelKey<T>,\n primaryColumn?: JoinableColumn | ModelKey<T>,\n operator?: BinaryOperatorType,\n ): this {\n let primaryColumnValue: string | ModelKey<T> | undefined = primaryColumn;\n const op: BinaryOperatorType | undefined = operator;\n\n if (!primaryColumnValue) {\n if (!this.model.primaryKey) {\n throw new HysteriaError(\n \"JoinQueryBuilder::join\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n primaryColumnValue = `${this.model.table}.${this.model.primaryKey}`;\n }\n\n this.joinNodes.push(\n new JoinNode(\n typeof relationTable === \"string\" ? relationTable : relationTable.table,\n referencingColumnOrPrimaryColumn as string,\n primaryColumnValue as string,\n \"full\",\n {\n operator: op || \"=\",\n },\n ),\n );\n return this;\n }\n}\n","import { convertCase } from \"../../utils/case_utils\";\nimport { DistinctNode } from \"../ast/query/node/distinct/distinct\";\nimport { DistinctOnNode } from \"../ast/query/node/distinct/distinct_on\";\nimport { FromNode } from \"../ast/query/node/from/from\";\nimport { SelectNode } from \"../ast/query/node/select/basic_select\";\nimport { SqlMethod } from \"../ast/query/node/select/select_types\";\nimport { Model } from \"../models/model\";\nimport { ModelKey } from \"../models/model_manager/model_manager_types\";\nimport { SqlDataSource } from \"../sql_data_source\";\nimport { SqlDataSourceType, TableFormat } from \"../sql_data_source_types\";\nimport { JoinQueryBuilder } from \"./join_query_builder\";\nimport { SelectableColumn } from \"./query_builder_types\";\n\nexport class SelectQueryBuilder<T extends Model> extends JoinQueryBuilder<T> {\n protected dbType: SqlDataSourceType;\n protected modelSelectedColumns: string[] = [];\n protected modelAnnotatedColumns: string[] = [];\n protected withQuery?: string;\n protected fromNode: FromNode;\n protected distinctNode: DistinctNode | null;\n protected distinctOnNode: DistinctOnNode | null;\n protected selectNodes: SelectNode[];\n\n constructor(model: typeof Model, sqlDataSource: SqlDataSource) {\n super(model, sqlDataSource);\n this.dbType = sqlDataSource.getDbType();\n this.fromNode = new FromNode(this.model.table || \"\");\n this.distinctNode = null;\n this.distinctOnNode = null;\n this.selectNodes = [];\n }\n\n /**\n * @description Adds a SELECT condition to the query.\n * @description Can be stacked multiple times\n * @warning For annotations, use the `annotate` method instead, aliases and methods are not supported in the select method and will give error `column \"${columnName} as ${alias}\" does not exist`\n * @example\n * ```ts\n * const user = await User.query().select(\"name\", \"age\").first(); // SELECT name, age FROM users\n * const user = await User.query().select(\"name\", \"users.age\").first(); // SELECT name, users.age FROM users\n * ```\n */\n select<S extends string>(...columns: SelectableColumn<S>[]): this;\n select(...columns: (ModelKey<T> | \"*\")[]): this;\n select<S extends string>(\n ...columns: (ModelKey<T> | \"*\" | SelectableColumn<S>)[]\n ): this {\n this.modelSelectedColumns = [\n ...this.modelSelectedColumns,\n ...(columns as string[]),\n ];\n\n const casedColumns = columns.map((column) =>\n convertCase(column as string, this.model.databaseCaseConvention),\n );\n\n casedColumns.forEach((column) => {\n this.selectNodes.push(new SelectNode(column));\n });\n\n return this;\n }\n\n /**\n * @description Adds a raw select statement to the query\n * @warning For models, only annotated columns are available and will be added to the `$annotations` property of the model. Everything else will be ignored, if you need a query like `selectRaw` you can use the `QueryBuilder` instead.\n */\n selectRaw(statement: string): this {\n this.selectNodes.push(\n new SelectNode(statement, undefined, undefined, true),\n );\n return this;\n }\n\n /**\n * @description Clears the SELECT clause\n */\n clearSelect(): this {\n this.modelSelectedColumns = [];\n this.selectNodes = [];\n return this;\n }\n\n /**\n * @description Clears the FROM clause\n */\n clearFrom(): this {\n this.fromNode = new FromNode(this.model.table || \"\");\n return this;\n }\n\n /**\n * @description Clears the DISTINCT clause\n */\n clearDistinct(): this {\n this.distinctNode = null;\n return this;\n }\n\n /**\n * @description Clears the DISTINCT ON clause\n */\n clearDistinctOn(): this {\n this.distinctOnNode = null;\n return this;\n }\n\n /**\n * @description Annotates a column with a SQL method or a simple alias\n * @description If using a model, the result will be available in the $annotations property of the model, else it will be available in the result of the query\n * @example\n * ```ts\n * const user = await User.query().annotate(\"max\", \"id\", \"maxId\").first(); // max(id) as maxId\n * const user = await User.query().annotate(\"id\", \"superId\").first(); // id as superId\n * const user = await User.query().annotate(\"id\", \"superId\").first(); // id as superId\n * ```\n */\n annotate(column: string, alias: string): this;\n annotate(sqlMethod: SqlMethod, column: string, alias: string): this;\n annotate(sqlMethod: string, column: string, alias: string): this;\n annotate(\n sqlMethodOrColumn: string | SqlMethod,\n columnOrAlias: string,\n maybeAlias?: string,\n ): this {\n let sqlMethod: string | undefined;\n let column: string;\n let alias: string;\n\n if (maybeAlias) {\n sqlMethod = sqlMethodOrColumn;\n column = columnOrAlias;\n alias = maybeAlias;\n } else {\n sqlMethod = undefined;\n column = sqlMethodOrColumn as string;\n alias = columnOrAlias;\n }\n\n this.selectNodes.push(new SelectNode(column, alias, sqlMethod));\n this.modelAnnotatedColumns.push(alias);\n\n return this;\n }\n\n /**\n * @description Sets the table to select from, by default is the table defined in the Model\n * @description Can be used on non select queries too, it will only specify the table name (es. INSERT INTO $table)\n * @param table The table name to query from, must be in valid sql format `table` or `table as alias`\n */\n from<S extends string>(table: TableFormat<S>): this {\n this.fromNode = new FromNode(table);\n return this;\n }\n\n /**\n * @description Sets the table to select from, by default is the table defined in the Model\n * @description Better naming convention for non select queries\n * @alias from\n */\n table(table: string): this {\n this.fromNode = new FromNode(table);\n return this;\n }\n\n /**\n * @description Adds a DISTINCT clause to the query\n */\n distinct(): this {\n this.distinctNode = new DistinctNode();\n return this;\n }\n\n /**\n * @description Adds a DISTINCT ON clause to the query, does not stack, only the last one will be used\n * @warning Cannot use both DISTINCT and DISTINCT ON in the same query, only the DISTINCT ON will be used\n * @postgresql Only usable with PostgreSQL\n */\n distinctOn(...columns: ModelKey<T>[]): this;\n distinctOn<S extends string>(...columns: SelectableColumn<S>[]): this;\n distinctOn<S extends string>(\n ...columns: (ModelKey<T> | SelectableColumn<S>)[]\n ): this {\n this.distinctOnNode = new DistinctOnNode(columns as string[]);\n return this;\n }\n}\n","import { HavingNode } from \"../ast/query/node/having\";\nimport type {\n BaseValues,\n BinaryOperatorType,\n} from \"../ast/query/node/where/where\";\nimport { WhereNode } from \"../ast/query/node/where/where\";\nimport { WhereGroupNode } from \"../ast/query/node/where/where_group\";\nimport type { SubqueryOperatorType } from \"../ast/query/node/where/where_subquery\";\nimport { WhereSubqueryNode } from \"../ast/query/node/where/where_subquery\";\nimport { Model } from \"../models/model\";\nimport type { ModelKey } from \"../models/model_manager/model_manager_types\";\nimport { SqlDataSource } from \"../sql_data_source\";\nimport { QueryBuilder } from \"./query_builder\";\nimport type { WhereOnlyQueryBuilder } from \"./query_builder_types\";\nimport { SelectableColumn } from \"./query_builder_types\";\nimport { SelectQueryBuilder } from \"./select_query_builder\";\n\nexport abstract class WhereQueryBuilder<\n T extends Model,\n> extends SelectQueryBuilder<T> {\n protected whereNodes: (WhereNode | WhereGroupNode | WhereSubqueryNode)[];\n protected havingNodes: HavingNode[];\n protected isNestedCondition = false;\n\n constructor(\n model: typeof Model,\n sqlDataSource: SqlDataSource,\n isNestedCondition = false,\n ) {\n super(model, sqlDataSource);\n this.whereNodes = [];\n this.havingNodes = [];\n this.isNestedCondition = isNestedCondition;\n }\n\n clearWhere(): this {\n this.whereNodes = [];\n return this;\n }\n\n clearHaving(): this {\n this.havingNodes = [];\n return this;\n }\n\n /**\n * @description Accepts a value and executes a callback only of the value is not null or undefined.\n * @warning The value is not checked for truthiness but existence, it is only checked for undefined or null. So false, 0, \"\", etc. will be considered truthy.\n */\n strictWhen(value: any, cb: (query: this) => void): this {\n if (value === undefined || value === null) {\n return this;\n }\n\n cb(this);\n return this;\n }\n\n /**\n * @description Accepts a value and executes a callback only of the value is not falsy.\n * @warning The value is checked for truthiness, so false, 0, \"\", etc. will be considered falsy. Use strictWhen for null or undefined only cases.\n */\n when(value: any, cb: (query: this) => void): this {\n if (!value) {\n return this;\n }\n\n cb(this);\n return this;\n }\n\n /**\n * @description Adds a WHERE condition to the query.\n */\n where(\n column: ModelKey<T>,\n operator: BinaryOperatorType,\n value: BaseValues,\n ): this;\n where<S extends string>(\n column: SelectableColumn<S>,\n operator: BinaryOperatorType,\n value: BaseValues,\n ): this;\n where(cb: (queryBuilder: WhereOnlyQueryBuilder<T>) => void): this;\n where(\n column: ModelKey<T> | SelectableColumn<string>,\n subQuery: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this;\n where(\n column: ModelKey<T> | SelectableColumn<string>,\n operator: SubqueryOperatorType,\n subQuery: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this;\n where(\n column: ModelKey<T> | SelectableColumn<string>,\n value: BaseValues,\n ): this;\n where(\n columnOrCb:\n | ModelKey<T>\n | SelectableColumn<string>\n | ((queryBuilder: WhereOnlyQueryBuilder<T>) => void),\n operatorOrValue?:\n | BinaryOperatorType\n | BaseValues\n | SubqueryOperatorType\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n value?:\n | BaseValues\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n if (typeof columnOrCb === \"function\") {\n return this.andWhereGroup(\n columnOrCb as unknown as (qb: WhereQueryBuilder<T>) => void,\n );\n }\n\n if (typeof operatorOrValue === \"function\" && value === undefined) {\n return this.andWhereSubQuery(\n columnOrCb as string,\n \"in\",\n operatorOrValue as (subQuery: QueryBuilder<T>) => void,\n );\n }\n\n if (operatorOrValue instanceof QueryBuilder && value === undefined) {\n return this.andWhereSubQuery(\n columnOrCb as string,\n \"in\",\n operatorOrValue as QueryBuilder<T>,\n );\n }\n\n if (\n typeof operatorOrValue === \"string\" &&\n (operatorOrValue as string) !== \"=\" &&\n value !== undefined &&\n (value instanceof QueryBuilder || typeof value === \"function\")\n ) {\n return this.andWhereSubQuery(\n columnOrCb as string,\n operatorOrValue as SubqueryOperatorType,\n value as QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n );\n }\n\n return this.andWhere(\n columnOrCb as ModelKey<T>,\n operatorOrValue as BinaryOperatorType,\n value as BaseValues,\n );\n }\n\n /**\n * @description Adds an AND WHERE condition to the query.\n */\n andWhere(\n column: ModelKey<T>,\n operator: BinaryOperatorType,\n value: BaseValues,\n ): this;\n andWhere(\n column: SelectableColumn<string>,\n operator: BinaryOperatorType,\n value: BaseValues,\n ): this;\n andWhere(\n column: ModelKey<T> | SelectableColumn<string>,\n value: BaseValues,\n ): this;\n andWhere(cb: (queryBuilder: WhereOnlyQueryBuilder<T>) => void): this;\n andWhere(\n column: ModelKey<T> | SelectableColumn<string>,\n subQuery: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this;\n andWhere(\n column: ModelKey<T> | SelectableColumn<string>,\n operator: SubqueryOperatorType,\n subQuery: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this;\n andWhere<S extends string>(\n columnOrCb:\n | ModelKey<T>\n | SelectableColumn<S>\n | ((queryBuilder: WhereQueryBuilder<T>) => void),\n operatorOrValue?:\n | BinaryOperatorType\n | BaseValues\n | SubqueryOperatorType\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n value?:\n | BaseValues\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n if (typeof columnOrCb === \"function\") {\n return this.andWhereGroup(\n columnOrCb as (qb: WhereQueryBuilder<T>) => void,\n );\n }\n\n if (typeof operatorOrValue === \"function\" && value === undefined) {\n return this.andWhereSubQuery(\n columnOrCb as string,\n \"in\",\n operatorOrValue as (subQuery: QueryBuilder<T>) => void,\n );\n }\n\n if (operatorOrValue instanceof QueryBuilder && value === undefined) {\n return this.andWhereSubQuery(\n columnOrCb as string,\n \"in\",\n operatorOrValue as QueryBuilder<T>,\n );\n }\n\n if (\n typeof operatorOrValue === \"string\" &&\n (operatorOrValue as string) !== \"=\" &&\n value !== undefined &&\n (value instanceof QueryBuilder || typeof value === \"function\")\n ) {\n return this.andWhereSubQuery(\n columnOrCb as string,\n operatorOrValue as SubqueryOperatorType,\n value as QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n );\n }\n\n let operator: BinaryOperatorType = \"=\";\n let actualValue: BaseValues;\n\n if (\n typeof operatorOrValue === \"string\" &&\n value !== undefined &&\n !(value instanceof QueryBuilder) &&\n typeof value !== \"function\"\n ) {\n operator = operatorOrValue as BinaryOperatorType;\n actualValue = value as BaseValues;\n } else {\n actualValue = operatorOrValue as BaseValues;\n operator = \"=\";\n }\n\n this.whereNodes.push(\n new WhereNode(columnOrCb as string, \"and\", false, operator, actualValue),\n );\n return this;\n }\n\n /**\n * @description Adds an OR WHERE condition to the query.\n */\n orWhere(\n column: ModelKey<T>,\n operator: BinaryOperatorType,\n value: BaseValues,\n ): this;\n orWhere<S extends string>(\n column: SelectableColumn<S>,\n operator: BinaryOperatorType,\n value: BaseValues,\n ): this;\n orWhere<S extends string>(\n column: ModelKey<T> | SelectableColumn<S>,\n value: BaseValues,\n ): this;\n orWhere(cb: (queryBuilder: WhereOnlyQueryBuilder<T>) => void): this;\n orWhere(\n column: ModelKey<T> | SelectableColumn<string>,\n subQuery: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this;\n orWhere(\n column: ModelKey<T> | SelectableColumn<string>,\n operator: SubqueryOperatorType,\n subQuery: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this;\n orWhere<S extends string>(\n columnOrCb:\n | ModelKey<T>\n | SelectableColumn<S>\n | ((queryBuilder: WhereQueryBuilder<T>) => void),\n operatorOrValue?:\n | BinaryOperatorType\n | BaseValues\n | SubqueryOperatorType\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n value?:\n | BaseValues\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n if (typeof columnOrCb === \"function\") {\n return this.orWhereGroup(\n columnOrCb as (qb: WhereQueryBuilder<T>) => void,\n );\n }\n\n if (typeof operatorOrValue === \"function\" && value === undefined) {\n return this.orWhereSubQuery(\n columnOrCb as string,\n \"in\",\n operatorOrValue as (subQuery: QueryBuilder<T>) => void,\n );\n }\n\n if (operatorOrValue instanceof QueryBuilder && value === undefined) {\n return this.orWhereSubQuery(\n columnOrCb as string,\n \"in\",\n operatorOrValue as QueryBuilder<T>,\n );\n }\n\n if (\n typeof operatorOrValue === \"string\" &&\n (operatorOrValue as string) !== \"=\" &&\n value !== undefined &&\n (value instanceof QueryBuilder || typeof value === \"function\")\n ) {\n return this.orWhereSubQuery(\n columnOrCb as string,\n operatorOrValue as SubqueryOperatorType,\n value as QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n );\n }\n\n let operator: BinaryOperatorType = \"=\";\n let actualValue: BaseValues;\n\n if (\n typeof operatorOrValue === \"string\" &&\n value !== undefined &&\n !(value instanceof QueryBuilder) &&\n typeof value !== \"function\"\n ) {\n operator = operatorOrValue as BinaryOperatorType;\n actualValue = value as BaseValues;\n } else {\n actualValue = operatorOrValue as BaseValues;\n operator = \"=\";\n }\n\n this.whereNodes.push(\n new WhereNode(columnOrCb as string, \"or\", false, operator, actualValue),\n );\n return this;\n }\n\n /**\n * @description Adds a negated WHERE condition to the query.\n */\n whereNot(\n column: ModelKey<T>,\n operator: BinaryOperatorType,\n value: BaseValues,\n ): this;\n whereNot<S extends string>(\n column: SelectableColumn<S>,\n operator: BinaryOperatorType,\n value: BaseValues,\n ): this;\n whereNot(\n column: ModelKey<T> | SelectableColumn<string>,\n value: BaseValues,\n ): this;\n whereNot(\n column: ModelKey<T> | SelectableColumn<string>,\n subQuery: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this;\n whereNot(\n column: ModelKey<T> | SelectableColumn<string>,\n operator: SubqueryOperatorType,\n subQuery: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this;\n whereNot<S extends string>(\n column: ModelKey<T> | SelectableColumn<S>,\n operatorOrValue:\n | BinaryOperatorType\n | BaseValues\n | SubqueryOperatorType\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n value?:\n | BaseValues\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n if (typeof operatorOrValue === \"function\" && value === undefined) {\n return this.andWhereSubQuery(\n column as string,\n \"not in\",\n operatorOrValue as (subQuery: QueryBuilder<T>) => void,\n );\n }\n\n if (operatorOrValue instanceof QueryBuilder && value === undefined) {\n return this.andWhereSubQuery(\n column as string,\n \"not in\",\n operatorOrValue as QueryBuilder<T>,\n );\n }\n\n if (\n typeof operatorOrValue === \"string\" &&\n value !== undefined &&\n (value instanceof QueryBuilder || typeof value === \"function\")\n ) {\n return this.andWhereSubQuery(\n column as string,\n operatorOrValue as SubqueryOperatorType,\n value as QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n );\n }\n\n let operator: BinaryOperatorType = \"=\";\n let actualValue: BaseValues;\n\n if (\n typeof operatorOrValue === \"string\" &&\n value !== undefined &&\n !(value instanceof QueryBuilder) &&\n typeof value !== \"function\"\n ) {\n operator = operatorOrValue as BinaryOperatorType;\n actualValue = value as BaseValues;\n } else {\n actualValue = operatorOrValue as BaseValues;\n operator = \"=\";\n }\n\n this.whereNodes.push(\n new WhereNode(column as string, \"and\", true, operator, actualValue),\n );\n return this;\n }\n\n /**\n * @description Adds a negated AND WHERE condition to the query.\n */\n andWhereNot(\n column: ModelKey<T>,\n operator: BinaryOperatorType,\n value: BaseValues,\n ): this;\n andWhereNot<S extends string>(\n column: SelectableColumn<S>,\n operator: BinaryOperatorType,\n value: BaseValues,\n ): this;\n andWhereNot(\n column: ModelKey<T> | SelectableColumn<string>,\n value: BaseValues,\n ): this;\n andWhereNot(\n column: ModelKey<T> | SelectableColumn<string>,\n subQuery: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this;\n andWhereNot(\n column: ModelKey<T> | SelectableColumn<string>,\n operator: SubqueryOperatorType,\n subQuery: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this;\n andWhereNot<S extends string>(\n column: ModelKey<T> | SelectableColumn<S>,\n operatorOrValue:\n | BinaryOperatorType\n | BaseValues\n | SubqueryOperatorType\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n value?:\n | BaseValues\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n if (typeof operatorOrValue === \"function\" && value === undefined) {\n return this.andWhereSubQuery(\n column as string,\n \"not in\",\n operatorOrValue as (subQuery: QueryBuilder<T>) => void,\n );\n }\n\n if (operatorOrValue instanceof QueryBuilder && value === undefined) {\n return this.andWhereSubQuery(\n column as string,\n \"not in\",\n operatorOrValue as QueryBuilder<T>,\n );\n }\n\n if (\n typeof operatorOrValue === \"string\" &&\n value !== undefined &&\n (value instanceof QueryBuilder || typeof value === \"function\")\n ) {\n return this.andWhereSubQuery(\n column as string,\n operatorOrValue as SubqueryOperatorType,\n value as QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n );\n }\n\n let operator: BinaryOperatorType = \"=\";\n let actualValue: BaseValues;\n\n if (\n typeof operatorOrValue === \"string\" &&\n value !== undefined &&\n !(value instanceof QueryBuilder) &&\n typeof value !== \"function\"\n ) {\n operator = operatorOrValue as BinaryOperatorType;\n actualValue = value as BaseValues;\n } else {\n actualValue = operatorOrValue as BaseValues;\n operator = \"=\";\n }\n\n this.whereNodes.push(\n new WhereNode(column as string, \"and\", true, operator, actualValue),\n );\n return this;\n }\n\n /**\n * @description Adds a negated OR WHERE condition to the query.\n */\n orWhereNot(\n column: ModelKey<T>,\n operator: BinaryOperatorType,\n value: BaseValues,\n ): this;\n orWhereNot<S extends string>(\n column: SelectableColumn<S>,\n operator: BinaryOperatorType,\n value: BaseValues,\n ): this;\n orWhereNot(\n column: ModelKey<T> | SelectableColumn<string>,\n value: BaseValues,\n ): this;\n orWhereNot(\n column: ModelKey<T> | SelectableColumn<string>,\n subQuery: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this;\n orWhereNot(\n column: ModelKey<T> | SelectableColumn<string>,\n operator: SubqueryOperatorType,\n subQuery: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this;\n orWhereNot<S extends string>(\n column: ModelKey<T> | SelectableColumn<S>,\n operatorOrValue:\n | BinaryOperatorType\n | BaseValues\n | SubqueryOperatorType\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n value?:\n | BaseValues\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n if (typeof operatorOrValue === \"function\" && value === undefined) {\n return this.orWhereSubQuery(\n column as string,\n \"not in\",\n operatorOrValue as (subQuery: QueryBuilder<T>) => void,\n );\n }\n\n if (operatorOrValue instanceof QueryBuilder && value === undefined) {\n return this.orWhereSubQuery(\n column as string,\n \"not in\",\n operatorOrValue as QueryBuilder<T>,\n );\n }\n\n if (\n typeof operatorOrValue === \"string\" &&\n value !== undefined &&\n (value instanceof QueryBuilder || typeof value === \"function\")\n ) {\n return this.orWhereSubQuery(\n column as string,\n operatorOrValue as SubqueryOperatorType,\n value as QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n );\n }\n\n let operator: BinaryOperatorType = \"=\";\n let actualValue: BaseValues;\n\n if (\n typeof operatorOrValue === \"string\" &&\n value !== undefined &&\n !(value instanceof QueryBuilder) &&\n typeof value !== \"function\"\n ) {\n operator = operatorOrValue as BinaryOperatorType;\n actualValue = value as BaseValues;\n } else {\n actualValue = operatorOrValue as BaseValues;\n operator = \"=\";\n }\n\n this.whereNodes.push(\n new WhereNode(column as string, \"or\", true, operator, actualValue),\n );\n return this;\n }\n\n /**\n * @description Adds a WHERE BETWEEN condition to the query.\n */\n whereBetween(column: ModelKey<T>, min: BaseValues, max: BaseValues): this;\n whereBetween<S extends string>(\n column: SelectableColumn<S>,\n min: BaseValues,\n max: BaseValues,\n ): this;\n whereBetween(\n column: ModelKey<T> | SelectableColumn<string>,\n min: BaseValues,\n max: BaseValues,\n ): this {\n return this.andWhereBetween(column as ModelKey<T>, min, max);\n }\n\n /**\n * @description Adds an AND WHERE BETWEEN condition to the query.\n */\n andWhereBetween(column: ModelKey<T>, min: BaseValues, max: BaseValues): this;\n andWhereBetween<S extends string>(\n column: SelectableColumn<S>,\n min: BaseValues,\n max: BaseValues,\n ): this;\n andWhereBetween(\n column: ModelKey<T> | SelectableColumn<string>,\n min: BaseValues,\n max: BaseValues,\n ): this {\n this.whereNodes.push(\n new WhereNode(column as string, \"and\", false, \"between\", [min, max]),\n );\n return this;\n }\n\n /**\n * @description Adds an OR WHERE BETWEEN condition to the query.\n */\n orWhereBetween(column: ModelKey<T>, min: BaseValues, max: BaseValues): this;\n orWhereBetween<S extends string>(\n column: SelectableColumn<S>,\n min: BaseValues,\n max: BaseValues,\n ): this;\n orWhereBetween(\n column: ModelKey<T> | SelectableColumn<string>,\n min: BaseValues,\n max: BaseValues,\n ): this {\n this.whereNodes.push(\n new WhereNode(column as string, \"or\", false, \"between\", [min, max]),\n );\n return this;\n }\n\n /**\n * @description Adds a WHERE NOT BETWEEN condition to the query.\n */\n whereNotBetween(column: ModelKey<T>, min: BaseValues, max: BaseValues): this;\n whereNotBetween<S extends string>(\n column: SelectableColumn<S>,\n min: BaseValues,\n max: BaseValues,\n ): this;\n whereNotBetween(\n column: ModelKey<T> | SelectableColumn<string>,\n min: BaseValues,\n max: BaseValues,\n ): this {\n return this.andWhereNotBetween(column as ModelKey<T>, min, max);\n }\n\n /**\n * @description Adds an AND WHERE NOT BETWEEN condition to the query.\n */\n andWhereNotBetween(\n column: ModelKey<T>,\n min: BaseValues,\n max: BaseValues,\n ): this;\n andWhereNotBetween<S extends string>(\n column: SelectableColumn<S>,\n min: BaseValues,\n max: BaseValues,\n ): this;\n andWhereNotBetween(\n column: ModelKey<T> | SelectableColumn<string>,\n min: BaseValues,\n max: BaseValues,\n ): this {\n this.whereNodes.push(\n new WhereNode(column as string, \"and\", true, \"between\", [min, max]),\n );\n return this;\n }\n\n /**\n * @description Adds an OR WHERE NOT BETWEEN condition to the query.\n */\n orWhereNotBetween(\n column: ModelKey<T>,\n min: BaseValues,\n max: BaseValues,\n ): this;\n orWhereNotBetween<S extends string>(\n column: SelectableColumn<S>,\n min: BaseValues,\n max: BaseValues,\n ): this;\n orWhereNotBetween(\n column: ModelKey<T> | SelectableColumn<string>,\n min: BaseValues,\n max: BaseValues,\n ): this {\n this.whereNodes.push(\n new WhereNode(column as string, \"or\", true, \"between\", [min, max]),\n );\n return this;\n }\n\n /**\n * @description Adds a WHERE LIKE condition to the query.\n */\n whereLike(column: ModelKey<T>, value: string): this;\n whereLike<S extends string>(column: SelectableColumn<S>, value: string): this;\n whereLike(\n column: ModelKey<T> | SelectableColumn<string>,\n value: string,\n ): this {\n return this.andWhereLike(column as ModelKey<T>, value);\n }\n\n /**\n * @description Adds an AND WHERE LIKE condition to the query.\n */\n andWhereLike(column: ModelKey<T>, value: string): this;\n andWhereLike<S extends string>(\n column: SelectableColumn<S>,\n value: string,\n ): this;\n andWhereLike(\n column: ModelKey<T> | SelectableColumn<string>,\n value: string,\n ): this {\n this.where(column as string, \"like\", value);\n return this;\n }\n\n /**\n * @description Adds an OR WHERE LIKE condition to the query.\n */\n orWhereLike(column: ModelKey<T>, value: string): this;\n orWhereLike<S extends string>(\n column: SelectableColumn<S>,\n value: string,\n ): this;\n orWhereLike(\n column: ModelKey<T> | SelectableColumn<string>,\n value: string,\n ): this {\n this.orWhere(column as string, \"like\", value);\n return this;\n }\n\n /**\n * @description Adds a WHERE ILIKE condition to the query.\n */\n whereILike(column: ModelKey<T>, value: string): this;\n whereILike<S extends string>(\n column: SelectableColumn<S>,\n value: string,\n ): this;\n whereILike(\n column: ModelKey<T> | SelectableColumn<string>,\n value: string,\n ): this {\n return this.andWhereILike(column as ModelKey<T>, value);\n }\n\n /**\n * @description Adds an AND WHERE ILIKE condition to the query.\n */\n andWhereILike(column: ModelKey<T>, value: string): this;\n andWhereILike<S extends string>(\n column: SelectableColumn<S>,\n value: string,\n ): this;\n andWhereILike(\n column: ModelKey<T> | SelectableColumn<string>,\n value: string,\n ): this {\n this.where(column as string, \"ilike\", value);\n return this;\n }\n\n /**\n * @description Adds an OR WHERE ILIKE condition to the query.\n */\n orWhereILike(column: ModelKey<T>, value: string): this;\n orWhereILike<S extends string>(\n column: SelectableColumn<S>,\n value: string,\n ): this;\n orWhereILike(\n column: ModelKey<T> | SelectableColumn<string>,\n value: string,\n ): this {\n this.orWhere(column as string, \"ilike\", value);\n return this;\n }\n\n /**\n * @description Adds a WHERE NOT LIKE condition to the query.\n */\n whereNotLike(column: ModelKey<T>, value: string): this;\n whereNotLike<S extends string>(\n column: SelectableColumn<S>,\n value: string,\n ): this;\n whereNotLike(\n column: ModelKey<T> | SelectableColumn<string>,\n value: string,\n ): this {\n return this.andWhereNotLike(column as ModelKey<T>, value);\n }\n\n /**\n * @description Adds an AND WHERE NOT LIKE condition to the query.\n */\n andWhereNotLike(column: ModelKey<T>, value: string): this;\n andWhereNotLike<S extends string>(\n column: SelectableColumn<S>,\n value: string,\n ): this;\n andWhereNotLike(\n column: ModelKey<T> | SelectableColumn<string>,\n value: string,\n ): this {\n this.where(column as string, \"not like\", value);\n return this;\n }\n\n /**\n * @description Adds an OR WHERE NOT LIKE condition to the query.\n */\n orWhereNotLike(column: ModelKey<T>, value: string): this;\n orWhereNotLike<S extends string>(\n column: SelectableColumn<S>,\n value: string,\n ): this;\n orWhereNotLike(\n column: ModelKey<T> | SelectableColumn<string>,\n value: string,\n ): this {\n this.orWhere(column as string, \"not like\", value);\n return this;\n }\n\n /**\n * @description Adds a WHERE NOT ILIKE condition to the query.\n */\n whereNotILike(column: ModelKey<T>, value: string): this;\n whereNotILike<S extends string>(\n column: SelectableColumn<S>,\n value: string,\n ): this;\n whereNotILike(\n column: ModelKey<T> | SelectableColumn<string>,\n value: string,\n ): this {\n return this.andWhereNotILike(column as ModelKey<T>, value);\n }\n\n /**\n * @description Adds an AND WHERE NOT ILIKE condition to the query.\n */\n andWhereNotILike(column: ModelKey<T>, value: string): this;\n andWhereNotILike<S extends string>(\n column: SelectableColumn<S>,\n value: string,\n ): this;\n andWhereNotILike(\n column: ModelKey<T> | SelectableColumn<string>,\n value: string,\n ): this {\n this.where(column as string, \"not ilike\", value);\n return this;\n }\n\n /**\n * @description Adds an OR WHERE NOT ILIKE condition to the query.\n */\n orWhereNotILike(column: ModelKey<T>, value: string): this;\n orWhereNotILike<S extends string>(\n column: SelectableColumn<S>,\n value: string,\n ): this;\n orWhereNotILike(\n column: ModelKey<T> | SelectableColumn<string>,\n value: string,\n ): this {\n this.orWhere(column as string, \"not ilike\", value);\n return this;\n }\n\n /**\n * @description Adds a WHERE IN condition to the query.\n * @warning If the array is empty, it will add an impossible condition.\n */\n whereIn(column: ModelKey<T>, values: BaseValues[]): this;\n whereIn<S extends string>(\n column: SelectableColumn<S>,\n values: BaseValues[],\n ): this;\n whereIn(\n column: ModelKey<T> | SelectableColumn<string>,\n values:\n | BaseValues[]\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n return this.andWhereIn(column as ModelKey<T>, values as any);\n }\n\n /**\n * @description Adds an AND WHERE IN condition to the query.\n * @warning If the array is empty, it will add an impossible condition.\n */\n andWhereIn(column: ModelKey<T>, values: BaseValues[]): this;\n andWhereIn<S extends string>(\n column: SelectableColumn<S>,\n values: BaseValues[],\n ): this;\n andWhereIn(\n column: ModelKey<T> | SelectableColumn<string>,\n values:\n | BaseValues[]\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n if (Array.isArray(values)) {\n if (!values.length) {\n this.whereNodes.push(\n new WhereNode(\"false\", \"and\", true, \"=\", [], true),\n );\n return this;\n }\n\n this.whereNodes.push(\n new WhereNode(column as string, \"and\", false, \"in\", values),\n );\n return this;\n }\n\n return this.andWhereSubQuery(\n column as string,\n \"in\",\n values as QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n );\n }\n\n /**\n * @description Adds an OR WHERE IN condition to the query.\n * @warning If the array is empty, it will add an impossible condition.\n */\n orWhereIn(column: ModelKey<T>, values: BaseValues[]): this;\n orWhereIn<S extends string>(\n column: SelectableColumn<S>,\n values: BaseValues[],\n ): this;\n orWhereIn(\n column: ModelKey<T> | SelectableColumn<string>,\n values:\n | BaseValues[]\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n if (Array.isArray(values)) {\n if (!values.length) {\n this.whereNodes.push(new WhereNode(\"false\", \"or\", true, \"=\", [], true));\n return this;\n }\n\n this.whereNodes.push(\n new WhereNode(column as string, \"or\", false, \"in\", values),\n );\n return this;\n }\n\n return this.orWhereSubQuery(\n column as string,\n \"in\",\n values as QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n );\n }\n\n /**\n * @description Adds a WHERE NOT IN condition to the query.\n * @warning If the array is empty, it will add an obvious condition to make it true.\n */\n whereNotIn(column: ModelKey<T>, values: BaseValues[]): this;\n whereNotIn<S extends string>(\n column: SelectableColumn<S>,\n values: BaseValues[],\n ): this;\n whereNotIn(\n column: ModelKey<T> | SelectableColumn<string>,\n values:\n | BaseValues[]\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n return this.andWhereNotIn(column as ModelKey<T>, values as any);\n }\n\n /**\n * @description Adds an OR WHERE NOT IN condition to the query.\n * @warning If the array is empty, it will add an obvious condition to make it true.\n */\n andWhereNotIn(column: ModelKey<T>, values: BaseValues[]): this;\n andWhereNotIn<S extends string>(\n column: SelectableColumn<S>,\n values: BaseValues[],\n ): this;\n andWhereNotIn(\n column: ModelKey<T> | SelectableColumn<string>,\n values:\n | BaseValues[]\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n if (Array.isArray(values)) {\n if (!values.length) {\n this.whereNodes.push(new WhereNode(\"true\", \"and\", true, \"=\", [], true));\n return this;\n }\n\n this.whereNodes.push(\n new WhereNode(column as string, \"and\", true, \"in\", values),\n );\n return this;\n }\n\n return this.andWhereSubQuery(\n column as string,\n \"not in\",\n values as QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n );\n }\n\n /**\n * @description Adds an OR WHERE NOT IN condition to the query.\n * @warning If the array is empty, it will add an obvious condition to make it true.\n */\n orWhereNotIn(column: ModelKey<T>, values: BaseValues[]): this;\n orWhereNotIn<S extends string>(\n column: SelectableColumn<S>,\n values: BaseValues[],\n ): this;\n orWhereNotIn(\n column: ModelKey<T> | SelectableColumn<string>,\n values:\n | BaseValues[]\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n if (Array.isArray(values)) {\n if (!values.length) {\n this.whereNodes.push(new WhereNode(\"true\", \"or\", true, \"=\", [], true));\n return this;\n }\n\n this.whereNodes.push(\n new WhereNode(column as string, \"or\", true, \"in\", values),\n );\n return this;\n }\n\n return this.orWhereSubQuery(\n column as string,\n \"not in\",\n values as QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n );\n }\n\n /**\n * @description Adds a WHERE NULL condition to the query.\n */\n whereNull(column: ModelKey<T>): this;\n whereNull<S extends string>(column: SelectableColumn<S>): this;\n whereNull(column: ModelKey<T> | SelectableColumn<string>): this {\n return this.andWhereNull(column as ModelKey<T>);\n }\n\n /**\n * @description Adds an AND WHERE NULL condition to the query.\n */\n andWhereNull(column: ModelKey<T>): this;\n andWhereNull<S extends string>(column: SelectableColumn<S>): this;\n andWhereNull(column: ModelKey<T> | SelectableColumn<string>): this {\n this.whereNodes.push(\n new WhereNode(column as string, \"and\", false, \"is null\", undefined),\n );\n return this;\n }\n\n /**\n * @description Adds an OR WHERE NULL condition to the query.\n */\n orWhereNull(column: ModelKey<T>): this;\n orWhereNull<S extends string>(column: SelectableColumn<S>): this;\n orWhereNull(column: ModelKey<T> | SelectableColumn<string>): this {\n this.whereNodes.push(\n new WhereNode(column as string, \"or\", false, \"is null\", undefined),\n );\n return this;\n }\n\n /**\n * @description Adds a WHERE NOT NULL condition to the query.\n */\n whereNotNull(column: ModelKey<T>): this;\n whereNotNull<S extends string>(column: SelectableColumn<S>): this;\n whereNotNull(column: ModelKey<T> | SelectableColumn<string>): this {\n return this.andWhereNotNull(column as ModelKey<T>);\n }\n\n /**\n * @description Adds an AND WHERE NOT NULL condition to the query.\n */\n andWhereNotNull(column: ModelKey<T>): this;\n andWhereNotNull<S extends string>(column: SelectableColumn<S>): this;\n andWhereNotNull(column: ModelKey<T> | SelectableColumn<string>): this {\n this.whereNodes.push(\n new WhereNode(column as string, \"and\", false, \"is not null\", undefined),\n );\n return this;\n }\n\n /**\n * @description Adds an OR WHERE NOT NULL condition to the query.\n */\n orWhereNotNull(column: ModelKey<T>): this;\n orWhereNotNull<S extends string>(column: SelectableColumn<S>): this;\n orWhereNotNull(column: ModelKey<T> | SelectableColumn<string>): this {\n this.whereNodes.push(\n new WhereNode(column as string, \"or\", false, \"is not null\", undefined),\n );\n return this;\n }\n\n /**\n * @description Adds a WHERE REGEXP condition to the query.\n * @mssql doesn't support REGEXP syntax\n * @sqlite doesn't support REGEXP syntax\n */\n whereRegexp(column: ModelKey<T>, regexp: RegExp): this;\n whereRegexp<S extends string>(\n column: SelectableColumn<S>,\n regexp: RegExp,\n ): this;\n whereRegexp(\n column: ModelKey<T> | SelectableColumn<string>,\n regexp: RegExp,\n ): this {\n return this.andWhereRegexp(column as ModelKey<T>, regexp);\n }\n\n /**\n * @description Adds an AND WHERE REGEXP condition to the query.\n * @mssql doesn't support REGEXP syntax\n * @sqlite doesn't support REGEXP syntax\n */\n andWhereRegexp(column: ModelKey<T>, regexp: RegExp): this;\n andWhereRegexp<S extends string>(\n column: SelectableColumn<S>,\n regexp: RegExp,\n ): this;\n andWhereRegexp(\n column: ModelKey<T> | SelectableColumn<string>,\n regexp: RegExp,\n ): this {\n const isPg =\n this.sqlDataSource.getDbType() === \"postgres\" ||\n this.sqlDataSource.getDbType() === \"cockroachdb\";\n\n this.whereNodes.push(\n new WhereNode(\n column as string,\n \"and\",\n false,\n isPg ? (\"~\" as BinaryOperatorType) : \"regexp\",\n regexp.source,\n ),\n );\n return this;\n }\n\n /**\n * @description Adds an OR WHERE REGEXP condition to the query.\n * @mssql doesn't support REGEXP syntax\n * @sqlite doesn't support REGEXP syntax\n */\n orWhereRegexp(column: ModelKey<T>, regexp: RegExp): this;\n orWhereRegexp<S extends string>(\n column: SelectableColumn<S>,\n regexp: RegExp,\n ): this;\n orWhereRegexp(\n column: ModelKey<T> | SelectableColumn<string>,\n regexp: RegExp,\n ): this {\n const isPg =\n this.sqlDataSource.getDbType() === \"postgres\" ||\n this.sqlDataSource.getDbType() === \"cockroachdb\";\n\n this.whereNodes.push(\n new WhereNode(\n column as string,\n \"or\",\n false,\n isPg ? (\"~\" as BinaryOperatorType) : \"regexp\",\n regexp.source,\n ),\n );\n return this;\n }\n\n /**\n * @description Adds a WHERE NOT REGEXP condition to the query.\n * @mssql doesn't support REGEXP syntax\n * @sqlite doesn't support REGEXP syntax\n */\n whereNotRegexp(column: ModelKey<T>, regexp: RegExp): this;\n whereNotRegexp<S extends string>(\n column: SelectableColumn<S>,\n regexp: RegExp,\n ): this;\n whereNotRegexp(\n column: ModelKey<T> | SelectableColumn<string>,\n regexp: RegExp,\n ): this {\n const isPg = this.sqlDataSource.getDbType() === \"postgres\";\n this.whereNodes.push(\n new WhereNode(\n column as string,\n \"and\",\n true,\n isPg ? (\"~\" as BinaryOperatorType) : \"regexp\",\n regexp.source,\n ),\n );\n return this;\n }\n\n /**\n * @description Adds an AND WHERE NOT REGEXP condition to the query.\n * @mssql doesn't support REGEXP syntax\n * @sqlite doesn't support REGEXP syntax\n */\n andWhereNotRegexp(column: ModelKey<T>, regexp: RegExp): this;\n andWhereNotRegexp<S extends string>(\n column: SelectableColumn<S>,\n regexp: RegExp,\n ): this;\n andWhereNotRegexp(\n column: ModelKey<T> | SelectableColumn<string>,\n regexp: RegExp,\n ): this {\n const isPg = this.sqlDataSource.getDbType() === \"postgres\";\n this.whereNodes.push(\n new WhereNode(\n column as string,\n \"and\",\n true,\n isPg ? (\"~\" as BinaryOperatorType) : \"regexp\",\n regexp.source,\n ),\n );\n return this;\n }\n\n /**\n * @description Adds an OR WHERE NOT REGEXP condition to the query.\n * @mssql doesn't support REGEXP syntax\n * @sqlite doesn't support REGEXP syntax\n */\n orWhereNotRegexp(column: ModelKey<T>, regexp: RegExp): this;\n orWhereNotRegexp<S extends string>(\n column: SelectableColumn<S>,\n regexp: RegExp,\n ): this;\n orWhereNotRegexp(\n column: ModelKey<T> | SelectableColumn<string>,\n regexp: RegExp,\n ): this {\n const isPg = this.sqlDataSource.getDbType() === \"postgres\";\n this.whereNodes.push(\n new WhereNode(\n column as string,\n \"or\",\n true,\n isPg ? (\"~\" as BinaryOperatorType) : \"regexp\",\n regexp.source,\n ),\n );\n return this;\n }\n\n /**\n * @description Adds a AND WHERE EXISTS condition to the query. By default uses the same table, you can use the `from` method to change the table.\n */\n whereExists(\n cbOrQueryBuilder: (queryBuilder: QueryBuilder<T>) => void | QueryBuilder<T>,\n ): this {\n return this.andWhereExists(cbOrQueryBuilder);\n }\n\n /**\n * @description Adds a AND WHERE EXISTS condition to the query. By default uses the same table, you can use the `from` method to change the table.\n */\n andWhereExists(\n cbOrQueryBuilder: (queryBuilder: QueryBuilder<T>) => void | QueryBuilder<T>,\n ): this {\n const nestedBuilder =\n cbOrQueryBuilder instanceof QueryBuilder\n ? cbOrQueryBuilder\n : new QueryBuilder(this.model, this.sqlDataSource);\n\n (nestedBuilder as WhereQueryBuilder<T>).isNestedCondition = true;\n if (typeof cbOrQueryBuilder === \"function\") {\n cbOrQueryBuilder(nestedBuilder as QueryBuilder<T>);\n }\n\n this.whereNodes.push(\n new WhereSubqueryNode(\n \"\",\n \"exists\",\n nestedBuilder.extractQueryNodes(),\n \"and\",\n ),\n );\n\n return this;\n }\n\n /**\n * @description Adds a OR WHERE EXISTS condition to the query. By default uses the same table, you can use the `from` method to change the table.\n */\n orWhereExists(\n cbOrQueryBuilder: (queryBuilder: QueryBuilder<T>) => void | QueryBuilder<T>,\n ): this {\n const nestedBuilder =\n cbOrQueryBuilder instanceof QueryBuilder\n ? cbOrQueryBuilder\n : new QueryBuilder(this.model, this.sqlDataSource);\n\n (nestedBuilder as WhereQueryBuilder<T>).isNestedCondition = true;\n if (typeof cbOrQueryBuilder === \"function\") {\n cbOrQueryBuilder(nestedBuilder as QueryBuilder<T>);\n }\n\n this.whereNodes.push(\n new WhereSubqueryNode(\n \"\",\n \"exists\",\n nestedBuilder.extractQueryNodes(),\n \"or\",\n ),\n );\n\n return this;\n }\n\n /**\n * @description Adds a WHERE NOT EXISTS condition to the query. By default uses the same table, you can use the `from` method to change the table.\n */\n whereNotExists(\n cbOrQueryBuilder: (queryBuilder: QueryBuilder<T>) => void | QueryBuilder<T>,\n ): this {\n return this.andWhereNotExists(cbOrQueryBuilder);\n }\n\n /**\n * @description Adds a WHERE NOT EXISTS condition to the query. By default uses the same table, you can use the `from` method to change the table.\n */\n andWhereNotExists(\n cbOrQueryBuilder: (queryBuilder: QueryBuilder<T>) => void | QueryBuilder<T>,\n ): this {\n const nestedBuilder =\n cbOrQueryBuilder instanceof QueryBuilder\n ? cbOrQueryBuilder\n : new QueryBuilder(this.model, this.sqlDataSource);\n\n (nestedBuilder as WhereQueryBuilder<T>).isNestedCondition = true;\n if (typeof cbOrQueryBuilder === \"function\") {\n cbOrQueryBuilder(nestedBuilder as QueryBuilder<T>);\n }\n\n this.whereNodes.push(\n new WhereSubqueryNode(\n \"\",\n \"not exists\",\n nestedBuilder.extractQueryNodes(),\n \"and\",\n ),\n );\n\n return this;\n }\n\n /**\n * @description Adds a WHERE NOT EXISTS condition to the query. By default uses the same table, you can use the `from` method to change the table.\n */\n orWhereNotExists(\n cbOrQueryBuilder: (queryBuilder: QueryBuilder<T>) => void | QueryBuilder<T>,\n ): this {\n const nestedBuilder =\n cbOrQueryBuilder instanceof QueryBuilder\n ? cbOrQueryBuilder\n : new QueryBuilder(this.model, this.sqlDataSource);\n\n (nestedBuilder as WhereQueryBuilder<T>).isNestedCondition = true;\n if (typeof cbOrQueryBuilder === \"function\") {\n cbOrQueryBuilder(nestedBuilder as QueryBuilder<T>);\n }\n\n this.whereNodes.push(\n new WhereSubqueryNode(\n \"\",\n \"not exists\",\n nestedBuilder.extractQueryNodes(),\n \"or\",\n ),\n );\n\n return this;\n }\n\n /**\n * @description Adds a raw WHERE condition to the query.\n */\n whereRaw(query: string, queryParams: any[] = []) {\n return this.andWhereRaw(query, queryParams);\n }\n\n /**\n * @description Adds a raw AND WHERE condition to the query.\n */\n andWhereRaw(query: string, queryParams: any[] = []) {\n this.whereNodes.push(\n new WhereNode(query, \"and\", false, \"=\", queryParams, true),\n );\n return this;\n }\n\n /**\n * @description Adds a raw OR WHERE condition to the query.\n */\n orWhereRaw(query: string, queryParams: any[] = []) {\n this.whereNodes.push(\n new WhereNode(query, \"or\", false, \"=\", queryParams, true),\n );\n return this;\n }\n\n /**\n * @description Adds a HAVING condition to the query.\n */\n having<S extends string>(column: SelectableColumn<S>, value: any): this;\n having(column: ModelKey<T>, operator: BinaryOperatorType, value: any): this;\n having(\n column: ModelKey<T> | SelectableColumn<string>,\n operatorOrValue: BinaryOperatorType | BaseValues,\n value?: BaseValues,\n ): this {\n return this.andHaving(\n column as ModelKey<T>,\n operatorOrValue as BinaryOperatorType,\n value,\n );\n }\n\n /**\n * @description Adds an AND HAVING condition to the query.\n */\n andHaving<S extends string>(column: SelectableColumn<S>, value: any): this;\n andHaving(\n column: ModelKey<T>,\n operator: BinaryOperatorType,\n value: any,\n ): this;\n andHaving(\n column: ModelKey<T> | SelectableColumn<string>,\n operatorOrValue: BinaryOperatorType | BaseValues,\n value?: BaseValues,\n ): this {\n let operator: BinaryOperatorType = \"=\";\n let actualValue: BaseValues;\n\n if (typeof operatorOrValue === \"string\" && value) {\n operator = operatorOrValue as BinaryOperatorType;\n actualValue = value as BaseValues;\n } else {\n actualValue = operatorOrValue as BaseValues;\n operator = \"=\";\n }\n\n this.havingNodes.push(\n new HavingNode(\n column as string,\n \"and\",\n false,\n operator as any,\n actualValue as any,\n ),\n );\n return this;\n }\n\n /**\n * @description Adds an OR HAVING condition to the query.\n */\n orHaving<S extends string>(column: SelectableColumn<S>, value: any): this;\n orHaving(column: ModelKey<T>, operator: BinaryOperatorType, value: any): this;\n orHaving(\n column: ModelKey<T> | SelectableColumn<string>,\n operatorOrValue: BinaryOperatorType | BaseValues,\n value?: BaseValues,\n ): this {\n let operator: BinaryOperatorType = \"=\";\n let actualValue: BaseValues;\n\n if (typeof operatorOrValue === \"string\" && value) {\n operator = operatorOrValue as BinaryOperatorType;\n actualValue = value;\n } else {\n actualValue = operatorOrValue as BaseValues;\n operator = \"=\";\n }\n\n this.havingNodes.push(\n new HavingNode(\n column as string,\n \"or\",\n false,\n operator as any,\n actualValue as any,\n ),\n );\n return this;\n }\n\n /**\n * @description Adds a raw HAVING condition to the query.\n */\n havingRaw(query: string): this {\n return this.andHavingRaw(query);\n }\n\n /**\n * @description Adds a raw OR HAVING condition to the query.\n */\n andHavingRaw(query: string): this {\n this.havingNodes.push(new HavingNode(query, \"and\", false, \"=\", [], true));\n\n return this;\n }\n\n /**\n * @description Adds a raw OR HAVING condition to the query.\n */\n orHavingRaw(query: string): this {\n this.havingNodes.push(new HavingNode(query, \"or\", false, \"=\", [], true));\n\n return this;\n }\n\n private buildSubQuery(\n subQueryOrCb: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): QueryBuilder<T> {\n if (subQueryOrCb instanceof QueryBuilder) {\n return subQueryOrCb;\n }\n const subQuery = new QueryBuilder(this.model, this.sqlDataSource);\n (subQueryOrCb as (qb: QueryBuilder<T>) => void)(subQuery);\n return subQuery;\n }\n\n private andWhereSubQuery(\n column: string,\n operator: SubqueryOperatorType,\n subQueryOrCb: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n const subQuery = this.buildSubQuery(subQueryOrCb);\n this.whereNodes.push(\n new WhereSubqueryNode(\n column,\n operator,\n (subQuery as any).extractQueryNodes(),\n \"and\",\n ),\n );\n return this;\n }\n\n private orWhereSubQuery(\n column: string,\n operator: SubqueryOperatorType,\n subQueryOrCb: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n const subQuery = this.buildSubQuery(subQueryOrCb);\n this.whereNodes.push(\n new WhereSubqueryNode(\n column,\n operator,\n (subQuery as any).extractQueryNodes(),\n \"or\",\n ),\n );\n return this;\n }\n\n private andWhereGroup(\n cb: (queryBuilder: WhereQueryBuilder<T>) => void,\n ): this {\n const nestedBuilder = new QueryBuilder(this.model, this.sqlDataSource);\n (nestedBuilder as any).isNestedCondition = true;\n cb(nestedBuilder as unknown as WhereQueryBuilder<T>);\n const whereGroupNode = new WhereGroupNode(\n (nestedBuilder as any).whereNodes,\n \"and\",\n );\n this.whereNodes.push(whereGroupNode);\n return this;\n }\n\n private orWhereGroup(cb: (queryBuilder: WhereQueryBuilder<T>) => void): this {\n const nestedBuilder = new QueryBuilder(this.model, this.sqlDataSource);\n (nestedBuilder as any).isNestedCondition = true;\n cb(nestedBuilder as unknown as WhereQueryBuilder<T>);\n const whereGroupNode = new WhereGroupNode(\n (nestedBuilder as any).whereNodes,\n \"or\",\n );\n this.whereNodes.push(whereGroupNode);\n return this;\n }\n}\n","import { WhereJsonNode } from \"../ast/query/node/where\";\nimport { Model } from \"../models/model\";\nimport { ModelKey } from \"../models/model_manager/model_manager_types\";\nimport { WhereQueryBuilder } from \"./where_query_builder\";\n\ntype JsonParam = Record<string, unknown> | any[];\n\nexport class JsonQueryBuilder<T extends Model> extends WhereQueryBuilder<T> {\n /**\n * @description Filters records matching exact JSON value.\n */\n whereJson(column: ModelKey<T>, value: JsonParam): this;\n whereJson(column: string, value: JsonParam): this;\n whereJson(column: ModelKey<T> | string, value: JsonParam): this {\n return this.andWhereJson(column as string, value);\n }\n\n /**\n * @description Filters records matching the given JSON value.\n * @mssql Partial JSON matching not supported - only exact matches work\n */\n andWhereJson(column: ModelKey<T>, value: JsonParam): this;\n andWhereJson(column: string, value: JsonParam): this;\n andWhereJson(column: ModelKey<T> | string, value: JsonParam): this {\n this.whereNodes.push(\n new WhereJsonNode(\n column as string,\n \"and\",\n false,\n \"contains\",\n value as any,\n ),\n );\n return this;\n }\n\n /**\n * @description Filters records matching the given JSON value.\n * @mssql Partial JSON matching not supported - only exact matches work\n */\n orWhereJson(column: ModelKey<T>, value: JsonParam): this;\n orWhereJson(column: string, value: JsonParam): this;\n orWhereJson(column: ModelKey<T> | string, value: JsonParam): this {\n this.whereNodes.push(\n new WhereJsonNode(\n column as string,\n \"or\",\n false,\n \"contains\",\n value as any,\n ),\n );\n return this;\n }\n\n /**\n * @description Filters records where JSON column does NOT contain the given value.\n * @sqlite might not work for all cases, suggest using the whereJsonRaw method instead\n * @mssql not supported - CHARINDEX cannot do partial JSON containment\n */\n whereJsonNotContains(column: ModelKey<T>, value: JsonParam): this;\n whereJsonNotContains(column: string, value: JsonParam): this;\n whereJsonNotContains(column: ModelKey<T> | string, value: JsonParam): this {\n return this.andWhereJsonNotContains(column as string, value);\n }\n\n /**\n * @description Filters records where JSON column does NOT contain the given value (AND).\n * @sqlite might not work for all cases, suggest using the whereJsonRaw method instead\n * @mssql not supported - CHARINDEX cannot do partial JSON containment\n */\n andWhereJsonNotContains(column: ModelKey<T>, value: JsonParam): this;\n andWhereJsonNotContains(column: string, value: JsonParam): this;\n andWhereJsonNotContains(\n column: ModelKey<T> | string,\n value: JsonParam,\n ): this {\n this.whereNodes.push(\n new WhereJsonNode(\n column as string,\n \"and\",\n true,\n \"not contains\",\n value as any,\n ),\n );\n return this;\n }\n\n /**\n * @description Filters records where JSON column does NOT contain the given value (OR).\n * @sqlite might not work for all cases, suggest using the whereJsonRaw method instead\n * @mssql not supported - CHARINDEX cannot do partial JSON containment\n */\n orWhereJsonNotContains(column: ModelKey<T>, value: JsonParam): this;\n orWhereJsonNotContains(column: string, value: JsonParam): this;\n orWhereJsonNotContains(column: ModelKey<T> | string, value: JsonParam): this {\n this.whereNodes.push(\n new WhereJsonNode(\n column as string,\n \"or\",\n true,\n \"not contains\",\n value as any,\n ),\n );\n return this;\n }\n\n /**\n * @description Filters records where JSON column contains the given value.\n * @sqlite might not work for all cases, suggest using the whereJsonRaw method instead\n * @mssql not supported - CHARINDEX cannot do partial JSON containment\n */\n whereJsonContains(column: ModelKey<T>, value: JsonParam): this;\n whereJsonContains(column: string, value: JsonParam): this;\n whereJsonContains(column: ModelKey<T> | string, value: JsonParam): this {\n return this.andWhereJsonContains(column as string, value);\n }\n\n /**\n * @description Filters records where JSON column contains the given value (AND).\n * @sqlite might not work for all cases, suggest using the whereJsonRaw method instead\n * @mssql not supported - CHARINDEX cannot do partial JSON containment\n */\n andWhereJsonContains(column: ModelKey<T>, value: JsonParam): this;\n andWhereJsonContains(column: string, value: JsonParam): this;\n andWhereJsonContains(column: ModelKey<T> | string, value: JsonParam): this {\n this.whereNodes.push(\n new WhereJsonNode(\n column as string,\n \"and\",\n false,\n \"contains\",\n value as any,\n ),\n );\n return this;\n }\n\n /**\n * @description Filters records where JSON column contains the given value (OR).\n * @sqlite might not work for all cases, suggest using the whereJsonRaw method instead\n * @mssql not supported - CHARINDEX cannot do partial JSON containment\n */\n orWhereJsonContains(column: ModelKey<T>, value: JsonParam): this;\n orWhereJsonContains(column: string, value: JsonParam): this;\n orWhereJsonContains(column: ModelKey<T> | string, value: JsonParam): this {\n this.whereNodes.push(\n new WhereJsonNode(\n column as string,\n \"or\",\n false,\n \"contains\",\n value as any,\n ),\n );\n return this;\n }\n\n /**\n * @description Filters records where JSON column does NOT match the given value.\n */\n whereNotJson(column: ModelKey<T>, value: JsonParam): this;\n whereNotJson(column: string, value: JsonParam): this;\n whereNotJson(column: ModelKey<T> | string, value: JsonParam): this {\n return this.andWhereNotJson(column as string, value);\n }\n\n /**\n * @description Filters records where JSON column does NOT match the given value (AND).\n */\n andWhereNotJson(column: ModelKey<T>, value: JsonParam): this;\n andWhereNotJson(column: string, value: JsonParam): this;\n andWhereNotJson(column: ModelKey<T> | string, value: JsonParam): this {\n this.whereNodes.push(\n new WhereJsonNode(\n column as string,\n \"and\",\n true,\n \"not contains\",\n value as any,\n ),\n );\n return this;\n }\n\n /**\n * @description Filters records where JSON column does NOT match the given value (OR).\n */\n orWhereNotJson(column: ModelKey<T>, value: JsonParam): this;\n orWhereNotJson(column: string, value: JsonParam): this;\n orWhereNotJson(column: ModelKey<T> | string, value: JsonParam): this {\n this.whereNodes.push(\n new WhereJsonNode(\n column as string,\n \"or\",\n true,\n \"not contains\",\n value as any,\n ),\n );\n return this;\n }\n\n /**\n * @description Add a raw JSON filter expression.\n */\n whereJsonRaw(raw: string, params?: any[]): this {\n return this.andWhereJsonRaw(raw, params);\n }\n\n /**\n * @description Add a raw JSON filter expression (AND).\n */\n andWhereJsonRaw(raw: string, params?: any[]): this {\n this.whereNodes.push(\n new WhereJsonNode(raw, \"and\", false, \"raw\", params as any),\n );\n return this;\n }\n\n /**\n * @description Add a raw JSON filter expression (OR).\n */\n orWhereJsonRaw(raw: string, params?: any[]): this {\n this.whereNodes.push(\n new WhereJsonNode(raw, \"or\", false, \"raw\", params as any),\n );\n return this;\n }\n}\n","import { PassThrough } from \"node:stream\";\nimport { HysteriaError } from \"../../errors/hysteria_error\";\nimport { baseSoftDeleteDate } from \"../../utils/date_utils\";\nimport logger from \"../../utils/logger\";\nimport { withPerformance } from \"../../utils/performance\";\nimport { bindParamsIntoQuery, formatQuery } from \"../../utils/query\";\nimport { coerceToNumber } from \"../../utils/types\";\nimport { AstParser } from \"../ast/parser\";\nimport { UnionNode, WithNode } from \"../ast/query/node\";\nimport { DeleteNode } from \"../ast/query/node/delete\";\nimport { FromNode } from \"../ast/query/node/from\";\nimport { InsertNode } from \"../ast/query/node/insert\";\nimport { LockNode } from \"../ast/query/node/lock/lock\";\nimport { OnDuplicateNode } from \"../ast/query/node/on_duplicate\";\nimport { SelectNode } from \"../ast/query/node/select/basic_select\";\nimport { UnionCallBack } from \"../ast/query/node/select/select_types\";\nimport { TruncateNode } from \"../ast/query/node/truncate\";\nimport { UpdateNode } from \"../ast/query/node/update\";\nimport { QueryNode } from \"../ast/query/query\";\nimport { InterpreterUtils } from \"../interpreter/interpreter_utils\";\nimport type { Model } from \"../models/model\";\nimport { ModelKey } from \"../models/model_manager/model_manager_types\";\nimport { AnnotatedModel } from \"../models/model_query_builder/model_query_builder_types\";\nimport type { NumberModelKey } from \"../models/model_types\";\nimport {\n CursorPaginatedData,\n getCursorPaginationMetadata,\n getPaginationMetadata,\n PaginatedData,\n} from \"../pagination\";\nimport { deepCloneNode } from \"../resources/utils\";\nimport { SqlDataSource } from \"../sql_data_source\";\nimport type { ReplicationType, TableFormat } from \"../sql_data_source_types\";\nimport { execSql, execSqlStreaming } from \"../sql_runner/sql_runner\";\nimport { SoftDeleteOptions } from \"./delete_query_builder_type\";\nimport { JsonQueryBuilder } from \"./json_query_builder\";\nimport {\n Cursor,\n PaginateWithCursorOptions,\n PluckReturnType,\n StreamOptions,\n UpsertOptionsRawBuilder,\n WriteQueryParam,\n} from \"./query_builder_types\";\nimport { RawNode } from \"../ast/query/node/raw/raw_node\";\n\nexport class QueryBuilder<T extends Model = any> extends JsonQueryBuilder<T> {\n model: typeof Model;\n protected astParser: AstParser;\n protected unionNodes: UnionNode[];\n protected withNodes: WithNode[];\n protected lockQueryNodes: LockNode[];\n protected isNestedCondition = false;\n protected mustRemoveAnnotations: boolean = false;\n protected interpreterUtils: InterpreterUtils;\n protected insertNode: InsertNode | null = null;\n protected onDuplicateNode: OnDuplicateNode | null = null;\n protected updateNode: UpdateNode | null = null;\n protected deleteNode: DeleteNode | null = null;\n protected truncateNode: TruncateNode | null = null;\n protected replicationMode: ReplicationType | null = null;\n\n /**\n * @description Performance methods that return the time that took to execute the query with the result\n */\n performance = {\n many: this.manyWithPerformance.bind(this),\n one: this.oneWithPerformance.bind(this),\n oneOrFail: this.oneOrFailWithPerformance.bind(this),\n first: this.firstWithPerformance.bind(this),\n firstOrFail: this.firstOrFailWithPerformance.bind(this),\n paginate: this.paginateWithPerformance.bind(this),\n paginateWithCursor: this.paginateWithCursorWithPerformance.bind(this),\n exists: this.existsWithPerformance.bind(this),\n truncate: this.truncateWithPerformance.bind(this),\n delete: this.deleteWithPerformance.bind(this),\n insert: this.insertWithPerformance.bind(this),\n insertMany: this.insertManyWithPerformance.bind(this),\n update: this.updateWithPerformance.bind(this),\n softDelete: this.softDeleteWithPerformance.bind(this),\n pluck: this.pluckWithPerformance.bind(this),\n };\n\n constructor(\n model: typeof Model,\n sqlDataSource: SqlDataSource = SqlDataSource.instance,\n ) {\n super(model, sqlDataSource);\n this.dbType = sqlDataSource.getDbType();\n this.isNestedCondition = false;\n this.model = model;\n this.unionNodes = [];\n this.lockQueryNodes = [];\n this.withNodes = [];\n this.astParser = new AstParser(this.model, this.dbType);\n this.interpreterUtils = new InterpreterUtils(this.model);\n }\n\n /**\n * @description Sets the replication mode for the query builder\n * @param replicationMode - The replication mode to use for the query builder\n * @description If not specified, read operations will use slave (if available) else master, and write operations will always use master\n * @description If set to \"master\", all operations will use master\n * @description If set to \"slave\", read operations will use slave and write operations will use master\n */\n setReplicationMode(replicationMode: ReplicationType): this {\n this.replicationMode = replicationMode;\n return this;\n }\n\n /**\n * @description Executes the query and returns true if the query returns at least one result, false otherwise.\n */\n async exists(): Promise<boolean> {\n return !!(await this.one());\n }\n\n /**\n * @description Executes the query and retrieves multiple results.\n */\n async many(): Promise<AnnotatedModel<T, any, any>[]> {\n const { sql, bindings } = this.unWrap();\n return this.execSqlWithSlaveHandling(\"read\", (dataSource) =>\n execSql(sql, bindings, dataSource, this.dbType, \"rows\", {\n sqlLiteOptions: {\n typeofModel: this.model,\n mode: \"fetch\",\n },\n }),\n );\n }\n\n /**\n * @description Executes the query and retrieves a single column from the results.\n * @param key - The column to retrieve from the results, must be a Model Column\n */\n async pluck<K extends ModelKey<T>>(key: K): Promise<PluckReturnType<T, K>> {\n const result = (await this.many()) as T[];\n return result.map(\n (item) => item[key as keyof typeof item],\n ) as PluckReturnType<T, K>;\n }\n\n /**\n * @description Executes the query and retrieves a single result.\n */\n async one(): Promise<AnnotatedModel<T, any, any> | null> {\n const result = (await this.limit(1).many()) as AnnotatedModel<T, {}>[];\n if (!result || !result.length) {\n return null;\n }\n\n return result[0];\n }\n\n /**\n * @alias one\n */\n async first(): Promise<AnnotatedModel<T, any, any> | null> {\n return this.one();\n }\n\n /**\n * @description Executes the query and retrieves the first result. Fail if no result is found.\n */\n async oneOrFail(): Promise<AnnotatedModel<T, any, any>> {\n const model = await this.one();\n if (!model) {\n throw new HysteriaError(\n \"SqlDataSource::query::oneOrFail\",\n \"ROW_NOT_FOUND\",\n );\n }\n\n return model;\n }\n\n /**\n * @alias oneOrFail\n */\n async firstOrFail(): Promise<AnnotatedModel<T, any, any>> {\n return this.oneOrFail();\n }\n\n /**\n * @description Executes the query and returns a node readable stream.\n * @description If used by a model query builder, it will serialize the models and apply the hooks and relations.\n * @postgres needs the pg-query-stream package in order to work\n * @throws If using postgres and the `pg-query-stream` package is not installed\n */\n async stream<M extends Model = T>(\n options: StreamOptions = {},\n ): Promise<PassThrough & AsyncGenerator<AnnotatedModel<M, {}, {}>>> {\n const { sql, bindings } = this.unWrap();\n return this.execSqlWithSlaveHandling(\"read\", async (dataSource) => {\n const stream = await execSqlStreaming(\n sql,\n bindings,\n dataSource,\n options,\n {\n onData: (passThrough, row) => {\n passThrough.write(row);\n },\n },\n );\n\n return stream as PassThrough & AsyncGenerator<AnnotatedModel<M, {}, {}>>;\n });\n }\n\n /**\n * @description Chunks the query into smaller queries, it returns a generator of the chunks\n * @description It will continue to yield chunks until the query returns no results\n * @description Useful for large queries that need to be processed in chunks\n * @warning overrides limit and offset set before in the query builder\n * @param chunkSize - The size of the chunk\n * @returns a generator of the chunks\n * @example\n * const chunks = await queryBuilder.chunk(100);\n * // first chunk\n * const firstChunk = await chunks.next();\n * console.log(firstChunk.value);\n * // second chunk\n * const secondChunk = await chunks.next();\n * console.log(secondChunk.value);\n * // third chunk\n * const thirdChunk = await chunks.next();\n * console.log(thirdChunk.value);\n *\n * @example\n * const chunkSize = 3;\n * const chunks = [];\n * const query = sql.query(\"users\").orderBy(\"name\", \"asc\");\n * for await (const chunk of sql.chunk(chunkSize)) {\n * chunks.push(chunk);\n * }\n *\n * console.log(chunks);\n */\n async *chunk(chunkSize: number) {\n let offset = 0;\n\n while (true) {\n const models = await this.limit(chunkSize).offset(offset).many();\n if (!models.length) {\n break;\n }\n\n offset += models.length;\n yield models;\n }\n }\n\n /**\n * @description Executes the query and retrieves multiple paginated results.\n * @description Overrides the limit and offset clauses in order to paginate the results.\n * @description Allows to avoid offset clause that can be inefficient for large datasets\n * @description If using a model query builder, primary key is used as discriminator by default\n * @param options - The options for the paginate with cursor\n * @param options.discriminator - The discriminator to use for the paginate with Cursor pagination\n * @param options.operator - The operator to use for the paginate with Cursor pagination\n * @param options.orderBy - The order by to use for the paginate with Cursor pagination\n * @param cursor - The cursor to use for the paginate with Cursor pagination\n * @warning If no order by clause is present in the query, the query will add an order by clause to the query `orderBy(discriminator, \"asc\")`\n * @returns the pagination metadata and the cursor for the next page\n */\n async paginateWithCursor<K extends ModelKey<T>>(\n limit: number,\n options: PaginateWithCursorOptions<T, K>,\n cursor?: Cursor<T, K>,\n ): Promise<[CursorPaginatedData<T>, Cursor<T, K>]> {\n const countQueryBuilder = this.clone();\n\n if (!this.orderByNodes.length) {\n this.orderBy(options.discriminator, options.orderBy || \"asc\");\n }\n\n if (cursor) {\n this.where(cursor.key, options.operator || \">\", cursor.value);\n }\n\n this.limit(limit);\n\n const data = await this.many();\n const count = await countQueryBuilder.getCount();\n\n const lastItem = data[data.length - 1];\n const lastItemValue = lastItem ? lastItem[options.discriminator] : null;\n const paginationMetadata = getCursorPaginationMetadata(limit, count);\n\n return [\n {\n paginationMetadata: paginationMetadata,\n data,\n },\n {\n key: options.discriminator,\n value: lastItemValue,\n },\n ];\n }\n\n /**\n * @description Selects a subquery, subquery must return a single column\n */\n selectSubQuery(\n cbOrQueryBuilder: ((subQuery: QueryBuilder<T>) => void) | QueryBuilder<any>,\n alias: string,\n ): this {\n if (typeof cbOrQueryBuilder === \"function\") {\n const subQuery = new QueryBuilder<T>(this.model, this.sqlDataSource);\n cbOrQueryBuilder(subQuery);\n this.selectNodes.push(\n new SelectNode(subQuery.extractQueryNodes(), alias),\n );\n return this;\n }\n\n this.selectNodes.push(\n new SelectNode(cbOrQueryBuilder.extractQueryNodes(), alias),\n );\n return this;\n }\n\n /**\n * @description Locks the table for update\n * @param skipLocked - If true, the query will skip locked rows\n * @sqlite does not support skipping locked rows, it will be ignored\n */\n lockForUpdate(\n options: { skipLocked?: boolean; noWait?: boolean } = {},\n ): this {\n this.lockQueryNodes.push(\n new LockNode(\"for_update\", options.skipLocked, options.noWait),\n );\n return this;\n }\n\n /**\n * @description Locks the table for share\n * @param skipLocked - If true, the query will skip locked rows\n * @sqlite does not support skipping locked rows, it will be ignored\n */\n forShare(options: { skipLocked?: boolean; noWait?: boolean } = {}): this {\n this.lockQueryNodes.push(\n new LockNode(\"for_share\", options.skipLocked, options.noWait),\n );\n return this;\n }\n\n /**\n * @description Adds a UNION to the query.\n */\n union(query: string, bindings?: any[]): this;\n union(cb: UnionCallBack<T>): this;\n union(queryBuilderOrCb: UnionCallBack<any> | string): this {\n if (typeof queryBuilderOrCb === \"string\") {\n this.unionNodes.push(new UnionNode(queryBuilderOrCb));\n return this;\n }\n\n const queryBuilder =\n queryBuilderOrCb instanceof QueryBuilder\n ? queryBuilderOrCb\n : queryBuilderOrCb(new QueryBuilder(this.model, this.sqlDataSource));\n\n const nodes = queryBuilder.extractQueryNodes();\n this.unionNodes.push(new UnionNode(nodes));\n return this;\n }\n\n /**\n * @description Adds a UNION ALL to the query.\n */\n unionAll(query: string, bindings?: any[]): this;\n unionAll(cb: UnionCallBack<T>): this;\n unionAll(queryBuilder: QueryBuilder<any>): this;\n unionAll(\n queryBuilderOrCb: UnionCallBack<any> | QueryBuilder<any> | string,\n ): this {\n if (typeof queryBuilderOrCb === \"string\") {\n this.unionNodes.push(new UnionNode(queryBuilderOrCb, true));\n return this;\n }\n\n const queryBuilder =\n queryBuilderOrCb instanceof QueryBuilder\n ? queryBuilderOrCb\n : queryBuilderOrCb(new QueryBuilder(this.model, this.sqlDataSource));\n\n const nodes = queryBuilder.extractQueryNodes();\n this.unionNodes.push(new UnionNode(nodes, true));\n return this;\n }\n\n /**\n * @description Increments the value of a column by a given amount\n * @typeSafe - In typescript, only numeric columns of the model will be accepted if using a Model\n * @default value + 1\n * @returns the number of affected rows\n */\n async increment(column: string, value: number): Promise<number>;\n async increment(column: NumberModelKey<T>, value: number): Promise<number>;\n async increment(\n column: NumberModelKey<T> | string,\n value: number = 1,\n ): Promise<number> {\n return this.update({\n [column as string]: this.sqlDataSource.rawStatement(\n `${column as string} + ${value}`,\n ),\n });\n }\n\n /**\n * @description Decrements the value of a column by a given amount\n * @typeSafe - In typescript, only numeric columns of the model will be accepted if using a Model\n * @default value - 1\n * @returns the number of affected rows\n */\n async decrement(column: string, value: number): Promise<number>;\n async decrement(column: NumberModelKey<T>, value: number): Promise<number>;\n async decrement(\n column: NumberModelKey<T> | string,\n value: number = 1,\n ): Promise<number> {\n return this.update({\n [column as string]: this.sqlDataSource.rawStatement(\n `${column as string} - ${value}`,\n ),\n });\n }\n\n /**\n * @description Executes the query and retrieves the count of results, it ignores all select, group by, order by, limit and offset clauses if they are present.\n */\n async getCount(column: string = \"*\"): Promise<number> {\n this.clearForFunctions();\n this.annotate(\"count\", column, \"total\");\n const result = await this.one();\n return result ? coerceToNumber(result[\"total\" as keyof typeof result]) : 0;\n }\n\n /**\n * @description Executes the query and retrieves the maximum value of a column, it ignores all select, group by, order by, limit and offset clauses if they are present.\n */\n async getMax(column: string): Promise<number> {\n this.clearForFunctions();\n this.annotate(\"max\", column, \"total\");\n const result = await this.one();\n return result ? coerceToNumber(result[\"total\" as keyof typeof result]) : 0;\n }\n\n /**\n * @description Executes the query and retrieves the minimum value of a column, it ignores all select, group by, order by, limit and offset clauses if they are present.\n */\n async getMin(column: string): Promise<number> {\n this.clearForFunctions();\n this.annotate(\"min\", column, \"total\");\n const result = await this.one();\n return result ? coerceToNumber(result[\"total\" as keyof typeof result]) : 0;\n }\n\n /**\n * @description Executes the query and retrieves the average value of a column, it ignores all select, group by, order by, limit and offset clauses if they are present.\n */\n async getAvg(column: string): Promise<number> {\n this.clearForFunctions();\n this.annotate(\"avg\", column, \"total\");\n const result = await this.one();\n return result ? coerceToNumber(result[\"total\" as keyof typeof result]) : 0;\n }\n\n /**\n * @description Executes the query and retrieves the sum of a column, it ignores all select, group by, order by, limit and offset clauses if they are present.\n */\n async getSum(column: string): Promise<number> {\n this.clearForFunctions();\n this.annotate(\"sum\", column, \"total\");\n const result = await this.one();\n return result ? coerceToNumber(result[\"total\" as keyof typeof result]) : 0;\n }\n\n /**\n * @description Executes the query and retrieves multiple paginated results.\n * @description Overrides the limit and offset clauses in order to paginate the results.\n */\n async paginate(page: number, perPage: number): Promise<PaginatedData<T>> {\n if (typeof page !== \"number\" || typeof perPage !== \"number\") {\n logger.warn(\n `${this.model.name}::paginate Non numeric values provided to \\`paginate\\``,\n );\n }\n\n const countQueryBuilder = this.clone();\n const paginatedQuery = this.limit(perPage).offset((page - 1) * perPage);\n\n const [models, total] = await this.executePaginateQueries(\n () => paginatedQuery.many(),\n () => countQueryBuilder.getCount(\"*\"),\n );\n\n const paginationMetadata = getPaginationMetadata(page, perPage, total);\n\n return {\n paginationMetadata,\n data: models,\n } as PaginatedData<T>;\n }\n\n /**\n * @description Overrides the from clause in the query.\n */\n from<S extends string>(table: TableFormat<S>, alias?: string): this;\n from(cb: (qb: QueryBuilder<T>) => void, alias: string): this;\n from<S extends string>(\n tableOrCb: TableFormat<S> | ((qb: QueryBuilder<T>) => void),\n maybeAlias?: string,\n ): this {\n if (typeof tableOrCb === \"function\") {\n if (!maybeAlias) {\n throw new HysteriaError(\n \"QueryBuilder::from\",\n \"MISSING_ALIAS_FOR_SUBQUERY\",\n );\n }\n\n const subQueryBuilder = new QueryBuilder<T>(\n this.model,\n this.sqlDataSource,\n );\n\n tableOrCb(subQueryBuilder);\n const subQueryNodes = subQueryBuilder.extractQueryNodes();\n this.fromNode = new FromNode(subQueryNodes, maybeAlias);\n return this;\n }\n\n this.fromNode = new FromNode(tableOrCb, maybeAlias);\n return this;\n }\n\n /**\n * @description Adds a CTE to the query using a callback to build the subquery.\n */\n with(alias: string, cb: (qb: QueryBuilder<T>) => void): this {\n const subQuery = new QueryBuilder<T>(this.model, this.sqlDataSource);\n cb(subQuery);\n const nodes = subQuery.extractQueryNodes();\n this.withNodes.push(new WithNode(\"normal\", alias, nodes));\n return this;\n }\n\n /**\n * @description Adds a recursive CTE to the query using a callback to build the subquery.\n * @mssql not supported\n */\n withRecursive(alias: string, cb: (qb: QueryBuilder<T>) => void): this {\n const subQuery = new QueryBuilder<T>(this.model, this.sqlDataSource);\n cb(subQuery);\n const nodes = subQuery.extractQueryNodes();\n this.withNodes.push(new WithNode(\"recursive\", alias, nodes));\n return this;\n }\n\n /**\n * @description Adds a materialized CTE to the query using a callback to build the subquery.\n * @postgres only\n * @throws HysteriaError if the database type is not postgres\n */\n withMaterialized(alias: string, cb: (qb: QueryBuilder<T>) => void): this {\n if (this.dbType !== \"postgres\" && this.dbType !== \"cockroachdb\") {\n throw new HysteriaError(\n \"QueryBuilder::withMaterialized\",\n \"MATERIALIZED_CTE_NOT_SUPPORTED\",\n new Error(\"MATERIALIZED CTE is only supported by postgres\"),\n );\n }\n\n const subQuery = new QueryBuilder<T>(this.model, this.sqlDataSource);\n cb(subQuery);\n const nodes = subQuery.extractQueryNodes();\n this.withNodes.push(new WithNode(\"materialized\", alias, nodes));\n return this;\n }\n\n /**\n * @description Insert record into a table, you can use raw statements in the data object for literal references to other columns\n * @param returning - The columns to return from the query, only supported by postgres and cockroachdb - default is \"*\"\n * @returns raw driver response\n */\n async insert(\n data: Record<string, WriteQueryParam>,\n returning?: string[],\n ): Promise<T> {\n const { columns: preparedColumns, values: preparedValues } =\n await this.interpreterUtils.prepareColumns(\n Object.keys(data),\n Object.values(data),\n \"insert\",\n );\n\n const insertObject = Object.fromEntries(\n preparedColumns.map((column, index) => [column, preparedValues[index]]),\n );\n\n this.insertNode = new InsertNode(this.fromNode, [insertObject], returning);\n const { sql, bindings } = this.astParser.parse([this.insertNode]);\n\n const dataSource = await this.getSqlDataSource(\"write\");\n const rows = await execSql(sql, bindings, dataSource, this.dbType, \"rows\", {\n sqlLiteOptions: {\n typeofModel: this.model,\n mode: \"insertOne\",\n models: [data as unknown as T],\n },\n });\n\n return Array.isArray(rows) && rows.length ? rows[0] : rows;\n }\n\n /**\n * @description Insert multiple records into a table\n * @param returning - The columns to return from the query, only supported by postgres and cockroachdb - default is \"*\"\n * @returns raw driver response\n * @oracledb may do multiple inserts with auto-generated identity columns\n */\n async insertMany(\n data: Record<string, WriteQueryParam>[],\n returning?: string[],\n ): Promise<T[]> {\n if (!data.length) {\n return [];\n }\n\n const models = await Promise.all(\n data.map(async (model) => {\n const { columns: preparedColumns, values: preparedValues } =\n await this.interpreterUtils.prepareColumns(\n Object.keys(model),\n Object.values(model),\n \"insert\",\n );\n\n return Object.fromEntries(\n preparedColumns.map((column, index) => [\n column,\n preparedValues[index],\n ]),\n );\n }),\n );\n\n this.insertNode = new InsertNode(this.fromNode, models, returning);\n const { sql, bindings } = this.astParser.parse([this.insertNode]);\n\n const dataSource = await this.getSqlDataSource(\"write\");\n return execSql(sql, bindings, dataSource, this.dbType, \"rows\", {\n sqlLiteOptions: {\n typeofModel: this.model,\n mode: \"insertMany\",\n models: models as T[],\n },\n });\n }\n\n /**\n * @description Updates or creates a new record using upsert functionality\n * @param data The data to insert or update\n * @param searchCriteria The criteria to search for existing records\n * @param options Upsert options including updateOnConflict and returning columns\n * @returns The upserted record\n */\n async upsert<O extends Record<string, any>>(\n data: O,\n searchCriteria: Partial<O>,\n options: UpsertOptionsRawBuilder = {\n updateOnConflict: true,\n },\n ): Promise<T[]> {\n const columnsToUpdate = Object.keys(data);\n const conflictColumns = Object.keys(searchCriteria);\n const { columns: preparedColumns, values: preparedValues } =\n await this.interpreterUtils.prepareColumns(\n Object.keys(data),\n Object.values(data),\n \"insert\",\n );\n\n const insertObject = Object.fromEntries(\n preparedColumns.map((column, index) => [column, preparedValues[index]]),\n );\n\n // MSSQL requires MERGE statement for upsert operations\n if (this.sqlDataSource.type === \"mssql\") {\n return this.executeMssqlMergeRaw(\n [insertObject],\n conflictColumns,\n columnsToUpdate,\n options,\n [data],\n );\n }\n\n const { sql, bindings } = this.astParser.parse([\n new InsertNode(\n new FromNode(this.model.table),\n [insertObject],\n undefined,\n true,\n ),\n new OnDuplicateNode(\n this.model.table,\n conflictColumns,\n columnsToUpdate,\n (options.updateOnConflict ?? true) ? \"update\" : \"ignore\",\n options.returning as string[],\n ),\n ]);\n\n const dataSource = await this.getSqlDataSource(\"write\");\n const rawResult = await execSql(\n sql,\n bindings,\n dataSource,\n this.dbType,\n \"rows\",\n {\n sqlLiteOptions: {\n typeofModel: this.model,\n mode: \"raw\",\n models: [data as unknown as T],\n },\n },\n );\n\n return (Array.isArray(rawResult) ? rawResult : [rawResult]) as T[];\n }\n\n /**\n * @description Updates or creates multiple records using upsert functionality\n * @param conflictColumns The columns to check for conflicts\n * @param columnsToUpdate The columns to update on conflict\n * @param data Array of data objects to insert or update\n * @param options Upsert options including updateOnConflict and returning columns\n */\n async upsertMany<O extends Record<string, any>>(\n conflictColumns: string[],\n columnsToUpdate: string[],\n data: O[],\n options: UpsertOptionsRawBuilder = {\n updateOnConflict: true,\n },\n ): Promise<T[]> {\n const insertObjects: Record<string, any>[] = [];\n\n await Promise.all(\n data.map(async (record) => {\n const { columns: preparedColumns, values: preparedValues } =\n await this.interpreterUtils.prepareColumns(\n Object.keys(record),\n Object.values(record),\n \"insert\",\n );\n\n const insertObject = Object.fromEntries(\n preparedColumns.map((column, index) => [\n column,\n preparedValues[index],\n ]),\n );\n\n insertObjects.push(insertObject);\n }),\n );\n\n // MSSQL requires MERGE statement for upsert operations\n if (this.sqlDataSource.type === \"mssql\") {\n return this.executeMssqlMergeRaw(\n insertObjects,\n conflictColumns,\n columnsToUpdate,\n options,\n data,\n );\n }\n\n const { sql, bindings } = this.astParser.parse([\n new InsertNode(\n new FromNode(this.model.table),\n insertObjects,\n undefined,\n true,\n ),\n new OnDuplicateNode(\n this.model.table,\n conflictColumns,\n columnsToUpdate,\n (options.updateOnConflict ?? true) ? \"update\" : \"ignore\",\n options.returning as string[],\n ),\n ]);\n\n const dataSource = await this.getSqlDataSource(\"write\");\n const rawResult = await execSql(\n sql,\n bindings,\n dataSource,\n this.dbType,\n \"rows\",\n {\n sqlLiteOptions: {\n typeofModel: this.model,\n mode: \"raw\",\n models: data as unknown as T[],\n },\n },\n );\n return (Array.isArray(rawResult)\n ? rawResult\n : [rawResult]) as unknown as T[];\n }\n\n /**\n * @description Executes a MERGE statement for MSSQL upsert operations (raw query builder)\n */\n private async executeMssqlMergeRaw<O extends Record<string, any>>(\n insertObjects: Record<string, any>[],\n conflictColumns: string[],\n columnsToUpdate: string[],\n options: UpsertOptionsRawBuilder,\n data: O[],\n ): Promise<T[]> {\n if (!insertObjects.length) {\n return [];\n }\n\n const columns = Object.keys(insertObjects[0]);\n const formattedTable = this.interpreterUtils.formatStringColumn(\n \"mssql\",\n this.model.table,\n );\n\n const formatCol = (col: string) =>\n this.interpreterUtils.formatStringColumn(\"mssql\", col);\n\n // Build source values for MERGE\n const bindings: any[] = [];\n const sourceRows = insertObjects.map((obj) => {\n const rowValues = columns.map((col) => {\n bindings.push(obj[col]);\n return `@${bindings.length}`;\n });\n return `select ${rowValues.join(\", \")}`;\n });\n\n const sourceColumns = columns.map(formatCol).join(\", \");\n const sourceQuery = sourceRows.join(\" union all \");\n\n // Build ON condition for conflict columns\n const onCondition = conflictColumns\n .map((col) => `target.${formatCol(col)} = source.${formatCol(col)}`)\n .join(\" and \");\n\n // Build UPDATE SET clause\n const updateSet = columnsToUpdate\n .filter((col) => !conflictColumns.includes(col))\n .map((col) => `target.${formatCol(col)} = source.${formatCol(col)}`)\n .join(\", \");\n\n // Build INSERT columns and values\n const insertCols = columns.map(formatCol).join(\", \");\n const insertVals = columns\n .map((col) => `source.${formatCol(col)}`)\n .join(\", \");\n\n // Build OUTPUT clause\n const outputCols =\n options.returning && options.returning.length\n ? options.returning\n .map((col) => `inserted.${formatCol(col)}`)\n .join(\", \")\n : columns.map((col) => `inserted.${formatCol(col)}`).join(\", \");\n\n // Construct MERGE statement\n const updateOnConflict = options.updateOnConflict ?? true;\n const whenMatchedClause =\n updateOnConflict && updateSet\n ? `when matched then update set ${updateSet}`\n : \"\";\n\n const sql =\n `merge into ${formattedTable} as target ` +\n `using (${sourceQuery}) as source (${sourceColumns}) ` +\n `on ${onCondition} ` +\n `${whenMatchedClause} ` +\n `when not matched then insert (${insertCols}) values (${insertVals}) ` +\n `output ${outputCols};`;\n\n const dataSource = await this.getSqlDataSource(\"write\");\n const rawResult = await execSql(\n sql,\n bindings,\n dataSource,\n this.dbType,\n \"rows\",\n {\n sqlLiteOptions: {\n typeofModel: this.model,\n mode: \"raw\",\n models: data as unknown as T[],\n },\n },\n );\n\n return (Array.isArray(rawResult)\n ? rawResult\n : [rawResult]) as unknown as T[];\n }\n\n /**\n * @description Updates records from a table, you can use raw statements in the data object for literal references to other columns\n * @returns the number of affected rows\n */\n async update(data: Record<string, WriteQueryParam>): Promise<number> {\n const rawColumns = Object.keys(data);\n const rawValues = Object.values(data);\n\n const { columns, values } = await this.interpreterUtils.prepareColumns(\n rawColumns,\n rawValues,\n \"update\",\n );\n\n this.updateNode = new UpdateNode(this.fromNode, columns, values);\n const { sql, bindings } = this.astParser.parse([\n this.updateNode,\n ...this.whereNodes,\n ...this.joinNodes,\n ]);\n\n const dataSource = await this.getSqlDataSource(\"write\");\n return execSql(sql, bindings, dataSource, this.dbType, \"affectedRows\", {\n sqlLiteOptions: { typeofModel: this.model, mode: \"affectedRows\" },\n });\n }\n\n /**\n * @description Deletes all records from a table\n * @warning This operation does not trigger any hook\n */\n async truncate(): Promise<void> {\n this.truncateNode = new TruncateNode(this.fromNode);\n const { sql, bindings } = this.astParser.parse([this.truncateNode]);\n const dataSource = await this.getSqlDataSource(\"write\");\n await execSql(sql, bindings, dataSource, this.dbType, \"rows\");\n }\n\n /**\n * @description Deletes records from a table\n * @returns the number of affected rows\n */\n async delete(): Promise<number> {\n this.deleteNode = new DeleteNode(this.fromNode);\n const { sql, bindings } = this.astParser.parse([\n this.deleteNode,\n ...this.whereNodes,\n ...this.joinNodes,\n ]);\n\n const dataSource = await this.getSqlDataSource(\"write\");\n return execSql(sql, bindings, dataSource, this.dbType, \"affectedRows\", {\n sqlLiteOptions: {\n typeofModel: this.model,\n mode: \"affectedRows\",\n },\n });\n }\n\n /**\n * @description Soft deletes records from a table\n * @default column - 'deletedAt'\n * @default value - The current date and time in UTC timezone in the format \"YYYY-MM-DD HH:mm:ss\"\n * @returns the number of affected rows\n */\n async softDelete(\n options: Omit<SoftDeleteOptions<T>, \"ignoreBeforeDeleteHook\"> = {},\n ): Promise<number> {\n const { column = \"deletedAt\", value = baseSoftDeleteDate() } =\n options || {};\n\n const { columns, values } = await this.interpreterUtils.prepareColumns(\n [column as string],\n [value],\n \"update\",\n );\n\n this.updateNode = new UpdateNode(this.fromNode, columns, values);\n const { sql, bindings } = this.astParser.parse([\n this.updateNode,\n ...this.whereNodes,\n ...this.joinNodes,\n ]);\n\n const dataSource = await this.getSqlDataSource(\"write\");\n return execSql(sql, bindings, dataSource, this.dbType, \"affectedRows\", {\n sqlLiteOptions: {\n typeofModel: this.model,\n mode: \"affectedRows\",\n },\n });\n }\n\n /**\n * @description Returns the query with the parameters bound to the query\n */\n toQuery(): string {\n const { sql, bindings } = this.unWrap();\n return bindParamsIntoQuery(sql, bindings);\n }\n\n /**\n * @description Returns the query with database driver placeholders and the params\n */\n unWrap(): ReturnType<typeof AstParser.prototype.parse> {\n if (!this.selectNodes.length) {\n this.selectNodes = [new SelectNode(`*`)];\n }\n\n const { sql, bindings } = this.astParser.parse(this.extractQueryNodes());\n\n const formattedQuery = formatQuery(this.sqlDataSource, sql);\n\n const finalQuery = this.withQuery\n ? `${this.withQuery} ${formattedQuery}`\n : formattedQuery;\n\n return {\n sql: finalQuery,\n bindings: [...(bindings || [])],\n };\n }\n\n /**\n * @description Returns a deep clone of the query builder instance.\n */\n clone(): this {\n const qb = new QueryBuilder<T>(this.model, this.sqlDataSource) as any;\n\n // select / from / distinct (from SelectQueryBuilder)\n qb.dbType = this.dbType;\n qb.modelSelectedColumns = deepCloneNode(this.modelSelectedColumns);\n qb.modelAnnotatedColumns = deepCloneNode(this.modelAnnotatedColumns);\n qb.distinctNode = deepCloneNode(this.distinctNode);\n qb.distinctOnNode = deepCloneNode(this.distinctOnNode);\n qb.selectNodes = deepCloneNode(this.selectNodes);\n qb.withQuery = deepCloneNode(this.withQuery);\n\n // join / where / group / having / order\n qb.joinNodes = deepCloneNode(this.joinNodes);\n qb.whereNodes = deepCloneNode(this.whereNodes);\n qb.groupByNodes = deepCloneNode(this.groupByNodes);\n qb.havingNodes = deepCloneNode(this.havingNodes);\n qb.orderByNodes = deepCloneNode(this.orderByNodes);\n\n // locks / unions / with\n qb.lockQueryNodes = deepCloneNode(this.lockQueryNodes);\n qb.unionNodes = deepCloneNode(this.unionNodes);\n qb.withNodes = deepCloneNode(this.withNodes);\n\n // from / limit / offset / flags\n qb.fromNode = deepCloneNode(this.fromNode);\n qb.limitNode = deepCloneNode(this.limitNode);\n qb.offsetNode = deepCloneNode(this.offsetNode);\n\n // flags\n qb.isNestedCondition = this.isNestedCondition;\n qb.mustRemoveAnnotations = this.mustRemoveAnnotations;\n\n return qb as this;\n }\n\n /**\n * @description Gives a fresh instance of the query builder\n */\n clear() {\n const qb = new QueryBuilder(this.model, this.sqlDataSource);\n if (this.fromNode.alias) {\n qb.from(qb.model.table, this.fromNode.alias);\n }\n\n return qb;\n }\n\n /**\n * @description Removes the lock query\n */\n clearLockQuery(): this {\n this.lockQueryNodes = [];\n return this;\n }\n\n /**\n * @description Removes any union query\n */\n clearUnionQuery(): this {\n this.unionNodes = [];\n return this;\n }\n\n /**\n * @description Removes any with query\n */\n clearWithQuery(): this {\n this.withNodes = [];\n return this;\n }\n\n extractQueryNodes(): QueryNode[] {\n if (!this.selectNodes.length) {\n this.selectNodes = [new SelectNode(`*`)];\n }\n\n if (this.insertNode) {\n return [this.insertNode, this.onDuplicateNode].filter(\n Boolean,\n ) as QueryNode[];\n }\n\n if (this.updateNode) {\n return [\n this.updateNode,\n ...this.whereNodes,\n ...this.joinNodes,\n ...this.orderByNodes,\n this.limitNode,\n ].filter(Boolean) as QueryNode[];\n }\n\n if (this.deleteNode) {\n return [\n this.deleteNode,\n ...this.whereNodes,\n ...this.joinNodes,\n ...this.orderByNodes,\n this.limitNode,\n ].filter(Boolean) as QueryNode[];\n }\n\n if (this.truncateNode) {\n return [this.truncateNode];\n }\n\n // Read case\n return [\n ...this.withNodes,\n this.distinctNode,\n this.distinctOnNode,\n ...this.selectNodes,\n this.fromNode,\n ...this.joinNodes,\n ...this.whereNodes,\n ...this.groupByNodes,\n ...this.havingNodes,\n ...this.orderByNodes,\n this.limitNode,\n this.offsetNode,\n ...this.lockQueryNodes,\n ...this.unionNodes,\n ].filter(Boolean) as QueryNode[];\n }\n\n protected clearForFunctions(): this {\n this.clearSelect();\n this.clearGroupBy();\n this.clearOrderBy();\n this.clearLimit();\n this.clearOffset();\n return this;\n }\n\n /**\n * @description Makes a many query and returns the time that took to execute that query\n */\n private async manyWithPerformance(\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ): Promise<{\n data: AnnotatedModel<T, any, any>[];\n time: number;\n }> {\n const [time, data] = await withPerformance(\n this.many.bind(this),\n returnType,\n )();\n\n return {\n data,\n time: Number(time),\n };\n }\n\n /**\n * @description Makes a one query and returns the time that took to execute that query\n */\n private async oneWithPerformance(\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ): Promise<{\n data: AnnotatedModel<T, any, any> | null;\n time: number;\n }> {\n const [time, data] = await withPerformance(\n this.one.bind(this),\n returnType,\n )();\n\n return {\n data,\n time: Number(time),\n };\n }\n\n /**\n * @alias oneWithPerformance\n */\n private async firstWithPerformance(\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n return this.oneWithPerformance(returnType);\n }\n\n /**\n * @alias oneOrFailWithPerformance\n */\n private async firstOrFailWithPerformance(\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n return this.oneOrFailWithPerformance(returnType);\n }\n\n private async paginateWithPerformance(\n page: number,\n perPage: number,\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, data] = await withPerformance(\n this.paginate.bind(this, page, perPage),\n returnType,\n )();\n\n return {\n data,\n time: Number(time),\n };\n }\n\n private async paginateWithCursorWithPerformance(\n page: number,\n options: PaginateWithCursorOptions<T, ModelKey<T>>,\n cursor?: Cursor<T, ModelKey<T>>,\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, data] = await withPerformance(\n this.paginateWithCursor.bind(this, page, options, cursor),\n returnType,\n )();\n\n return {\n data,\n time: Number(time),\n };\n }\n\n /**\n * @description Makes a one or fail query and returns the time that took to execute that query\n */\n private async oneOrFailWithPerformance(\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, data] = await withPerformance(\n this.oneOrFail.bind(this),\n returnType,\n )();\n\n return {\n data,\n time: Number(time),\n };\n }\n\n /**\n * @description Executes the query and returns true if the query returns at least one result, false otherwise.\n * @description Returns the time that took to execute the query\n */\n private async existsWithPerformance(\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ): Promise<{\n data: boolean;\n time: number;\n }> {\n const [time, data] = await withPerformance(\n this.exists.bind(this),\n returnType,\n )();\n return { data, time: Number(time) };\n }\n\n private async pluckWithPerformance(\n key: ModelKey<T>,\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, data] = await withPerformance(\n this.pluck.bind(this, key),\n returnType,\n )();\n\n return {\n data,\n time: Number(time),\n };\n }\n\n private async updateWithPerformance(\n data: Record<string, any>,\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, result] = await withPerformance(\n this.update.bind(this, data),\n returnType,\n )();\n\n return {\n data: result,\n time: Number(time),\n };\n }\n\n private async insertWithPerformance(\n data: Record<string, any>,\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, result] = await withPerformance(\n this.insert.bind(this, data),\n returnType,\n )();\n\n return {\n data: result,\n time: Number(time),\n };\n }\n\n private async insertManyWithPerformance(\n data: Record<string, any>[],\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, result] = await withPerformance(\n this.insertMany.bind(this, data),\n returnType,\n )();\n\n return {\n data: result,\n time: Number(time),\n };\n }\n\n private async softDeleteWithPerformance(\n options: Omit<SoftDeleteOptions<T>, \"ignoreBeforeDeleteHook\"> = {},\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, data] = await withPerformance(\n this.softDelete.bind(this, options),\n returnType,\n )();\n\n return {\n data,\n time: Number(time),\n };\n }\n\n private async deleteWithPerformance(\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, data] = await withPerformance(\n this.delete.bind(this),\n returnType,\n )();\n\n return {\n data,\n time: Number(time),\n };\n }\n\n private async truncateWithPerformance(\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, result] = await withPerformance(\n this.truncate.bind(this),\n returnType,\n )();\n\n return {\n data: result,\n time: Number(time),\n };\n }\n\n /**\n * @description Checks if the current context is an MSSQL transaction\n * @description MSSQL transactions can only handle one request at a time\n */\n protected isMssqlTransaction(): boolean {\n return (\n this.sqlDataSource.type === \"mssql\" && !!this.sqlDataSource.sqlConnection\n );\n }\n\n /**\n * @description Executes pagination queries, serializing them for MSSQL transactions\n */\n protected async executePaginateQueries<M, C>(\n modelsQuery: () => Promise<M>,\n countQuery: () => Promise<C>,\n ): Promise<[M, C]> {\n if (this.isMssqlTransaction()) {\n const models = await modelsQuery();\n const count = await countQuery();\n return [models, count];\n }\n\n return Promise.all([modelsQuery(), countQuery()]);\n }\n\n protected async getSqlDataSource(\n mode: \"read\" | \"write\",\n ): Promise<SqlDataSource> {\n if (!this.replicationMode) {\n if (mode === \"read\") {\n const slave = this.sqlDataSource.getSlave();\n return slave || this.sqlDataSource;\n }\n\n return this.sqlDataSource;\n }\n\n if (this.replicationMode === \"master\") {\n return this.sqlDataSource;\n }\n\n if (mode === \"write\") {\n return this.sqlDataSource;\n }\n\n const slave = this.sqlDataSource.getSlave();\n return slave || this.sqlDataSource;\n }\n\n /**\n * @description Executes SQL with slave failure handling\n * @param mode The operation mode (read or write)\n * @param operation The execSql operation to perform\n * @returns The result of the operation\n */\n protected async execSqlWithSlaveHandling<R>(\n mode: \"read\" | \"write\",\n operation: (dataSource: SqlDataSource) => Promise<R>,\n ): Promise<R> {\n const dataSource = await this.getSqlDataSource(mode);\n const isSlave = dataSource !== this.sqlDataSource;\n\n if (!isSlave) {\n return operation(dataSource);\n }\n\n try {\n return await operation(dataSource);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n const onSlaveFailure = this.sqlDataSource.getOnSlaveServerFailure();\n\n if (onSlaveFailure) {\n await onSlaveFailure(err, {\n host: dataSource.host,\n port: dataSource.port,\n username: dataSource.username,\n password: dataSource.password,\n database: dataSource.database,\n type: dataSource.getDbType(),\n });\n return await operation(this.sqlDataSource);\n }\n\n throw err;\n }\n }\n}\n","import crypto from \"node:crypto\";\nimport { PassThrough } from \"node:stream\";\nimport { HysteriaError } from \"../../../errors/hysteria_error\";\nimport { convertCase } from \"../../../utils/case_utils\";\nimport { withPerformance } from \"../../../utils/performance\";\nimport { SelectNode } from \"../../ast/query/node/select/basic_select\";\nimport type { SqlMethod } from \"../../ast/query/node/select/select_types\";\nimport { BaseValues, BinaryOperatorType } from \"../../ast/query/node/where\";\nimport { InterpreterUtils } from \"../../interpreter/interpreter_utils\";\nimport { Model } from \"../../models/model\";\nimport type {\n ModelKey,\n ModelRelation,\n} from \"../../models/model_manager/model_manager_types\";\nimport SqlModelManagerUtils from \"../../models/model_manager/model_manager_utils\";\nimport {\n CursorPaginatedData,\n getPaginationMetadata,\n PaginatedData,\n} from \"../../pagination\";\nimport {\n DeleteOptions,\n SoftDeleteOptions,\n} from \"../../query_builder/delete_query_builder_type\";\nimport { QueryBuilder } from \"../../query_builder/query_builder\";\nimport {\n Cursor,\n PaginateWithCursorOptions,\n RelationRetrieveMethod,\n SelectableColumn,\n StreamOptions,\n WriteQueryParam,\n} from \"../../query_builder/query_builder_types\";\nimport type { UpdateOptions } from \"../../query_builder/update_query_builder_types\";\nimport {\n deepCloneNode,\n remapSelectedColumnToFromAlias,\n} from \"../../resources/utils\";\nimport { serializeModel } from \"../../serializer\";\nimport { SqlDataSource } from \"../../sql_data_source\";\nimport { execSqlStreaming } from \"../../sql_runner/sql_runner\";\nimport { ColumnType } from \"../decorators/model_decorators_types\";\nimport { BaseModelMethodOptions, ModelWithoutRelations } from \"../model_types\";\nimport { ManyToMany } from \"../relations/many_to_many\";\nimport { Relation, RelationEnum } from \"../relations/relation\";\nimport type {\n AnnotatedModel,\n CommonSqlMethodReturnType,\n FetchHooks,\n ManyOptions,\n OneOptions,\n RelatedInstance,\n} from \"./model_query_builder_types\";\nimport type { RelationQueryBuilderType } from \"./relation_query_builder/relation_query_builder_types\";\n\nexport class ModelQueryBuilder<\n T extends Model,\n A extends Record<string, any> = {},\n R extends Record<string, any> = {},\n> extends QueryBuilder<T> {\n declare relation: Relation;\n protected sqlModelManagerUtils: SqlModelManagerUtils<T>;\n protected relationQueryBuilders: ModelQueryBuilder<any>[];\n protected modelSelectedColumns: string[];\n private modelColumnsMap: Map<string, ColumnType>;\n private modelColumnsDatabaseNames: Map<string, string>;\n protected limitValue?: number;\n protected offsetValue?: number;\n\n // @ts-expect-error\n override performance = {\n many: this.manyWithPerformance.bind(this),\n one: this.oneWithPerformance.bind(this),\n oneOrFail: this.oneOrFailWithPerformance.bind(this),\n first: this.firstWithPerformance.bind(this),\n firstOrFail: this.firstOrFailWithPerformance.bind(this),\n paginate: this.paginateWithPerformance.bind(this),\n exists: this.existsWithPerformance.bind(this),\n paginateWithCursor: this.paginateWithCursorWithPerformance.bind(this),\n truncate: this.truncateWithPerformance.bind(this),\n delete: this.deleteWithPerformance.bind(this),\n update: this.updateWithPerformance.bind(this),\n softDelete: this.softDeleteWithPerformance.bind(this),\n pluck: this.pluckWithPerformance.bind(this),\n };\n\n constructor(model: typeof Model, sqlDataSource: SqlDataSource) {\n super(model, sqlDataSource);\n this.sqlModelManagerUtils = new SqlModelManagerUtils<T>(\n model,\n this.dbType,\n sqlDataSource,\n );\n\n this.relationQueryBuilders = [];\n this.modelSelectedColumns = [];\n this.modelColumnsMap = new Map<string, ColumnType>();\n this.modelColumnsDatabaseNames = new Map<string, string>();\n const modelColumns = this.model.getColumns();\n modelColumns.forEach((column) => {\n this.modelColumnsMap.set(column.databaseName, column);\n this.modelColumnsDatabaseNames.set(\n column.databaseName,\n column.columnName,\n );\n });\n }\n\n /**\n * @description Returns true if the query builder is a relation query builder, this changes the behavior of the query builder like limit, offset, etc.\n * @internal\n */\n protected get isRelationQueryBuilder(): boolean {\n return !!this.relation;\n }\n\n /**\n * @description Creates a new ModelQueryBuilder instance from a model. Will use the main connection to the database by default.\n */\n static from(\n model: typeof Model,\n options: BaseModelMethodOptions = {},\n ): ModelQueryBuilder<InstanceType<typeof model>> {\n if (options.connection) {\n return new ModelQueryBuilder(model, options.connection as SqlDataSource);\n }\n\n if (options.trx) {\n return new ModelQueryBuilder(model, options.trx.sql as SqlDataSource);\n }\n\n return new ModelQueryBuilder(model, model.sqlInstance);\n }\n\n async one(options: OneOptions = {}): Promise<AnnotatedModel<T, A, R> | null> {\n const result = await this.limit(1).many(options);\n if (!result || !result.length) {\n return null;\n }\n\n return result[0];\n }\n\n async first(options?: OneOptions): Promise<AnnotatedModel<T, A, R> | null> {\n return this.one(options);\n }\n\n async oneOrFail(options?: {\n ignoreHooks?: OneOptions[\"ignoreHooks\"] & { customError?: Error };\n }): Promise<AnnotatedModel<T, A, R>> {\n const model = await this.one(options);\n if (!model) {\n throw new HysteriaError(this.model.name + \"::oneOrFail\", \"ROW_NOT_FOUND\");\n }\n\n return model as AnnotatedModel<T, A, R>;\n }\n\n async firstOrFail(options?: {\n ignoreHooks?: OneOptions[\"ignoreHooks\"] & { customError?: Error };\n }): Promise<AnnotatedModel<T, A, R>> {\n return this.oneOrFail(options);\n }\n\n override async many(\n options: ManyOptions = {},\n ): Promise<AnnotatedModel<T, A, R>[]> {\n !(options.ignoreHooks as string[])?.includes(\"beforeFetch\") &&\n (await this.model.beforeFetch?.(this));\n const rows = await super.many();\n const models = rows.map((row) => {\n return this.addAdditionalColumnsToModel(row, this.model);\n });\n\n if (!models.length) {\n return [];\n }\n\n const serializedModels = await serializeModel(\n models as T[],\n this.model,\n this.modelSelectedColumns,\n this.modelAnnotatedColumns,\n this.mustRemoveAnnotations,\n );\n\n if (!serializedModels) {\n return [];\n }\n\n const serializedModelsArray = Array.isArray(serializedModels)\n ? serializedModels\n : [serializedModels];\n\n if (!(options.ignoreHooks as string[])?.includes(\"afterFetch\")) {\n await this.model.afterFetch?.(serializedModelsArray);\n }\n\n if (this.relationQueryBuilders.length) {\n await this.processRelationsRecursively(serializedModelsArray);\n }\n\n return serializedModelsArray as unknown as AnnotatedModel<T, A, R>[];\n }\n\n override async *chunk(\n chunkSize: number,\n options: ManyOptions = {},\n ): AsyncGenerator<AnnotatedModel<T, A, R>[]> {\n let offset = 0;\n\n while (true) {\n const models = await this.limit(chunkSize).offset(offset).many(options);\n if (!models.length) {\n break;\n }\n\n yield models;\n offset += models.length;\n }\n }\n\n // @ts-expect-error\n override async stream(\n options: ManyOptions & StreamOptions = {},\n ): Promise<PassThrough & AsyncGenerator<AnnotatedModel<T, A, R>>> {\n !(options.ignoreHooks as string[])?.includes(\"beforeFetch\") &&\n (await this.model.beforeFetch?.(this));\n\n const { sql, bindings } = this.unWrap();\n const dataSource = await this.getSqlDataSource(\"read\");\n const stream = await execSqlStreaming(sql, bindings, dataSource, options, {\n onData: async (passThrough, row) => {\n const model = this.addAdditionalColumnsToModel(row, this.model);\n const serializedModel = await serializeModel(\n [model] as T[],\n this.model,\n this.modelSelectedColumns,\n this.modelAnnotatedColumns,\n this.mustRemoveAnnotations,\n );\n\n if (!serializedModel) {\n return;\n }\n\n if (!(options.ignoreHooks as string[])?.includes(\"afterFetch\")) {\n await this.model.afterFetch?.([serializedModel] as unknown as T[]);\n }\n\n if (this.relationQueryBuilders.length) {\n await this.processRelationsRecursively([serializedModel as T]);\n }\n\n passThrough.write(serializedModel);\n },\n });\n\n return stream as PassThrough & AsyncGenerator<AnnotatedModel<T, A, R>>;\n }\n\n override async paginateWithCursor<K extends ModelKey<T>>(\n page: number,\n options?: PaginateWithCursorOptions<T, K>,\n cursor?: Cursor<T, K>,\n ): Promise<[CursorPaginatedData<T, A, R>, Cursor<T, K>]> {\n if (!options) {\n if (!this.model.primaryKey) {\n throw new HysteriaError(\n this.model.name + \"::paginateWithCursor\",\n \"PRIMARY_KEY_NOT_FOUND\",\n );\n }\n\n options = {\n discriminator: this.model.primaryKey as K,\n };\n }\n\n return super.paginateWithCursor(page, options, cursor) as Promise<\n [CursorPaginatedData<T, A, R>, Cursor<T, K>]\n >;\n }\n\n /**\n * @description Inserts a new record into the database, it is not advised to use this method directly from the query builder if using a ModelQueryBuilder (`Model.query()`), use the `Model.insert` method instead.\n */\n // @ts-expect-error\n override async insert(\n ...args: Parameters<typeof this.model.insert>\n ): ReturnType<typeof this.model.insert> {\n return (this.model as any).insert(...args);\n }\n\n /**\n * @description Inserts multiple records into the database, it is not advised to use this method directly from the query builder if using a ModelQueryBuilder (`Model.query()`), use the `Model.insertMany` method instead.\n */\n // @ts-expect-error\n override async insertMany(\n ...args: Parameters<typeof this.model.insertMany>\n ): ReturnType<typeof this.model.insertMany> {\n return (this.model as any).insertMany(...args);\n }\n\n // @ts-expect-error\n override async update(\n data: Partial<ModelWithoutRelations<T>>,\n options: UpdateOptions = {},\n ): Promise<number> {\n if (!options.ignoreBeforeUpdateHook) {\n await this.model.beforeUpdate?.(this);\n }\n return super.update(data as Record<string, WriteQueryParam>);\n }\n\n override async softDelete(\n options: SoftDeleteOptions<T> = {},\n ): Promise<number> {\n const { ignoreBeforeUpdateHook = false } = options || {};\n !ignoreBeforeUpdateHook && (await this.model.beforeUpdate?.(this));\n return super.softDelete(options);\n }\n\n async delete(options: DeleteOptions = {}): Promise<number> {\n if (!options.ignoreBeforeDeleteHook) {\n await this.model.beforeDelete?.(this);\n }\n return super.delete();\n }\n\n override async getCount(\n column: string = \"*\",\n options: { ignoreHooks: boolean } = { ignoreHooks: false },\n ): Promise<number> {\n this.clearForFunctions();\n this.annotate(\"count\", column, \"total\");\n const ignoredHooks: string[] = options.ignoreHooks ? [\"beforeFetch\"] : [];\n\n const result = (await this.one({\n ignoreHooks: ignoredHooks as FetchHooks,\n })) as { $annotations: { total: number } } | null;\n\n if (!result) {\n return 0;\n }\n\n return +result.$annotations.total;\n }\n\n override async getMax(\n column: string,\n options: { ignoreHooks: boolean } = { ignoreHooks: false },\n ): Promise<number> {\n this.clearForFunctions();\n this.annotate(\"max\", column, \"total\");\n const ignoredHooks: string[] = options.ignoreHooks\n ? [\"beforeFetch\", \"afterFetch\"]\n : [];\n\n const result = (await this.one({\n ignoreHooks: ignoredHooks as FetchHooks,\n })) as {\n $annotations: { total: number };\n } | null;\n\n if (!result) {\n return 0;\n }\n\n return +result.$annotations.total;\n }\n\n override async getMin(\n column: string,\n options: { ignoreHooks: boolean } = { ignoreHooks: false },\n ): Promise<number> {\n this.clearForFunctions();\n this.annotate(\"min\", column, \"total\");\n const ignoredHooks: string[] = options.ignoreHooks\n ? [\"beforeFetch\", \"afterFetch\"]\n : [];\n\n const result = (await this.one({\n ignoreHooks: ignoredHooks as FetchHooks,\n })) as {\n $annotations: { total: number };\n } | null;\n\n if (!result) {\n return 0;\n }\n\n return +result.$annotations.total;\n }\n\n override async getAvg(\n column: string,\n options: { ignoreHooks: boolean } = { ignoreHooks: false },\n ): Promise<number> {\n this.clearForFunctions();\n this.annotate(\"avg\", column, \"total\");\n const ignoredHooks: string[] = options.ignoreHooks\n ? [\"beforeFetch\", \"afterFetch\"]\n : [];\n\n const result = (await this.one({\n ignoreHooks: ignoredHooks as FetchHooks,\n })) as {\n $annotations: { total: number };\n } | null;\n\n if (!result) {\n return 0;\n }\n\n return +result.$annotations.total;\n }\n\n override async getSum(\n column: string,\n options: { ignoreHooks: boolean } = { ignoreHooks: false },\n ): Promise<number> {\n this.clearForFunctions();\n this.annotate(\"sum\", column, \"total\");\n const ignoredHooks: string[] = options.ignoreHooks\n ? [\"beforeFetch\", \"afterFetch\"]\n : [];\n\n const result = (await this.one({\n ignoreHooks: ignoredHooks as FetchHooks,\n })) as {\n $annotations: { total: number };\n } | null;\n\n if (!result) {\n return 0;\n }\n\n return +result.$annotations.total;\n }\n\n override async paginate(\n page: number,\n perPage: number,\n options: { ignoreHooks: boolean } = { ignoreHooks: false },\n ): Promise<PaginatedData<T, A, R>> {\n const clonedQuery = this.clone();\n const paginatedQuery = this.limit(perPage).offset((page - 1) * perPage);\n const hooksToIgnore: [\"beforeFetch\", \"afterFetch\"] | [] =\n options.ignoreHooks ? [\"beforeFetch\", \"afterFetch\"] : [];\n\n const [models, total] = await this.executePaginateQueries(\n () => paginatedQuery.many({ ignoreHooks: hooksToIgnore }),\n () => clonedQuery.getCount(\"*\", { ignoreHooks: options.ignoreHooks }),\n );\n\n const paginationMetadata = getPaginationMetadata(page, perPage, total);\n\n return {\n paginationMetadata,\n data: models,\n };\n }\n\n override select<S extends string>(...columns: SelectableColumn<S>[]): this;\n override select(...columns: (ModelKey<T> | \"*\")[]): this;\n override select<S extends string>(\n ...columns: (ModelKey<T> | \"*\" | SelectableColumn<S>)[]\n ): this {\n this.modelSelectedColumns = [\n ...this.modelSelectedColumns,\n ...(columns as string[]),\n ];\n\n this.selectNodes = this.selectNodes.concat(\n columns.map((column) => new SelectNode(column as string)),\n );\n\n return this;\n }\n\n /**\n * @description Annotates a column with a SQL method or a simple alias\n * @description If using a model, the result will be available in the $annotations property of the model, else it will be available in the result of the query\n * @example\n * ```ts\n * const user = await User.query().annotate(\"max\", \"id\", \"maxId\").first(); // max(id) as maxId\n * const user = await User.query().annotate(\"id\", \"superId\").first(); // id as superId\n * ```\n */\n // @ts-expect-error\n override annotate<K extends string, V = any>(\n column: string,\n alias: K,\n ): ModelQueryBuilder<T, A & { [P in K]: V }, R>;\n // @ts-expect-error\n override annotate<\n K extends string,\n S extends SqlMethod,\n V = CommonSqlMethodReturnType<S>,\n >(\n sqlMethod: string,\n column: string,\n alias: K,\n ): ModelQueryBuilder<T, A & { [P in K]: V }, R>;\n // @ts-expect-error\n override annotate<\n K extends string,\n S extends SqlMethod,\n V = CommonSqlMethodReturnType<S>,\n >(\n sqlMethod: S,\n column: string,\n alias: K,\n ): ModelQueryBuilder<T, A & { [P in K]: V }, R>;\n // @ts-expect-error\n override annotate<\n K extends string,\n S extends SqlMethod,\n V = CommonSqlMethodReturnType<S>,\n >(\n sqlMethod: S,\n column: string,\n alias: K,\n ): ModelQueryBuilder<T, A & { [P in K]: V }, R>;\n\n // @ts-expect-error\n override annotate<\n K extends string,\n S extends SqlMethod,\n V = CommonSqlMethodReturnType<S>,\n >(\n sqlMethodOrColumn: string | S,\n columnOrAlias: string,\n maybeAlias?: string,\n ): ModelQueryBuilder<T, A & { [P in K]: V }, R> {\n let sqlMethod: string | undefined;\n let column: string;\n let alias: string;\n\n if (maybeAlias) {\n sqlMethod = sqlMethodOrColumn as string;\n column = columnOrAlias;\n alias = maybeAlias as string;\n } else {\n sqlMethod = undefined;\n column = sqlMethodOrColumn as string;\n alias = columnOrAlias as string;\n }\n\n this.selectNodes = this.selectNodes.concat(\n new SelectNode(column, alias, sqlMethod),\n );\n this.modelAnnotatedColumns.push(alias);\n\n return this;\n }\n\n /**\n * @description Removes annotations from the serialized model, by default, annotations are maintained in the serialized model if `annotate` is used\n */\n removeAnnotations(): ModelQueryBuilder<T, {}> {\n this.mustRemoveAnnotations = true;\n this.modelAnnotatedColumns = [];\n return this;\n }\n\n /**\n * @description Fills the relations in the model in the serialized response. Relation must be defined in the model.\n * @warning Many to many relations have special behavior, since they require a join, a join clause will always be added to the query.\n * @warning Many to many relations uses the model foreign key for mapping in the `$annotations` property, this property will be removed from the model after the relation is filled.\n * @warning Foreign keys should always be selected in the relation query builder, otherwise the relation will not be filled.\n * @mssql HasMany relations with limit/offset and orderByRaw may fail with \"Ambiguous column name\" error - use fully qualified column names (e.g., `table.column`) in orderByRaw\n * @cockroachdb HasMany relations with limit/offset and orderByRaw may fail with \"Ambiguous column name\" error - use fully qualified column names (e.g., `table.column`) in orderByRaw\n */\n load<\n RelationKey extends ModelRelation<T>,\n IA extends Record<string, any> = {},\n IR extends Record<string, any> = {},\n >(\n relation: RelationKey,\n cb: (\n queryBuilder: RelationQueryBuilderType<RelatedInstance<T, RelationKey>>,\n ) => RelationQueryBuilderType<RelatedInstance<T, RelationKey>, IA, IR>,\n ): ModelQueryBuilder<\n T,\n A,\n R & {\n [K in RelationKey]: Awaited<\n ReturnType<\n ModelQueryBuilder<\n RelatedInstance<T, K>,\n IA,\n IR\n >[RelationRetrieveMethod<T[K]>]\n >\n >;\n }\n >;\n load<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cb?: (\n queryBuilder: RelationQueryBuilderType<RelatedInstance<T, RelationKey>>,\n ) => void,\n ): ModelQueryBuilder<\n T,\n A,\n R & {\n [K in RelationKey]: Awaited<\n ReturnType<\n ModelQueryBuilder<\n RelatedInstance<T, K>,\n {},\n {}\n >[RelationRetrieveMethod<T[K]>]\n >\n >;\n }\n >;\n load<\n RelationKey extends ModelRelation<T>,\n IA extends Record<string, any> = {},\n IR extends Record<string, any> = {},\n >(\n relation: RelationKey,\n cb?: (\n queryBuilder: RelationQueryBuilderType<RelatedInstance<T, RelationKey>>,\n ) => RelationQueryBuilderType<\n RelatedInstance<T, RelationKey>,\n IA,\n IR\n > | void,\n ): ModelQueryBuilder<\n T,\n A,\n R & {\n [K in RelationKey]: Awaited<\n ReturnType<\n ModelQueryBuilder<\n RelatedInstance<T, K>,\n IA,\n IR\n >[RelationRetrieveMethod<T[K]>]\n >\n >;\n }\n > {\n const modelRelation =\n this.sqlModelManagerUtils.getRelationFromModel(relation);\n\n const relationQueryBuilder = new ModelQueryBuilder<\n RelatedInstance<T, RelationKey>\n >(modelRelation.model, this.sqlDataSource);\n\n relationQueryBuilder.relation = modelRelation;\n cb?.(\n relationQueryBuilder as unknown as RelationQueryBuilderType<\n RelatedInstance<T, RelationKey>\n >,\n );\n this.relationQueryBuilders.push(relationQueryBuilder);\n\n return this as unknown as ModelQueryBuilder<\n T,\n A,\n R & {\n [K in RelationKey]: Awaited<\n ReturnType<\n ModelQueryBuilder<\n RelatedInstance<T, K>,\n IA,\n IR\n >[RelationRetrieveMethod<T[K]>]\n >\n >;\n }\n >;\n }\n\n /**\n * @description Clears the relations from the query builder\n */\n clearRelations(): this {\n this.relationQueryBuilders = [];\n return this;\n }\n\n // #region Relation filters\n\n /**\n * @description Checks if the relation exists in the models and has the given filters, if no callback is provided, it only check if there is at least one record for the relation\n * @warning All select statements are ignored, since we're only checking if the relation exists, a \"select 1\" will be added to the Query\n */\n havingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cb?: (\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void,\n ): this;\n havingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n operatorOrValue?: BinaryOperatorType | BaseValues,\n maybeValue?: BaseValues,\n ): this;\n havingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cbOrOperatorOrValue?:\n | ((\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void)\n | BinaryOperatorType\n | BaseValues,\n maybeValue?: BaseValues,\n ): this {\n return this.andHavingRelated(\n relation,\n cbOrOperatorOrValue as any,\n maybeValue,\n );\n }\n\n /**\n * @description Checks if the relation exists in the models and has the given filters, if no callback is provided, it only check if there is at least one record for the relation\n * @warning All select statements are ignored, since we're only checking if the relation exists, a \"select 1\" will be added to the Query\n */\n andHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cb?: (\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void,\n ): this;\n andHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n operatorOrValue?: BinaryOperatorType | BaseValues,\n maybeValue?: BaseValues,\n ): this;\n andHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cbOrOperatorOrValue?:\n | ((\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void)\n | BinaryOperatorType\n | BaseValues,\n maybeValue?: BaseValues,\n ): this {\n let actualValue: BaseValues | undefined;\n let actualOperator: BinaryOperatorType | undefined;\n let cb:\n | ((\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void)\n | undefined;\n\n if (typeof cbOrOperatorOrValue === \"function\") {\n cb = cbOrOperatorOrValue as (\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void;\n } else if (\n typeof cbOrOperatorOrValue === \"string\" &&\n maybeValue !== undefined\n ) {\n actualOperator = cbOrOperatorOrValue as BinaryOperatorType;\n actualValue = maybeValue;\n } else if (cbOrOperatorOrValue !== undefined) {\n actualValue = cbOrOperatorOrValue as BaseValues;\n actualOperator = \"=\";\n }\n\n const modelRelation =\n this.sqlModelManagerUtils.getRelationFromModel(relation);\n const modelQueryBuilder = new ModelQueryBuilder<\n RelatedInstance<T, RelationKey>\n >(modelRelation.model, this.sqlDataSource);\n modelQueryBuilder.relation = modelRelation;\n\n const relationQueryBuilder = this.getRelatedModelsQueryForRelation(\n modelQueryBuilder,\n modelRelation,\n [],\n );\n\n // We clear where in order to apply having relation filter, since we're passing an empty array, by default will be a false condition so we need to clear it\n relationQueryBuilder.clearWhere();\n relationQueryBuilder.clearSelect();\n relationQueryBuilder.selectRaw(\"1\");\n\n cb?.(\n relationQueryBuilder as unknown as ModelQueryBuilder<\n RelatedInstance<T, RelationKey>\n >,\n );\n\n this.applyHavingRelatedFilter(\n relationQueryBuilder,\n modelRelation,\n actualOperator,\n actualValue,\n );\n\n this.whereExists(\n relationQueryBuilder as unknown as (\n queryBuilder: QueryBuilder<T>,\n ) => void | QueryBuilder<T>,\n );\n\n return this;\n }\n\n /**\n * @description Checks if the relation exists in the models and has the given filters, if no callback is provided, it only check if there is at least one record for the relation,\n * @warning All select statements are ignored, since we're only checking if the relation exists, a \"select 1\" will be added to the Query\n */\n orHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cb?: (\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void,\n ): this;\n orHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n operatorOrValue?: BinaryOperatorType | BaseValues,\n maybeValue?: BaseValues,\n ): this;\n orHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cbOrOperatorOrValue?:\n | ((\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void)\n | BinaryOperatorType\n | BaseValues,\n maybeValue?: BaseValues,\n ): this {\n let actualValue: BaseValues | undefined;\n let actualOperator: BinaryOperatorType | undefined;\n let cb:\n | ((\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void)\n | undefined;\n\n if (typeof cbOrOperatorOrValue === \"function\") {\n cb = cbOrOperatorOrValue as (\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void;\n } else if (\n typeof cbOrOperatorOrValue === \"string\" &&\n maybeValue !== undefined\n ) {\n actualOperator = cbOrOperatorOrValue as BinaryOperatorType;\n actualValue = maybeValue;\n } else if (cbOrOperatorOrValue !== undefined) {\n actualValue = cbOrOperatorOrValue as BaseValues;\n actualOperator = \"=\";\n }\n\n const modelRelation =\n this.sqlModelManagerUtils.getRelationFromModel(relation);\n const modelQueryBuilder = new ModelQueryBuilder<\n RelatedInstance<T, RelationKey>\n >(modelRelation.model, this.sqlDataSource);\n modelQueryBuilder.relation = modelRelation;\n\n const relationQueryBuilder = this.getRelatedModelsQueryForRelation(\n modelQueryBuilder,\n modelRelation,\n [],\n );\n\n // We clear where in order to apply having relation filter, since we're passing an empty array, by default will be a false condition so we need to clear it\n relationQueryBuilder.clearWhere();\n relationQueryBuilder.clearSelect();\n relationQueryBuilder.selectRaw(\"1\");\n\n cb?.(\n relationQueryBuilder as unknown as ModelQueryBuilder<\n RelatedInstance<T, RelationKey>\n >,\n );\n\n this.applyHavingRelatedFilter(\n relationQueryBuilder,\n modelRelation,\n actualOperator,\n actualValue,\n );\n\n this.orWhereExists(\n relationQueryBuilder as unknown as (\n queryBuilder: QueryBuilder<T>,\n ) => void | QueryBuilder<T>,\n );\n\n return this;\n }\n\n /**\n * @description Checks if the relation does not exist in the models and has the given filters, if no callback is provided, it only check if there is no record for the Relation\n * @warning All select statements are ignored, since we're only checking if the relation exists, a \"select 1\" will be added to the Query\n */\n notHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cb?: (\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void,\n ): this;\n notHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n operatorOrValue?: BinaryOperatorType | BaseValues,\n maybeValue?: BaseValues,\n ): this;\n notHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cbOrOperatorOrValue?:\n | ((\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void)\n | BinaryOperatorType\n | BaseValues,\n maybeValue?: BaseValues,\n ): this {\n return this.andNotHavingRelated(\n relation,\n cbOrOperatorOrValue as any,\n maybeValue,\n );\n }\n\n /**\n * @description Checks if the relation does not exist in the models and has the given filters, if no callback is provided, it only check if there is no record for the relation\n * @warning All select statements are ignored, since we're only checking if the relation exists, a \"select 1\" will be added to the Query\n */\n andNotHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cb?: (\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void,\n ): this;\n andNotHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n operatorOrValue?: BinaryOperatorType | BaseValues,\n maybeValue?: BaseValues,\n ): this;\n andNotHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cbOrOperatorOrValue?:\n | ((\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void)\n | BinaryOperatorType\n | BaseValues,\n maybeValue?: BaseValues,\n ): this {\n let actualValue: BaseValues | undefined;\n let actualOperator: BinaryOperatorType | undefined;\n let cb:\n | ((\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void)\n | undefined;\n\n if (typeof cbOrOperatorOrValue === \"function\") {\n cb = cbOrOperatorOrValue as (\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void;\n } else if (\n typeof cbOrOperatorOrValue === \"string\" &&\n maybeValue !== undefined\n ) {\n actualOperator = cbOrOperatorOrValue as BinaryOperatorType;\n actualValue = maybeValue;\n } else if (cbOrOperatorOrValue !== undefined) {\n actualValue = cbOrOperatorOrValue as BaseValues;\n actualOperator = \"=\";\n }\n\n const modelRelation =\n this.sqlModelManagerUtils.getRelationFromModel(relation);\n const modelQueryBuilder = new ModelQueryBuilder<\n RelatedInstance<T, RelationKey>\n >(modelRelation.model, this.sqlDataSource);\n modelQueryBuilder.relation = modelRelation;\n\n const relationQueryBuilder = this.getRelatedModelsQueryForRelation(\n modelQueryBuilder,\n modelRelation,\n [],\n );\n\n // We clear where in order to apply having relation filter, since we're passing an empty array, by default will be a false condition so we need to clear it\n relationQueryBuilder.clearWhere();\n relationQueryBuilder.clearSelect();\n relationQueryBuilder.selectRaw(\"1\");\n\n cb?.(\n relationQueryBuilder as unknown as ModelQueryBuilder<\n RelatedInstance<T, RelationKey>\n >,\n );\n\n this.applyHavingRelatedFilter(\n relationQueryBuilder,\n modelRelation,\n actualOperator,\n actualValue,\n );\n\n this.whereNotExists(\n relationQueryBuilder as unknown as (\n queryBuilder: QueryBuilder<T>,\n ) => void | QueryBuilder<T>,\n );\n\n return this;\n }\n\n /**\n * @description Checks if the relation does not exist in the models and has the given filters, if no callback is provided, it only check if there is no record for the Relation\n * @warning All select statements are ignored, since we're only checking if the relation exists, a \"select 1\" will be added to the Query\n */\n orNotHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cb?: (\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void,\n ): this;\n orNotHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n operatorOrValue?: BinaryOperatorType | BaseValues,\n maybeValue?: BaseValues,\n ): this;\n orNotHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cbOrOperatorOrValue?:\n | ((\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void)\n | BinaryOperatorType\n | BaseValues,\n maybeValue?: BaseValues,\n ): this {\n let actualValue: BaseValues | undefined;\n let actualOperator: BinaryOperatorType | undefined;\n let cb:\n | ((\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void)\n | undefined;\n\n if (typeof cbOrOperatorOrValue === \"function\") {\n cb = cbOrOperatorOrValue as (\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void;\n } else if (\n typeof cbOrOperatorOrValue === \"string\" &&\n maybeValue !== undefined\n ) {\n actualOperator = cbOrOperatorOrValue as BinaryOperatorType;\n actualValue = maybeValue;\n } else if (cbOrOperatorOrValue !== undefined) {\n actualValue = cbOrOperatorOrValue as BaseValues;\n actualOperator = \"=\";\n }\n\n const modelRelation =\n this.sqlModelManagerUtils.getRelationFromModel(relation);\n const modelQueryBuilder = new ModelQueryBuilder<\n RelatedInstance<T, RelationKey>\n >(modelRelation.model, this.sqlDataSource);\n modelQueryBuilder.relation = modelRelation;\n\n const relationQueryBuilder = this.getRelatedModelsQueryForRelation(\n modelQueryBuilder,\n modelRelation,\n [],\n );\n\n // We clear where in order to apply having relation filter, since we're passing an empty array, by default will be a false condition so we need to clear it\n relationQueryBuilder.clearWhere();\n relationQueryBuilder.clearSelect();\n relationQueryBuilder.selectRaw(\"1\");\n\n cb?.(\n relationQueryBuilder as unknown as ModelQueryBuilder<\n RelatedInstance<T, RelationKey>\n >,\n );\n\n this.applyHavingRelatedFilter(\n relationQueryBuilder,\n modelRelation,\n actualOperator,\n actualValue,\n );\n\n this.orWhereNotExists(\n relationQueryBuilder as unknown as (\n queryBuilder: QueryBuilder<T>,\n ) => void | QueryBuilder<T>,\n );\n\n return this;\n }\n\n // #endregion\n\n /**\n * @description Returns a copy of the query builder instance.\n */\n override clone(): this {\n const queryBuilder = super.clone();\n queryBuilder.relationQueryBuilders = deepCloneNode(\n this.relationQueryBuilders,\n );\n return queryBuilder;\n }\n\n /**\n * @description Recursively processes all relations, including nested ones\n */\n protected async processRelationsRecursively(models: T[]): Promise<void> {\n await Promise.all(\n this.relationQueryBuilders\n .filter(\n (relationQueryBuilder) => relationQueryBuilder.isRelationQueryBuilder,\n )\n .map(async (relationQueryBuilder) => {\n const relatedModels = await this.getRelatedModelsForRelation(\n relationQueryBuilder,\n relationQueryBuilder.relation,\n models,\n );\n\n this.mapRelatedModelsToModels(\n relationQueryBuilder.relation,\n models,\n relatedModels,\n );\n }),\n );\n }\n\n protected mapRelatedModelsToModels<R extends ModelWithoutRelations<T>>(\n relation: Relation,\n modelsToFillWithRelations: T[],\n relatedModels: R[],\n ): void {\n switch (relation.type) {\n case RelationEnum.hasOne:\n if (!this.model.primaryKey) {\n throw new HysteriaError(\n this.model.name + \"::mapRelatedModelsToModels::hasOne\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n const relatedModelsMap = new Map<string, R>();\n\n relatedModels.forEach((relatedModel) => {\n const foreignKeyValue = relatedModel[relation.foreignKey as keyof R];\n if (foreignKeyValue) {\n relatedModelsMap.set(String(foreignKeyValue), relatedModel);\n }\n });\n\n modelsToFillWithRelations.forEach((modelToFillWithRelation) => {\n const primaryKeyValue =\n modelToFillWithRelation[this.model.primaryKey as keyof T];\n if (!primaryKeyValue) {\n modelToFillWithRelation[relation.columnName as keyof T] =\n null as T[keyof T];\n return;\n }\n\n const relatedModel = relatedModelsMap.get(String(primaryKeyValue));\n modelToFillWithRelation[relation.columnName as keyof T] =\n (relatedModel || null) as T[keyof T];\n });\n\n break;\n case RelationEnum.belongsTo:\n const relatedModelsByKey = new Map<string, R>();\n\n relatedModels.forEach((relatedModel) => {\n if (!relation.model.primaryKey) {\n throw new HysteriaError(\n this.model.name + \"::mapRelatedModelsToModels::belongsTo\",\n `RELATED_MODEL_DOES_NOT_HAVE_A_PRIMARY_KEY_${relation.model.name}` as const,\n );\n }\n\n const primaryKeyValue =\n relatedModel[relation.model.primaryKey as keyof R];\n if (primaryKeyValue) {\n relatedModelsByKey.set(String(primaryKeyValue), relatedModel);\n }\n });\n\n modelsToFillWithRelations.forEach((modelToFillWithRelation) => {\n const foreignKeyValue =\n modelToFillWithRelation[relation.foreignKey as keyof T];\n if (!foreignKeyValue) {\n modelToFillWithRelation[relation.columnName as keyof T] =\n null as T[keyof T];\n return;\n }\n\n const relatedModel = relatedModelsByKey.get(String(foreignKeyValue));\n modelToFillWithRelation[relation.columnName as keyof T] =\n (relatedModel || null) as T[keyof T];\n });\n\n break;\n case RelationEnum.hasMany:\n if (!this.model.primaryKey) {\n throw new HysteriaError(\n this.model.name + \"::mapRelatedModelsToModels::hasMany\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n const relatedModelsGroupedByForeignKey = new Map<string, R[]>();\n\n relatedModels.forEach((relatedModel) => {\n const foreignKeyValue = relatedModel[relation.foreignKey as keyof R];\n if (!foreignKeyValue) return;\n\n const foreignKeyStr = String(foreignKeyValue);\n if (!relatedModelsGroupedByForeignKey.has(foreignKeyStr)) {\n relatedModelsGroupedByForeignKey.set(foreignKeyStr, []);\n }\n\n relatedModelsGroupedByForeignKey\n .get(foreignKeyStr)!\n .push(relatedModel);\n });\n\n modelsToFillWithRelations.forEach((modelToFillWithRelation) => {\n const primaryKeyValue =\n modelToFillWithRelation[this.model.primaryKey as keyof T];\n if (!primaryKeyValue) {\n modelToFillWithRelation[relation.columnName as keyof T] =\n [] as T[keyof T];\n return;\n }\n\n const relatedModelsList =\n relatedModelsGroupedByForeignKey.get(String(primaryKeyValue)) || [];\n modelToFillWithRelation[relation.columnName as keyof T] =\n relatedModelsList as T[keyof T];\n });\n\n break;\n case RelationEnum.manyToMany:\n if (!this.model.primaryKey || !relation.model.primaryKey) {\n throw new HysteriaError(\n this.model.name + \"::mapRelatedModelsToModels::manyToMany\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n const manyToManyRelation = relation as ManyToMany;\n const relatedModelsMapManyToMany = new Map<string, R[]>();\n const relatedPrimaryKey = manyToManyRelation.leftForeignKey;\n const casedRelatedPrimaryKey =\n this.modelColumnsMap.get(relatedPrimaryKey) ||\n this.modelColumnsDatabaseNames.get(relatedPrimaryKey) ||\n convertCase(relatedPrimaryKey, this.model.modelCaseConvention);\n\n relatedModels.forEach((relatedModel) => {\n const annotations = (relatedModel as any).$annotations || {};\n const foreignKeyValue = annotations[casedRelatedPrimaryKey];\n if (foreignKeyValue === undefined || foreignKeyValue === null) {\n return;\n }\n\n const foreignKeyStr = String(foreignKeyValue);\n if (!relatedModelsMapManyToMany.has(foreignKeyStr)) {\n relatedModelsMapManyToMany.set(foreignKeyStr, []);\n }\n\n if (!this.modelAnnotatedColumns.includes(casedRelatedPrimaryKey)) {\n delete annotations[casedRelatedPrimaryKey];\n if (!Object.keys(annotations).length) {\n delete (relatedModel as any).$annotations;\n }\n }\n\n relatedModelsMapManyToMany.get(foreignKeyStr)!.push(relatedModel);\n });\n\n modelsToFillWithRelations.forEach((modelToFillWithRelation) => {\n const primaryKeyValue =\n modelToFillWithRelation[this.model.primaryKey as keyof T];\n if (!primaryKeyValue) {\n modelToFillWithRelation[relation.columnName as keyof T] =\n [] as T[keyof T];\n return;\n }\n\n const relatedModelsList =\n relatedModelsMapManyToMany.get(String(primaryKeyValue)) || [];\n modelToFillWithRelation[relation.columnName as keyof T] =\n relatedModelsList as T[keyof T];\n });\n\n break;\n default:\n throw new HysteriaError(\n this.model.name + \"::mapRelatedModelsToModels\",\n \"UNSUPPORTED_RELATION_TYPE\",\n );\n }\n }\n\n protected async getRelatedModelsForRelation(\n relationQueryBuilder: ModelQueryBuilder<any>,\n relation: Relation,\n models: T[],\n ): Promise<ModelWithoutRelations<T>[]> {\n return this.getRelatedModelsQueryForRelation(\n relationQueryBuilder,\n relation,\n models,\n ).many();\n }\n\n protected getRelatedModelsQueryForRelation(\n relationQueryBuilder: ModelQueryBuilder<any>,\n relation: Relation,\n models: T[],\n ): ModelQueryBuilder<T> {\n const filterValues = this.getFilterValuesFromModelsForRelation(\n relation,\n models,\n );\n\n switch (relation.type) {\n case RelationEnum.belongsTo:\n case RelationEnum.hasOne:\n return relationQueryBuilder.whereIn(\n relationQueryBuilder.relation.type === RelationEnum.belongsTo\n ? relation.model.primaryKey!\n : (relation.foreignKey as string),\n filterValues,\n );\n case RelationEnum.hasMany:\n const limit = relationQueryBuilder.limitNode?.limit;\n const offset = relationQueryBuilder.offsetNode?.offset;\n if (!limit && !offset) {\n return relationQueryBuilder.whereIn(\n relationQueryBuilder.relation.type === RelationEnum.belongsTo\n ? relation.model.primaryKey!\n : (relation.foreignKey as string),\n filterValues,\n );\n }\n\n const rn = crypto.randomBytes(6).toString(\"hex\");\n const withTableName = `${relation.model.table}_cte_${rn}`;\n const orderByClause = relationQueryBuilder.orderByNodes\n .map((orderByNode) => {\n if (orderByNode.isRawValue) {\n return orderByNode.column;\n }\n\n return `${this.interpreterUtils.formatStringColumn(this.dbType, orderByNode.column)} ${orderByNode.direction}`;\n })\n .join(\", \") || [\"1\"];\n\n relationQueryBuilder.clearLimit();\n relationQueryBuilder.clearOffset();\n\n const qb = relationQueryBuilder.with(withTableName, (cteQb) =>\n cteQb\n .select(...relationQueryBuilder.modelSelectedColumns)\n .selectRaw(\n `ROW_NUMBER() OVER (PARTITION BY ${this.interpreterUtils.formatStringColumn(this.dbType, relation.foreignKey!)} ORDER BY ${orderByClause}) as rn_${rn}`,\n )\n .whereIn(relation.foreignKey as string, filterValues),\n );\n\n if (limit) {\n qb.whereRaw(`rn_${rn} <= ${limit + (offset || 0)}`);\n }\n\n if (offset) {\n qb.whereRaw(`rn_${rn} > ${offset}`);\n }\n\n const outerSelectedColumnsHasMany =\n relationQueryBuilder.modelSelectedColumns.map((column) =>\n remapSelectedColumnToFromAlias(\n column,\n withTableName,\n relationQueryBuilder.model.table,\n ),\n );\n\n return qb.select(...outerSelectedColumnsHasMany).from(withTableName);\n case RelationEnum.manyToMany:\n if (!this.model.primaryKey || !relation.model.primaryKey) {\n throw new HysteriaError(\n this.model.name + \"::getRelatedModelsForRelation\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n const manyToManyRelation = relation as ManyToMany;\n if (!models.length) {\n return relationQueryBuilder;\n }\n\n const m2mLimit = relationQueryBuilder.limitNode?.limit;\n const m2mOffset = relationQueryBuilder.offsetNode?.offset;\n const m2mSelectedColumns = relationQueryBuilder.modelSelectedColumns\n .length\n ? relationQueryBuilder.modelSelectedColumns.map((column) =>\n column.includes(\".\")\n ? column\n : `${relation.model.table}.${column}`,\n )\n : [`${relation.model.table}.*`];\n\n if (!m2mLimit && !m2mOffset) {\n return relationQueryBuilder\n .select(...m2mSelectedColumns)\n .annotate(\n `${manyToManyRelation.throughModel}.${manyToManyRelation.leftForeignKey}`,\n manyToManyRelation.leftForeignKey,\n )\n .leftJoin(\n manyToManyRelation.throughModel,\n `${manyToManyRelation.relatedModel}.${manyToManyRelation.model.primaryKey}`,\n `${manyToManyRelation.throughModel}.${manyToManyRelation.rightForeignKey}`,\n )\n .whereIn(\n `${manyToManyRelation.throughModel}.${manyToManyRelation.leftForeignKey}`,\n filterValues,\n );\n }\n\n const rnM2m = crypto.randomBytes(6).toString(\"hex\");\n const withTableNameM2m = `${relation.model.table}_cte_${rnM2m}`;\n const orderByClauseM2m = relationQueryBuilder.orderByNodes\n .map((orderByNode) => {\n if (orderByNode.isRawValue) {\n return orderByNode.column;\n }\n\n const column = orderByNode.column.includes(\".\")\n ? orderByNode.column\n : `${relation.model.table}.${orderByNode.column}`;\n return `${this.interpreterUtils.formatStringColumn(this.dbType, column)} ${orderByNode.direction}`;\n })\n .join(\", \") || [\"1\"];\n\n relationQueryBuilder.clearLimit();\n relationQueryBuilder.clearOffset();\n relationQueryBuilder.clearOrderBy();\n\n const cteLeftForeignKey = `${crypto.randomBytes(6).toString(\"hex\")}_left_foreign_key`;\n const qbM2m = relationQueryBuilder.with(withTableNameM2m, (innerQb) =>\n innerQb\n .select(...m2mSelectedColumns)\n .annotate(\n `${manyToManyRelation.throughModel}.${manyToManyRelation.leftForeignKey}`,\n cteLeftForeignKey,\n )\n .selectRaw(\n `ROW_NUMBER() OVER (PARTITION BY ${manyToManyRelation.throughModel}.${this.interpreterUtils.formatStringColumn(this.dbType, manyToManyRelation.leftForeignKey)} ORDER BY ${orderByClauseM2m}) as rn_${rnM2m}`,\n )\n .leftJoin(\n manyToManyRelation.throughModel,\n `${manyToManyRelation.relatedModel}.${manyToManyRelation.model.primaryKey}`,\n `${manyToManyRelation.throughModel}.${manyToManyRelation.rightForeignKey}`,\n )\n .whereIn(\n `${manyToManyRelation.throughModel}.${manyToManyRelation.leftForeignKey}`,\n filterValues,\n ),\n );\n\n if (m2mLimit) {\n qbM2m.whereRaw(`rn_${rnM2m} <= ${m2mLimit + (m2mOffset || 0)}`);\n }\n\n if (m2mOffset) {\n qbM2m.whereRaw(`rn_${rnM2m} > ${m2mOffset}`);\n }\n\n const outerSelectedColumns = m2mSelectedColumns.map((column) =>\n remapSelectedColumnToFromAlias(\n column,\n withTableNameM2m,\n relationQueryBuilder.model.table,\n ),\n );\n\n return qbM2m\n .select(...outerSelectedColumns)\n .annotate(\n `${withTableNameM2m}.${cteLeftForeignKey}`,\n manyToManyRelation.leftForeignKey,\n )\n .from(withTableNameM2m);\n default:\n throw new HysteriaError(\n this.model.name + \"::getRelatedModelsForRelation\",\n \"UNSUPPORTED_RELATION_TYPE\",\n );\n }\n }\n\n protected getFilterValuesFromModelsForRelation(\n relation: Relation,\n models: T[],\n ): any[] {\n switch (relation.type) {\n case RelationEnum.hasMany:\n case RelationEnum.hasOne:\n if (!this.model.primaryKey) {\n throw new HysteriaError(\n this.model.name + \"::getFilterValuesFromModelsForRelation\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n return models.map((model) => model[this.model.primaryKey as keyof T]);\n case RelationEnum.belongsTo:\n return models.map((model) => model[relation.foreignKey as keyof T]);\n case RelationEnum.manyToMany:\n if (!this.model.primaryKey) {\n throw new HysteriaError(\n this.model.name + \"::getFilterValuesFromModelsForRelation\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n return models.map((model) => model[this.model.primaryKey as keyof T]);\n default:\n throw new HysteriaError(\n this.model.name + \"::getFilterValuesFromModelsForRelation\",\n \"UNSUPPORTED_RELATION_TYPE\",\n );\n }\n }\n\n protected applyHavingRelatedFilter(\n relationQueryBuilder: ModelQueryBuilder<any>,\n relation: Relation,\n operator?: BinaryOperatorType,\n value?: BaseValues,\n ): void {\n const relatedInterpreter = new InterpreterUtils(relation.model);\n const outerInterpreter = new InterpreterUtils(this.model);\n const dbType = this.dbType;\n\n switch (relation.type) {\n case RelationEnum.hasOne:\n case RelationEnum.hasMany: {\n if (!this.model.primaryKey || !relation.foreignKey) {\n throw new HysteriaError(\n this.model.name + \"::applyHavingRelatedFilter\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n const left = relatedInterpreter.formatStringColumn(\n dbType,\n `${relation.model.table}.${relation.foreignKey}`,\n );\n\n const right = outerInterpreter.formatStringColumn(\n dbType,\n `${this.model.table}.${this.model.primaryKey}`,\n );\n\n relationQueryBuilder.whereRaw(`${left} = ${right}`);\n\n if (operator && typeof value === \"number\") {\n relationQueryBuilder\n .groupByRaw(left)\n .andHavingRaw(`count(*) ${operator} ${value}`);\n }\n return;\n }\n case RelationEnum.belongsTo: {\n if (!relation.model.primaryKey || !relation.foreignKey) {\n throw new HysteriaError(\n this.model.name + \"::applyHavingRelatedFilter\",\n `RELATED_MODEL_DOES_NOT_HAVE_A_PRIMARY_KEY_${relation.model.name}` as const,\n );\n }\n\n const left = relatedInterpreter.formatStringColumn(\n dbType,\n `${relation.model.table}.${relation.model.primaryKey}`,\n );\n const right = outerInterpreter.formatStringColumn(\n dbType,\n `${this.model.table}.${relation.foreignKey}`,\n );\n\n relationQueryBuilder.whereRaw(`${left} = ${right}`);\n\n if (operator && typeof value === \"number\") {\n relationQueryBuilder\n .groupByRaw(left)\n .andHavingRaw(`count(*) ${operator} ${value}`);\n }\n return;\n }\n case RelationEnum.manyToMany: {\n const m2m = relation as ManyToMany;\n if (!this.model.primaryKey || !relation.model.primaryKey) {\n throw new HysteriaError(\n this.model.name + \"::applyHavingRelatedFilter\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n const hasThroughJoin = relationQueryBuilder.joinNodes?.some(\n (jn) =>\n !jn.isRawValue &&\n jn.table === m2m.throughModel &&\n jn.type === \"left\",\n );\n\n if (!hasThroughJoin) {\n relationQueryBuilder.leftJoin(\n m2m.throughModel,\n `${m2m.relatedModel}.${relation.model.primaryKey}`,\n `${m2m.throughModel}.${m2m.rightForeignKey}`,\n );\n }\n\n const throughLeft = outerInterpreter.formatStringColumn(\n dbType,\n `${m2m.throughModel}.${m2m.leftForeignKey}`,\n );\n const outerPk = outerInterpreter.formatStringColumn(\n dbType,\n `${this.model.table}.${this.model.primaryKey}`,\n );\n\n relationQueryBuilder.whereRaw(`${throughLeft} = ${outerPk}`);\n\n if (operator && typeof value === \"number\") {\n relationQueryBuilder\n .groupByRaw(throughLeft)\n .andHavingRaw(`count(*) ${operator} ${value}`);\n }\n return;\n }\n default:\n throw new HysteriaError(\n this.model.name + \"::applyHavingRelatedFilter\",\n \"UNSUPPORTED_RELATION_TYPE\",\n );\n }\n }\n\n protected addAdditionalColumnsToModel(\n row: any,\n typeofModel: typeof Model,\n ): Record<string, any> {\n const model: Record<string, any> = {};\n const $annotations: Record<string, any> = {};\n Object.entries(row).forEach(([key, value]) => {\n if (key === \"$annotations\" || this.modelColumnsDatabaseNames.get(key)) {\n model[key] = value;\n return;\n }\n\n $annotations[convertCase(key, typeofModel.modelCaseConvention)] = value;\n });\n\n model.$annotations = $annotations;\n return model;\n }\n\n // @ts-expect-error\n private async manyWithPerformance(\n options: ManyOptions = {},\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ): Promise<{\n data: AnnotatedModel<T, A, R>[];\n time: number;\n }> {\n const [time, data] = await withPerformance(\n this.many.bind(this, options),\n returnType,\n )();\n\n return { data, time: Number(time) };\n }\n\n // @ts-expect-error\n private async oneWithPerformance(\n options: OneOptions = {},\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ): Promise<{\n data: AnnotatedModel<T, A, R> | null;\n time: number;\n }> {\n const [time, data] = await withPerformance(\n this.one.bind(this, options),\n returnType,\n )();\n\n return { data, time: Number(time) };\n }\n\n // @ts-expect-error\n private async oneOrFailWithPerformance(\n options: OneOptions = {},\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ): Promise<{\n data: AnnotatedModel<T, A, R>;\n time: number;\n }> {\n const [time, data] = await withPerformance(\n this.oneOrFail.bind(this, options),\n returnType,\n )();\n\n return { data, time: Number(time) };\n }\n\n // @ts-expect-error\n private async firstOrFailWithPerformance(\n options: OneOptions = {},\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ): Promise<{\n data: AnnotatedModel<T, A, R>;\n time: number;\n }> {\n return this.oneOrFailWithPerformance(options, returnType);\n }\n\n // @ts-expect-error\n private async firstWithPerformance(\n options: OneOptions = {},\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ): Promise<{\n data: AnnotatedModel<T, A, R> | null;\n time: number;\n }> {\n return this.oneWithPerformance(options, returnType);\n }\n\n // @ts-expect-error\n private async paginateWithPerformance(\n page: number,\n perPage: number,\n options?: { ignoreHooks?: boolean },\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ): Promise<{\n data: PaginatedData<T, A, R>;\n time: number;\n }> {\n const { ignoreHooks = false } = options || {};\n const [time, data] = await withPerformance(\n this.paginate.bind(this, page, perPage, { ignoreHooks }),\n returnType,\n )();\n\n return {\n data: {\n paginationMetadata: data.paginationMetadata,\n data: data.data,\n },\n time: Number(time),\n };\n }\n\n private async paginateWithCursorWithPerformance(\n page: number,\n options: PaginateWithCursorOptions<T, ModelKey<T>>,\n cursor?: Cursor<T, ModelKey<T>>,\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ): Promise<{\n data: [CursorPaginatedData<T, A, R>, Cursor<T, ModelKey<T>>];\n time: number;\n }> {\n const [time, data] = await withPerformance(\n this.paginateWithCursor.bind(this, page, options, cursor),\n returnType,\n )();\n\n return {\n data: data as [CursorPaginatedData<T, A, R>, Cursor<T, ModelKey<T>>],\n time: Number(time),\n };\n }\n\n private async existsWithPerformance(\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, data] = await withPerformance(\n this.exists.bind(this),\n returnType,\n )();\n\n return {\n data,\n time: Number(time),\n };\n }\n\n private async pluckWithPerformance(\n key: ModelKey<T>,\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, data] = await withPerformance(\n this.pluck.bind(this, key),\n returnType,\n )();\n\n return {\n data,\n time: Number(time),\n };\n }\n\n private async softDeleteWithPerformance(\n options: Omit<SoftDeleteOptions<T>, \"ignoreBeforeDeleteHook\"> = {},\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, data] = await withPerformance(\n this.softDelete.bind(this, options),\n returnType,\n )();\n\n return {\n data,\n time: Number(time),\n };\n }\n\n // @ts-expect-error\n private async updateWithPerformance(\n data: Partial<ModelWithoutRelations<T>>,\n options: UpdateOptions = {},\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, result] = await withPerformance(\n this.update.bind(this, data, options),\n returnType,\n )();\n\n return {\n data: result,\n time: Number(time),\n };\n }\n\n private async deleteWithPerformance(\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, result] = await withPerformance(\n this.delete.bind(this),\n returnType,\n )();\n\n return {\n data: result,\n time: Number(time),\n };\n }\n\n private async truncateWithPerformance(\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, result] = await withPerformance(\n this.truncate.bind(this),\n returnType,\n )();\n\n return {\n data: result,\n time: Number(time),\n };\n }\n}\n","import { baseSoftDeleteDate } from \"../../../utils/date_utils\";\nimport { DeleteNode } from \"../../ast/query/node/delete\";\nimport { InsertNode } from \"../../ast/query/node/insert\";\nimport { TruncateNode } from \"../../ast/query/node/truncate\";\nimport { UpdateNode } from \"../../ast/query/node/update\";\nimport type { SqlDataSource } from \"../../sql_data_source\";\nimport type { Model } from \"../model\";\nimport { ModelQueryBuilder } from \"./model_query_builder\";\n\n/**\n * Allows to get model queries without executing them\n */\nexport class DryModelQueryBuilder<\n T extends Model,\n A extends Record<string, any> = {},\n R extends Record<string, any> = {},\n> extends ModelQueryBuilder<T, A, R> {\n constructor(model: typeof Model, sqlDataSource: SqlDataSource) {\n super(model, sqlDataSource);\n }\n\n // @ts-expect-error\n override many(): this {\n return this;\n }\n\n /**\n * @description Builds the insert query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @param args The arguments to pass to the insert method\n * @warning This method does not run model or column hooks\n * @returns The query builder\n */\n // @ts-expect-error\n override insert(...args: Parameters<typeof this.model.insert<T>>): this {\n const [data, options] = args;\n const insertObject = Object.fromEntries(\n Object.keys(data).map((column) => [\n column,\n data[column as keyof typeof data],\n ]),\n );\n\n this.insertNode = new InsertNode(\n this.fromNode,\n [insertObject],\n options?.returning as string[],\n );\n return this;\n }\n\n /**\n * @description Builds the insert many query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @param args The arguments to pass to the insert many method\n * @warning This method does not run model or column hooks\n * @returns The query builder\n */\n // @ts-expect-error\n override insertMany(\n ...args: Parameters<typeof this.model.insertMany<T>>\n ): this {\n const [data, options] = args;\n if (!data.length) {\n return this;\n }\n\n const models = data.map((model) => {\n return Object.fromEntries(\n Object.keys(model).map((column) => [\n column,\n model[column as keyof typeof model],\n ]),\n );\n });\n\n this.insertNode = new InsertNode(\n this.fromNode,\n models,\n options?.returning as string[],\n );\n return this;\n }\n\n /**\n * @description Builds the update query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @param data The data to update\n * @warning This method does not run model or column hooks\n * @returns The query builder\n */\n // @ts-expect-error\n override update(\n ...args: Parameters<ReturnType<typeof this.model.query<T>>[\"update\"]>\n ): this {\n const [data] = args;\n this.updateNode = new UpdateNode(\n this.fromNode,\n Object.keys(data),\n Object.values(data),\n );\n return this;\n }\n\n /**\n * @description Builds the delete query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @param options Delete options\n * @returns The query builder\n */\n // @ts-expect-error\n override delete(\n ...args: Parameters<ReturnType<typeof this.model.query<T>>[\"delete\"]>\n ): this {\n const [options] = args;\n\n if (!options?.ignoreBeforeDeleteHook) {\n this.model.beforeDelete?.(this as any);\n }\n\n this.deleteNode = new DeleteNode(this.fromNode);\n return this;\n }\n\n /**\n * @description Builds the truncate query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @returns The query builder\n */\n // @ts-expect-error\n override truncate(): this {\n this.truncateNode = new TruncateNode(this.fromNode);\n return this;\n }\n\n /**\n * @description Builds the soft delete query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @param options Soft delete options\n * @warning This method does not run model or column hooks\n * @returns The query builder\n */\n // @ts-expect-error\n override softDelete(\n ...args: Parameters<ReturnType<typeof this.model.query<T>>[\"softDelete\"]>\n ): this {\n const [options] = args;\n\n const { column = \"deletedAt\", value = baseSoftDeleteDate() } =\n options || {};\n\n this.updateNode = new UpdateNode(\n this.fromNode,\n [column as string],\n [value],\n );\n return this;\n }\n}\n","import { HysteriaError } from \"../../../errors/hysteria_error\";\nimport { AstParser } from \"../../ast/parser\";\nimport { DeleteNode } from \"../../ast/query/node/delete\";\nimport { FromNode } from \"../../ast/query/node/from\";\nimport { InsertNode } from \"../../ast/query/node/insert\";\nimport { OnDuplicateNode } from \"../../ast/query/node/on_duplicate\";\nimport { UpdateNode } from \"../../ast/query/node/update\";\nimport { WhereNode } from \"../../ast/query/node/where\";\nimport { InterpreterUtils } from \"../../interpreter/interpreter_utils\";\nimport { serializeModel } from \"../../serializer\";\nimport { SqlDataSource } from \"../../sql_data_source\";\nimport { SqlDataSourceType } from \"../../sql_data_source_types\";\nimport { execSql } from \"../../sql_runner/sql_runner\";\nimport { Model } from \"../model\";\nimport { DryModelQueryBuilder } from \"../model_query_builder/dry_model_query_builder\";\nimport { ModelQueryBuilder } from \"../model_query_builder/model_query_builder\";\nimport { AnnotatedModel } from \"../model_query_builder/model_query_builder_types\";\nimport { ModelWithoutRelations } from \"../model_types\";\nimport { getBaseModelInstance } from \"../model_utils\";\nimport {\n FindOneType,\n FindType,\n InsertOptions,\n ModelKey,\n ModelRelation,\n OrderByChoices,\n UnrestrictedFindOneType,\n UnrestrictedFindType,\n UpsertOptions,\n} from \"./model_manager_types\";\n\nexport class ModelManager<T extends Model> {\n protected sqlDataSource: SqlDataSource;\n protected sqlType: SqlDataSourceType;\n protected logs: boolean;\n protected model: typeof Model;\n protected modelInstance: T;\n protected astParser: AstParser;\n protected interpreterUtils: InterpreterUtils;\n protected replicationMode: \"master\" | \"slave\" | null = null;\n\n /**\n * @description Constructor for ModelManager class.\n */\n constructor(model: typeof Model, sqlDataSource: SqlDataSource) {\n this.model = model;\n this.modelInstance = getBaseModelInstance<T>();\n this.sqlDataSource = sqlDataSource;\n this.logs = this.sqlDataSource.logs;\n this.sqlType = this.sqlDataSource.getDbType();\n this.astParser = new AstParser(this.model, this.sqlType);\n this.interpreterUtils = new InterpreterUtils(this.model);\n }\n\n /**\n * @description Sets the replication mode for queries created by this model manager\n */\n setReplicationMode(mode: \"master\" | \"slave\"): this {\n this.replicationMode = mode;\n return this;\n }\n\n /**\n * @description Finds all records that match the input\n */\n async find<\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(input?: FindType<T, S, R>): Promise<AnnotatedModel<T, {}>[]>;\n async find<\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(input?: UnrestrictedFindType<T, S, R>): Promise<AnnotatedModel<T, {}>[]>;\n async find<\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(\n input?: FindType<T, S, R> | UnrestrictedFindType<T, S, R>,\n ): Promise<AnnotatedModel<T, {}>[]> {\n if (!input) {\n return this.query().many();\n }\n\n const query = this.query();\n if (input.select) {\n query.select(...(input.select as string[]));\n }\n\n if (input.relations) {\n input.relations.forEach((relation) => {\n query.load(relation);\n });\n }\n\n if (input.where) {\n Object.entries(input.where).forEach(([key, value]) => {\n if (Array.isArray(value)) {\n query.whereIn(key, value);\n return;\n }\n\n query.where(key, value);\n });\n }\n\n if (input.orderBy) {\n Object.entries(input.orderBy).forEach(([key, value]) => {\n query.orderBy(key as ModelKey<T>, value as OrderByChoices);\n });\n }\n\n if (input.limit) {\n query.limit(input.limit);\n }\n\n if (input.offset) {\n query.offset(input.offset);\n }\n\n if (input.groupBy) {\n query.groupBy(...(input.groupBy as string[]));\n }\n\n return query.many({ ignoreHooks: input.ignoreHooks || [] });\n }\n\n /**\n * @description Finds the first record that matches the input\n */\n async findOne<\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(\n input: UnrestrictedFindOneType<T, S, R>,\n ): Promise<AnnotatedModel<T, {}> | null>;\n async findOne<\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(input: FindOneType<T, S, R>): Promise<AnnotatedModel<T, {}> | null>;\n async findOne<\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(\n input: FindOneType<T, S, R> | UnrestrictedFindOneType<T, S, R>,\n ): Promise<AnnotatedModel<T, {}> | null> {\n const results = await this.find({\n groupBy: input.groupBy,\n orderBy: input.orderBy,\n relations: input.relations,\n select: input.select,\n where: input.where,\n ignoreHooks: input.ignoreHooks,\n offset: input.offset,\n limit: 1,\n } as FindType<T, S, R>);\n\n if (!results.length) {\n return null;\n }\n\n return results[0];\n }\n\n /**\n * @description Finds the first record that matches the input or throws an error\n */\n async findOneOrFail<\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(input: FindOneType<T, S, R>): Promise<AnnotatedModel<T, {}>>;\n async findOneOrFail<\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(input: UnrestrictedFindOneType<T, S, R>): Promise<AnnotatedModel<T, {}>>;\n async findOneOrFail<\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(\n input: (FindOneType<T, S, R> | UnrestrictedFindOneType<T, S, R>) & {\n customError?: Error;\n },\n ): Promise<AnnotatedModel<T, {}>> {\n const result = await this.findOne({\n groupBy: input.groupBy,\n orderBy: input.orderBy,\n relations: input.relations,\n select: input.select,\n where: input.where,\n ignoreHooks: input.ignoreHooks,\n offset: input.offset,\n } as FindOneType<T, S, R>);\n\n if (result === null) {\n if (input.customError) {\n throw input.customError;\n }\n\n throw new HysteriaError(\n this.model.name + \"::findOneOrFail\",\n \"ROW_NOT_FOUND\",\n );\n }\n\n return result;\n }\n\n /**\n * @description Finds a record by its primary key\n * @description Ignores all model hooks\n * @throws {HysteriaError} if the model has no primary key\n */\n async findOneByPrimaryKey(\n value: string | number,\n returning?: ModelKey<T>[],\n ): Promise<AnnotatedModel<T, {}> | null> {\n if (!this.model.primaryKey) {\n throw new HysteriaError(\n this.model.name + \"::findOneByPrimaryKey\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n return this.query()\n .select(...(returning || []))\n .where(this.model.primaryKey as string, value)\n .one({ ignoreHooks: [\"afterFetch\", \"beforeFetch\"] });\n }\n\n /**\n * @description Creates a new record in the database\n */\n async insert(\n model: Partial<T>,\n options: InsertOptions<T> = {},\n ): Promise<AnnotatedModel<T, {}>> {\n !options.ignoreHooks && (await this.model.beforeInsert?.(model as T));\n const { columns: preparedColumns, values: preparedValues } =\n await this.interpreterUtils.prepareColumns(\n Object.keys(model),\n Object.values(model),\n \"insert\",\n );\n\n const insertObject: Record<string, any> = {};\n preparedColumns.forEach((column, index) => {\n const value = preparedValues[index];\n insertObject[column] = value;\n (model as any)[column] ??= value;\n });\n\n const { sql, bindings } = this.astParser.parse([\n new InsertNode(\n new FromNode(this.model.table),\n [insertObject],\n options.returning as string[],\n ),\n ]);\n\n const rows = await execSql(\n sql,\n bindings,\n this.sqlDataSource,\n this.sqlType as SqlDataSourceType,\n \"rows\",\n {\n sqlLiteOptions: {\n typeofModel: this.model,\n mode: \"insertOne\",\n models: [model as T],\n },\n },\n );\n\n if (this.sqlType === \"mysql\" || this.sqlType === \"mariadb\") {\n return this.handleMysqlInsert(\n rows,\n [model as T],\n \"one\",\n options.returning as string[],\n );\n }\n\n const insertedModel = (rows as T[])[0];\n if (!insertedModel) {\n return model as T;\n }\n\n await this.model.afterFetch?.([insertedModel]);\n const result = (await serializeModel([insertedModel], this.model)) as T;\n return result;\n }\n\n /**\n * @description Creates multiple records in the database\n */\n async insertMany(\n models: Partial<T>[],\n options: InsertOptions<T> = {},\n ): Promise<AnnotatedModel<T, {}>[]> {\n await this.model.beforeInsertMany?.(models as T[]);\n\n // Oracle with identity columns doesn't support INSERT ALL properly\n // Handle this case separately BEFORE attempting the batch insert\n if (this.sqlType === \"oracledb\") {\n const primaryKey = this.model.primaryKey;\n const firstModelKeys = Object.keys(models[0] || {});\n const hasMissingPrimaryKey =\n primaryKey && !firstModelKeys.includes(primaryKey);\n\n if (hasMissingPrimaryKey) {\n return this.handleOracleIdentityInsert(models as T[], options);\n }\n }\n\n const insertObjects: Record<string, any>[] = [];\n for (const model of models) {\n const { columns: preparedColumns, values: preparedValues } =\n await this.interpreterUtils.prepareColumns(\n Object.keys(model),\n Object.values(model),\n \"insert\",\n );\n\n const insertObject: Record<string, any> = {};\n preparedColumns.forEach((column, index) => {\n const value = preparedValues[index];\n insertObject[column] = value;\n (model as any)[column] ??= value;\n });\n\n insertObjects.push(insertObject);\n }\n\n const { sql, bindings } = this.astParser.parse([\n new InsertNode(\n new FromNode(this.model.table),\n insertObjects,\n options.returning as string[],\n ),\n ]);\n\n const rows = await execSql(\n sql,\n bindings,\n this.sqlDataSource,\n this.sqlType as SqlDataSourceType,\n \"rows\",\n {\n sqlLiteOptions: {\n typeofModel: this.model,\n mode: \"insertMany\",\n models: models as T[],\n },\n },\n );\n\n if (this.sqlType === \"mysql\" || this.sqlType === \"mariadb\") {\n return (\n (await this.handleMysqlInsert(\n rows,\n models as T[],\n \"many\",\n options.returning as string[],\n )) || []\n );\n }\n\n const insertedModels = rows as T[];\n if (!insertedModels.length) {\n return [];\n }\n\n await this.model.afterFetch?.(insertedModels);\n\n const results = await serializeModel(insertedModels, this.model);\n return (results || []) as T[];\n }\n\n async upsertMany(\n conflictColumns: string[],\n columnsToUpdate: string[],\n data: ModelWithoutRelations<T>[],\n options: UpsertOptions<T> = {\n updateOnConflict: true,\n },\n ): Promise<AnnotatedModel<T, {}>[]> {\n const insertObjects: Record<string, any>[] = [];\n await this.model.beforeInsertMany?.(data as T[]);\n await Promise.all(\n data.map(async (model) => {\n const { columns: preparedColumns, values: preparedValues } =\n await this.interpreterUtils.prepareColumns(\n Object.keys(model),\n Object.values(model),\n \"insert\",\n );\n\n const insertObject = Object.fromEntries(\n preparedColumns.map((column, index) => [\n column,\n preparedValues[index],\n ]),\n );\n\n insertObjects.push(insertObject);\n }),\n );\n\n // MSSQL requires MERGE statement for upsert operations\n if (this.sqlType === \"mssql\") {\n return this.executeMssqlMerge(\n insertObjects,\n conflictColumns,\n columnsToUpdate,\n options,\n data,\n );\n }\n\n const { sql, bindings } = this.astParser.parse([\n new InsertNode(\n new FromNode(this.model.table),\n insertObjects,\n undefined,\n true,\n ),\n new OnDuplicateNode(\n this.model.table,\n conflictColumns,\n columnsToUpdate,\n (options.updateOnConflict ?? true) ? \"update\" : \"ignore\",\n options.returning as string[],\n ),\n ]);\n\n const rows = await execSql(\n sql,\n bindings,\n this.sqlDataSource,\n this.sqlType as SqlDataSourceType,\n \"rows\",\n {\n sqlLiteOptions: {\n typeofModel: this.model,\n mode: \"raw\",\n models: data as T[],\n },\n },\n );\n\n return rows as T[];\n }\n\n /**\n * @description Executes a MERGE statement for MSSQL upsert operations\n */\n private async executeMssqlMerge(\n insertObjects: Record<string, any>[],\n conflictColumns: string[],\n columnsToUpdate: string[],\n options: UpsertOptions<T>,\n data: ModelWithoutRelations<T>[],\n ): Promise<AnnotatedModel<T, {}>[]> {\n if (!insertObjects.length) {\n return [];\n }\n\n const columns = Object.keys(insertObjects[0]);\n const formattedTable = this.interpreterUtils.formatStringColumn(\n \"mssql\",\n this.model.table,\n );\n\n const formatCol = (col: string) =>\n this.interpreterUtils.formatStringColumn(\"mssql\", col);\n\n // Build source values for MERGE\n const bindings: any[] = [];\n const sourceRows = insertObjects.map((obj) => {\n const rowValues = columns.map((col) => {\n bindings.push(obj[col]);\n return `@${bindings.length}`;\n });\n return `select ${rowValues.join(\", \")}`;\n });\n\n const sourceColumns = columns.map(formatCol).join(\", \");\n const sourceQuery = sourceRows.join(\" union all \");\n\n // Build ON condition for conflict columns\n const onCondition = conflictColumns\n .map((col) => `target.${formatCol(col)} = source.${formatCol(col)}`)\n .join(\" and \");\n\n // Build UPDATE SET clause\n const updateSet = columnsToUpdate\n .filter((col) => !conflictColumns.includes(col))\n .map((col) => `target.${formatCol(col)} = source.${formatCol(col)}`)\n .join(\", \");\n\n // Build INSERT columns and values\n const insertCols = columns.map(formatCol).join(\", \");\n const insertVals = columns\n .map((col) => `source.${formatCol(col)}`)\n .join(\", \");\n\n // Build OUTPUT clause\n const outputCols =\n options.returning && options.returning.length\n ? options.returning\n .map((col) => `inserted.${formatCol(col as string)}`)\n .join(\", \")\n : columns.map((col) => `inserted.${formatCol(col)}`).join(\", \");\n\n // Construct MERGE statement\n const updateOnConflict = options.updateOnConflict ?? true;\n const whenMatchedClause =\n updateOnConflict && updateSet\n ? `when matched then update set ${updateSet}`\n : \"\";\n\n const sql =\n `merge into ${formattedTable} as target ` +\n `using (${sourceQuery}) as source (${sourceColumns}) ` +\n `on ${onCondition} ` +\n `${whenMatchedClause} ` +\n `when not matched then insert (${insertCols}) values (${insertVals}) ` +\n `output ${outputCols};`;\n\n const rows = await execSql(\n sql,\n bindings,\n this.sqlDataSource,\n this.sqlType as SqlDataSourceType,\n \"rows\",\n {\n sqlLiteOptions: {\n typeofModel: this.model,\n mode: \"raw\",\n models: data as T[],\n },\n },\n );\n\n return rows as T[];\n }\n\n /**\n * @description Updates a record, returns the updated record\n * @description Model is retrieved from the database using the primary key regardless of any model hooks\n * @description Can only be used if the model has a primary key, use a massive update if the model has no primary key\n */\n async updateRecord(\n model: Partial<T>,\n options?: { returning?: ModelKey<T>[] },\n ): Promise<AnnotatedModel<T, {}>> {\n let { columns: preparedColumns, values: preparedValues } =\n await this.interpreterUtils.prepareColumns(\n Object.keys(model),\n Object.values(model),\n \"update\",\n );\n\n const { primaryKey } = this.model;\n if (!primaryKey) {\n throw new HysteriaError(\n this.model.name + \"::updateRecord\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n // Primary key is filtered out of the prepared columns and values\n const primaryKeyIndex = preparedColumns.indexOf(primaryKey);\n if (primaryKeyIndex !== -1) {\n preparedColumns.splice(primaryKeyIndex, 1);\n preparedValues.splice(primaryKeyIndex, 1);\n }\n\n const { sql, bindings } = this.astParser.parse([\n new UpdateNode(\n new FromNode(this.model.table),\n preparedColumns,\n preparedValues,\n ),\n new WhereNode(\n primaryKey as string,\n \"and\",\n false,\n \"=\",\n model[primaryKey as keyof T] as string,\n ),\n ]);\n\n await execSql(\n sql,\n bindings,\n this.sqlDataSource,\n this.sqlType as SqlDataSourceType,\n \"affectedRows\",\n );\n const updatedModel = await this.findOneByPrimaryKey(\n model[this.model.primaryKey as keyof T] as string,\n options?.returning ?? undefined,\n );\n\n if (!updatedModel) {\n throw new HysteriaError(\n this.model.name + \"::updateRecord\",\n \"ROW_NOT_FOUND\",\n );\n }\n\n return updatedModel;\n }\n\n /**\n * @description Deletes a record\n * @description Can only be used if the model has a primary key, use a massive delete if the model has no primary key\n */\n async deleteRecord(model: T): Promise<void> {\n if (!this.model.primaryKey) {\n throw new HysteriaError(\n this.model.name + \"::deleteRecord\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n const whereNode = new WhereNode(\n this.model.primaryKey as string,\n \"and\",\n false,\n \"=\",\n model[this.model.primaryKey as keyof T] as string,\n );\n\n const { sql, bindings } = this.astParser.parse([\n new DeleteNode(new FromNode(this.model.table)),\n whereNode,\n ]);\n\n await execSql(\n sql,\n bindings,\n this.sqlDataSource,\n this.sqlType as SqlDataSourceType,\n \"affectedRows\",\n );\n }\n\n /**\n * @description Returns a query builder instance\n */\n query(): Omit<ModelQueryBuilder<T>, \"insert\" | \"insertMany\"> {\n const queryBuilder = new ModelQueryBuilder<T>(\n this.model,\n this.sqlDataSource,\n );\n if (this.replicationMode) {\n queryBuilder.setReplicationMode(this.replicationMode);\n }\n return queryBuilder;\n }\n\n /**\n * @description Returns a dry query builder instance\n * @description The dry query builder instance will not execute the query, it will return the query statement\n */\n dryQuery(): Omit<DryModelQueryBuilder<T>, \"insert\" | \"insertMany\"> {\n return new DryModelQueryBuilder<T>(this.model, this.sqlDataSource);\n }\n\n /**\n * @description Mysql does not return the inserted model, so we need to get the inserted model from the database\n */\n private async handleMysqlInsert<O extends \"one\" | \"many\">(\n rows: any,\n models: T[],\n returnType: O,\n retuning?: string[],\n ): Promise<O extends \"one\" ? T : T[] | null> {\n if (!this.model.primaryKey) {\n if (returnType === \"one\") {\n const returnModel = models.length ? models[0] : null;\n if (!returnModel) {\n return null as O extends \"one\" ? T : T[] | null;\n }\n\n return (await serializeModel(\n [returnModel],\n this.model,\n )) as O extends \"one\" ? T : T[];\n }\n\n return (await serializeModel(models, this.model)) as O extends \"one\"\n ? T\n : T[];\n }\n\n // UUID and before fetch defined primary keys\n if (this.model.primaryKey && models[0][this.model.primaryKey as keyof T]) {\n const idsToFetchList = models.map(\n (model) => model[this.model.primaryKey as keyof T],\n ) as string[];\n\n const primaryKeyList = idsToFetchList.map((key) => `'${key}'`).join(\",\");\n const fetchedModels = await this.query()\n .select(...(retuning ?? \"*\"))\n .whereIn(this.model.primaryKey as string, idsToFetchList)\n .orderByRaw(`FIELD(${this.model.primaryKey}, ${primaryKeyList})`)\n .many();\n\n if (returnType === \"one\") {\n return (\n fetchedModels.length ? fetchedModels[0] : null\n ) as O extends \"one\" ? T : T[];\n }\n\n return fetchedModels as O extends \"one\" ? T : T[];\n }\n\n // standard auto increment primary keys\n const idsToFetchList = Array.from(\n { length: rows.affectedRows },\n (_, i) => i + rows.insertId,\n );\n\n const fetchedModels = await this.query()\n .select(...(retuning || \"*\"))\n .whereIn(this.model.primaryKey as string, idsToFetchList)\n .many();\n\n if (returnType === \"one\") {\n return (fetchedModels.length ? fetchedModels[0] : null) as O extends \"one\"\n ? T\n : T[];\n }\n\n return fetchedModels as O extends \"one\" ? T : T[];\n }\n\n /**\n * @description Oracle with identity columns doesn't support INSERT ALL properly.\n * This method inserts records one at a time to avoid duplicate ID issues.\n * After each insert, it queries the row back using unique columns to get the generated ID.\n */\n private async handleOracleIdentityInsert(\n models: T[],\n options: InsertOptions<T>,\n ): Promise<AnnotatedModel<T, {}>[]> {\n const results: T[] = [];\n const primaryKey = this.model.primaryKey;\n\n for (const model of models) {\n // Prepare columns for the insert\n const { columns: preparedColumns, values: preparedValues } =\n await this.interpreterUtils.prepareColumns(\n Object.keys(model),\n Object.values(model),\n \"insert\",\n );\n\n const insertObject: Record<string, any> = {};\n preparedColumns.forEach((column, index) => {\n const value = preparedValues[index];\n insertObject[column] = value;\n (model as any)[column] ??= value;\n });\n\n // Execute the insert\n const { sql, bindings } = this.astParser.parse([\n new InsertNode(\n new FromNode(this.model.table),\n [insertObject],\n options.returning as string[],\n ),\n ]);\n\n await execSql(\n sql,\n bindings,\n this.sqlDataSource,\n this.sqlType as SqlDataSourceType,\n \"rows\",\n );\n\n // Query back the inserted row to get the generated ID\n const queryBuilder = this.query().select(\n ...((options.returning as string[]) || [\"*\"]),\n );\n\n for (const [column, value] of Object.entries(insertObject)) {\n if (value !== null && value !== undefined && column !== primaryKey) {\n queryBuilder.where(column, \"=\", value);\n }\n }\n\n // Order by ID desc to get the most recently inserted row\n if (primaryKey) {\n queryBuilder.orderBy(primaryKey, \"desc\");\n }\n\n const insertedRow = await queryBuilder.one({\n ignoreHooks: [\"beforeFetch\"],\n });\n\n if (insertedRow) {\n if (\n primaryKey &&\n insertedRow[primaryKey as keyof ModelWithoutRelations<T>]\n ) {\n (model as any)[primaryKey] =\n insertedRow[primaryKey as keyof ModelWithoutRelations<T>];\n }\n results.push(insertedRow as T);\n } else {\n results.push(model as T);\n }\n }\n\n await this.model.afterFetch?.(results);\n return results as AnnotatedModel<T, {}>[];\n }\n}\n","import { baseSoftDeleteDate } from \"../../utils/date_utils\";\nimport { DeleteNode } from \"../ast/query/node/delete\";\nimport { FromNode } from \"../ast/query/node/from\";\nimport { InsertNode } from \"../ast/query/node/insert\";\nimport { OnDuplicateNode } from \"../ast/query/node/on_duplicate\";\nimport { TruncateNode } from \"../ast/query/node/truncate\";\nimport { UpdateNode } from \"../ast/query/node/update\";\nimport type { Model } from \"../models/model\";\nimport type { SqlDataSource } from \"../sql_data_source\";\nimport { SoftDeleteOptions } from \"./delete_query_builder_type\";\nimport { QueryBuilder } from \"./query_builder\";\n\n/**\n * Allows to get queries without executing them\n */\nexport class DryQueryBuilder extends QueryBuilder {\n constructor(model: typeof Model, sqlDataSource: SqlDataSource) {\n super(model, sqlDataSource);\n }\n\n // @ts-expect-error\n override many(): this {\n return this;\n }\n\n /**\n * @description Builds the insert query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @param args The arguments to pass to the insert method\n * @warning This method does not run model or column hooks\n * @returns The query builder\n */\n // @ts-expect-error\n override insert(\n ...args: Parameters<typeof QueryBuilder.prototype.insert>\n ): this {\n const [data, options] = args;\n const insertObject = Object.fromEntries(\n Object.keys(data).map((column) => [\n column,\n data[column as keyof typeof data],\n ]),\n );\n\n this.insertNode = new InsertNode(this.fromNode, [insertObject], options);\n return this;\n }\n\n /**\n * @description Builds the insert many query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @param args The arguments to pass to the insert many method\n * @warning This method does not run model or column hooks\n * @returns The query builder\n */\n // @ts-expect-error\n override insertMany(\n ...args: Parameters<typeof QueryBuilder.prototype.insertMany>\n ): this {\n const [data, options] = args;\n if (!data.length) {\n return this;\n }\n\n const models = data.map((model) => {\n return Object.fromEntries(\n Object.keys(model).map((column) => [\n column,\n model[column as keyof typeof model],\n ]),\n );\n });\n\n this.insertNode = new InsertNode(this.fromNode, models, options);\n return this;\n }\n\n /**\n * @description Builds the upsert query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @param args The arguments to pass to the upsert method\n * @warning This method does not run model or column hooks\n * @returns The query builder\n */\n // @ts-expect-error\n override upsert(\n ...args: Parameters<typeof QueryBuilder.prototype.upsert>\n ): this {\n const [data, searchCriteria, options] = args;\n const columnsToUpdate = Object.keys(data);\n const conflictColumns = Object.keys(searchCriteria);\n\n this.insertNode = new InsertNode(\n new FromNode(this.model.table),\n [data],\n undefined,\n true,\n );\n\n this.onDuplicateNode = new OnDuplicateNode(\n this.model.table,\n conflictColumns,\n columnsToUpdate,\n (options?.updateOnConflict ?? true) ? \"update\" : \"ignore\",\n options?.returning as string[],\n );\n\n return this;\n }\n\n // @ts-expect-error\n override upsertMany(\n ...args: Parameters<typeof QueryBuilder.prototype.upsertMany>\n ): this {\n const [conflictColumns, columnsToUpdate, data, options] = args;\n const insertObjects: Record<string, any>[] = data.map((record) => {\n return Object.fromEntries(\n Object.keys(record).map((column) => [\n column,\n record[column as keyof typeof record],\n ]),\n );\n });\n\n this.insertNode = new InsertNode(\n new FromNode(this.model.table),\n insertObjects,\n undefined,\n true,\n );\n\n this.onDuplicateNode = new OnDuplicateNode(\n this.model.table,\n conflictColumns,\n columnsToUpdate,\n (options?.updateOnConflict ?? true) ? \"update\" : \"ignore\",\n options?.returning as string[],\n );\n\n return this;\n }\n\n /**\n * @description Builds the update query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @param data The data to update\n * @warning This method does not run model or column hooks\n * @returns The query builder\n */\n // @ts-expect-error\n override update(data: Record<string, WriteQueryParam>): this {\n this.updateNode = new UpdateNode(\n this.fromNode,\n Object.keys(data),\n Object.values(data),\n );\n return this;\n }\n\n /**\n * @description Builds the delete query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @warning This method does not run model or column hooks\n * @returns The query builder\n */\n // @ts-expect-error\n override delete(): this {\n this.deleteNode = new DeleteNode(this.fromNode);\n return this;\n }\n\n /**\n * @description Builds the truncate query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @warning This method does not run model or column hooks\n * @returns The query builder\n */\n // @ts-expect-error\n override truncate(): this {\n this.truncateNode = new TruncateNode(this.fromNode);\n return this;\n }\n\n /**\n * @description Builds the soft delete query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @param options Soft delete options\n * @warning This method does not run model or column hooks\n * @returns The query builder\n */\n // @ts-expect-error\n override softDelete(\n options: Omit<SoftDeleteOptions<any>, \"ignoreBeforeDeleteHook\"> = {},\n ): this {\n const { column = \"deletedAt\", value = baseSoftDeleteDate() } =\n options || {};\n\n this.updateNode = new UpdateNode(\n this.fromNode,\n [column as string],\n [value],\n );\n return this;\n }\n}\n","import { baseSoftDeleteDate } from \"../../utils/date_utils\";\nimport { Model } from \"../models/model\";\nimport { RawModelOptions } from \"../models/model_types\";\n\nexport const getRawQueryBuilderModel = (\n table: string,\n options?: RawModelOptions,\n): typeof Model => {\n return {\n table,\n modelCaseConvention: \"preserve\",\n databaseCaseConvention: options?.databaseCaseConvention ?? \"preserve\",\n softDeleteColumn: options?.softDeleteColumn ?? \"deleted_at\",\n softDeleteValue: options?.softDeleteValue ?? baseSoftDeleteDate(),\n } as typeof Model;\n};\n","// Transaction class does not use the ast parser nor nodes since it's not used in any query builder and the transaction only lives here\n\nimport type { IIsolationLevel } from \"mssql\";\nimport crypto from \"node:crypto\";\nimport { DriverNotFoundError } from \"../../drivers/driver_constants\";\nimport { HysteriaError } from \"../../errors/hysteria_error\";\nimport logger, { log } from \"../../utils/logger\";\nimport { SqlDataSource } from \"../sql_data_source\";\nimport { GetConnectionReturnType } from \"../sql_data_source_types\";\nimport {\n NestedTransactionCallback,\n NestedTransactionReturnType,\n TransactionExecutionOptions,\n TransactionIsolationLevel,\n} from \"./transaction_types\";\n\n/**\n * @description Transaction class, not meant to be used directly, use sql.startTransaction() instead\n */\nexport class Transaction {\n /**\n * @description The sql data source instance that the transaction is running on here you can both query or execute raw queries\n * @example\n * ```ts\n * import { sql } from \"hysteria-orm\";\n * import { User } from \"./models/user\";\n *\n * // Raw queries\n * const trx = await sql.startTransaction();\n * await trx.rawQuery(\"SELECT * FROM users\");\n *\n * // Model manager\n * const modelManager = trx.sql.getModelManager(User);\n * await modelManager.insert({ name: \"John Doe\" });\n *\n * // Query builder\n * await trx.query(User.table).insert({ name: \"John Doe\" });\n *\n * await trx.commit();\n * ```\n */\n sql: Omit<\n SqlDataSource,\n \"transaction\" | \"startGlobalTransaction\" | \"startTransaction\"\n >;\n /**\n * @description Whether the transaction is active\n */\n isActive: boolean;\n /**\n * @description The transaction unique identifier\n */\n transactionId: string;\n\n private connectionReleased = false;\n private isolationLevel?: TransactionIsolationLevel;\n private isNested: boolean;\n private nestingDepth: number;\n\n constructor(\n sql: SqlDataSource,\n isolationLevel?: TransactionIsolationLevel,\n isNested = false,\n nestingDepth = 0,\n ) {\n this.sql = sql;\n this.isActive = false;\n this.transactionId = crypto.randomBytes(16).toString(\"hex\");\n this.isolationLevel = isolationLevel;\n this.isNested = isNested;\n this.nestingDepth = nestingDepth;\n }\n\n /**\n * @description Creates a new transaction with the same isolation level and same connection using save points\n * @description If a callback is provided, it will execute the callback and commit or rollback the nested transaction save points based on the callback's success or failure\n */\n async nestedTransaction(): Promise<Transaction>;\n async nestedTransaction(\n cb: (trx: Transaction) => Promise<void>,\n ): Promise<void>;\n async nestedTransaction<T extends NestedTransactionCallback | undefined>(\n cb?: T,\n ): Promise<NestedTransactionReturnType<T>> {\n const trx = new Transaction(\n this.sql as SqlDataSource,\n this.isolationLevel,\n true,\n this.nestingDepth + 1,\n );\n\n await trx.startTransaction();\n\n if (cb) {\n try {\n await cb(trx);\n await trx.commit();\n } catch (error) {\n await trx.rollback();\n throw error;\n }\n }\n\n return trx as NestedTransactionReturnType<T>;\n }\n\n /**\n * @description Starts a transaction, automatically handled from the sql data source instance in the `startTransaction` method\n */\n async startTransaction(): Promise<void> {\n const levelQuery = this.getIsolationLevelQuery();\n // Nested transactions use SAVEPOINTs and do not begin a new transaction\n if (this.isNested) {\n const savepoint = this.getSavePointName();\n switch (this.sql.type) {\n case \"mssql\":\n await this.sql.rawQuery(`SAVE TRANSACTION ${savepoint}`);\n this.isActive = true;\n return;\n case \"mysql\":\n case \"mariadb\":\n case \"postgres\":\n case \"cockroachdb\":\n case \"oracledb\":\n await this.sql.rawQuery(`SAVEPOINT ${savepoint}`);\n this.isActive = true;\n return;\n case \"sqlite\":\n await this.sql.rawQuery(`SAVEPOINT ${savepoint}`);\n this.isActive = true;\n return;\n }\n }\n\n // Top-level transaction handling\n switch (this.sql.type) {\n case \"mssql\":\n if (levelQuery) {\n await this.sql.rawQuery(levelQuery);\n }\n\n log(\"BEGIN TRANSACTION\", this.sql.logs);\n const mssqlTransactionLevel = await this.getMssqlTransactionLevel();\n await (\n this.sql.sqlConnection as GetConnectionReturnType<\"mssql\">\n ).begin(mssqlTransactionLevel);\n this.isActive = true;\n break;\n case \"mysql\":\n case \"mariadb\":\n if (levelQuery) {\n await this.sql.rawQuery(levelQuery);\n }\n\n const mysqlConnection = this.sql\n .sqlConnection as GetConnectionReturnType<\"mysql\">;\n log(\"BEGIN TRANSACTION\", this.sql.logs);\n await mysqlConnection.beginTransaction();\n\n this.isActive = true;\n break;\n case \"postgres\":\n case \"cockroachdb\":\n await this.sql.rawQuery(\"BEGIN TRANSACTION\");\n if (levelQuery) {\n await this.sql.rawQuery(levelQuery);\n }\n\n this.isActive = true;\n break;\n case \"sqlite\":\n if (levelQuery) {\n await this.sql.rawQuery(levelQuery);\n }\n\n await this.sql.rawQuery(\"BEGIN TRANSACTION\");\n this.isActive = true;\n break;\n case \"oracledb\":\n // Oracle auto-starts transactions, SET TRANSACTION must come first\n if (levelQuery) {\n await this.sql.rawQuery(levelQuery);\n }\n this.isActive = true;\n break;\n }\n }\n\n /**\n * @description Commit the transaction releasing the connection\n * @throws {HysteriaError} if the transaction is not active and options.throwErrorOnInactiveTransaction is true\n * @logs if the transaction is not active and options.throwErrorOnInactiveTransaction is false\n */\n async commit(options?: TransactionExecutionOptions): Promise<void> {\n if (!this.isActive) {\n if (options?.throwErrorOnInactiveTransaction) {\n throw new HysteriaError(\n \"TRANSACTION::commit\",\n \"TRANSACTION_NOT_ACTIVE\",\n );\n }\n logger.warn(\"Transaction::commit - TRANSACTION_NOT_ACTIVE\");\n return;\n }\n\n try {\n // Nested transactions should release their savepoint and keep the outer transaction/connection\n if (this.isNested) {\n const savepoint = this.getSavePointName();\n switch (this.sql.type) {\n case \"mssql\":\n case \"oracledb\":\n // MSSQL and Oracle don't support RELEASE SAVEPOINT - savepoints are automatically released on commit\n break;\n case \"mysql\":\n case \"mariadb\":\n case \"postgres\":\n case \"cockroachdb\":\n case \"sqlite\":\n await this.sql.rawQuery(`RELEASE SAVEPOINT ${savepoint}`);\n break;\n }\n this.isActive = false;\n return;\n }\n\n switch (this.sql.type) {\n case \"mssql\":\n log(\"COMMIT\", this.sql.logs);\n await (\n this.sql.sqlConnection as GetConnectionReturnType<\"mssql\">\n ).commit();\n break;\n case \"mysql\":\n case \"mariadb\":\n const mysqlConnection = this.sql\n .sqlConnection as GetConnectionReturnType<\"mysql\">;\n log(\"COMMIT\", this.sql.logs);\n await mysqlConnection.commit();\n break;\n case \"postgres\":\n case \"cockroachdb\":\n await this.sql.rawQuery(\"COMMIT\");\n break;\n case \"sqlite\":\n await this.sql.rawQuery(\"COMMIT\");\n break;\n case \"oracledb\":\n log(\"COMMIT\", this.sql.logs);\n await (\n this.sql.sqlConnection as GetConnectionReturnType<\"oracledb\">\n ).commit();\n break;\n }\n } catch (error: any) {\n logger.error(error);\n throw error;\n }\n\n await this.releaseConnection();\n this.isActive = false;\n }\n\n /**\n * @description Rollback the transaction releasing the connection\n * @throws {HysteriaError} if the transaction is not active and options.throwErrorOnInactiveTransaction is true\n * @logs if the transaction is not active and options.throwErrorOnInactiveTransaction is false\n */\n async rollback(options?: TransactionExecutionOptions): Promise<void> {\n if (!this.isActive) {\n if (options?.throwErrorOnInactiveTransaction) {\n throw new HysteriaError(\n \"TRANSACTION::rollback\",\n \"TRANSACTION_NOT_ACTIVE\",\n );\n }\n\n logger.warn(\"Transaction::rollback - TRANSACTION_NOT_ACTIVE\");\n return;\n }\n\n try {\n // Nested transactions should rollback to their savepoint and keep the outer transaction/connection\n if (this.isNested) {\n const savepoint = this.getSavePointName();\n switch (this.sql.type) {\n case \"mssql\":\n await this.sql.rawQuery(`ROLLBACK TRANSACTION ${savepoint}`);\n break;\n case \"mysql\":\n case \"mariadb\":\n case \"postgres\":\n case \"cockroachdb\":\n case \"oracledb\":\n await this.sql.rawQuery(`ROLLBACK TO SAVEPOINT ${savepoint}`);\n break;\n case \"sqlite\":\n await this.sql.rawQuery(`ROLLBACK TO ${savepoint}`);\n break;\n default:\n throw new HysteriaError(\n \"TRANSACTION::rollback\",\n `UNSUPPORTED_DATABASE_TYPE_${this.sql.type}`,\n );\n }\n this.isActive = false;\n return;\n }\n\n switch (this.sql.type) {\n case \"mssql\":\n log(\"ROLLBACK\", this.sql.logs);\n await (\n this.sql.sqlConnection as GetConnectionReturnType<\"mssql\">\n ).rollback();\n break;\n case \"mysql\":\n case \"mariadb\":\n const mysqlConnection = this.sql\n .sqlConnection as GetConnectionReturnType<\"mysql\">;\n log(\"ROLLBACK\", this.sql.logs);\n await mysqlConnection.rollback();\n break;\n case \"postgres\":\n case \"cockroachdb\":\n await this.sql.rawQuery(\"ROLLBACK\");\n break;\n case \"sqlite\":\n await this.sql.rawQuery(\"ROLLBACK\");\n break;\n case \"oracledb\":\n log(\"ROLLBACK\", this.sql.logs);\n await (\n this.sql.sqlConnection as GetConnectionReturnType<\"oracledb\">\n ).rollback();\n break;\n default:\n throw new HysteriaError(\n \"TRANSACTION::rollback\",\n `UNSUPPORTED_DATABASE_TYPE_${this.sql.type}`,\n );\n }\n } catch (error: any) {\n logger.error(error);\n throw error;\n }\n\n await this.releaseConnection();\n this.isActive = false;\n }\n\n /**\n * @description Release the connection, does nothing if the connection is already released\n */\n private async releaseConnection(): Promise<void> {\n if (this.connectionReleased) {\n return;\n }\n\n try {\n switch (this.sql.type) {\n case \"mssql\":\n // Mssql transactions are automatically released when the connection is released\n break;\n case \"mysql\":\n case \"mariadb\":\n (\n this.sql.sqlConnection as GetConnectionReturnType<\"mysql\">\n ).release();\n break;\n case \"postgres\":\n case \"cockroachdb\":\n (\n this.sql.sqlConnection as GetConnectionReturnType<\"postgres\">\n ).release();\n break;\n case \"sqlite\":\n // Since we are living on a single connection, we don't need to release sqlite\n break;\n case \"oracledb\":\n await (\n this.sql.sqlConnection as GetConnectionReturnType<\"oracledb\">\n ).close();\n break;\n default:\n throw new HysteriaError(\n \"TRANSACTION::releaseConnection\",\n `UNSUPPORTED_DATABASE_TYPE_${this.sql.type}`,\n );\n }\n } catch (error: any) {\n logger.error(error);\n }\n\n await this.sql.closeConnection();\n this.sql.sqlConnection = null;\n this.connectionReleased = true;\n }\n\n private getIsolationLevelQuery(): string {\n // MSSQL is handled in the getMssqlTransactionLevel method\n if (!this.isolationLevel || this.sql.type === \"mssql\") {\n return \"\";\n }\n\n if (this.sql.type === \"sqlite\" && this.isolationLevel !== \"SERIALIZABLE\") {\n throw new HysteriaError(\n \"TRANSACTION::getIsolationLevelQuery\",\n \"SQLITE_ONLY_SUPPORTS_SERIALIZABLE_ISOLATION_LEVEL\",\n );\n }\n\n if (this.sql.type === \"mysql\" || this.sql.type === \"mariadb\") {\n return `SET TRANSACTION ISOLATION LEVEL ${this.isolationLevel}`;\n }\n\n if (this.sql.type === \"postgres\" || this.sql.type === \"cockroachdb\") {\n return `SET TRANSACTION ISOLATION LEVEL ${this.isolationLevel}`;\n }\n\n if (this.sql.type === \"oracledb\") {\n // Oracle uses SET TRANSACTION ISOLATION LEVEL\n return `SET TRANSACTION ISOLATION LEVEL ${this.isolationLevel}`;\n }\n\n if (this.sql.type === \"sqlite\") {\n return \"\";\n }\n\n throw new HysteriaError(\n \"TRANSACTION::getIsolationLevelQuery\",\n `UNSUPPORTED_DATABASE_TYPE_${this.sql.type}`,\n );\n }\n\n private getSavePointName(): string {\n const shortId = this.transactionId.slice(0, 8).toUpperCase();\n return `sp_${this.nestingDepth}_${shortId}`;\n }\n\n private async getMssqlTransactionLevel(): Promise<\n IIsolationLevel | undefined\n > {\n if (!this.isolationLevel) {\n return;\n }\n\n const mssqlTransactionLevels = await import(\"mssql\")\n .then((module) => module.default.ISOLATION_LEVEL)\n .catch((error) => {\n logger.error(error);\n throw new DriverNotFoundError(\"mssql\");\n });\n\n switch (this.isolationLevel) {\n case \"READ UNCOMMITTED\":\n return mssqlTransactionLevels.READ_UNCOMMITTED;\n case \"READ COMMITTED\":\n return mssqlTransactionLevels.READ_COMMITTED;\n case \"REPEATABLE READ\":\n return mssqlTransactionLevels.REPEATABLE_READ;\n case \"SERIALIZABLE\":\n return mssqlTransactionLevels.SERIALIZABLE;\n default:\n throw new HysteriaError(\n \"TRANSACTION::getMssqlTransactionLevel\",\n `UNSUPPORTED_ISOLATION_LEVEL_${this.isolationLevel}`,\n );\n }\n }\n}\n","import {\n initializeAdminJs,\n initializeAdminJsExpress,\n} from \"../adminjs/adminjs_adapter\";\nimport type {\n AdminJsAdminInstance,\n AdminJsInstance,\n AdminJsOptions,\n} from \"../adminjs/adminjs_types\";\nimport { InMemoryAdapter } from \"../cache/adapters/in_memory\";\nimport { CacheAdapter } from \"../cache/cache_adapter\";\nimport { CacheKeys, UseCacheReturnType } from \"../cache/cache_types\";\nimport { DataSource } from \"../data_source/data_source\";\nimport { env } from \"../env/env\";\nimport { HysteriaError } from \"../errors/hysteria_error\";\nimport { generateOpenApiModelWithMetadata } from \"../openapi/openapi\";\nimport { hashString } from \"../utils/hash\";\nimport logger, { log } from \"../utils/logger\";\nimport {\n formatQuery,\n getSqlDialect,\n isTableMissingError,\n} from \"../utils/query\";\nimport { AstParser } from \"./ast/parser\";\nimport { RawNode } from \"./ast/query/node/raw/raw_node\";\nimport { ForeignKeyInfoNode } from \"./ast/query/node/schema\";\nimport { IndexInfoNode } from \"./ast/query/node/schema/index_info\";\nimport { PrimaryKeyInfoNode } from \"./ast/query/node/schema/primary_key_info\";\nimport { TableInfoNode } from \"./ast/query/node/schema/table_info\";\nimport Schema from \"./migrations/schema/schema\";\nimport { SchemaDiff } from \"./migrations/schema_diff/schema_diff\";\nimport { normalizeColumnType } from \"./migrations/schema_diff/type_normalizer\";\nimport { Model } from \"./models/model\";\nimport { ModelManager } from \"./models/model_manager/model_manager\";\nimport { RawModelOptions } from \"./models/model_types\";\nimport { DryQueryBuilder } from \"./query_builder/dry_query_builder\";\nimport { QueryBuilder } from \"./query_builder/query_builder\";\nimport { DryQueryBuilderWithoutReadOperations } from \"./query_builder/query_builder_types\";\nimport { getRawQueryBuilderModel } from \"./query_builder/query_builder_utils\";\nimport type {\n TableColumnInfo,\n TableForeignKeyInfo,\n TableIndexInfo,\n TablePrimaryKeyInfo,\n TableSchemaInfo,\n} from \"./schema_introspection_types\";\nimport { createSqlPool } from \"./sql_connection_utils\";\nimport type {\n ConnectionPolicies,\n GetConnectionReturnType,\n getPoolReturnType,\n MssqlPoolInstance,\n MysqlConnectionInstance,\n OracleDBPoolInstance,\n PgPoolClientInstance,\n RawQueryOptions,\n SlaveAlgorithm,\n SlaveContext,\n SqlCloneOptions,\n SqlDataSourceInput,\n SqlDataSourceModel,\n SqlDataSourceType,\n SqliteConnectionInstance,\n SqlPoolType,\n TableFormat,\n UseConnectionInput,\n} from \"./sql_data_source_types\";\nimport { execSql } from \"./sql_runner/sql_runner\";\nimport { RawQueryResponseType } from \"./sql_runner/sql_runner_types\";\nimport { Transaction } from \"./transactions/transaction\";\nimport {\n StartTransactionOptions,\n StartTransactionReturnType,\n TransactionExecutionOptions,\n TransactionOptionsOrCallback,\n} from \"./transactions/transaction_types\";\n\n/**\n * @description The SqlDataSource class is the main class for interacting with the database, it's used to create connections, execute queries, and manage transactions\n * @example\n * ```ts\n * // Create and connect to a database\n * const sql = new SqlDataSource({\n * type: \"mysql\",\n * host: \"localhost\",\n * username: \"root\",\n * password: \"password\",\n * database: \"mydb\",\n * models: { User, Post }\n * });\n * await sql.connect();\n *\n * // Now you can use the connection\n * const users = await sql.query(\"users\").many();\n * ```\n */\nexport class SqlDataSource<\n D extends SqlDataSourceType = SqlDataSourceType,\n T extends Record<string, SqlDataSourceModel> = {},\n C extends CacheKeys = {},\n> extends DataSource {\n static #instance: SqlDataSource | null = null;\n private globalTransaction: Transaction | null = null;\n private sqlType: D;\n private _models: T;\n private ownsPool: boolean = false;\n\n /**\n * @description The slaves data sources to use for the sql data source, slaves are automatically used for read operations unless specified otherwise\n */\n slaves: SqlDataSource<D, T, C>[];\n\n /**\n * @description The algorithm to use for selecting the slave for read operations\n * @default \"roundRobin\" - Distributes requests evenly across all slaves in sequence\n * @option \"random\" - Randomly selects a slave for each request\n */\n slaveAlgorithm: SlaveAlgorithm;\n\n /**\n * @description The current index for round-robin slave selection\n * @private\n */\n private roundRobinIndex: number = 0;\n\n /**\n * @description The pool of connections for the database\n */\n declare sqlPool: SqlPoolType | null;\n\n /**\n * @description Only used in transaction context to specify the connection, not meant to be used directly\n * @private\n */\n sqlConnection: GetConnectionReturnType<D> | null = null;\n\n /**\n * @description Options provided in the sql data source initialization\n */\n inputDetails: SqlDataSourceInput<D, T, C>;\n\n /**\n * @description Adapter for `useCache`, uses an in memory strategy by default\n */\n cacheAdapter: CacheAdapter = new InMemoryAdapter();\n\n /**\n * @description Maps global keys to specific handlers for cache handling\n */\n cacheKeys: C;\n\n /**\n * @description Migration configuration for the sql data source\n */\n migrationConfig: {\n path: string;\n tsconfig?: string;\n lock: boolean;\n transactional: boolean;\n lockTimeout?: number;\n } = {\n path: env.MIGRATION_PATH || \"database/migrations\",\n lock: true,\n transactional: true,\n lockTimeout: 30000,\n };\n\n /**\n * @description Seeder configuration for the sql data source\n */\n seederConfig: {\n path: string;\n tsconfig?: string;\n } = {\n path: \"database/seeders\",\n };\n\n /**\n * @description AdminJS configuration options\n */\n private adminJsOptions?: AdminJsOptions;\n\n /**\n * @description Cached AdminJS instance\n */\n private adminJsInstance?: AdminJsInstance;\n\n /**\n * @description Callback to handle slave server failures\n */\n private onSlaveServerFailure?: (\n error: Error,\n context: SlaveContext,\n ) => void | Promise<void>;\n\n /**\n * @description Returns the configured slave failure callback\n */\n getOnSlaveServerFailure() {\n return this.onSlaveServerFailure;\n }\n\n // ============================================\n // Static Methods\n // ============================================\n\n /**\n * @description Returns the primary instance of the SqlDataSource (set via connect with setPrimary: true)\n * All models by default will use this instance to execute queries unless you pass a different connection/transaction in the query options\n */\n static get instance(): SqlDataSource {\n if (!this.#instance) {\n throw new HysteriaError(\n \"SqlDataSource::instance\",\n \"CONNECTION_NOT_ESTABLISHED\",\n );\n }\n\n return this.#instance;\n }\n\n /**\n * @description Creates a secondary database connection that won't be set as the primary instance\n * @description By default not used by the Models, you have to pass it as a parameter to the Models to use it\n * @example\n * ```ts\n * const secondaryDb = await SqlDataSource.connectToSecondarySource({\n * type: \"postgres\",\n * host: \"replica.db.com\",\n * ...\n * });\n *\n * const user = await User.query({ connection: secondaryDb }).many();\n * ```\n */\n static async connectToSecondarySource<\n U extends SqlDataSourceType,\n M extends Record<string, SqlDataSourceModel> = {},\n K extends CacheKeys = {},\n >(\n input: Omit<SqlDataSourceInput<U, M, K>, \"slaves\">,\n cb?: (sqlDataSource: SqlDataSource<U, M, K>) => Promise<void> | void,\n ): Promise<SqlDataSource<U, M, K>> {\n const sqlDataSource = new SqlDataSource(\n input as SqlDataSourceInput<U, M, K>,\n );\n await sqlDataSource.connectWithoutSettingPrimary();\n const result = sqlDataSource as SqlDataSource<U, M, K>;\n await cb?.(result);\n return result;\n }\n\n /**\n * @description Creates a temporary connection that is automatically closed after the callback is executed\n * @example\n * ```ts\n * await SqlDataSource.useConnection({\n * type: \"mysql\",\n * ...connectionData\n * }, async (sql) => {\n * const user = await User.query({ connection: sql }).many();\n * });\n * // Connection is automatically closed here\n * ```\n */\n static async useConnection<\n U extends SqlDataSourceType,\n M extends Record<string, SqlDataSourceModel> = {},\n K extends CacheKeys = {},\n >(\n connectionDetails: UseConnectionInput<U, M, K>,\n cb: (sqlDataSource: SqlDataSource<U, M, K>) => Promise<void>,\n ): Promise<void> {\n const sqlDataSource = new SqlDataSource(\n connectionDetails as SqlDataSourceInput<U, M, K>,\n );\n await sqlDataSource.connectWithoutSettingPrimary();\n\n const result = sqlDataSource as SqlDataSource<U, M, K>;\n\n try {\n await cb(result);\n if (sqlDataSource.isConnected) {\n await sqlDataSource.closeConnection();\n }\n } catch (error) {\n if (sqlDataSource.isConnected) {\n await sqlDataSource.closeConnection();\n }\n throw error;\n }\n }\n\n /**\n * @description Closes the primary connection (singleton instance)\n */\n static async closeConnection(): Promise<void> {\n if (!this.#instance) {\n logger.warn(\"Connection already closed\");\n return;\n }\n\n await this.#instance.closeConnection();\n this.#instance = null;\n }\n\n /**\n * @alias closeConnection\n */\n static async disconnect(): Promise<void> {\n return this.closeConnection();\n }\n\n /**\n * @description Starts a global transaction on the primary database connection\n * @description Intended for testing purposes - wraps all operations in a transaction that can be rolled back\n */\n static async startGlobalTransaction(\n options?: StartTransactionOptions,\n ): Promise<Transaction> {\n return this.instance.startGlobalTransaction(options);\n }\n\n /**\n * @description Commits a global transaction on the primary database connection\n * @throws {HysteriaError} If the global transaction is not started\n */\n static async commitGlobalTransaction(): Promise<void> {\n await this.instance.commitGlobalTransaction();\n }\n\n /**\n * @description Rolls back a global transaction on the primary database connection\n * @throws {HysteriaError} If the global transaction is not started\n */\n static async rollbackGlobalTransaction(): Promise<void> {\n await this.instance.rollbackGlobalTransaction();\n }\n\n /**\n * @description Returns true if the primary instance is in a global transaction\n */\n static get isInGlobalTransaction(): boolean {\n return !!this.#instance?.globalTransaction;\n }\n\n // ============================================\n // Constructor\n // ============================================\n\n /**\n * @description Creates a new SqlDataSource instance. Call `.connect()` to establish the connection.\n * @param input Configuration options for the database connection. If not provided, uses env variables.\n * @example\n * ```ts\n * // With explicit config\n * const sql = new SqlDataSource({\n * type: \"mysql\",\n * host: \"localhost\",\n * username: \"root\",\n * password: \"password\",\n * database: \"mydb\",\n * models: { User, Post }\n * });\n * await sql.connect();\n *\n * // Using env variables\n * const sql = new SqlDataSource();\n * await sql.connect();\n * ```\n */\n constructor(input?: SqlDataSourceInput<D, T, C>) {\n super(input as SqlDataSourceInput);\n this.sqlType = (input?.type || this.type) as D;\n\n // Cast input to access connection properties that come from mapped types\n const inputAny = input as Record<string, any> | undefined;\n\n // Create inputDetails by merging input with base class values (from env vars)\n // This ensures connection details are available even if only partially provided\n this.inputDetails = {\n ...input,\n type: this.sqlType,\n host: inputAny?.host ?? this.host,\n port: inputAny?.port ?? this.port,\n username: inputAny?.username ?? this.username,\n password: inputAny?.password ?? this.password,\n database: inputAny?.database ?? this.database,\n logs: inputAny?.logs ?? this.logs,\n } as unknown as SqlDataSourceInput<D, T, C>;\n\n // Set connection policies with defaults\n this.inputDetails.connectionPolicies = input?.connectionPolicies || {\n retry: {\n maxRetries: 0,\n delay: 0,\n },\n };\n\n // Set query format options with defaults\n this.inputDetails.queryFormatOptions = input?.queryFormatOptions || {\n language: getSqlDialect(this.sqlType),\n keywordCase: \"lower\",\n dataTypeCase: \"lower\",\n functionCase: \"lower\",\n };\n\n // Set cache configuration\n this.cacheKeys = (input?.cacheStrategy?.keys ?? {}) as C;\n this.cacheAdapter = input?.cacheStrategy?.cacheAdapter ?? this.cacheAdapter;\n\n // Set AdminJS options\n this.adminJsOptions = input?.adminJs;\n\n // Set migrations configuration\n if (input?.migrations) {\n this.migrationConfig = {\n path: input.migrations.path || this.migrationConfig.path,\n tsconfig: input.migrations.tsconfig,\n lock: input.migrations.lock ?? this.migrationConfig.lock,\n transactional:\n \"transactional\" in input.migrations\n ? ((input.migrations as { transactional?: boolean })\n .transactional ?? this.migrationConfig.transactional)\n : this.migrationConfig.transactional,\n };\n }\n\n // Set seeders configuration\n if (input?.seeders) {\n this.seederConfig = {\n path: input.seeders.path || this.seederConfig.path,\n tsconfig: input.seeders.tsconfig,\n };\n }\n\n // Set models configured on the sql data source instance\n this._models = (input?.models || {}) as T;\n\n // Set slaves configured on the sql data source instance\n this.slaves = (input?.replication?.slaves || []).map(\n (slave) => new SqlDataSource(slave as SqlDataSourceInput<D, T, C>),\n );\n\n // Set slave algorithm\n this.slaveAlgorithm = input?.replication?.slaveAlgorithm || \"roundRobin\";\n\n // Set slave failure callback\n this.onSlaveServerFailure = input?.replication?.onSlaveServerFailure;\n }\n\n // ============================================\n // Connect Method\n // ============================================\n\n /**\n * @description Establishes the database connection and sets this instance as the primary connection, it also connects to the slaves if any are configured\n * @throws {HysteriaError} If the connection is already established, use `SqlDataSource.useConnection` or `SqlDataSource.connectToSecondarySource` for auxiliary connections\n * @example\n * ```ts\n * const sql = new SqlDataSource({ type: \"mysql\", ... });\n * await sql.connect();\n * ```\n */\n async connect(): Promise<void> {\n if (SqlDataSource.#instance) {\n throw new HysteriaError(\n \"SqlDataSource::connect\",\n \"CONNECTION_ALREADY_ESTABLISHED\",\n );\n }\n\n // Create the connection pool\n this.sqlPool = await createSqlPool(this.sqlType, this.inputDetails);\n this.ownsPool = true;\n\n // Connect to the slaves if any are configured\n if (this.slaves.length) {\n await Promise.all(\n this.slaves.map(async (slave) => {\n slave.sqlPool = await createSqlPool(\n slave.sqlType,\n slave.inputDetails,\n );\n slave.ownsPool = true;\n }),\n );\n }\n\n // Set as primary instance\n SqlDataSource.#instance = this;\n }\n\n // ============================================\n // Instance Methods\n // ============================================\n\n /**\n * @description Returns true if the connection is established\n */\n get isConnected(): boolean {\n return !!this.sqlPool || !!this.sqlConnection;\n }\n\n /**\n * @description Returns true if this instance is in a global transaction\n */\n get isInGlobalTransaction(): boolean {\n return !!this.globalTransaction;\n }\n\n /**\n * @description Returns the models configured on this SqlDataSource instance\n */\n get models(): T {\n return this._models;\n }\n\n /**\n * @description Selects a slave from the pool using the configured algorithm\n * @returns A slave SqlDataSource instance or null if no slaves are available\n */\n getSlave(): SqlDataSource<D, T, C> | null {\n if (!this.slaves.length) {\n return null;\n }\n\n if (this.slaveAlgorithm === \"random\") {\n return this.slaves[Math.floor(Math.random() * this.slaves.length)];\n }\n\n const slave = this.slaves[this.roundRobinIndex % this.slaves.length];\n this.roundRobinIndex = (this.roundRobinIndex + 1) % this.slaves.length;\n return slave;\n }\n\n /**\n * @description Uses the cache adapter to get a value from the cache\n * @param key The key to get the value from\n * @param args The arguments to pass to the key handler\n */\n async useCache<K extends keyof C>(\n key: K,\n ...args: Parameters<C[K]>\n ): Promise<UseCacheReturnType<C, K>>;\n /**\n * @description Uses the cache adapter to get a value from the cache\n * @param key The key to get the value from\n * @param ttl The time to live for the value in milliseconds\n * @param args The arguments to pass to the key handler\n */\n async useCache<K extends keyof C>(\n key: K,\n ttl: number,\n ...args: Parameters<C[K]>\n ): Promise<UseCacheReturnType<C, K>>;\n async useCache<K extends keyof C>(\n key: K,\n ttlOrFirstArg?: number | any,\n ...restArgs: any[]\n ): Promise<UseCacheReturnType<C, K>> {\n if (!this.cacheAdapter) {\n throw new HysteriaError(\n \"SqlDataSource::useCache\",\n \"CACHE_ADAPTER_NOT_CONFIGURED\",\n );\n }\n\n const mappedKeyHandler = this.cacheKeys[key];\n if (!mappedKeyHandler) {\n throw new HysteriaError(\n \"SqlDataSource::useCache\",\n `KEY_${key as string}_HAS_NO_HANDLER_IN_CACHE_KEYS_CONFIG`,\n );\n }\n\n const handlerArgsCount = (mappedKeyHandler as Function).length;\n const isTTLProvided =\n typeof ttlOrFirstArg === \"number\" && handlerArgsCount === restArgs.length;\n\n let ttl: number | undefined;\n let args: any[] = [];\n\n if (isTTLProvided) {\n ttl = ttlOrFirstArg;\n args = restArgs;\n } else {\n ttl = undefined;\n args =\n ttlOrFirstArg !== undefined ? [ttlOrFirstArg, ...restArgs] : restArgs;\n }\n\n const hashedArgs = hashString(JSON.stringify(args));\n const cachedKey = hashedArgs\n ? `${key as string}:${hashedArgs}`\n : (key as string);\n\n const cachedValue = await this.cacheAdapter.get<unknown>(cachedKey);\n if (cachedValue !== undefined) {\n return cachedValue as UseCacheReturnType<C, K>;\n }\n\n const retrievedValue = await (mappedKeyHandler as Function)(...args);\n await this.cacheAdapter.set(cachedKey, retrievedValue, ttl);\n return retrievedValue;\n }\n\n /**\n * @description Invalidates a value from the cache\n * @param key The key to invalidate the value from\n * @param args The arguments to pass to the key handler (required if the handler expects arguments)\n */\n async invalidCache<K extends keyof C>(\n key: K,\n ...args: Parameters<C[K]>\n ): Promise<void>;\n async invalidCache<K extends keyof C>(key: K): Promise<void>;\n async invalidCache<K extends keyof C>(key: K, ...args: any[]): Promise<void> {\n if (!this.cacheAdapter) {\n throw new HysteriaError(\n \"SqlDataSource::invalidCache\",\n \"CACHE_ADAPTER_NOT_CONFIGURED\",\n );\n }\n\n const mappedKeyHandler = this.cacheKeys[key];\n if (!mappedKeyHandler) {\n throw new HysteriaError(\n \"SqlDataSource::invalidCache\",\n `KEY_${key as string}_HAS_NO_HANDLER_IN_CACHE_KEYS_CONFIG`,\n );\n }\n\n const handlerArgsCount = (mappedKeyHandler as Function).length;\n\n if (handlerArgsCount > 0 && args.length === 0) {\n const cachedKey = key as string;\n await this.cacheAdapter.invalidate(cachedKey);\n return;\n }\n\n const hashedArgs = hashString(JSON.stringify(args));\n const cachedKey = hashedArgs\n ? `${key as string}:${hashedArgs}`\n : (key as string);\n\n await this.cacheAdapter.invalidate(cachedKey);\n }\n\n /**\n * @description Invalidates all values from the cache starting with the given key\n * @param key The key to invalidate the values from\n */\n async invalidateAllCache(key: string): Promise<void> {\n if (!this.cacheAdapter) {\n throw new HysteriaError(\n \"SqlDataSource::invalidateAllCache\",\n \"CACHE_ADAPTER_NOT_CONFIGURED\",\n );\n }\n\n await this.cacheAdapter.invalidateAll(key);\n }\n\n /**\n * @description Clones the SqlDataSource instance\n * @param options.shouldRecreatePool Whether to recreate the pool of connections for the given driver, by default it's false\n * @sqlite ignores the shouldRecreatePool option\n * @returns A new SqlDataSource instance with the same input details\n */\n async clone(options?: SqlCloneOptions): Promise<this> {\n const cloned = new SqlDataSource(this.inputDetails) as this;\n const mustCreateNewPool =\n cloned.sqlType === \"sqlite\" || !!options?.shouldRecreatePool;\n\n if (mustCreateNewPool) {\n cloned.sqlPool = await createSqlPool(\n cloned.sqlType,\n this.inputDetails as SqlDataSourceInput<SqlDataSourceType>,\n );\n cloned.ownsPool = true;\n } else {\n cloned.sqlPool = this.sqlPool;\n cloned.ownsPool = false;\n }\n\n return cloned;\n }\n\n /**\n * @description Returns the type of the database\n */\n getDbType(): D {\n return this.sqlType;\n }\n\n /**\n * @description Returns a QueryBuilder instance for raw queries\n * @description Query builder from the SqlDataSource instance returns raw data from the database\n * @param table The table name to query from\n */\n query<S extends string>(\n table: TableFormat<S>,\n options?: RawModelOptions,\n ): QueryBuilder {\n const sqlForQueryBuilder =\n this.isInGlobalTransaction && this.globalTransaction?.isActive\n ? this.globalTransaction.sql\n : this;\n\n const qb = new QueryBuilder(\n getRawQueryBuilderModel(table, options),\n sqlForQueryBuilder as SqlDataSource,\n );\n\n if (options?.alias) {\n qb.from(table, options.alias);\n }\n\n return qb;\n }\n\n /**\n * @description Returns a DryQueryBuilder instance that returns the query statement without executing\n */\n dryQuery<S extends string>(\n table: TableFormat<S>,\n options?: RawModelOptions,\n ): DryQueryBuilderWithoutReadOperations {\n return new DryQueryBuilder(getRawQueryBuilderModel(table, options), this);\n }\n\n /**\n * @description Return the query to alter the given table schema\n */\n alterTable(...args: Parameters<Schema[\"alterTable\"]>): string[] {\n const schema = new Schema(this.getDbType());\n schema.alterTable(...args);\n return schema.queryStatements;\n }\n\n /**\n * @description Return the query to create the given table schema\n */\n createTable(...args: Parameters<Schema[\"createTable\"]>): string {\n const schema = new Schema(this.getDbType());\n schema.createTable(...args);\n return schema.queryStatements[0] || \"\";\n }\n\n /**\n * @description Starts a global transaction on the database\n * @description Intended for testing purposes - wraps all operations in a transaction that can be rolled back\n */\n async startGlobalTransaction(\n options?: StartTransactionOptions,\n ): Promise<Transaction> {\n const cloned = await this.clone();\n cloned.sqlConnection = await cloned.getConnection();\n this.globalTransaction = new Transaction(cloned, options?.isolationLevel);\n await this.globalTransaction.startTransaction();\n return this.globalTransaction;\n }\n\n /**\n * @description Commits a global transaction on the database\n * @throws {HysteriaError} If the global transaction is not started\n */\n async commitGlobalTransaction(\n options?: TransactionExecutionOptions,\n ): Promise<void> {\n if (!this.globalTransaction) {\n throw new HysteriaError(\n \"SqlDataSource::commitGlobalTransaction\",\n \"GLOBAL_TRANSACTION_NOT_STARTED\",\n );\n }\n\n await this.globalTransaction.commit({\n throwErrorOnInactiveTransaction: options?.throwErrorOnInactiveTransaction,\n });\n this.globalTransaction = null;\n }\n\n /**\n * @description Rolls back a global transaction on the database\n */\n async rollbackGlobalTransaction(\n options?: TransactionExecutionOptions,\n ): Promise<void> {\n if (!this.globalTransaction) {\n logger.warn(\n \"SqlDataSource::rollbackGlobalTransaction - GLOBAL_TRANSACTION_NOT_STARTED\",\n );\n return;\n }\n\n await this.globalTransaction.rollback({\n throwErrorOnInactiveTransaction: options?.throwErrorOnInactiveTransaction,\n });\n this.globalTransaction = null;\n }\n\n /**\n * @description Starts a transaction on a dedicated connection from the pool\n * @param cb if a callback is provided, it will execute the callback and commit or rollback the transaction based on the callback's success or failure\n * @param options.isolationLevel The isolation level to use for the transaction\n * @sqlite ignores the isolation level\n */\n async startTransaction(\n options?: StartTransactionOptions,\n ): Promise<Transaction>;\n async startTransaction(\n cb: (trx: Transaction) => Promise<void>,\n options?: StartTransactionOptions,\n ): Promise<void>;\n async startTransaction<TOption extends TransactionOptionsOrCallback>(\n optionsOrCb?:\n | StartTransactionOptions\n | ((trx: Transaction) => Promise<void>),\n maybeOptions?: StartTransactionOptions,\n ): Promise<StartTransactionReturnType<TOption>> {\n const options =\n typeof optionsOrCb === \"function\" ? maybeOptions : optionsOrCb;\n\n // If a global transaction is active, create a nested transaction on the same connection\n if (this.globalTransaction?.isActive) {\n if (typeof optionsOrCb === \"function\") {\n try {\n await this.globalTransaction.nestedTransaction(optionsOrCb);\n return undefined as StartTransactionReturnType<TOption>;\n } catch (error) {\n throw error;\n }\n }\n\n const nested = await this.globalTransaction.nestedTransaction();\n return nested as StartTransactionReturnType<TOption>;\n }\n\n const cloned = await this.clone();\n cloned.sqlConnection = await cloned.getConnection();\n const sqlTrx = new Transaction(cloned, options?.isolationLevel);\n await sqlTrx.startTransaction();\n\n if (typeof optionsOrCb === \"function\") {\n try {\n await optionsOrCb(sqlTrx);\n await sqlTrx.commit({\n throwErrorOnInactiveTransaction: false,\n });\n return undefined as StartTransactionReturnType<TOption>;\n } catch (error) {\n await sqlTrx.rollback({\n throwErrorOnInactiveTransaction: false,\n });\n throw error;\n }\n }\n\n return sqlTrx as StartTransactionReturnType<TOption>;\n }\n\n /**\n * @alias startTransaction\n */\n async transaction(options?: StartTransactionOptions): Promise<Transaction>;\n async transaction(\n cb: (trx: Transaction) => Promise<void>,\n options?: StartTransactionOptions,\n ): Promise<void>;\n async transaction(\n optionsOrCb?:\n | StartTransactionOptions\n | ((trx: Transaction) => Promise<void>),\n maybeOptions?: StartTransactionOptions,\n ): Promise<Transaction | void> {\n return this.startTransaction(\n optionsOrCb as (trx: Transaction) => Promise<void>,\n maybeOptions,\n );\n }\n\n /**\n * @description Returns a ModelManager instance for the given model\n */\n getModelManager<M extends Model>(\n model: { new (): M } | typeof Model,\n ): ModelManager<M> {\n if (!this.isConnected) {\n throw new HysteriaError(\n \"SqlDataSource::getModelManager\",\n \"CONNECTION_NOT_ESTABLISHED\",\n );\n }\n\n if (this.globalTransaction?.isActive) {\n return new ModelManager(\n model as typeof Model,\n this.globalTransaction.sql as SqlDataSource,\n );\n }\n\n return new ModelManager(model as typeof Model, this);\n }\n\n /**\n * @description Returns the current raw driver Pool\n * @throws {HysteriaError} If the connection pool is not established\n */\n getPool(): getPoolReturnType<D> {\n if (!this.sqlPool) {\n throw new HysteriaError(\n \"SqlDataSource::getPool\",\n \"CONNECTION_NOT_ESTABLISHED\",\n );\n }\n\n return this.sqlPool as getPoolReturnType<D>;\n }\n\n /**\n * @description Returns a connection from the pool\n * @throws {HysteriaError} If the connection is not established\n */\n async getConnection(): Promise<GetConnectionReturnType<D>> {\n if (this.sqlConnection) {\n return this.sqlConnection as GetConnectionReturnType<D>;\n }\n\n if (!this.sqlPool) {\n throw new HysteriaError(\n \"SqlDataSource::getConnection\",\n \"CONNECTION_NOT_ESTABLISHED\",\n );\n }\n\n switch (this.sqlType) {\n case \"mysql\":\n case \"mariadb\":\n const mysqlPool = this.sqlPool as MysqlConnectionInstance;\n return (await mysqlPool.getConnection()) as GetConnectionReturnType<D>;\n case \"postgres\":\n case \"cockroachdb\":\n const pgPool = this.sqlPool as PgPoolClientInstance;\n return (await pgPool.connect()) as GetConnectionReturnType<D>;\n case \"sqlite\":\n return this.sqlPool as GetConnectionReturnType<D>;\n case \"mssql\":\n const mssqlPool = this.sqlPool as MssqlPoolInstance;\n return mssqlPool.transaction() as GetConnectionReturnType<D>;\n case \"oracledb\":\n const oracledbPool = this.sqlPool as OracleDBPoolInstance;\n return (await oracledbPool.getConnection()) as GetConnectionReturnType<D>;\n default:\n throw new HysteriaError(\n \"SqlDataSource::getConnection\",\n `UNSUPPORTED_DATABASE_TYPE_${this.sqlType}`,\n );\n }\n }\n\n /**\n * @description Closes the current connection\n * @description If there is an active global transaction, it will be rolled back\n * @description Also disconnects all slave connections if any are configured\n */\n async closeConnection(): Promise<void> {\n if (!this.isConnected) {\n log(\"Connection already closed or not established\", this.logs);\n return;\n }\n\n if (!this.ownsPool) {\n this.sqlConnection = null;\n return;\n }\n\n try {\n if (this.globalTransaction?.isActive) {\n await this.rollbackGlobalTransaction({\n throwErrorOnInactiveTransaction: false,\n });\n }\n } catch (err: any) {\n logger.warn(\n \"SqlDataSource::closeConnection - Error while rolling back global transaction\",\n );\n }\n\n await this.cacheAdapter?.disconnect?.();\n\n if (this.slaves.length) {\n await Promise.all(\n this.slaves.map(async (slave) => {\n try {\n await slave.closeConnection();\n } catch (err: any) {\n logger.warn(\n `SqlDataSource::closeConnection - Error while closing slave connection: ${err.message}`,\n );\n }\n }),\n );\n }\n\n log(\"Closing connection\", this.logs);\n switch (this.sqlType) {\n case \"mysql\":\n case \"mariadb\":\n await (this.sqlPool as MysqlConnectionInstance).end();\n break;\n case \"postgres\":\n case \"cockroachdb\":\n await (this.sqlPool as PgPoolClientInstance).end();\n break;\n case \"sqlite\":\n await new Promise<void>((resolve, reject) => {\n (this.sqlPool as SqliteConnectionInstance).close((err) => {\n if (err) {\n reject(err);\n }\n resolve();\n });\n });\n break;\n case \"mssql\":\n await (this.sqlPool as MssqlPoolInstance).close();\n break;\n case \"oracledb\":\n await (this.sqlPool as OracleDBPoolInstance).close();\n break;\n default:\n throw new HysteriaError(\n \"SqlDataSource::closeConnection\",\n `UNSUPPORTED_DATABASE_TYPE_${this.sqlType}`,\n );\n }\n\n this.sqlPool = null;\n this.sqlConnection = null;\n }\n\n /**\n * @description Returns the connection details\n */\n getConnectionDetails(): SqlDataSourceInput<D, T, C> {\n return {\n type: this.getDbType(),\n host: this.host,\n port: this.port,\n username: this.username,\n password: this.password,\n database: this.database,\n connectionPolicies: this.inputDetails\n .connectionPolicies as ConnectionPolicies,\n queryFormatOptions: this.inputDetails.queryFormatOptions,\n } as unknown as SqlDataSourceInput<D, T, C>;\n }\n\n /**\n * @alias closeConnection\n */\n async disconnect(): Promise<void> {\n return this.closeConnection();\n }\n\n /**\n * @description Syncs the schema of the database with the models metadata\n * @warning This will drop and recreate all the indexes and constraints, use with caution\n * @sqlite Not supported but won't throw an error\n */\n async syncSchema(options?: { transactional: boolean }): Promise<void> {\n options = options || { transactional: false };\n\n if (this.sqlType === \"sqlite\") {\n logger.warn(\"Syncing schema with SQLite is not supported, skipping...\");\n return;\n }\n\n const diff = await SchemaDiff.makeDiff(this);\n const sqlStatements = diff.getSqlStatements();\n if (!sqlStatements.length) {\n logger.info(\n `No new changes detected between database schema and models metadata`,\n );\n return;\n }\n\n logger.info(\n `Generated ${sqlStatements.length} SQL statements to sync schema`,\n );\n\n if (!options?.transactional) {\n for (const sql of sqlStatements) {\n await this.rawQuery(sql);\n }\n\n logger.info(`Synced schema with ${sqlStatements.length} SQL statements`);\n return;\n }\n\n await this.transaction(async (trx) => {\n for (const sql of sqlStatements) {\n await trx.sql.rawQuery(sql);\n }\n });\n logger.info(`Synced schema with ${sqlStatements.length} SQL statements`);\n }\n\n /**\n * @description Executes a raw query on the database and returns the raw driver result\n */\n async rawQuery<R = RawQueryResponseType<D>>(\n query: string,\n params: any[] = [],\n options?: RawQueryOptions,\n ): Promise<R> {\n if (!this.isConnected) {\n throw new HysteriaError(\n \"SqlDataSource::rawQuery\",\n \"CONNECTION_NOT_ESTABLISHED\",\n );\n }\n\n const formattedQuery = formatQuery(this, query);\n const replicationMode = options?.replicationMode || \"master\";\n\n if (replicationMode === \"slave\") {\n return this.executeOnSlave(async (slaveInstance) => {\n return execSql(\n formattedQuery,\n params,\n slaveInstance,\n this.getDbType(),\n \"raw\",\n ) as R;\n });\n }\n\n return execSql(formattedQuery, params, this, this.getDbType(), \"raw\") as R;\n }\n\n /**\n * @description Adds a raw statement to an operation that will be executed as is\n * @example\n * ```ts\n * await sql.query(\"users\").where(\"name\", sql.rawStatement(\"LOWER(name)\"));\n * await sql.query(\"users\").update({\n * name: sql.rawStatement(\"LOWER(name)\"),\n * });\n * await sql.query(\"users\").insert({\n * name: sql.rawStatement(\"LOWER(name)\"),\n * });\n * ```\n */\n rawStatement(value: string) {\n return new RawNode(value);\n }\n\n /**\n * @description Retrieves information from the database for the given table\n */\n async getTableSchema(table: string): Promise<TableSchemaInfo> {\n const [columns, indexes, foreignKeys, primaryKey] = await Promise.all([\n this.getTableInfo(table),\n this.getIndexInfo(table),\n this.getForeignKeyInfo(table),\n this.getPrimaryKeyInfo(table),\n ]);\n\n return { columns, indexes, foreignKeys, primaryKey };\n }\n\n /**\n * @description Models provided inside the connection method will always be used for openapi schema generation\n * @experimental\n */\n getModelOpenApiSchema() {\n return generateOpenApiModelWithMetadata(\n Object.values(this._models) as unknown as (new () => Model)[],\n );\n }\n\n // AdminJS Methods\n\n /**\n * @description Initializes AdminJS with the configured options\n * @throws {HysteriaError} If AdminJS is not enabled in the configuration\n */\n async initializeAdminJs(): Promise<AdminJsAdminInstance> {\n if (!this.adminJsOptions?.enabled) {\n throw new HysteriaError(\n \"SqlDataSource::initializeAdminJs\",\n \"ADMINJS_NOT_ENABLED\",\n );\n }\n\n if (this.adminJsInstance) {\n return this.adminJsInstance.admin;\n }\n\n this.adminJsInstance = await initializeAdminJs(this, this.adminJsOptions);\n return this.adminJsInstance?.admin as AdminJsAdminInstance;\n }\n\n /**\n * @description Initializes AdminJS with Express router\n * @throws {HysteriaError} If AdminJS is not enabled in the configuration\n */\n async initializeAdminJsExpress(): Promise<Required<AdminJsInstance>> {\n if (!this.adminJsOptions?.enabled) {\n throw new HysteriaError(\n \"SqlDataSource::initializeAdminJsExpress\",\n \"ADMINJS_NOT_ENABLED\",\n );\n }\n\n if (this.adminJsInstance?.router) {\n return this.adminJsInstance as Required<AdminJsInstance>;\n }\n\n this.adminJsInstance = await initializeAdminJsExpress(\n this,\n this.adminJsOptions,\n );\n return this.adminJsInstance as Required<AdminJsInstance>;\n }\n\n /**\n * @description Returns the AdminJS instance if initialized\n */\n getAdminJs(): AdminJsInstance | undefined {\n return this.adminJsInstance;\n }\n\n /**\n * @description Returns the AdminJS configuration options\n */\n getAdminJsOptions(): AdminJsOptions | undefined {\n return this.adminJsOptions;\n }\n\n /**\n * @description Checks if AdminJS is enabled\n */\n isAdminJsEnabled(): boolean {\n return !!this.adminJsOptions?.enabled;\n }\n\n /**\n * @description Introspects table columns metadata\n */\n async getTableInfo(table: string): Promise<TableColumnInfo[]> {\n const ast = new AstParser(\n {\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model,\n this.getDbType(),\n );\n\n const sql = ast.parse([new TableInfoNode(table)]).sql;\n let rows: any[] = [];\n try {\n rows = await this.rawQuery(sql);\n } catch (err: any) {\n if (isTableMissingError(this.getDbType(), err)) {\n return [];\n }\n throw err;\n }\n const db = this.getDbType();\n if (db === \"sqlite\") {\n return rows.map((r: any) => {\n const rawType = String(r.type || \"\").toLowerCase();\n const dataType = normalizeColumnType(db, rawType);\n return {\n name: r.name,\n dataType,\n isNullable: r.notnull === 0,\n defaultValue: r.dflt_value ?? null,\n withTimezone: null,\n };\n });\n }\n\n return rows.map((r: any) => {\n const name = String(r.column_name || r.COLUMN_NAME || r.name || \"\");\n const rawType = String(\n r.data_type || r.DATA_TYPE || r.type || \"\",\n ).toLowerCase();\n const dataType = normalizeColumnType(db, rawType);\n const rawNullable =\n r.is_nullable !== undefined\n ? r.is_nullable\n : r.IS_NULLABLE !== undefined\n ? r.IS_NULLABLE\n : undefined;\n const isNullable = (() => {\n if (typeof rawNullable === \"string\") {\n return rawNullable.toLowerCase() !== \"no\";\n }\n if (typeof rawNullable === \"boolean\") {\n return rawNullable;\n }\n if (r.notnull !== undefined) {\n return r.notnull === 0;\n }\n return true;\n })();\n\n const defaultValue =\n r.column_default ??\n r.COLUMN_DEFAULT ??\n r.defaultValue ??\n r.dflt_value ??\n null;\n const length = r.char_length != null ? Number(r.char_length) : null;\n const precision =\n r.numeric_precision != null ? Number(r.numeric_precision) : null;\n const scale = r.numeric_scale != null ? Number(r.numeric_scale) : null;\n const withTimezone =\n r.timezone != null\n ? Boolean(r.timezone)\n : typeof r.datetime_precision === \"number\"\n ? /with time zone/.test(\n String(r.column_type || r.udt_name || \"\").toLowerCase(),\n )\n : /with time zone/.test(\n String(r.column_type || r.udt_name || \"\").toLowerCase(),\n );\n return {\n name,\n dataType,\n isNullable,\n defaultValue,\n length,\n precision,\n scale,\n withTimezone,\n };\n });\n }\n\n /**\n * @description Introspects table indexes metadata\n */\n async getIndexInfo(table: string): Promise<TableIndexInfo[]> {\n const ast = new AstParser(\n {\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model,\n this.getDbType(),\n );\n\n const sql = ast.parse([new IndexInfoNode(table)]).sql;\n const db = this.getDbType();\n let rows: any[] = [];\n try {\n rows = await this.rawQuery(sql);\n } catch (err: any) {\n if (isTableMissingError(this.getDbType(), err)) {\n return [];\n }\n throw err;\n }\n if (db === \"mysql\" || db === \"mariadb\") {\n const map = new Map<\n string,\n { name: string; columns: string[]; isUnique: boolean }\n >();\n for (const r of rows) {\n const key = r.Key_name;\n const isUnique = r.Non_unique === 0;\n const arr = map.get(key) || {\n name: key,\n columns: [] as string[],\n isUnique,\n };\n arr.columns.push(r.Column_name);\n map.set(key, arr);\n }\n return Array.from(map.values());\n }\n\n if (db === \"postgres\" || db === \"cockroachdb\") {\n const map = new Map<\n string,\n { name: string; columns: string[]; isUnique: boolean }\n >();\n for (const r of rows) {\n const key = r.index_name;\n const isUnique = !!r.is_unique;\n const arr = map.get(key) || {\n name: key,\n columns: [] as string[],\n isUnique,\n };\n arr.columns.push(r.column_name);\n map.set(key, arr);\n }\n return Array.from(map.values());\n }\n\n // sqlite\n const result: TableIndexInfo[] = [];\n for (const r of rows) {\n const name = r.name;\n const isUnique = !!r.unique;\n const colsRows: any[] = await this.rawQuery(`PRAGMA index_info(${name})`);\n const columns = colsRows.map((cr) => cr.name);\n result.push({ name, columns, isUnique });\n }\n return result;\n }\n\n /**\n * @description Introspects table foreign keys metadata\n */\n async getForeignKeyInfo(table: string): Promise<TableForeignKeyInfo[]> {\n const ast = new AstParser(\n {\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model,\n this.getDbType(),\n );\n\n const sql = ast.parse([new ForeignKeyInfoNode(table)]).sql;\n let rows: any[] = [];\n try {\n rows = await this.rawQuery(sql);\n } catch (err: any) {\n if (isTableMissingError(this.getDbType(), err)) {\n return [];\n }\n throw err;\n }\n\n const db = this.getDbType();\n if (db === \"sqlite\") {\n const grouped = new Map<number, TableForeignKeyInfo>();\n for (const r of rows) {\n const id = Number(r.id);\n const fk = grouped.get(id) || {\n name: undefined,\n columns: [] as string[],\n referencedTable: String(r.table),\n referencedColumns: [] as string[],\n onDelete: r.on_delete ?? null,\n onUpdate: r.on_update ?? null,\n };\n\n fk.columns.push(String(r.from));\n fk.referencedColumns.push(String(r.to));\n grouped.set(id, fk);\n }\n return Array.from(grouped.values());\n }\n\n const map = new Map<string, TableForeignKeyInfo>();\n for (const row of rows) {\n const name = String(row.name || \"\");\n const key = name || `${row.referenced_table}_${row.column_name}`;\n const fk = map.get(key) || {\n name: name || undefined,\n columns: [] as string[],\n referencedTable: String(row.referenced_table),\n referencedColumns: [] as string[],\n onDelete: row.on_delete ?? null,\n onUpdate: row.on_update ?? null,\n };\n\n fk.columns.push(String(row.column_name));\n fk.referencedColumns.push(String(row.referenced_column));\n map.set(key, fk);\n }\n\n return Array.from(map.values());\n }\n\n /**\n * @description Introspects table primary key from the database\n */\n async getPrimaryKeyInfo(\n table: string,\n ): Promise<TablePrimaryKeyInfo | undefined> {\n const ast = new AstParser(\n {\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model,\n this.getDbType(),\n );\n\n const sql = ast.parse([new PrimaryKeyInfoNode(table)]).sql;\n let rows: any[] = [];\n try {\n rows = await this.rawQuery(sql);\n } catch (err: any) {\n if (isTableMissingError(this.getDbType(), err)) {\n return undefined;\n }\n throw err;\n }\n\n if (!rows.length) {\n return undefined;\n }\n\n const columns = rows.map((row) => String(row.column_name));\n const name = rows[0].name;\n\n return {\n name: name || undefined,\n columns,\n };\n }\n\n /**\n * @description Acquires an advisory lock\n * @description Useful for preventing concurrent operations from running simultaneously\n * @param lockKey - The lock identifier (defaults to 'hysteria_lock')\n * @param timeoutMs - Maximum time to wait for lock in milliseconds (postgres/mssql only)\n * @returns true if lock was acquired, false otherwise\n */\n async acquireLock(\n lockKey: string = \"hysteria_lock\",\n timeoutMs: number = 30000,\n ): Promise<boolean> {\n const dbType = this.getDbType();\n\n try {\n switch (dbType) {\n case \"postgres\":\n case \"cockroachdb\": {\n const lockId = this.hashStringToLockId(lockKey);\n const result = (await this.rawQuery(\n `SELECT pg_try_advisory_lock($1) as pg_try_advisory_lock`,\n [lockId],\n )) as any;\n const lockAcquired = result.rows?.[0]?.pg_try_advisory_lock;\n // Handle both boolean and string ('t'/'f') responses from different drivers\n return lockAcquired === true || lockAcquired === \"t\";\n }\n\n case \"mysql\":\n case \"mariadb\": {\n const timeoutSeconds = Math.floor(timeoutMs / 1000);\n const result = (await this.rawQuery(\n `SELECT GET_LOCK(?, ?) as lock_result`,\n [lockKey, timeoutSeconds],\n )) as any;\n return result[0]?.[0]?.lock_result === 1;\n }\n\n case \"mssql\": {\n const result = (await this.rawQuery(\n `DECLARE @result INT; EXEC @result = sp_getapplock @Resource = @p0, @LockMode = 'Exclusive', @LockOwner = 'Session', @LockTimeout = @p1; SELECT @result as lock_result`,\n [lockKey, timeoutMs],\n )) as any;\n const lockResult = result.recordset?.[0]?.lock_result ?? -999;\n return lockResult >= 0;\n }\n\n case \"oracledb\": {\n try {\n const lockHandle = this.hashStringToLockId(lockKey);\n await this.rawQuery(\n `BEGIN DBMS_LOCK.ALLOCATE_UNIQUE('${lockKey}', '${lockHandle}'); END;`,\n );\n const result = await this.rawQuery<any>(\n `DECLARE\n v_result NUMBER;\n BEGIN\n v_result := DBMS_LOCK.REQUEST(\n lockhandle => ${lockHandle},\n lockmode => DBMS_LOCK.X_MODE,\n timeout => ${Math.floor(timeoutMs / 1000)},\n release_on_commit => FALSE\n );\n IF v_result IN (0, 4) THEN\n :result := 1;\n ELSE\n :result := 0;\n END IF;\n END;`,\n );\n return result?.outBinds?.result === 1;\n } catch (error) {\n const err =\n error instanceof Error ? error : new Error(String(error));\n logger.warn(\n `Oracle lock allocation may have failed: ${err.message}`,\n );\n return false;\n }\n }\n\n case \"sqlite\":\n logger.info(\n \"SQLite uses automatic file-based locking, advisory locks not needed\",\n );\n return true;\n\n default:\n logger.warn(\n `Advisory locks not implemented for database type: ${dbType}`,\n );\n return true;\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n logger.error(\n `Failed to acquire lock: ${err.message || JSON.stringify(error)} (dbType: ${dbType}, lockKey: ${lockKey}). Full error: ${JSON.stringify(error)}`,\n );\n return false;\n }\n }\n\n /**\n * @description Releases an advisory lock\n * @param lockKey - The lock identifier (defaults to 'hysteria_lock')\n * @returns true if lock was released, false otherwise\n */\n async releaseLock(lockKey: string = \"hysteria_lock\"): Promise<boolean> {\n const dbType = this.getDbType();\n\n try {\n switch (dbType) {\n case \"postgres\":\n case \"cockroachdb\": {\n const lockId = this.hashStringToLockId(lockKey);\n const result = (await this.rawQuery(\n `SELECT pg_advisory_unlock($1) as pg_advisory_unlock`,\n [lockId],\n )) as any;\n const lockReleased = result.rows?.[0]?.pg_advisory_unlock;\n // Handle both boolean and string ('t'/'f') responses from different drivers\n return lockReleased === true || lockReleased === \"t\";\n }\n\n case \"mysql\":\n case \"mariadb\": {\n const result = (await this.rawQuery(\n `SELECT RELEASE_LOCK(?) as release_result`,\n [lockKey],\n )) as any;\n return result[0]?.[0]?.release_result === 1;\n }\n\n case \"mssql\": {\n const result = (await this.rawQuery(\n `DECLARE @result INT; EXEC @result = sp_releaseapplock @Resource = @p0, @LockOwner = 'Session'; SELECT @result as release_result`,\n [lockKey],\n )) as any;\n const lockResult = result.recordset?.[0]?.release_result ?? -999;\n return lockResult >= 0;\n }\n\n case \"oracledb\": {\n try {\n const lockHandle = this.hashStringToLockId(lockKey);\n const result = await this.rawQuery<any>(\n `DECLARE\n v_result NUMBER;\n BEGIN\n v_result := DBMS_LOCK.RELEASE(${lockHandle});\n IF v_result = 0 THEN\n :result := 1;\n ELSE\n :result := 0;\n END IF;\n END;`,\n );\n return result?.outBinds?.result === 1;\n } catch (error) {\n const err =\n error instanceof Error ? error : new Error(String(error));\n logger.warn(`Oracle lock release may have failed: ${err.message}`);\n return false;\n }\n }\n\n case \"sqlite\":\n return true;\n\n default:\n logger.warn(\n `Advisory locks not implemented for database type: ${dbType}`,\n );\n return true;\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n logger.error(\n `Failed to release lock: ${err.message || JSON.stringify(error)} (dbType: ${dbType}, lockKey: ${lockKey}). Full error: ${JSON.stringify(error)}`,\n );\n return false;\n }\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n /**\n * @description Converts a string to a numeric lock ID for databases that require it\n */\n private hashStringToLockId(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n return Math.abs(hash);\n }\n\n /**\n * @description Executes an operation on a slave, handling failures with the configured callback\n * @param operation The operation to execute on the slave\n * @returns The result of the operation, or falls back to master if slave fails\n */\n private async executeOnSlave<R>(\n operation: (slave: SqlDataSource<D, T, C>) => Promise<R>,\n ): Promise<R> {\n const slave = this.getSlave();\n\n if (!slave) {\n return operation(this);\n }\n\n try {\n return await operation(slave);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n if (this.onSlaveServerFailure) {\n await this.onSlaveServerFailure(err, {\n host: slave.host,\n port: slave.port,\n username: slave.username,\n password: slave.password,\n database: slave.database,\n type: slave.sqlType,\n });\n\n return operation(this);\n }\n\n throw err;\n }\n }\n\n /**\n * @description Internal method to establish connection without setting as primary instance\n * @description Used by connectToSecondarySource and useConnection\n */\n private async connectWithoutSettingPrimary(): Promise<void> {\n this.sqlPool = await createSqlPool(this.sqlType, this.inputDetails);\n this.ownsPool = true;\n }\n}\n","import rollbackMigrationsConnector from \"../../cli/migration_rollback_connector\";\nimport runMigrationsConnector from \"../../cli/migration_run_connector\";\nimport { env } from \"../../env/env\";\nimport logger from \"../../utils/logger\";\nimport { SqlDataSource } from \"../sql_data_source\";\nimport {\n SqlDataSourceInput,\n SqlDataSourceType,\n} from \"../sql_data_source_types\";\nimport { Migration } from \"./migration\";\n\n/**\n * @description Used internally from the CLI\n */\nexport class Migrator {\n private sql: SqlDataSource;\n private readonly migrationTable = \"migrations\";\n\n constructor(sql?: SqlDataSource) {\n this.sql = sql || SqlDataSource.instance;\n }\n\n async upMigrations(migrations: Migration[]): Promise<void> {\n for (const migration of migrations) {\n logger.info(`Running migration ${migration.migrationName}`);\n await migration.up();\n const statements = migration.schema.queryStatements;\n for (const statement of statements) {\n if (!statement) {\n continue;\n }\n\n await this.sql.rawQuery(statement);\n }\n\n await this.addMigrationToMigrationTable(migration);\n if (migration.afterMigration) {\n await migration.afterMigration(this.sql);\n }\n }\n }\n\n async downMigrations(migrations: Migration[]): Promise<void> {\n migrations = migrations.reverse();\n for (const migration of migrations) {\n logger.info(`Rolling back migration ${migration.migrationName}`);\n await migration.down();\n const statements = migration.schema.queryStatements;\n for (const statement of statements) {\n if (!statement) {\n continue;\n }\n\n await this.sql.rawQuery(statement);\n }\n\n await this.deleteMigrationFromMigrationTable(migration);\n if (migration.afterMigration) {\n await migration.afterMigration(this.sql);\n }\n }\n }\n\n private async addMigrationToMigrationTable(migration: Migration) {\n const completeUtcTimestamp = new Date();\n // Oracle requires Date object, not string format\n const timestamp =\n this.sql.getDbType() === \"oracledb\"\n ? completeUtcTimestamp\n : completeUtcTimestamp\n .toISOString()\n .replace(\"T\", \" \")\n .replace(/\\.\\d{3}Z$/, \"\");\n\n await this.sql.query(this.migrationTable).insert({\n name: migration.migrationName,\n timestamp,\n });\n }\n\n private async deleteMigrationFromMigrationTable(migration: Migration) {\n await this.sql\n .query(this.migrationTable)\n .where(\"name\", migration.migrationName)\n .delete();\n }\n}\n\n/**\n * @description Can be used to run migrations programmatically\n */\nexport class ClientMigrator {\n protected migrationPath: string;\n protected sqlDataSourceInput?: SqlDataSource[\"inputDetails\"] | SqlDataSource;\n\n constructor(\n migrationPath: string = env.MIGRATION_PATH || \"database/migrations\",\n sqlDataSourceInput?: SqlDataSource[\"inputDetails\"] | SqlDataSource,\n ) {\n this.migrationPath = migrationPath;\n this.sqlDataSourceInput = sqlDataSourceInput;\n }\n\n /**\n * @description Runs programmatic migrations up\n */\n async up(): Promise<void> {\n return this.migrate(\"up\");\n }\n\n /**\n * @description Runs programmatic migrations down\n */\n async down(): Promise<void> {\n return this.migrate(\"down\");\n }\n\n /**\n * @description Runs programmatic migrations up or down\n * @param direction - The direction to migrate, either \"up\" or \"down\"\n */\n private async migrate(direction: \"up\" | \"down\"): Promise<void> {\n env.MIGRATION_PATH = this.migrationPath;\n let sqlDataSource: SqlDataSource;\n\n if (this.sqlDataSourceInput instanceof SqlDataSource) {\n sqlDataSource = this.sqlDataSourceInput;\n } else {\n const input = this\n .sqlDataSourceInput as SqlDataSourceInput<SqlDataSourceType>;\n sqlDataSource = new SqlDataSource(input);\n await sqlDataSource.connect();\n }\n\n if (direction === \"up\") {\n return runMigrationsConnector(\n sqlDataSource,\n undefined,\n this.migrationPath,\n sqlDataSource.migrationConfig.tsconfig,\n sqlDataSource.migrationConfig.transactional,\n );\n }\n\n return rollbackMigrationsConnector(\n sqlDataSource,\n undefined,\n this.migrationPath,\n sqlDataSource.migrationConfig.tsconfig,\n sqlDataSource.migrationConfig.transactional,\n );\n }\n}\n\n/**\n * @description Defines a programmatic migrator, can be used to run migrations programmatically\n * @param migrationPath - The path to the migrations\n * @param sqlDataSourceInput - The sql data source input, if not provided, env variables will be used\n */\nexport const defineMigrator = (\n migrationPath: string,\n sqlDataSourceInput?: SqlDataSource[\"inputDetails\"] | SqlDataSource,\n): ClientMigrator => {\n return new ClientMigrator(migrationPath, sqlDataSourceInput);\n};\n","import { Migration } from \"../sql/migrations/migration\";\nimport { Migrator } from \"../sql/migrations/migrator\";\nimport { type SqlDataSource } from \"../sql/sql_data_source\";\nimport { SqlDataSourceType } from \"../sql/sql_data_source_types\";\nimport { Transaction } from \"../sql/transactions/transaction\";\nimport logger from \"../utils/logger\";\nimport { getMigrations, getMigrationTable } from \"./migration_utils\";\nimport { MigrationTableType } from \"./resources/migration_table_type\";\n\nexport default async function rollbackMigrationsConnector(\n sql: SqlDataSource,\n rollBackUntil?: string,\n migrationPath?: string,\n tsconfigPath?: string,\n transactional?: boolean,\n) {\n const dbType = sql.getDbType();\n const shouldUseTransaction =\n transactional && dbType !== \"mssql\" && dbType !== \"oracledb\";\n let trx: Transaction | null = null;\n logger.info(\"Rolling back migrations for database type: \" + dbType);\n\n try {\n const migrationTable: MigrationTableType[] = await getMigrationTable(\n dbType as SqlDataSourceType,\n sql.getPool(),\n );\n const migrations: Migration[] = await getMigrations(\n dbType as SqlDataSourceType,\n migrationPath,\n tsconfigPath,\n );\n\n const tableMigrations = migrationTable.map((migration) => migration.name);\n const pendingMigrations = migrations.filter((migration) =>\n tableMigrations.includes(migration.migrationName),\n );\n\n if (pendingMigrations.length === 0) {\n logger.info(\"No pending migrations.\");\n return;\n }\n\n if (rollBackUntil) {\n const rollBackUntilIndex = pendingMigrations.findIndex(\n (migration) => migration.migrationName === rollBackUntil,\n );\n\n if (rollBackUntilIndex === -1) {\n logger.error(`Rollback until migration not found: ${rollBackUntil}`);\n return;\n }\n\n const filteredMigrations = pendingMigrations.slice(rollBackUntilIndex);\n\n if (shouldUseTransaction) {\n trx = await sql.startTransaction();\n sql = trx.sql as SqlDataSource;\n }\n\n const migrator = new Migrator(sql);\n await migrator.downMigrations(filteredMigrations);\n\n if (shouldUseTransaction) {\n await trx?.commit();\n }\n\n logger.info(\"Migrations rolled back successfully\");\n return;\n }\n\n const migrator = new Migrator(sql);\n if (shouldUseTransaction) {\n trx = await sql.startTransaction();\n sql = trx.sql as SqlDataSource;\n }\n\n await migrator.downMigrations(pendingMigrations);\n\n if (shouldUseTransaction) {\n await trx?.commit();\n }\n } catch (error: any) {\n if (shouldUseTransaction) {\n await trx?.rollback();\n }\n\n throw error;\n }\n\n logger.info(\"Migrations rolled back successfully\");\n}\n","export class GenerateMigrationTemplate {\n static async generate(sqlStatements: string[]) {\n const template = `import { Migration } from \"hysteria-orm\";\n\nexport default class extends Migration {\n async up() {\n${sqlStatements\n .map((statement) => {\n const escapedStatement = statement\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/'/g, \"\\\\'\")\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\t/g, \"\\\\t\");\n return ` this.schema.rawQuery('${escapedStatement}');`;\n })\n .join(\"\\n\")}\n }\n\n async down() {}\n}`;\n return template;\n }\n}\n","export class InitTemplates {\n static initTemplate(type: string): string {\n const port = this.getDefaultPort(type);\n const database = type === \"sqlite\" ? \"database.db\" : \"database\";\n const importType =\n type === \"mongodb\"\n ? \"mongo\"\n : type === \"redis\"\n ? \"redis\"\n : \"SqlDataSource\";\n\n if (type === \"mongodb\" || type === \"redis\") {\n return this.handleNoSqlConnection(\n type,\n importType === \"SqlDataSource\" ? \"sql\" : importType,\n );\n }\n\n return `\nimport { ${importType} } from \"hysteria-orm\";\n\nconst db = new ${importType}({\n type: \"${type}\",\n database: \"${database}\",${\n type === \"sqlite\"\n ? `\n logs: true,\n migrations: {\n path: \"database/migrations\",\n },`\n : `\n port: ${port},\n host: \"localhost\",\n username: \"root\",\n password: \"root\",\n logs: true,\n migrations: {\n path: \"database/migrations\",\n },`\n }\n});\n\nawait db.connect().catch((err) => {\n console.error(err);\n process.exit(1);\n});\n\nexport default db;\n`;\n }\n\n private static handleNoSqlConnection(\n type: string,\n importType: string,\n ): string {\n const config = this.getNoSqlConnectionConfig(type);\n if (config) {\n return `\nimport { ${importType} } from \"hysteria-orm\";\n\nconst db = await ${importType}.connect(${config}).catch((err) => {\n console.error(err);\n process.exit(1);\n});\n\nexport default db;`;\n }\n\n return \"\";\n }\n\n private static getNoSqlConnectionConfig(type: string): string {\n switch (type) {\n case \"mongodb\":\n return \"mongodb://localhost:27017/database?authSource=admin\";\n case \"redis\":\n return `{\n host: \"localhost\",\n port: 6379,\n password: \"root\",\n username: \"default\",\n db: 0,\n}`;\n default:\n return \"\";\n }\n }\n\n private static getDefaultPort(type: string): number {\n switch (type) {\n case \"mysql\":\n return 3306;\n case \"postgres\":\n return 5432;\n case \"mariadb\":\n return 3306;\n case \"cockroachdb\":\n return 26257;\n case \"mssql\":\n return 1433;\n case \"mongodb\":\n return 27017;\n case \"redis\":\n return 6379;\n case \"oracledb\":\n return 1521;\n default:\n return 3306;\n }\n }\n}\n","import fs from \"node:fs\";\nimport { type SqlDataSource } from \"../sql/sql_data_source\";\nimport logger from \"../utils/logger\";\nimport path from \"node:path\";\n\nexport default async function runSqlConnector(\n sql: string,\n sqlDataSource: SqlDataSource,\n out?: string,\n): Promise<void> {\n const databaseType = sqlDataSource.getDbType();\n logger.info(`Running sql for ${databaseType}`);\n const result = await sqlDataSource.rawQuery(sql);\n logger.info(\"Sql ran successfully\");\n if (out) {\n const fileDir = path.dirname(out);\n if (!fs.existsSync(fileDir)) {\n fs.mkdirSync(fileDir, { recursive: true });\n }\n\n fs.writeFileSync(out, JSON.stringify(result, null, 2));\n logger.info(`Query result saved to ${out}`);\n return;\n }\n\n logger.info(JSON.stringify(result, null, 2));\n await sqlDataSource.disconnect();\n}\n","export class SeederTemplates {\n static seederTemplate(): string {\n return `import { BaseSeeder } from \"hysteria-orm\";\n\nexport default class extends BaseSeeder {\n /**\n * Run the seeder\n */\n async run(): Promise<void> {\n console.log('Seeder completed');\n }\n}\n`;\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { SeederTemplates } from \"./resources/seeder_templates\";\nimport logger from \"../utils/logger\";\n\nconst seederCreateConnector = (\n name: string,\n javascript: boolean,\n seederPath?: string,\n): void => {\n const seedersFolder = seederPath || \"database/seeders\";\n const extension = javascript ? \".js\" : \".ts\";\n const timestamp = Date.now();\n const fileName = `${timestamp}_${name}${extension}`;\n\n if (!fs.existsSync(seedersFolder)) {\n fs.mkdirSync(seedersFolder, { recursive: true });\n logger.info(`Created seeders directory: ${seedersFolder}`);\n }\n\n const filePath = path.join(seedersFolder, fileName);\n const template = SeederTemplates.seederTemplate();\n\n fs.writeFileSync(filePath, template);\n logger.info(`Seeder created successfully: ${filePath}`);\n};\n\nexport default seederCreateConnector;\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { SqlDataSource } from \"../sql/sql_data_source\";\nimport { importTsUniversal } from \"../utils/importer\";\nimport logger from \"../utils/logger\";\n\nconst runSeedersConnector = async (\n sqlDataSource: SqlDataSource,\n seederPaths: string[],\n tsconfigPath?: string,\n): Promise<void> => {\n const filesToRun: Array<{ file: string; folder: string }> = [];\n\n for (const seederPath of seederPaths) {\n const resolvedPath = path.resolve(process.cwd(), seederPath);\n\n if (!fs.existsSync(resolvedPath)) {\n logger.error(`Path not found: ${resolvedPath}`);\n process.exit(1);\n }\n\n const stats = fs.statSync(resolvedPath);\n\n if (stats.isDirectory()) {\n const files = fs\n .readdirSync(resolvedPath)\n .filter((file) => file.endsWith(\".ts\") || file.endsWith(\".js\"))\n .sort();\n\n for (const file of files) {\n filesToRun.push({ file, folder: resolvedPath });\n }\n } else if (stats.isFile()) {\n const fileName = path.basename(resolvedPath);\n const folderPath = path.dirname(resolvedPath);\n\n if (fileName.endsWith(\".ts\") || fileName.endsWith(\".js\")) {\n filesToRun.push({ file: fileName, folder: folderPath });\n } else {\n logger.error(`File must be a .ts or .js file: ${fileName}`);\n process.exit(1);\n }\n }\n }\n\n if (!filesToRun.length) {\n logger.info(\"No seeders found\");\n return;\n }\n\n logger.info(`Found ${filesToRun.length} seeder(s) to run`);\n\n if (!sqlDataSource.isConnected) {\n await sqlDataSource.connect();\n }\n\n for (const { file, folder } of filesToRun) {\n try {\n logger.info(`Running seeder: ${file}`);\n const seederFilePath = path.resolve(folder, file);\n\n const seederModule = await importTsUniversal<{\n default: new (sqlDataSource: SqlDataSource) => {\n run: () => Promise<void>;\n };\n }>(seederFilePath, tsconfigPath);\n\n if (!seederModule.default) {\n logger.error(`Seeder ${file} does not export a default class`);\n continue;\n }\n\n const seederInstance = new seederModule.default(sqlDataSource);\n\n if (typeof seederInstance.run !== \"function\") {\n logger.error(\n `Seeder ${file} must have a run() method. Make sure it extends BaseSeeder from hysteria-orm`,\n );\n continue;\n }\n\n await seederInstance.run();\n logger.info(`✓ Completed seeder: ${file}`);\n } catch (error) {\n logger.error(`Failed to run seeder ${file}: ${error}`);\n throw error;\n }\n }\n\n logger.info(\"All seeders completed successfully\");\n};\n\nexport default runSeedersConnector;\n","import { execSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport readline from \"node:readline\";\nimport { sqlDatabaseTypes } from \"../cli\";\nimport { DataSourceType } from \"../data_source/data_source_types\";\nimport logger from \"./logger\";\n\nexport const getPackageManager = (): [string, string] => {\n const hasYarnLock = fs.existsSync(path.join(process.cwd(), \"yarn.lock\"));\n if (hasYarnLock) {\n return [\"yarn\", \"add\"];\n }\n const hasPnpmLock = fs.existsSync(path.join(process.cwd(), \"pnpm-lock.yaml\"));\n if (hasPnpmLock) {\n return [\"pnpm\", \"add\"];\n }\n const hasPackageLock = fs.existsSync(\n path.join(process.cwd(), \"package-lock.json\"),\n );\n if (hasPackageLock) {\n return [\"npm\", \"install\"];\n }\n const hasBunLock = fs.existsSync(path.join(process.cwd(), \"bun.lockb\"));\n if (hasBunLock) {\n return [\"bun\", \"add\"];\n }\n const hasDenoLock = fs.existsSync(path.join(process.cwd(), \"deno.lock\"));\n if (hasDenoLock) {\n return [\"deno\", \"add\"];\n }\n return [\"npm\", \"install\"];\n};\n\n/**\n * Prompts user for confirmation and executes a command if approved\n * @param command - The command to execute\n * @param packageManager - The package manager name (e.g., \"npm\", \"yarn\")\n * @param dependencies - Array of dependencies to display\n * @param options - execSync options\n * @returns Promise that resolves to true if executed, false if skipped\n */\nexport const execWithPrompt = async (\n command: string,\n packageManager: string,\n dependencies: string[],\n options?: Parameters<typeof execSync>[1],\n): Promise<boolean> => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const dependenciesList = dependencies.join(\", \");\n const prompt = `Do you want to install the following dependencies using ${packageManager}?\\n${dependenciesList}\\n(y/n): `;\n\n return new Promise((resolve) => {\n rl.question(prompt, (answer) => {\n rl.close();\n\n if (answer.toLowerCase() === \"y\" || answer.toLowerCase() === \"yes\") {\n execSync(command, options);\n resolve(true);\n return;\n }\n\n resolve(false);\n });\n });\n};\n\nexport const installBaseDependencies = async (\n packageManager: string,\n packageManagerCommand: string,\n type: DataSourceType | \"redis\",\n): Promise<void> => {\n const devDependencies = sqlDatabaseTypes.includes(type)\n ? [\"bundle-require@^5.1.0\", \"typescript@^5.9.3\", \"esbuild@^0.27.0\"]\n : [];\n\n let driverDependency = \"\";\n switch (type) {\n case \"mariadb\":\n case \"mysql\":\n driverDependency = \"mysql2@^3.15.3\";\n devDependencies.push(\"@types/mysql2@github:types/mysql2\");\n break;\n case \"cockroachdb\":\n case \"postgres\":\n driverDependency = \"pg@^8.16.3\";\n devDependencies.push(\"@types/pg@^8.16.0\");\n break;\n case \"sqlite\":\n driverDependency = \"sqlite3@^5.1.7\";\n devDependencies.push(\"@types/sqlite3@^5.1.0\");\n break;\n case \"mongo\":\n driverDependency = \"mongodb@^7.0.0\";\n devDependencies.push(\"@types/mongodb@^4.0.7\");\n break;\n case \"redis\":\n driverDependency = \"ioredis@^5.8.2\";\n devDependencies.push(\"@types/ioredis@^5.0.0\");\n break;\n case \"mssql\":\n driverDependency = \"mssql@^12.2.0\";\n devDependencies.push(\"@types/mssql@^9.1.8\");\n break;\n case \"oracledb\":\n driverDependency = \"oracledb@^6.10.0\";\n devDependencies.push(\"@types/oracledb@^6.10.0\");\n break;\n default:\n throw new Error(`Invalid database type: ${type}`);\n }\n\n if (driverDependency) {\n const driverInstalled = await execWithPrompt(\n `${packageManager} ${packageManagerCommand} ${driverDependency}`,\n packageManager,\n [driverDependency],\n { stdio: \"inherit\" },\n );\n\n if (driverInstalled) {\n logger.info(\"Driver dependency installed successfully\");\n }\n\n if (!driverInstalled) {\n logger.info(\"Driver dependency installation skipped\");\n }\n }\n\n const devFlag = packageManager === \"deno\" ? \"--dev\" : \"-D\";\n if (devDependencies.length) {\n const devInstalled = await execWithPrompt(\n `${packageManager} ${packageManagerCommand} ${devDependencies.join(\" \")} ${devFlag}`,\n packageManager,\n devDependencies,\n { stdio: \"inherit\" },\n );\n\n if (devInstalled) {\n logger.info(\"Dev dependencies installed successfully\");\n }\n\n if (!devInstalled) {\n logger.info(\"Dev dependencies installation skipped\");\n }\n }\n};\n","import { Command } from \"commander\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport dropAllTablesConnector from \"./cli/drop_all_tables_connector\";\nimport migrationCreateConnector from \"./cli/migration_create_connector\";\nimport rollbackMigrationsConnector from \"./cli/migration_rollback_connector\";\nimport runMigrationsConnector from \"./cli/migration_run_connector\";\nimport { GenerateMigrationTemplate } from \"./cli/resources/generate_migration_template\";\nimport { InitTemplates } from \"./cli/resources/init_templates\";\nimport runSqlConnector from \"./cli/run_sql_connector\";\nimport seederCreateConnector from \"./cli/seeder_create_connector\";\nimport runSeedersConnector from \"./cli/seeder_run_connector\";\nimport { SchemaDiff } from \"./sql/migrations/schema_diff/schema_diff\";\nimport { SqlDataSource } from \"./sql/sql_data_source\";\nimport { SqlDataSourceType } from \"./sql/sql_data_source_types\";\nimport { importTsUniversal } from \"./utils/importer\";\nimport logger from \"./utils/logger\";\nimport { getPackageManager, installBaseDependencies } from \"./utils/package\";\n\nexport const sqlDatabaseTypes = [\n \"sqlite\",\n \"mysql\",\n \"postgres\",\n \"mariadb\",\n \"cockroachdb\",\n \"mssql\",\n];\nconst allDatabaseTypes = sqlDatabaseTypes.concat(\"mongodb\", \"redis\");\n\nconst program = new Command();\n\nprogram\n .command(\"init\", { isDefault: false })\n .option(\n \"-t, --type [type]\",\n `Type of the database to connect to, available types: ${allDatabaseTypes.join(\", \")}`,\n undefined,\n )\n .description(\n \"Initialize the hysteria-orm with standard configuration, it will create a database if not exists and a migrations folder inside it if not exists, it will also create a index.ts file in the database folder\",\n )\n .action(async (option: { type: SqlDataSourceType }) => {\n const availableTypes = allDatabaseTypes.join(\", \");\n if (!option.type) {\n logger.error(\n `Database type is required (-t|--type), available types: ${availableTypes}`,\n );\n process.exit(1);\n }\n\n if (!allDatabaseTypes.includes(option.type)) {\n logger.error(\n `Invalid database type: ${option.type}, available types: ${allDatabaseTypes.join(\", \")}`,\n );\n process.exit(1);\n }\n\n logger.info(\"Initializing hysteria-orm with standard configuration\");\n logger.info(\n `Database type: ${option.type || \"not specified (will use env DB_TYPE)\"}`,\n );\n\n const [packageManager, packageManagerCommand] = getPackageManager();\n logger.info(`Package manager: ${packageManager}`);\n\n logger.info(\"Installing base dependencies\");\n await installBaseDependencies(\n packageManager,\n packageManagerCommand,\n option.type,\n );\n\n const template = InitTemplates.initTemplate(option.type);\n if (!fs.existsSync(\"database\")) {\n fs.mkdirSync(\"database\", { recursive: true });\n } else {\n logger.info(\"database folder already exists, skipping\");\n }\n\n if (!fs.existsSync(\"database/index.ts\")) {\n fs.writeFileSync(\"database/index.ts\", template);\n } else {\n logger.info(\"database/index.ts file already exists, skipping\");\n }\n\n if (\n sqlDatabaseTypes.includes(option.type) &&\n !fs.existsSync(\"database/migrations\")\n ) {\n fs.mkdirSync(\"database/migrations\", { recursive: true });\n } else {\n logger.info(\n \"database/migrations folder already exists or is not a sql database, skipping\",\n );\n }\n\n logger.info(\"Initialization completed successfully\");\n });\n\nprogram\n .command(\"sql [sql]\")\n .alias(\"run:sql\")\n .option(\"-f, --file [path]\", \"Path to the sql file\", undefined)\n .option(\n \"-d, --datasource [path]\",\n \"Path to SqlDataSource (default export)\",\n undefined,\n )\n .option(\"-o, --out [query]\", \"File path to save the query result\", undefined)\n .option(\n \"-t, --tsconfig [tsconfigPath]\",\n \"Path to the tsconfig.json file, defaults to ./tsconfig.json\",\n undefined,\n )\n .description(\n \"Run a sql file or a sql query directly from the command line for the given connection defined in the env file\",\n )\n .action(\n async (\n sql?: string,\n option?: {\n file?: string;\n datasource?: string;\n out?: string;\n tsconfigPath?: string;\n },\n ) => {\n logger.info(\"Starting SQL execution\");\n if (!option?.datasource) {\n logger.error(\"SqlDataSource file path is required (-d|--datasource)\");\n process.exit(1);\n }\n\n let filePath = option?.file;\n if (!sql && !filePath) {\n logger.error(\"SQL query or file path is required\");\n process.exit(1);\n }\n\n if (sql && filePath) {\n logger.error(\"Cannot provide both sql query and file path\");\n process.exit(1);\n }\n\n const resolvedPath = path.resolve(process.cwd(), option.datasource);\n const { default: sqlDs } = await importTsUniversal<{\n default: SqlDataSource;\n }>(resolvedPath, option?.tsconfigPath);\n\n if (sql) {\n logger.info(\"Executing SQL query directly from command line\");\n try {\n await runSqlConnector(sql, sqlDs, option?.out);\n logger.info(\"SQL execution completed successfully\");\n process.exit(0);\n } catch (error) {\n logger.error(`SQL execution failed: ${error}`);\n process.exit(1);\n }\n }\n\n if (!filePath) {\n logger.error(\"No SQL statement or file provided\");\n process.exit(1);\n }\n\n logger.info(`Reading SQL from file: ${filePath}`);\n filePath = path.resolve(process.cwd(), filePath);\n if (!fs.existsSync(filePath)) {\n logger.error(`File not found: ${filePath}`);\n process.exit(1);\n }\n\n const sqlStatement = fs.readFileSync(filePath, \"utf-8\");\n logger.info(\n `SQL file loaded successfully (${sqlStatement.length} characters)`,\n );\n try {\n await runSqlConnector(sqlStatement, sqlDs, option?.out);\n logger.info(\"SQL file execution completed successfully\");\n process.exit(0);\n } catch (error) {\n logger.error(`SQL file execution failed: ${error}`);\n process.exit(1);\n }\n },\n );\n\nprogram\n .command(\"create:migration <name>\")\n .description(\n \"Create a new migration file, standard folder is migrations from the current directory you are now, you can change it in the env MIGRATION_PATH\",\n )\n .option(\n \"-j, --javascript\",\n \"Generate a javascript migration file instead of a default typescript one\",\n false,\n )\n .option(\n \"-a, --alter\",\n \"Generate a template for an alter table migration\",\n false,\n )\n .option(\n \"-c, --create\",\n \"Generate a template for a create table migration\",\n false,\n )\n .option(\n \"-t, --table <table>\",\n \"Specifies the target table name for the migration\",\n false,\n )\n .action(\n (\n name: string,\n option: {\n javascript: boolean;\n alter: boolean;\n create: boolean;\n table: string;\n },\n ) => {\n logger.info(`Creating migration: ${name}`);\n logger.info(\n `Migration options: javascript=${option.javascript}, alter=${option.alter}, create=${option.create}, table=${option.table || \"not specified\"}`,\n );\n\n if (!name) {\n logger.error(\"Migration name is required\");\n process.exit(1);\n }\n\n if (option.alter && option.create) {\n logger.error(\"Cannot use --alter and --create at the same time\");\n process.exit(1);\n }\n\n if (option.table && !(option.create || option.alter)) {\n logger.error(\"Cannot use --table without --create or --alter\");\n process.exit(1);\n }\n\n const migrationMode = option.alter\n ? \"alter\"\n : option.create\n ? \"create\"\n : \"basic\";\n\n logger.info(`Migration mode: ${migrationMode}`);\n migrationCreateConnector(\n name,\n option.javascript,\n migrationMode,\n option.table || name,\n );\n },\n );\n\nprogram\n .command(\"migrate [runUntil]\")\n .option(\n \"-c, --tsconfig [tsconfigPath]\",\n \"Path to the tsconfig.json file, defaults to ./tsconfig.json\",\n undefined,\n )\n .option(\n \"-d, --datasource [path]\",\n \"Path to SqlDataSource (default export)\",\n undefined,\n )\n .option(\n \"-m, --migration-path [migrationPath]\",\n \"Path to the migrations\",\n undefined,\n )\n .option(\n \"-t, --transactional\",\n \"Runs all the pending migrations in a single transaction, only applies to postgres\",\n true,\n )\n .option(\n \"-l, --lock\",\n \"Acquire advisory lock before running migrations to prevent concurrent execution\",\n true,\n )\n .option(\n \"--lock-timeout [lockTimeout]\",\n \"Lock timeout in milliseconds for migration advisory lock acquisition\",\n undefined,\n )\n .description(\n \"Run pending migrations, if runUntil is provided, it will run all migrations until the provided migration name\",\n )\n .action(\n async (\n runUntil: string,\n option?: {\n migrationPath: string;\n tsconfigPath: string;\n datasource?: string;\n transactional: boolean;\n lock: boolean;\n lockTimeout?: string;\n },\n ) => {\n if (!option?.datasource) {\n logger.error(\"SqlDataSource file path is required (-d|--datasource)\");\n process.exit(1);\n }\n const { default: sqlDs } = await importTsUniversal<{\n default: SqlDataSource;\n }>(path.resolve(process.cwd(), option.datasource), option?.tsconfigPath);\n\n // Priority: CLI option > DataSource config > Default\n const migrationPath = option?.migrationPath || sqlDs.migrationConfig.path;\n const tsconfig = option?.tsconfigPath || sqlDs.migrationConfig.tsconfig;\n const useLock = option?.lock ?? sqlDs.migrationConfig.lock;\n const lockTimeout = option?.lockTimeout\n ? parseInt(option.lockTimeout, 10)\n : sqlDs.migrationConfig.lockTimeout;\n const transactional =\n option?.transactional ?? sqlDs.migrationConfig.transactional;\n let lockAcquired = false;\n\n try {\n if (useLock) {\n logger.info(\"Acquiring migration lock\");\n lockAcquired = await sqlDs.acquireLock(\n \"hysteria_migration_lock\",\n lockTimeout,\n );\n\n if (!lockAcquired) {\n logger.error(\n \"Failed to acquire migration lock. Another migration may be running.\",\n );\n throw new Error(\"Failed to acquire migration lock\");\n }\n\n logger.info(\"Migration lock acquired successfully\");\n }\n\n await runMigrationsConnector(\n sqlDs,\n runUntil,\n migrationPath,\n tsconfig,\n transactional,\n );\n } catch (error) {\n console.error(error);\n throw error;\n } finally {\n if (useLock && lockAcquired) {\n logger.info(\"Releasing migration lock\");\n const released = await sqlDs.releaseLock(\"hysteria_migration_lock\");\n\n if (!released) {\n logger.warn(\"Failed to release migration lock\");\n }\n }\n await sqlDs.closeConnection();\n }\n },\n );\n\nprogram\n .command(\"rollback [rollbackUntil]\")\n .option(\n \"-c, --tsconfig [tsconfigPath]\",\n \"Path to the tsconfig.json file, defaults to ./tsconfig.json\",\n undefined,\n )\n .option(\n \"-d, --datasource [path]\",\n \"Path to SqlDataSource (default export)\",\n undefined,\n )\n .option(\n \"-m, --migration-path [migrationPath]\",\n \"Path to the migrations\",\n undefined,\n )\n .option(\n \"-t, --transactional\",\n \"Runs all the pending migrations in a single transaction, this does not apply to mysql since it does not support transactions inside schema changes\",\n true,\n )\n .option(\n \"-l, --lock\",\n \"Acquire advisory lock before running migrations to prevent concurrent execution\",\n true,\n )\n .option(\n \"--lock-timeout [lockTimeout]\",\n \"Lock timeout in milliseconds for migration advisory lock acquisition\",\n undefined,\n )\n .description(\n \"Rollbacks every migration that has been run, if rollbackUntil is provided, it will rollback all migrations until the provided migration name\",\n )\n .action(\n async (\n rollbackUntil: string,\n option?: {\n migrationPath: string;\n tsconfigPath: string;\n datasource?: string;\n transactional: boolean;\n lock: boolean;\n lockTimeout?: string;\n },\n ) => {\n if (!option?.datasource) {\n logger.error(\"SqlDataSource file path is required (-d|--datasource)\");\n process.exit(1);\n }\n const { default: sqlDs } = await importTsUniversal<{\n default: SqlDataSource;\n }>(path.resolve(process.cwd(), option.datasource), option?.tsconfigPath);\n\n // Priority: CLI option > DataSource config > Default\n const migrationPath = option?.migrationPath || sqlDs.migrationConfig.path;\n const tsconfig = option?.tsconfigPath || sqlDs.migrationConfig.tsconfig;\n const useLock = option?.lock ?? sqlDs.migrationConfig.lock;\n const lockTimeout = option?.lockTimeout\n ? parseInt(option.lockTimeout, 10)\n : sqlDs.migrationConfig.lockTimeout;\n const transactional =\n option?.transactional ?? sqlDs.migrationConfig.transactional;\n let lockAcquired = false;\n\n try {\n if (useLock) {\n logger.info(\"Acquiring migration lock\");\n lockAcquired = await sqlDs.acquireLock(\n \"hysteria_migration_lock\",\n lockTimeout,\n );\n\n if (!lockAcquired) {\n logger.error(\n \"Failed to acquire migration lock. Another migration may be running.\",\n );\n throw new Error(\"Failed to acquire migration lock\");\n }\n\n logger.info(\"Migration lock acquired successfully\");\n }\n\n await rollbackMigrationsConnector(\n sqlDs,\n rollbackUntil,\n migrationPath,\n tsconfig,\n transactional,\n );\n } catch (error) {\n console.error(error);\n throw error;\n } finally {\n if (useLock && lockAcquired) {\n logger.info(\"Releasing migration lock\");\n const released = await sqlDs.releaseLock(\"hysteria_migration_lock\");\n\n if (!released) {\n logger.warn(\"Failed to release migration lock\");\n }\n }\n await sqlDs.closeConnection();\n }\n },\n );\n\nprogram\n .command(\"refresh\")\n .option(\n \"-f, --force\",\n \"Drop all tables in the database before running the migrations instead of running the down migrations\",\n false,\n )\n .option(\n \"-c, --tsconfig [tsconfigPath]\",\n \"Path to the tsconfig.json file, defaults to ./tsconfig.json\",\n undefined,\n )\n .option(\n \"-d, --datasource [path]\",\n \"Path to SqlDataSource (default export)\",\n undefined,\n )\n .option(\n \"-t, --transactional\",\n \"Runs all the pending migrations in a single transaction, this does not apply to mysql since it does not support transactions inside schema changes\",\n true,\n )\n .option(\n \"-l, --lock\",\n \"Acquire advisory lock before running migrations to prevent concurrent execution\",\n true,\n )\n .option(\n \"--lock-timeout [lockTimeout]\",\n \"Lock timeout in milliseconds for migration advisory lock acquisition\",\n undefined,\n )\n .option(\"-m, --migration-path [path]\", \"Path to the migrations\", undefined)\n .description(\n \"Rollbacks every migration that has been run and then run the migrations\",\n )\n .action(\n async (option?: {\n force: boolean;\n migrationPath: string;\n tsconfigPath: string;\n datasource?: string;\n transactional: boolean;\n lock: boolean;\n lockTimeout?: string;\n }) => {\n const force = option?.force || false;\n if (!option?.datasource) {\n logger.error(\"SqlDataSource file path is required (-d|--datasource)\");\n process.exit(1);\n }\n const { default: sqlDs } = await importTsUniversal<{\n default: SqlDataSource;\n }>(path.resolve(process.cwd(), option.datasource), option?.tsconfigPath);\n\n // Priority: CLI option > DataSource config > Default\n const migrationPath = option?.migrationPath || sqlDs.migrationConfig.path;\n const tsconfig = option?.tsconfigPath || sqlDs.migrationConfig.tsconfig;\n const useLock = option?.lock ?? sqlDs.migrationConfig.lock;\n const lockTimeout = option?.lockTimeout\n ? parseInt(option.lockTimeout, 10)\n : sqlDs.migrationConfig.lockTimeout;\n const transactional =\n option?.transactional ?? sqlDs.migrationConfig.transactional;\n let lockAcquired = false;\n\n try {\n if (useLock) {\n logger.info(\"Acquiring migration lock for refresh operation\");\n lockAcquired = await sqlDs.acquireLock(\n \"hysteria_migration_lock\",\n lockTimeout,\n );\n\n if (!lockAcquired) {\n logger.error(\n \"Failed to acquire migration lock. Another migration may be running.\",\n );\n throw new Error(\"Failed to acquire migration lock\");\n }\n\n logger.info(\"Migration lock acquired successfully\");\n }\n\n force\n ? await dropAllTablesConnector(sqlDs, false, transactional)\n : await rollbackMigrationsConnector(\n sqlDs,\n undefined,\n migrationPath,\n tsconfig,\n transactional,\n );\n\n await runMigrationsConnector(\n sqlDs,\n undefined,\n migrationPath,\n tsconfig,\n transactional,\n );\n } catch (error) {\n console.error(error);\n } finally {\n if (useLock && lockAcquired) {\n logger.info(\"Releasing migration lock\");\n const released = await sqlDs.releaseLock(\"hysteria_migration_lock\");\n\n if (!released) {\n logger.warn(\"Failed to release migration lock\");\n }\n }\n await sqlDs.closeConnection();\n }\n },\n );\n\nprogram\n .command(\"generate:migrations\")\n .description(\n \"Generate a migration file based on the database schema and the models metadata, not supported for sqlite\",\n )\n .option(\n \"-c, --tsconfig [tsconfigPath]\",\n \"Path to the tsconfig.json file, defaults to ./tsconfig.json\",\n undefined,\n )\n .option(\n \"-d, --datasource [path]\",\n \"Path to SqlDataSource (default export)\",\n undefined,\n )\n .option(\n \"-f, --dry\",\n \"Does not create a migration file but only outputs sql statements\",\n false,\n )\n .option(\n \"-j, --javascript\",\n \"Generate a javascript migration file instead of a default typescript one\",\n false,\n )\n .option(\"-m, --migration-path [path]\", \"Path to the migrations\", undefined)\n .option(\"-n, --name [name]\", \"Name of the migration\", undefined)\n .action(\n async (option?: {\n tsconfigPath: string;\n datasource?: string;\n migrationPath: string;\n javascript: boolean;\n name: string;\n dry?: boolean;\n }) => {\n if (!option?.datasource) {\n logger.error(\"SqlDataSource file path is required (-d|--datasource)\");\n process.exit(1);\n }\n\n if (!option?.name) {\n option.name = `auto_generated_migration`;\n }\n\n option.name = `${Date.now()}_${option.name}`;\n\n const { default: sqlDs } = await importTsUniversal<{\n default: SqlDataSource;\n }>(path.resolve(process.cwd(), option.datasource), option?.tsconfigPath);\n\n // Priority: CLI option > DataSource config > Default\n const migrationPath = option?.migrationPath || sqlDs.migrationConfig.path;\n\n const allowedDatabaseTypes = [\n \"mysql\",\n \"postgres\",\n \"mariadb\",\n \"cockroachdb\",\n ];\n if (!allowedDatabaseTypes.includes(sqlDs.getDbType())) {\n logger.error(\n `generate:migrations is not supported for ${sqlDs.getDbType()}, it's suggested to use manual migrations instead`,\n );\n process.exit(1);\n }\n\n try {\n const diff = await SchemaDiff.makeDiff(sqlDs);\n const sqlStatements = diff.getSqlStatements();\n if (!sqlStatements.length) {\n logger.info(\n `No new changes detected between database schema and models metadata`,\n );\n process.exit(0);\n }\n\n if (option.dry) {\n for (const sql of sqlStatements) {\n console.log(sql);\n }\n\n process.exit(0);\n }\n\n if (!fs.existsSync(migrationPath)) {\n fs.mkdirSync(migrationPath, { recursive: true });\n }\n\n const template =\n await GenerateMigrationTemplate.generate(sqlStatements);\n\n const extension = option?.javascript ? \".js\" : \".ts\";\n fs.writeFileSync(\n `${migrationPath}/${option?.name}${extension}`,\n template,\n );\n logger.info(\n `Migration file created successfully: ${option?.name}${extension}`,\n );\n\n await sqlDs.closeConnection();\n process.exit(0);\n } catch (error) {\n console.error(error);\n await sqlDs.closeConnection();\n process.exit(1);\n }\n },\n );\n\nprogram\n .command(\"create:seeder <name>\")\n .description(\"Create a new seeder file\")\n .option(\n \"-j, --javascript\",\n \"Generate a javascript seeder file instead of a default typescript one\",\n false,\n )\n .option(\"-s, --seeder-path [path]\", \"Path to the seeders\", undefined)\n .action(\n (\n name: string,\n option: {\n javascript: boolean;\n seederPath?: string;\n },\n ) => {\n logger.info(`Creating seeder: ${name}`);\n logger.info(`Seeder options: javascript=${option.javascript}`);\n\n if (!name) {\n logger.error(\"Seeder name is required\");\n process.exit(1);\n }\n\n seederCreateConnector(name, option.javascript, option.seederPath);\n },\n );\n\nprogram\n .command(\"seed\")\n .description(\"Run database seeders from folder or specific files\")\n .option(\n \"-c, --tsconfig [tsconfigPath]\",\n \"Path to the tsconfig.json file, defaults to ./tsconfig.json\",\n undefined,\n )\n .option(\n \"-d, --datasource [path]\",\n \"Path to SqlDataSource (default export)\",\n undefined,\n )\n .option(\n \"-s, --seeder-path [path]\",\n \"Path to seeder folder or file (can be specified multiple times or comma-separated)\",\n (value, previous: string[] = []) => {\n return [...previous, value];\n },\n )\n .action(\n async (option?: {\n tsconfigPath?: string;\n datasource?: string;\n seederPath?: string[];\n }) => {\n logger.info(\"Starting seeder execution\");\n if (!option?.datasource) {\n logger.error(\"SqlDataSource file path is required (-d|--datasource)\");\n process.exit(1);\n }\n\n const { default: sqlDs } = await importTsUniversal<{\n default: SqlDataSource;\n }>(path.resolve(process.cwd(), option.datasource), option?.tsconfigPath);\n\n let seederPaths: string[];\n if (option?.seederPath && option.seederPath.length > 0) {\n seederPaths = option.seederPath.flatMap((path) =>\n path.split(\",\").map((s) => s.trim()),\n );\n } else {\n seederPaths = [sqlDs.seederConfig.path];\n }\n const tsconfig = option?.tsconfigPath || sqlDs.seederConfig.tsconfig;\n\n try {\n await runSeedersConnector(sqlDs, seederPaths, tsconfig);\n await sqlDs.closeConnection();\n logger.info(\"Seeding completed successfully\");\n process.exit(0);\n } catch (error) {\n console.error(error);\n await sqlDs.closeConnection();\n process.exit(1);\n }\n },\n );\n\nprogram.parse(process.argv);\n"]}