{"version":3,"sources":["../../../../../../src/config/env.config.ts","../../../../../../src/config/logger.config.ts","../../../../../../src/api/integrations/chatbot/chatwoot/libs/postgres.client.ts","../../../../../../src/api/integrations/chatbot/chatwoot/utils/chatwoot-import-helper.ts"],"sourcesContent":["import { isBooleanString } from 'class-validator';\nimport dotenv from 'dotenv';\n\ndotenv.config();\n\nexport type HttpServer = {\n  NAME: string;\n  TYPE: 'http' | 'https';\n  PORT: number;\n  URL: string;\n  DISABLE_DOCS: boolean;\n  DISABLE_MANAGER: boolean;\n};\n\nexport type HttpMethods = 'POST' | 'GET' | 'PUT' | 'DELETE';\nexport type Cors = {\n  ORIGIN: string[];\n  METHODS: HttpMethods[];\n  CREDENTIALS: boolean;\n};\n\nexport type LogBaileys = 'fatal' | 'error' | 'warn' | 'info' | 'debug' | 'trace';\n\nexport type LogLevel = 'ERROR' | 'WARN' | 'DEBUG' | 'INFO' | 'LOG' | 'VERBOSE' | 'DARK' | 'WEBHOOKS' | 'WEBSOCKET';\n\nexport type Log = {\n  LEVEL: LogLevel[];\n  COLOR: boolean;\n  BAILEYS: LogBaileys;\n};\n\nexport type ProviderSession = {\n  ENABLED: boolean;\n  HOST: string;\n  PORT: string;\n  PREFIX: string;\n};\n\nexport type SaveData = {\n  INSTANCE: boolean;\n  HISTORIC: boolean;\n  NEW_MESSAGE: boolean;\n  MESSAGE_UPDATE: boolean;\n  CONTACTS: boolean;\n  CHATS: boolean;\n  LABELS: boolean;\n  IS_ON_WHATSAPP: boolean;\n  IS_ON_WHATSAPP_DAYS: number;\n};\n\nexport type DBConnection = {\n  URI: string;\n  CLIENT_NAME: string;\n};\nexport type Database = {\n  CONNECTION: DBConnection;\n  PROVIDER: string;\n  SAVE_DATA: SaveData;\n  DELETE_DATA: DeleteData;\n};\n\nexport type DeleteData = {\n  LOGICAL_MESSAGE_DELETE: boolean;\n};\nexport type EventsRabbitmq = {\n  APPLICATION_STARTUP: boolean;\n  INSTANCE_CREATE: boolean;\n  INSTANCE_DELETE: boolean;\n  QRCODE_UPDATED: boolean;\n  MESSAGES_SET: boolean;\n  MESSAGES_UPSERT: boolean;\n  MESSAGES_EDITED: boolean;\n  MESSAGES_UPDATE: boolean;\n  MESSAGES_DELETE: boolean;\n  SEND_MESSAGE: boolean;\n  SEND_MESSAGE_UPDATE: boolean;\n  CONTACTS_SET: boolean;\n  CONTACTS_UPDATE: boolean;\n  CONTACTS_UPSERT: boolean;\n  PRESENCE_UPDATE: boolean;\n  CHATS_SET: boolean;\n  CHATS_UPDATE: boolean;\n  CHATS_DELETE: boolean;\n  CHATS_UPSERT: boolean;\n  CONNECTION_UPDATE: boolean;\n  LABELS_EDIT: boolean;\n  LABELS_ASSOCIATION: boolean;\n  GROUPS_UPSERT: boolean;\n  GROUP_UPDATE: boolean;\n  GROUP_PARTICIPANTS_UPDATE: boolean;\n  CALL: boolean;\n  TYPEBOT_START: boolean;\n  TYPEBOT_CHANGE_STATUS: boolean;\n};\n\nexport type Rabbitmq = {\n  ENABLED: boolean;\n  URI: string;\n  FRAME_MAX: number;\n  EXCHANGE_NAME: string;\n  GLOBAL_ENABLED: boolean;\n  EVENTS: EventsRabbitmq;\n  PREFIX_KEY?: string;\n};\n\nexport type Nats = {\n  ENABLED: boolean;\n  URI: string;\n  EXCHANGE_NAME: string;\n  GLOBAL_ENABLED: boolean;\n  EVENTS: EventsRabbitmq;\n  PREFIX_KEY?: string;\n};\n\nexport type Sqs = {\n  ENABLED: boolean;\n  GLOBAL_ENABLED: boolean;\n  GLOBAL_FORCE_SINGLE_QUEUE: boolean;\n  GLOBAL_PREFIX_NAME: string;\n  ACCESS_KEY_ID: string;\n  SECRET_ACCESS_KEY: string;\n  ACCOUNT_ID: string;\n  REGION: string;\n  MAX_PAYLOAD_SIZE: number;\n  EVENTS: {\n    APPLICATION_STARTUP: boolean;\n    CALL: boolean;\n    CHATS_DELETE: boolean;\n    CHATS_SET: boolean;\n    CHATS_UPDATE: boolean;\n    CHATS_UPSERT: boolean;\n    CONNECTION_UPDATE: boolean;\n    CONTACTS_SET: boolean;\n    CONTACTS_UPDATE: boolean;\n    CONTACTS_UPSERT: boolean;\n    GROUP_PARTICIPANTS_UPDATE: boolean;\n    GROUPS_UPDATE: boolean;\n    GROUPS_UPSERT: boolean;\n    LABELS_ASSOCIATION: boolean;\n    LABELS_EDIT: boolean;\n    LOGOUT_INSTANCE: boolean;\n    MESSAGES_DELETE: boolean;\n    MESSAGES_EDITED: boolean;\n    MESSAGES_SET: boolean;\n    MESSAGES_UPDATE: boolean;\n    MESSAGES_UPSERT: boolean;\n    PRESENCE_UPDATE: boolean;\n    QRCODE_UPDATED: boolean;\n    REMOVE_INSTANCE: boolean;\n    SEND_MESSAGE: boolean;\n    TYPEBOT_CHANGE_STATUS: boolean;\n    TYPEBOT_START: boolean;\n  };\n};\n\nexport type Kafka = {\n  ENABLED: boolean;\n  CLIENT_ID: string;\n  BROKERS: string[];\n  CONNECTION_TIMEOUT: number;\n  REQUEST_TIMEOUT: number;\n  GLOBAL_ENABLED: boolean;\n  CONSUMER_GROUP_ID: string;\n  TOPIC_PREFIX: string;\n  NUM_PARTITIONS: number;\n  REPLICATION_FACTOR: number;\n  AUTO_CREATE_TOPICS: boolean;\n  EVENTS: EventsRabbitmq;\n  SASL?: {\n    ENABLED: boolean;\n    MECHANISM: string;\n    USERNAME: string;\n    PASSWORD: string;\n  };\n  SSL?: {\n    ENABLED: boolean;\n    REJECT_UNAUTHORIZED: boolean;\n    CA?: string;\n    KEY?: string;\n    CERT?: string;\n  };\n};\n\nexport type Websocket = {\n  ENABLED: boolean;\n  GLOBAL_EVENTS: boolean;\n  ALLOWED_HOSTS?: string;\n};\n\nexport type WaBusiness = {\n  TOKEN_WEBHOOK: string;\n  URL: string;\n  VERSION: string;\n  LANGUAGE: string;\n};\n\nexport type EventsWebhook = {\n  APPLICATION_STARTUP: boolean;\n  INSTANCE_CREATE: boolean;\n  INSTANCE_DELETE: boolean;\n  QRCODE_UPDATED: boolean;\n  MESSAGES_SET: boolean;\n  MESSAGES_UPSERT: boolean;\n  MESSAGES_EDITED: boolean;\n  MESSAGES_UPDATE: boolean;\n  MESSAGES_DELETE: boolean;\n  SEND_MESSAGE: boolean;\n  SEND_MESSAGE_UPDATE: boolean;\n  CONTACTS_SET: boolean;\n  CONTACTS_UPDATE: boolean;\n  CONTACTS_UPSERT: boolean;\n  PRESENCE_UPDATE: boolean;\n  CHATS_SET: boolean;\n  CHATS_UPDATE: boolean;\n  CHATS_DELETE: boolean;\n  CHATS_UPSERT: boolean;\n  CONNECTION_UPDATE: boolean;\n  LABELS_EDIT: boolean;\n  LABELS_ASSOCIATION: boolean;\n  GROUPS_UPSERT: boolean;\n  GROUP_UPDATE: boolean;\n  GROUP_PARTICIPANTS_UPDATE: boolean;\n  CALL: boolean;\n  TYPEBOT_START: boolean;\n  TYPEBOT_CHANGE_STATUS: boolean;\n  ERRORS: boolean;\n  ERRORS_WEBHOOK: string;\n};\n\nexport type EventsPusher = {\n  APPLICATION_STARTUP: boolean;\n  INSTANCE_CREATE: boolean;\n  INSTANCE_DELETE: boolean;\n  QRCODE_UPDATED: boolean;\n  MESSAGES_SET: boolean;\n  MESSAGES_UPSERT: boolean;\n  MESSAGES_EDITED: boolean;\n  MESSAGES_UPDATE: boolean;\n  MESSAGES_DELETE: boolean;\n  SEND_MESSAGE: boolean;\n  SEND_MESSAGE_UPDATE: boolean;\n  CONTACTS_SET: boolean;\n  CONTACTS_UPDATE: boolean;\n  CONTACTS_UPSERT: boolean;\n  PRESENCE_UPDATE: boolean;\n  CHATS_SET: boolean;\n  CHATS_UPDATE: boolean;\n  CHATS_DELETE: boolean;\n  CHATS_UPSERT: boolean;\n  CONNECTION_UPDATE: boolean;\n  LABELS_EDIT: boolean;\n  LABELS_ASSOCIATION: boolean;\n  GROUPS_UPSERT: boolean;\n  GROUP_UPDATE: boolean;\n  GROUP_PARTICIPANTS_UPDATE: boolean;\n  CALL: boolean;\n  TYPEBOT_START: boolean;\n  TYPEBOT_CHANGE_STATUS: boolean;\n};\n\nexport type ApiKey = { KEY: string };\n\nexport type Auth = {\n  API_KEY: ApiKey;\n  EXPOSE_IN_FETCH_INSTANCES: boolean;\n};\n\nexport type DelInstance = number | boolean;\n\nexport type Language = string | 'en';\n\nexport type GlobalWebhook = {\n  URL: string;\n  ENABLED: boolean;\n  WEBHOOK_BY_EVENTS: boolean;\n};\n\nexport type GlobalPusher = {\n  ENABLED: boolean;\n  APP_ID: string;\n  KEY: string;\n  SECRET: string;\n  CLUSTER: string;\n  USE_TLS: boolean;\n};\n\nexport type CacheConfRedis = {\n  ENABLED: boolean;\n  URI: string;\n  PREFIX_KEY: string;\n  TTL: number;\n  SAVE_INSTANCES: boolean;\n};\nexport type CacheConfLocal = {\n  ENABLED: boolean;\n  TTL: number;\n};\nexport type SslConf = { PRIVKEY: string; FULLCHAIN: string };\nexport type Webhook = {\n  GLOBAL?: GlobalWebhook;\n  EVENTS: EventsWebhook;\n  REQUEST?: {\n    TIMEOUT_MS?: number;\n  };\n  RETRY?: {\n    MAX_ATTEMPTS?: number;\n    INITIAL_DELAY_SECONDS?: number;\n    USE_EXPONENTIAL_BACKOFF?: boolean;\n    MAX_DELAY_SECONDS?: number;\n    JITTER_FACTOR?: number;\n    NON_RETRYABLE_STATUS_CODES?: number[];\n  };\n};\nexport type Pusher = { ENABLED: boolean; GLOBAL?: GlobalPusher; EVENTS: EventsPusher };\nexport type ConfigSessionPhone = { CLIENT: string; NAME: string };\nexport type QrCode = { LIMIT: number; COLOR: string };\nexport type Typebot = { ENABLED: boolean; API_VERSION: string; SEND_MEDIA_BASE64: boolean };\nexport type Chatwoot = {\n  ENABLED: boolean;\n  MESSAGE_DELETE: boolean;\n  MESSAGE_READ: boolean;\n  BOT_CONTACT: boolean;\n  IMPORT: {\n    DATABASE: {\n      CONNECTION: {\n        URI: string;\n      };\n    };\n    PLACEHOLDER_MEDIA_MESSAGE: boolean;\n  };\n};\nexport type Openai = { ENABLED: boolean; API_KEY_GLOBAL?: string };\nexport type Dify = { ENABLED: boolean };\nexport type N8n = { ENABLED: boolean };\nexport type Evoai = { ENABLED: boolean };\nexport type Flowise = { ENABLED: boolean };\n\nexport type S3 = {\n  ACCESS_KEY: string;\n  SECRET_KEY: string;\n  ENDPOINT: string;\n  BUCKET_NAME: string;\n  ENABLE: boolean;\n  PORT?: number;\n  USE_SSL?: boolean;\n  REGION?: string;\n  SKIP_POLICY?: boolean;\n  SAVE_VIDEO?: boolean;\n};\n\nexport type CacheConf = { REDIS: CacheConfRedis; LOCAL: CacheConfLocal };\nexport type Metrics = {\n  ENABLED: boolean;\n  AUTH_REQUIRED: boolean;\n  USER?: string;\n  PASSWORD?: string;\n  ALLOWED_IPS?: string;\n};\n\nexport type Telemetry = {\n  ENABLED: boolean;\n  URL?: string;\n};\n\nexport type Proxy = {\n  HOST?: string;\n  PORT?: string;\n  PROTOCOL?: string;\n  USERNAME?: string;\n  PASSWORD?: string;\n};\n\nexport type AudioConverter = {\n  API_URL?: string;\n  API_KEY?: string;\n};\n\nexport type Facebook = {\n  APP_ID?: string;\n  CONFIG_ID?: string;\n  USER_TOKEN?: string;\n};\n\nexport type Sentry = {\n  DSN?: string;\n};\n\nexport type EventEmitter = {\n  MAX_LISTENERS: number;\n};\n\nexport type Production = boolean;\n\nexport interface Env {\n  SERVER: HttpServer;\n  CORS: Cors;\n  SSL_CONF: SslConf;\n  PROVIDER: ProviderSession;\n  DATABASE: Database;\n  RABBITMQ: Rabbitmq;\n  NATS: Nats;\n  SQS: Sqs;\n  KAFKA: Kafka;\n  WEBSOCKET: Websocket;\n  WA_BUSINESS: WaBusiness;\n  LOG: Log;\n  DEL_INSTANCE: DelInstance;\n  DEL_TEMP_INSTANCES: boolean;\n  LANGUAGE: Language;\n  WEBHOOK: Webhook;\n  PUSHER: Pusher;\n  CONFIG_SESSION_PHONE: ConfigSessionPhone;\n  QRCODE: QrCode;\n  TYPEBOT: Typebot;\n  CHATWOOT: Chatwoot;\n  OPENAI: Openai;\n  DIFY: Dify;\n  N8N: N8n;\n  EVOAI: Evoai;\n  FLOWISE: Flowise;\n  CACHE: CacheConf;\n  S3?: S3;\n  AUTHENTICATION: Auth;\n  METRICS: Metrics;\n  TELEMETRY: Telemetry;\n  PROXY: Proxy;\n  AUDIO_CONVERTER: AudioConverter;\n  FACEBOOK: Facebook;\n  SENTRY: Sentry;\n  EVENT_EMITTER: EventEmitter;\n  PRODUCTION?: Production;\n}\n\nexport type Key = keyof Env;\n\nexport class ConfigService {\n  constructor() {\n    this.loadEnv();\n  }\n\n  private env: Env;\n\n  public get<T = any>(key: Key) {\n    return this.env[key] as T;\n  }\n\n  private loadEnv() {\n    this.env = this.envProcess();\n    this.env.PRODUCTION = process.env?.NODE_ENV === 'PROD';\n    if (process.env?.DOCKER_ENV === 'true') {\n      this.env.SERVER.TYPE = process.env.SERVER_TYPE as 'http' | 'http';\n      this.env.SERVER.PORT = Number.parseInt(process.env.SERVER_PORT) || 8080;\n    }\n  }\n\n  private envProcess(): Env {\n    return {\n      SERVER: {\n        NAME: process.env?.SERVER_NAME || 'evolution',\n        TYPE: (process.env.SERVER_TYPE as 'http' | 'https') || 'http',\n        PORT: Number.parseInt(process.env.SERVER_PORT) || 8080,\n        URL: process.env.SERVER_URL,\n        DISABLE_DOCS: process.env?.SERVER_DISABLE_DOCS === 'true',\n        DISABLE_MANAGER: process.env?.SERVER_DISABLE_MANAGER === 'true',\n      },\n      CORS: {\n        ORIGIN: process.env.CORS_ORIGIN?.split(',') || ['*'],\n        METHODS:\n          (process.env.CORS_METHODS?.split(',') as HttpMethods[]) ||\n          (['POST', 'GET', 'PUT', 'DELETE'] as HttpMethods[]),\n        CREDENTIALS: process.env?.CORS_CREDENTIALS === 'true',\n      },\n      SSL_CONF: {\n        PRIVKEY: process.env?.SSL_CONF_PRIVKEY || '',\n        FULLCHAIN: process.env?.SSL_CONF_FULLCHAIN || '',\n      },\n      PROVIDER: {\n        ENABLED: process.env?.PROVIDER_ENABLED === 'true',\n        HOST: process.env.PROVIDER_HOST,\n        PORT: process.env?.PROVIDER_PORT || '5656',\n        PREFIX: process.env?.PROVIDER_PREFIX || 'evolution',\n      },\n      DATABASE: {\n        CONNECTION: {\n          URI: process.env.DATABASE_CONNECTION_URI || '',\n          CLIENT_NAME: process.env.DATABASE_CONNECTION_CLIENT_NAME || 'evolution',\n        },\n        PROVIDER: process.env.DATABASE_PROVIDER || 'postgresql',\n        SAVE_DATA: {\n          INSTANCE: process.env?.DATABASE_SAVE_DATA_INSTANCE === 'true',\n          NEW_MESSAGE: process.env?.DATABASE_SAVE_DATA_NEW_MESSAGE === 'true',\n          MESSAGE_UPDATE: process.env?.DATABASE_SAVE_MESSAGE_UPDATE === 'true',\n          CONTACTS: process.env?.DATABASE_SAVE_DATA_CONTACTS === 'true',\n          CHATS: process.env?.DATABASE_SAVE_DATA_CHATS === 'true',\n          HISTORIC: process.env?.DATABASE_SAVE_DATA_HISTORIC === 'true',\n          LABELS: process.env?.DATABASE_SAVE_DATA_LABELS === 'true',\n          IS_ON_WHATSAPP: process.env?.DATABASE_SAVE_IS_ON_WHATSAPP === 'true',\n          IS_ON_WHATSAPP_DAYS: Number.parseInt(process.env?.DATABASE_SAVE_IS_ON_WHATSAPP_DAYS ?? '7'),\n        },\n        DELETE_DATA: {\n          LOGICAL_MESSAGE_DELETE: process.env?.DATABASE_DELETE_MESSAGE === 'true',\n        },\n      },\n      RABBITMQ: {\n        ENABLED: process.env?.RABBITMQ_ENABLED === 'true',\n        GLOBAL_ENABLED: process.env?.RABBITMQ_GLOBAL_ENABLED === 'true',\n        PREFIX_KEY: process.env?.RABBITMQ_PREFIX_KEY,\n        EXCHANGE_NAME: process.env?.RABBITMQ_EXCHANGE_NAME || 'evolution_exchange',\n        URI: process.env.RABBITMQ_URI || '',\n        FRAME_MAX: Number.parseInt(process.env.RABBITMQ_FRAME_MAX) || 8192,\n        EVENTS: {\n          APPLICATION_STARTUP: process.env?.RABBITMQ_EVENTS_APPLICATION_STARTUP === 'true',\n          INSTANCE_CREATE: process.env?.RABBITMQ_EVENTS_INSTANCE_CREATE === 'true',\n          INSTANCE_DELETE: process.env?.RABBITMQ_EVENTS_INSTANCE_DELETE === 'true',\n          QRCODE_UPDATED: process.env?.RABBITMQ_EVENTS_QRCODE_UPDATED === 'true',\n          MESSAGES_SET: process.env?.RABBITMQ_EVENTS_MESSAGES_SET === 'true',\n          MESSAGES_UPSERT: process.env?.RABBITMQ_EVENTS_MESSAGES_UPSERT === 'true',\n          MESSAGES_EDITED: process.env?.RABBITMQ_EVENTS_MESSAGES_EDITED === 'true',\n          MESSAGES_UPDATE: process.env?.RABBITMQ_EVENTS_MESSAGES_UPDATE === 'true',\n          MESSAGES_DELETE: process.env?.RABBITMQ_EVENTS_MESSAGES_DELETE === 'true',\n          SEND_MESSAGE: process.env?.RABBITMQ_EVENTS_SEND_MESSAGE === 'true',\n          SEND_MESSAGE_UPDATE: process.env?.RABBITMQ_EVENTS_SEND_MESSAGE_UPDATE === 'true',\n          CONTACTS_SET: process.env?.RABBITMQ_EVENTS_CONTACTS_SET === 'true',\n          CONTACTS_UPDATE: process.env?.RABBITMQ_EVENTS_CONTACTS_UPDATE === 'true',\n          CONTACTS_UPSERT: process.env?.RABBITMQ_EVENTS_CONTACTS_UPSERT === 'true',\n          PRESENCE_UPDATE: process.env?.RABBITMQ_EVENTS_PRESENCE_UPDATE === 'true',\n          CHATS_SET: process.env?.RABBITMQ_EVENTS_CHATS_SET === 'true',\n          CHATS_UPDATE: process.env?.RABBITMQ_EVENTS_CHATS_UPDATE === 'true',\n          CHATS_UPSERT: process.env?.RABBITMQ_EVENTS_CHATS_UPSERT === 'true',\n          CHATS_DELETE: process.env?.RABBITMQ_EVENTS_CHATS_DELETE === 'true',\n          CONNECTION_UPDATE: process.env?.RABBITMQ_EVENTS_CONNECTION_UPDATE === 'true',\n          LABELS_EDIT: process.env?.RABBITMQ_EVENTS_LABELS_EDIT === 'true',\n          LABELS_ASSOCIATION: process.env?.RABBITMQ_EVENTS_LABELS_ASSOCIATION === 'true',\n          GROUPS_UPSERT: process.env?.RABBITMQ_EVENTS_GROUPS_UPSERT === 'true',\n          GROUP_UPDATE: process.env?.RABBITMQ_EVENTS_GROUPS_UPDATE === 'true',\n          GROUP_PARTICIPANTS_UPDATE: process.env?.RABBITMQ_EVENTS_GROUP_PARTICIPANTS_UPDATE === 'true',\n          CALL: process.env?.RABBITMQ_EVENTS_CALL === 'true',\n          TYPEBOT_START: process.env?.RABBITMQ_EVENTS_TYPEBOT_START === 'true',\n          TYPEBOT_CHANGE_STATUS: process.env?.RABBITMQ_EVENTS_TYPEBOT_CHANGE_STATUS === 'true',\n        },\n      },\n      NATS: {\n        ENABLED: process.env?.NATS_ENABLED === 'true',\n        GLOBAL_ENABLED: process.env?.NATS_GLOBAL_ENABLED === 'true',\n        PREFIX_KEY: process.env?.NATS_PREFIX_KEY,\n        EXCHANGE_NAME: process.env?.NATS_EXCHANGE_NAME || 'evolution_exchange',\n        URI: process.env.NATS_URI || '',\n        EVENTS: {\n          APPLICATION_STARTUP: process.env?.NATS_EVENTS_APPLICATION_STARTUP === 'true',\n          INSTANCE_CREATE: process.env?.NATS_EVENTS_INSTANCE_CREATE === 'true',\n          INSTANCE_DELETE: process.env?.NATS_EVENTS_INSTANCE_DELETE === 'true',\n          QRCODE_UPDATED: process.env?.NATS_EVENTS_QRCODE_UPDATED === 'true',\n          MESSAGES_SET: process.env?.NATS_EVENTS_MESSAGES_SET === 'true',\n          MESSAGES_UPSERT: process.env?.NATS_EVENTS_MESSAGES_UPSERT === 'true',\n          MESSAGES_EDITED: process.env?.NATS_EVENTS_MESSAGES_EDITED === 'true',\n          MESSAGES_UPDATE: process.env?.NATS_EVENTS_MESSAGES_UPDATE === 'true',\n          MESSAGES_DELETE: process.env?.NATS_EVENTS_MESSAGES_DELETE === 'true',\n          SEND_MESSAGE: process.env?.NATS_EVENTS_SEND_MESSAGE === 'true',\n          SEND_MESSAGE_UPDATE: process.env?.NATS_EVENTS_SEND_MESSAGE_UPDATE === 'true',\n          CONTACTS_SET: process.env?.NATS_EVENTS_CONTACTS_SET === 'true',\n          CONTACTS_UPDATE: process.env?.NATS_EVENTS_CONTACTS_UPDATE === 'true',\n          CONTACTS_UPSERT: process.env?.NATS_EVENTS_CONTACTS_UPSERT === 'true',\n          PRESENCE_UPDATE: process.env?.NATS_EVENTS_PRESENCE_UPDATE === 'true',\n          CHATS_SET: process.env?.NATS_EVENTS_CHATS_SET === 'true',\n          CHATS_UPDATE: process.env?.NATS_EVENTS_CHATS_UPDATE === 'true',\n          CHATS_UPSERT: process.env?.NATS_EVENTS_CHATS_UPSERT === 'true',\n          CHATS_DELETE: process.env?.NATS_EVENTS_CHATS_DELETE === 'true',\n          CONNECTION_UPDATE: process.env?.NATS_EVENTS_CONNECTION_UPDATE === 'true',\n          LABELS_EDIT: process.env?.NATS_EVENTS_LABELS_EDIT === 'true',\n          LABELS_ASSOCIATION: process.env?.NATS_EVENTS_LABELS_ASSOCIATION === 'true',\n          GROUPS_UPSERT: process.env?.NATS_EVENTS_GROUPS_UPSERT === 'true',\n          GROUP_UPDATE: process.env?.NATS_EVENTS_GROUPS_UPDATE === 'true',\n          GROUP_PARTICIPANTS_UPDATE: process.env?.NATS_EVENTS_GROUP_PARTICIPANTS_UPDATE === 'true',\n          CALL: process.env?.NATS_EVENTS_CALL === 'true',\n          TYPEBOT_START: process.env?.NATS_EVENTS_TYPEBOT_START === 'true',\n          TYPEBOT_CHANGE_STATUS: process.env?.NATS_EVENTS_TYPEBOT_CHANGE_STATUS === 'true',\n        },\n      },\n      SQS: {\n        ENABLED: process.env?.SQS_ENABLED === 'true',\n        GLOBAL_ENABLED: process.env?.SQS_GLOBAL_ENABLED === 'true',\n        GLOBAL_FORCE_SINGLE_QUEUE: process.env?.SQS_GLOBAL_FORCE_SINGLE_QUEUE === 'true',\n        GLOBAL_PREFIX_NAME: process.env?.SQS_GLOBAL_PREFIX_NAME || 'global',\n        ACCESS_KEY_ID: process.env.SQS_ACCESS_KEY_ID || '',\n        SECRET_ACCESS_KEY: process.env.SQS_SECRET_ACCESS_KEY || '',\n        ACCOUNT_ID: process.env.SQS_ACCOUNT_ID || '',\n        REGION: process.env.SQS_REGION || '',\n        MAX_PAYLOAD_SIZE: Number.parseInt(process.env.SQS_MAX_PAYLOAD_SIZE ?? '1048576'),\n        EVENTS: {\n          APPLICATION_STARTUP: process.env?.SQS_GLOBAL_APPLICATION_STARTUP === 'true',\n          CALL: process.env?.SQS_GLOBAL_CALL === 'true',\n          CHATS_DELETE: process.env?.SQS_GLOBAL_CHATS_DELETE === 'true',\n          CHATS_SET: process.env?.SQS_GLOBAL_CHATS_SET === 'true',\n          CHATS_UPDATE: process.env?.SQS_GLOBAL_CHATS_UPDATE === 'true',\n          CHATS_UPSERT: process.env?.SQS_GLOBAL_CHATS_UPSERT === 'true',\n          CONNECTION_UPDATE: process.env?.SQS_GLOBAL_CONNECTION_UPDATE === 'true',\n          CONTACTS_SET: process.env?.SQS_GLOBAL_CONTACTS_SET === 'true',\n          CONTACTS_UPDATE: process.env?.SQS_GLOBAL_CONTACTS_UPDATE === 'true',\n          CONTACTS_UPSERT: process.env?.SQS_GLOBAL_CONTACTS_UPSERT === 'true',\n          GROUP_PARTICIPANTS_UPDATE: process.env?.SQS_GLOBAL_GROUP_PARTICIPANTS_UPDATE === 'true',\n          GROUPS_UPDATE: process.env?.SQS_GLOBAL_GROUPS_UPDATE === 'true',\n          GROUPS_UPSERT: process.env?.SQS_GLOBAL_GROUPS_UPSERT === 'true',\n          LABELS_ASSOCIATION: process.env?.SQS_GLOBAL_LABELS_ASSOCIATION === 'true',\n          LABELS_EDIT: process.env?.SQS_GLOBAL_LABELS_EDIT === 'true',\n          LOGOUT_INSTANCE: process.env?.SQS_GLOBAL_LOGOUT_INSTANCE === 'true',\n          MESSAGES_DELETE: process.env?.SQS_GLOBAL_MESSAGES_DELETE === 'true',\n          MESSAGES_EDITED: process.env?.SQS_GLOBAL_MESSAGES_EDITED === 'true',\n          MESSAGES_SET: process.env?.SQS_GLOBAL_MESSAGES_SET === 'true',\n          MESSAGES_UPDATE: process.env?.SQS_GLOBAL_MESSAGES_UPDATE === 'true',\n          MESSAGES_UPSERT: process.env?.SQS_GLOBAL_MESSAGES_UPSERT === 'true',\n          PRESENCE_UPDATE: process.env?.SQS_GLOBAL_PRESENCE_UPDATE === 'true',\n          QRCODE_UPDATED: process.env?.SQS_GLOBAL_QRCODE_UPDATED === 'true',\n          REMOVE_INSTANCE: process.env?.SQS_GLOBAL_REMOVE_INSTANCE === 'true',\n          SEND_MESSAGE: process.env?.SQS_GLOBAL_SEND_MESSAGE === 'true',\n          TYPEBOT_CHANGE_STATUS: process.env?.SQS_GLOBAL_TYPEBOT_CHANGE_STATUS === 'true',\n          TYPEBOT_START: process.env?.SQS_GLOBAL_TYPEBOT_START === 'true',\n        },\n      },\n      KAFKA: {\n        ENABLED: process.env?.KAFKA_ENABLED === 'true',\n        CLIENT_ID: process.env?.KAFKA_CLIENT_ID || 'evolution-api',\n        BROKERS: process.env?.KAFKA_BROKERS?.split(',') || ['localhost:9092'],\n        CONNECTION_TIMEOUT: Number.parseInt(process.env?.KAFKA_CONNECTION_TIMEOUT || '3000'),\n        REQUEST_TIMEOUT: Number.parseInt(process.env?.KAFKA_REQUEST_TIMEOUT || '30000'),\n        GLOBAL_ENABLED: process.env?.KAFKA_GLOBAL_ENABLED === 'true',\n        CONSUMER_GROUP_ID: process.env?.KAFKA_CONSUMER_GROUP_ID || 'evolution-api-consumers',\n        TOPIC_PREFIX: process.env?.KAFKA_TOPIC_PREFIX || 'evolution',\n        NUM_PARTITIONS: Number.parseInt(process.env?.KAFKA_NUM_PARTITIONS || '1'),\n        REPLICATION_FACTOR: Number.parseInt(process.env?.KAFKA_REPLICATION_FACTOR || '1'),\n        AUTO_CREATE_TOPICS: process.env?.KAFKA_AUTO_CREATE_TOPICS === 'true',\n        EVENTS: {\n          APPLICATION_STARTUP: process.env?.KAFKA_EVENTS_APPLICATION_STARTUP === 'true',\n          INSTANCE_CREATE: process.env?.KAFKA_EVENTS_INSTANCE_CREATE === 'true',\n          INSTANCE_DELETE: process.env?.KAFKA_EVENTS_INSTANCE_DELETE === 'true',\n          QRCODE_UPDATED: process.env?.KAFKA_EVENTS_QRCODE_UPDATED === 'true',\n          MESSAGES_SET: process.env?.KAFKA_EVENTS_MESSAGES_SET === 'true',\n          MESSAGES_UPSERT: process.env?.KAFKA_EVENTS_MESSAGES_UPSERT === 'true',\n          MESSAGES_EDITED: process.env?.KAFKA_EVENTS_MESSAGES_EDITED === 'true',\n          MESSAGES_UPDATE: process.env?.KAFKA_EVENTS_MESSAGES_UPDATE === 'true',\n          MESSAGES_DELETE: process.env?.KAFKA_EVENTS_MESSAGES_DELETE === 'true',\n          SEND_MESSAGE: process.env?.KAFKA_EVENTS_SEND_MESSAGE === 'true',\n          SEND_MESSAGE_UPDATE: process.env?.KAFKA_EVENTS_SEND_MESSAGE_UPDATE === 'true',\n          CONTACTS_SET: process.env?.KAFKA_EVENTS_CONTACTS_SET === 'true',\n          CONTACTS_UPSERT: process.env?.KAFKA_EVENTS_CONTACTS_UPSERT === 'true',\n          CONTACTS_UPDATE: process.env?.KAFKA_EVENTS_CONTACTS_UPDATE === 'true',\n          PRESENCE_UPDATE: process.env?.KAFKA_EVENTS_PRESENCE_UPDATE === 'true',\n          CHATS_SET: process.env?.KAFKA_EVENTS_CHATS_SET === 'true',\n          CHATS_UPSERT: process.env?.KAFKA_EVENTS_CHATS_UPSERT === 'true',\n          CHATS_UPDATE: process.env?.KAFKA_EVENTS_CHATS_UPDATE === 'true',\n          CHATS_DELETE: process.env?.KAFKA_EVENTS_CHATS_DELETE === 'true',\n          CONNECTION_UPDATE: process.env?.KAFKA_EVENTS_CONNECTION_UPDATE === 'true',\n          LABELS_EDIT: process.env?.KAFKA_EVENTS_LABELS_EDIT === 'true',\n          LABELS_ASSOCIATION: process.env?.KAFKA_EVENTS_LABELS_ASSOCIATION === 'true',\n          GROUPS_UPSERT: process.env?.KAFKA_EVENTS_GROUPS_UPSERT === 'true',\n          GROUP_UPDATE: process.env?.KAFKA_EVENTS_GROUPS_UPDATE === 'true',\n          GROUP_PARTICIPANTS_UPDATE: process.env?.KAFKA_EVENTS_GROUP_PARTICIPANTS_UPDATE === 'true',\n          CALL: process.env?.KAFKA_EVENTS_CALL === 'true',\n          TYPEBOT_START: process.env?.KAFKA_EVENTS_TYPEBOT_START === 'true',\n          TYPEBOT_CHANGE_STATUS: process.env?.KAFKA_EVENTS_TYPEBOT_CHANGE_STATUS === 'true',\n        },\n        SASL:\n          process.env?.KAFKA_SASL_ENABLED === 'true'\n            ? {\n                ENABLED: true,\n                MECHANISM: process.env?.KAFKA_SASL_MECHANISM || 'plain',\n                USERNAME: process.env?.KAFKA_SASL_USERNAME || '',\n                PASSWORD: process.env?.KAFKA_SASL_PASSWORD || '',\n              }\n            : undefined,\n        SSL:\n          process.env?.KAFKA_SSL_ENABLED === 'true'\n            ? {\n                ENABLED: true,\n                REJECT_UNAUTHORIZED: process.env?.KAFKA_SSL_REJECT_UNAUTHORIZED !== 'false',\n                CA: process.env?.KAFKA_SSL_CA,\n                KEY: process.env?.KAFKA_SSL_KEY,\n                CERT: process.env?.KAFKA_SSL_CERT,\n              }\n            : undefined,\n      },\n      WEBSOCKET: {\n        ENABLED: process.env?.WEBSOCKET_ENABLED === 'true',\n        GLOBAL_EVENTS: process.env?.WEBSOCKET_GLOBAL_EVENTS === 'true',\n        ALLOWED_HOSTS: process.env?.WEBSOCKET_ALLOWED_HOSTS,\n      },\n      PUSHER: {\n        ENABLED: process.env?.PUSHER_ENABLED === 'true',\n        GLOBAL: {\n          ENABLED: process.env?.PUSHER_GLOBAL_ENABLED === 'true',\n          APP_ID: process.env?.PUSHER_GLOBAL_APP_ID || '',\n          KEY: process.env?.PUSHER_GLOBAL_KEY || '',\n          SECRET: process.env?.PUSHER_GLOBAL_SECRET || '',\n          CLUSTER: process.env?.PUSHER_GLOBAL_CLUSTER || '',\n          USE_TLS: process.env?.PUSHER_GLOBAL_USE_TLS === 'true',\n        },\n        EVENTS: {\n          APPLICATION_STARTUP: process.env?.PUSHER_EVENTS_APPLICATION_STARTUP === 'true',\n          INSTANCE_CREATE: process.env?.PUSHER_EVENTS_INSTANCE_CREATE === 'true',\n          INSTANCE_DELETE: process.env?.PUSHER_EVENTS_INSTANCE_DELETE === 'true',\n          QRCODE_UPDATED: process.env?.PUSHER_EVENTS_QRCODE_UPDATED === 'true',\n          MESSAGES_SET: process.env?.PUSHER_EVENTS_MESSAGES_SET === 'true',\n          MESSAGES_UPSERT: process.env?.PUSHER_EVENTS_MESSAGES_UPSERT === 'true',\n          MESSAGES_EDITED: process.env?.PUSHER_EVENTS_MESSAGES_EDITED === 'true',\n          MESSAGES_UPDATE: process.env?.PUSHER_EVENTS_MESSAGES_UPDATE === 'true',\n          MESSAGES_DELETE: process.env?.PUSHER_EVENTS_MESSAGES_DELETE === 'true',\n          SEND_MESSAGE: process.env?.PUSHER_EVENTS_SEND_MESSAGE === 'true',\n          SEND_MESSAGE_UPDATE: process.env?.PUSHER_EVENTS_SEND_MESSAGE_UPDATE === 'true',\n          CONTACTS_SET: process.env?.PUSHER_EVENTS_CONTACTS_SET === 'true',\n          CONTACTS_UPDATE: process.env?.PUSHER_EVENTS_CONTACTS_UPDATE === 'true',\n          CONTACTS_UPSERT: process.env?.PUSHER_EVENTS_CONTACTS_UPSERT === 'true',\n          PRESENCE_UPDATE: process.env?.PUSHER_EVENTS_PRESENCE_UPDATE === 'true',\n          CHATS_SET: process.env?.PUSHER_EVENTS_CHATS_SET === 'true',\n          CHATS_UPDATE: process.env?.PUSHER_EVENTS_CHATS_UPDATE === 'true',\n          CHATS_UPSERT: process.env?.PUSHER_EVENTS_CHATS_UPSERT === 'true',\n          CHATS_DELETE: process.env?.PUSHER_EVENTS_CHATS_DELETE === 'true',\n          CONNECTION_UPDATE: process.env?.PUSHER_EVENTS_CONNECTION_UPDATE === 'true',\n          LABELS_EDIT: process.env?.PUSHER_EVENTS_LABELS_EDIT === 'true',\n          LABELS_ASSOCIATION: process.env?.PUSHER_EVENTS_LABELS_ASSOCIATION === 'true',\n          GROUPS_UPSERT: process.env?.PUSHER_EVENTS_GROUPS_UPSERT === 'true',\n          GROUP_UPDATE: process.env?.PUSHER_EVENTS_GROUPS_UPDATE === 'true',\n          GROUP_PARTICIPANTS_UPDATE: process.env?.PUSHER_EVENTS_GROUP_PARTICIPANTS_UPDATE === 'true',\n          CALL: process.env?.PUSHER_EVENTS_CALL === 'true',\n          TYPEBOT_START: process.env?.PUSHER_EVENTS_TYPEBOT_START === 'true',\n          TYPEBOT_CHANGE_STATUS: process.env?.PUSHER_EVENTS_TYPEBOT_CHANGE_STATUS === 'true',\n        },\n      },\n      WA_BUSINESS: {\n        TOKEN_WEBHOOK: process.env.WA_BUSINESS_TOKEN_WEBHOOK || 'evolution',\n        URL: process.env.WA_BUSINESS_URL || 'https://graph.facebook.com',\n        VERSION: process.env.WA_BUSINESS_VERSION || 'v18.0',\n        LANGUAGE: process.env.WA_BUSINESS_LANGUAGE || 'en',\n      },\n      LOG: {\n        LEVEL:\n          (process.env?.LOG_LEVEL?.split(',') as LogLevel[]) ||\n          (['ERROR', 'WARN', 'DEBUG', 'INFO', 'LOG', 'VERBOSE', 'DARK', 'WEBHOOKS', 'WEBSOCKET'] as LogLevel[]),\n        COLOR: process.env?.LOG_COLOR === 'true',\n        BAILEYS: (process.env?.LOG_BAILEYS as LogBaileys) || 'error',\n      },\n      DEL_INSTANCE: isBooleanString(process.env?.DEL_INSTANCE)\n        ? process.env.DEL_INSTANCE === 'true'\n        : Number.parseInt(process.env.DEL_INSTANCE) || false,\n      DEL_TEMP_INSTANCES: isBooleanString(process.env?.DEL_TEMP_INSTANCES)\n        ? process.env.DEL_TEMP_INSTANCES === 'true'\n        : true,\n      LANGUAGE: process.env?.LANGUAGE || 'en',\n      WEBHOOK: {\n        GLOBAL: {\n          URL: process.env?.WEBHOOK_GLOBAL_URL || '',\n          ENABLED: process.env?.WEBHOOK_GLOBAL_ENABLED === 'true',\n          WEBHOOK_BY_EVENTS: process.env?.WEBHOOK_GLOBAL_WEBHOOK_BY_EVENTS === 'true',\n        },\n        EVENTS: {\n          APPLICATION_STARTUP: process.env?.WEBHOOK_EVENTS_APPLICATION_STARTUP === 'true',\n          INSTANCE_CREATE: process.env?.WEBHOOK_EVENTS_INSTANCE_CREATE === 'true',\n          INSTANCE_DELETE: process.env?.WEBHOOK_EVENTS_INSTANCE_DELETE === 'true',\n          QRCODE_UPDATED: process.env?.WEBHOOK_EVENTS_QRCODE_UPDATED === 'true',\n          MESSAGES_SET: process.env?.WEBHOOK_EVENTS_MESSAGES_SET === 'true',\n          MESSAGES_UPSERT: process.env?.WEBHOOK_EVENTS_MESSAGES_UPSERT === 'true',\n          MESSAGES_EDITED: process.env?.WEBHOOK_EVENTS_MESSAGES_EDITED === 'true',\n          MESSAGES_UPDATE: process.env?.WEBHOOK_EVENTS_MESSAGES_UPDATE === 'true',\n          MESSAGES_DELETE: process.env?.WEBHOOK_EVENTS_MESSAGES_DELETE === 'true',\n          SEND_MESSAGE: process.env?.WEBHOOK_EVENTS_SEND_MESSAGE === 'true',\n          SEND_MESSAGE_UPDATE: process.env?.WEBHOOK_EVENTS_SEND_MESSAGE_UPDATE === 'true',\n          CONTACTS_SET: process.env?.WEBHOOK_EVENTS_CONTACTS_SET === 'true',\n          CONTACTS_UPDATE: process.env?.WEBHOOK_EVENTS_CONTACTS_UPDATE === 'true',\n          CONTACTS_UPSERT: process.env?.WEBHOOK_EVENTS_CONTACTS_UPSERT === 'true',\n          PRESENCE_UPDATE: process.env?.WEBHOOK_EVENTS_PRESENCE_UPDATE === 'true',\n          CHATS_SET: process.env?.WEBHOOK_EVENTS_CHATS_SET === 'true',\n          CHATS_UPDATE: process.env?.WEBHOOK_EVENTS_CHATS_UPDATE === 'true',\n          CHATS_UPSERT: process.env?.WEBHOOK_EVENTS_CHATS_UPSERT === 'true',\n          CHATS_DELETE: process.env?.WEBHOOK_EVENTS_CHATS_DELETE === 'true',\n          CONNECTION_UPDATE: process.env?.WEBHOOK_EVENTS_CONNECTION_UPDATE === 'true',\n          LABELS_EDIT: process.env?.WEBHOOK_EVENTS_LABELS_EDIT === 'true',\n          LABELS_ASSOCIATION: process.env?.WEBHOOK_EVENTS_LABELS_ASSOCIATION === 'true',\n          GROUPS_UPSERT: process.env?.WEBHOOK_EVENTS_GROUPS_UPSERT === 'true',\n          GROUP_UPDATE: process.env?.WEBHOOK_EVENTS_GROUPS_UPDATE === 'true',\n          GROUP_PARTICIPANTS_UPDATE: process.env?.WEBHOOK_EVENTS_GROUP_PARTICIPANTS_UPDATE === 'true',\n          CALL: process.env?.WEBHOOK_EVENTS_CALL === 'true',\n          TYPEBOT_START: process.env?.WEBHOOK_EVENTS_TYPEBOT_START === 'true',\n          TYPEBOT_CHANGE_STATUS: process.env?.WEBHOOK_EVENTS_TYPEBOT_CHANGE_STATUS === 'true',\n          ERRORS: process.env?.WEBHOOK_EVENTS_ERRORS === 'true',\n          ERRORS_WEBHOOK: process.env?.WEBHOOK_EVENTS_ERRORS_WEBHOOK || '',\n        },\n        REQUEST: {\n          TIMEOUT_MS: Number.parseInt(process.env?.WEBHOOK_REQUEST_TIMEOUT_MS) || 30000,\n        },\n        RETRY: {\n          MAX_ATTEMPTS: Number.parseInt(process.env?.WEBHOOK_RETRY_MAX_ATTEMPTS) || 10,\n          INITIAL_DELAY_SECONDS: Number.parseInt(process.env?.WEBHOOK_RETRY_INITIAL_DELAY_SECONDS) || 5,\n          USE_EXPONENTIAL_BACKOFF: process.env?.WEBHOOK_RETRY_USE_EXPONENTIAL_BACKOFF !== 'false',\n          MAX_DELAY_SECONDS: Number.parseInt(process.env?.WEBHOOK_RETRY_MAX_DELAY_SECONDS) || 300,\n          JITTER_FACTOR: Number.parseFloat(process.env?.WEBHOOK_RETRY_JITTER_FACTOR) || 0.2,\n          NON_RETRYABLE_STATUS_CODES: process.env?.WEBHOOK_RETRY_NON_RETRYABLE_STATUS_CODES?.split(',').map(Number) || [\n            400, 401, 403, 404, 422,\n          ],\n        },\n      },\n      CONFIG_SESSION_PHONE: {\n        CLIENT: process.env?.CONFIG_SESSION_PHONE_CLIENT || 'Evolution API',\n        NAME: process.env?.CONFIG_SESSION_PHONE_NAME || 'Chrome',\n      },\n      QRCODE: {\n        LIMIT: Number.parseInt(process.env.QRCODE_LIMIT) || 30,\n        COLOR: process.env.QRCODE_COLOR || '#198754',\n      },\n      TYPEBOT: {\n        ENABLED: process.env?.TYPEBOT_ENABLED === 'true',\n        API_VERSION: process.env?.TYPEBOT_API_VERSION || 'old',\n        SEND_MEDIA_BASE64: process.env?.TYPEBOT_SEND_MEDIA_BASE64 === 'true',\n      },\n      CHATWOOT: {\n        ENABLED: process.env?.CHATWOOT_ENABLED === 'true',\n        MESSAGE_DELETE: process.env.CHATWOOT_MESSAGE_DELETE === 'true',\n        MESSAGE_READ: process.env.CHATWOOT_MESSAGE_READ === 'true',\n        BOT_CONTACT: !process.env.CHATWOOT_BOT_CONTACT || process.env.CHATWOOT_BOT_CONTACT === 'true',\n        IMPORT: {\n          DATABASE: {\n            CONNECTION: {\n              URI: process.env.CHATWOOT_IMPORT_DATABASE_CONNECTION_URI || '',\n            },\n          },\n          PLACEHOLDER_MEDIA_MESSAGE: process.env?.CHATWOOT_IMPORT_PLACEHOLDER_MEDIA_MESSAGE === 'true',\n        },\n      },\n      OPENAI: {\n        ENABLED: process.env?.OPENAI_ENABLED === 'true',\n        API_KEY_GLOBAL: process.env?.OPENAI_API_KEY_GLOBAL || null,\n      },\n      DIFY: {\n        ENABLED: process.env?.DIFY_ENABLED === 'true',\n      },\n      N8N: {\n        ENABLED: process.env?.N8N_ENABLED === 'true',\n      },\n      EVOAI: {\n        ENABLED: process.env?.EVOAI_ENABLED === 'true',\n      },\n      FLOWISE: {\n        ENABLED: process.env?.FLOWISE_ENABLED === 'true',\n      },\n      CACHE: {\n        REDIS: {\n          ENABLED: process.env?.CACHE_REDIS_ENABLED === 'true',\n          URI: process.env?.CACHE_REDIS_URI || '',\n          PREFIX_KEY: process.env?.CACHE_REDIS_PREFIX_KEY || 'evolution-cache',\n          TTL: Number.parseInt(process.env?.CACHE_REDIS_TTL) || 604800,\n          SAVE_INSTANCES: process.env?.CACHE_REDIS_SAVE_INSTANCES === 'true',\n        },\n        LOCAL: {\n          ENABLED: process.env?.CACHE_LOCAL_ENABLED === 'true',\n          TTL: Number.parseInt(process.env?.CACHE_REDIS_TTL) || 86400,\n        },\n      },\n      S3: {\n        ACCESS_KEY: process.env?.S3_ACCESS_KEY,\n        SECRET_KEY: process.env?.S3_SECRET_KEY,\n        ENDPOINT: process.env?.S3_ENDPOINT,\n        BUCKET_NAME: process.env?.S3_BUCKET,\n        ENABLE: process.env?.S3_ENABLED === 'true',\n        PORT: Number.parseInt(process.env?.S3_PORT || '9000'),\n        USE_SSL: process.env?.S3_USE_SSL === 'true',\n        REGION: process.env?.S3_REGION,\n        SKIP_POLICY: process.env?.S3_SKIP_POLICY === 'true',\n        SAVE_VIDEO: process.env?.S3_SAVE_VIDEO === 'true',\n      },\n      AUTHENTICATION: {\n        API_KEY: {\n          KEY: process.env.AUTHENTICATION_API_KEY || 'BQYHJGJHJ',\n        },\n        EXPOSE_IN_FETCH_INSTANCES: process.env?.AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES === 'true',\n      },\n      METRICS: {\n        ENABLED: process.env?.PROMETHEUS_METRICS === 'true',\n        AUTH_REQUIRED: process.env?.METRICS_AUTH_REQUIRED === 'true',\n        USER: process.env?.METRICS_USER,\n        PASSWORD: process.env?.METRICS_PASSWORD,\n        ALLOWED_IPS: process.env?.METRICS_ALLOWED_IPS,\n      },\n      TELEMETRY: {\n        ENABLED: process.env?.TELEMETRY_ENABLED === undefined || process.env?.TELEMETRY_ENABLED === 'true',\n        URL: process.env?.TELEMETRY_URL,\n      },\n      PROXY: {\n        HOST: process.env?.PROXY_HOST,\n        PORT: process.env?.PROXY_PORT,\n        PROTOCOL: process.env?.PROXY_PROTOCOL,\n        USERNAME: process.env?.PROXY_USERNAME,\n        PASSWORD: process.env?.PROXY_PASSWORD,\n      },\n      AUDIO_CONVERTER: {\n        API_URL: process.env?.API_AUDIO_CONVERTER,\n        API_KEY: process.env?.API_AUDIO_CONVERTER_KEY,\n      },\n      FACEBOOK: {\n        APP_ID: process.env?.FACEBOOK_APP_ID,\n        CONFIG_ID: process.env?.FACEBOOK_CONFIG_ID,\n        USER_TOKEN: process.env?.FACEBOOK_USER_TOKEN,\n      },\n      SENTRY: {\n        DSN: process.env?.SENTRY_DSN,\n      },\n      EVENT_EMITTER: {\n        MAX_LISTENERS: Number.parseInt(process.env?.EVENT_EMITTER_MAX_LISTENERS) || 50,\n      },\n    };\n  }\n}\n\nexport const configService = new ConfigService();\n","import dayjs from 'dayjs';\nimport fs from 'fs';\n\nimport { configService, Log } from './env.config';\nconst packageJson = JSON.parse(fs.readFileSync('./package.json', 'utf8'));\n\nconst formatDateLog = (timestamp: number) =>\n  dayjs(timestamp)\n    .toDate()\n    .toString()\n    .replace(/\\sGMT.+/, '');\n\nenum Color {\n  LOG = '\\x1b[32m',\n  INFO = '\\x1b[34m',\n  WARN = '\\x1b[33m',\n  ERROR = '\\x1b[31m',\n  DEBUG = '\\x1b[36m',\n  VERBOSE = '\\x1b[37m',\n  DARK = '\\x1b[30m',\n}\n\nenum Command {\n  RESET = '\\x1b[0m',\n  BRIGHT = '\\x1b[1m',\n  UNDERSCORE = '\\x1b[4m',\n}\n\nenum Level {\n  LOG = Color.LOG + '%s' + Command.RESET,\n  DARK = Color.DARK + '%s' + Command.RESET,\n  INFO = Color.INFO + '%s' + Command.RESET,\n  WARN = Color.WARN + '%s' + Command.RESET,\n  ERROR = Color.ERROR + '%s' + Command.RESET,\n  DEBUG = Color.DEBUG + '%s' + Command.RESET,\n  VERBOSE = Color.VERBOSE + '%s' + Command.RESET,\n}\n\nenum Type {\n  LOG = 'LOG',\n  WARN = 'WARN',\n  INFO = 'INFO',\n  DARK = 'DARK',\n  ERROR = 'ERROR',\n  DEBUG = 'DEBUG',\n  VERBOSE = 'VERBOSE',\n}\n\nenum Background {\n  LOG = '\\x1b[42m',\n  INFO = '\\x1b[44m',\n  WARN = '\\x1b[43m',\n  DARK = '\\x1b[40m',\n  ERROR = '\\x1b[41m',\n  DEBUG = '\\x1b[46m',\n  VERBOSE = '\\x1b[47m',\n}\n\nexport class Logger {\n  private readonly configService = configService;\n  private context: string;\n\n  constructor(context = 'Logger') {\n    this.context = context;\n  }\n\n  private instance = null;\n\n  public setContext(value: string) {\n    this.context = value;\n  }\n\n  public setInstance(value: string) {\n    this.instance = value;\n  }\n\n  private console(value: any, type: Type) {\n    const types: Type[] = [];\n\n    this.configService.get<Log>('LOG').LEVEL.forEach((level) => types.push(Type[level]));\n\n    const typeValue = typeof value;\n    if (types.includes(type)) {\n      if (configService.get<Log>('LOG').COLOR) {\n        console.log(\n          /*Command.UNDERSCORE +*/ Command.BRIGHT + Level[type],\n          '[Evolution API]',\n          Command.BRIGHT + Color[type],\n          this.instance ? `[${this.instance}]` : '',\n          Command.BRIGHT + Color[type],\n          `v${packageJson.version}`,\n          Command.BRIGHT + Color[type],\n          process.pid.toString(),\n          Command.RESET,\n          Command.BRIGHT + Color[type],\n          '-',\n          Command.BRIGHT + Color.VERBOSE,\n          `${formatDateLog(Date.now())}  `,\n          Command.RESET,\n          Color[type] + Background[type] + Command.BRIGHT,\n          `${type} ` + Command.RESET,\n          Color.WARN + Command.BRIGHT,\n          `[${this.context}]` + Command.RESET,\n          Color[type] + Command.BRIGHT,\n          `[${typeValue}]` + Command.RESET,\n          Color[type],\n          typeValue !== 'object' ? value : '',\n          Command.RESET,\n        );\n        typeValue === 'object' ? console.log(/*Level.DARK,*/ value, '\\n') : '';\n      } else {\n        console.log(\n          '[Evolution API]',\n          this.instance ? `[${this.instance}]` : '',\n          process.pid.toString(),\n          '-',\n          `${formatDateLog(Date.now())}  `,\n          `${type} `,\n          `[${this.context}]`,\n          `[${typeValue}]`,\n          value,\n        );\n      }\n    }\n  }\n\n  public log(value: any) {\n    this.console(value, Type.LOG);\n  }\n\n  public info(value: any) {\n    this.console(value, Type.INFO);\n  }\n\n  public warn(value: any) {\n    this.console(value, Type.WARN);\n  }\n\n  public error(value: any) {\n    this.console(value, Type.ERROR);\n  }\n\n  public verbose(value: any) {\n    this.console(value, Type.VERBOSE);\n  }\n\n  public debug(value: any) {\n    this.console(value, Type.DEBUG);\n  }\n\n  public dark(value: any) {\n    this.console(value, Type.DARK);\n  }\n}\n","import { Chatwoot, configService } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport postgresql from 'pg';\n\nconst { Pool } = postgresql;\n\nclass Postgres {\n  private logger = new Logger('Postgres');\n  private pool;\n  private connected = false;\n\n  getConnection(connectionString: string) {\n    if (this.connected) {\n      return this.pool;\n    } else {\n      this.pool = new Pool({\n        connectionString,\n        ssl: {\n          rejectUnauthorized: false,\n        },\n      });\n\n      this.pool.on('error', () => {\n        this.logger.error('postgres disconnected');\n        this.connected = false;\n      });\n\n      try {\n        this.connected = true;\n      } catch (e) {\n        this.connected = false;\n        this.logger.error('postgres connect exception caught: ' + e);\n        return null;\n      }\n\n      return this.pool;\n    }\n  }\n\n  getChatwootConnection() {\n    const uri = configService.get<Chatwoot>('CHATWOOT').IMPORT.DATABASE.CONNECTION.URI;\n\n    return this.getConnection(uri);\n  }\n}\n\nexport const postgresClient = new Postgres();\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { ChatwootDto } from '@api/integrations/chatbot/chatwoot/dto/chatwoot.dto';\nimport { postgresClient } from '@api/integrations/chatbot/chatwoot/libs/postgres.client';\nimport { ChatwootService } from '@api/integrations/chatbot/chatwoot/services/chatwoot.service';\nimport { Chatwoot, configService } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport { inbox } from '@figuro/chatwoot-sdk';\nimport { Chatwoot as ChatwootModel, Contact, Message } from '@prisma/client';\nimport { proto } from 'baileys';\n\ntype ChatwootUser = {\n  user_type: string;\n  user_id: number;\n};\n\ntype FksChatwoot = {\n  phone_number: string;\n  contact_id: string;\n  conversation_id: string;\n};\n\ntype firstLastTimestamp = {\n  first: number;\n  last: number;\n};\n\ntype IWebMessageInfo = Omit<proto.IWebMessageInfo, 'key'> & Partial<Pick<proto.IWebMessageInfo, 'key'>>;\n\nclass ChatwootImport {\n  private logger = new Logger('ChatwootImport');\n  private repositoryMessagesCache = new Map<string, Set<string>>();\n  private historyMessages = new Map<string, Message[]>();\n  private historyContacts = new Map<string, Contact[]>();\n\n  public getRepositoryMessagesCache(instance: InstanceDto) {\n    return this.repositoryMessagesCache.has(instance.instanceName)\n      ? this.repositoryMessagesCache.get(instance.instanceName)\n      : null;\n  }\n\n  public setRepositoryMessagesCache(instance: InstanceDto, repositoryMessagesCache: Set<string>) {\n    this.repositoryMessagesCache.set(instance.instanceName, repositoryMessagesCache);\n  }\n\n  public deleteRepositoryMessagesCache(instance: InstanceDto) {\n    this.repositoryMessagesCache.delete(instance.instanceName);\n  }\n\n  public addHistoryMessages(instance: InstanceDto, messagesRaw: Message[]) {\n    const actualValue = this.historyMessages.has(instance.instanceName)\n      ? this.historyMessages.get(instance.instanceName)\n      : [];\n    this.historyMessages.set(instance.instanceName, [...actualValue, ...messagesRaw]);\n  }\n\n  public addHistoryContacts(instance: InstanceDto, contactsRaw: Contact[]) {\n    const actualValue = this.historyContacts.has(instance.instanceName)\n      ? this.historyContacts.get(instance.instanceName)\n      : [];\n    this.historyContacts.set(instance.instanceName, actualValue.concat(contactsRaw));\n  }\n\n  public deleteHistoryMessages(instance: InstanceDto) {\n    this.historyMessages.delete(instance.instanceName);\n  }\n\n  public deleteHistoryContacts(instance: InstanceDto) {\n    this.historyContacts.delete(instance.instanceName);\n  }\n\n  public clearAll(instance: InstanceDto) {\n    this.deleteRepositoryMessagesCache(instance);\n    this.deleteHistoryMessages(instance);\n    this.deleteHistoryContacts(instance);\n  }\n\n  public getHistoryMessagesLenght(instance: InstanceDto) {\n    return this.historyMessages.get(instance.instanceName)?.length ?? 0;\n  }\n\n  public async importHistoryContacts(instance: InstanceDto, provider: ChatwootDto) {\n    try {\n      if (this.getHistoryMessagesLenght(instance) > 0) {\n        return;\n      }\n\n      const pgClient = postgresClient.getChatwootConnection();\n\n      let totalContactsImported = 0;\n\n      const contacts = this.historyContacts.get(instance.instanceName) || [];\n      if (contacts.length === 0) {\n        return 0;\n      }\n\n      let contactsChunk: Contact[] = this.sliceIntoChunks(contacts, 3000);\n      while (contactsChunk.length > 0) {\n        const labelSql = `SELECT id FROM labels WHERE title = '${provider.nameInbox}' AND account_id = ${provider.accountId} LIMIT 1`;\n\n        let labelId = (await pgClient.query(labelSql))?.rows[0]?.id;\n\n        if (!labelId) {\n          // creating label in chatwoot db and getting the id\n          const sqlLabel = `INSERT INTO labels (title, color, show_on_sidebar, account_id, created_at, updated_at) VALUES ('${provider.nameInbox}', '#34039B', true, ${provider.accountId}, NOW(), NOW()) RETURNING id`;\n\n          labelId = (await pgClient.query(sqlLabel))?.rows[0]?.id;\n        }\n\n        // inserting contacts in chatwoot db\n        let sqlInsert = `INSERT INTO contacts\n          (name, phone_number, account_id, identifier, created_at, updated_at) VALUES `;\n        const bindInsert = [provider.accountId];\n\n        for (const contact of contactsChunk) {\n          const isGroup = this.isIgnorePhoneNumber(contact.remoteJid);\n\n          const contactName = isGroup ? `${contact.pushName} (GROUP)` : contact.pushName;\n          bindInsert.push(contactName);\n          const bindName = `$${bindInsert.length}`;\n\n          let bindPhoneNumber: string;\n          if (!isGroup) {\n            bindInsert.push(`+${contact.remoteJid.split('@')[0]}`);\n            bindPhoneNumber = `$${bindInsert.length}`;\n          } else {\n            bindPhoneNumber = 'NULL';\n          }\n          bindInsert.push(contact.remoteJid);\n          const bindIdentifier = `$${bindInsert.length}`;\n\n          sqlInsert += `(${bindName}, ${bindPhoneNumber}, $1, ${bindIdentifier}, NOW(), NOW()),`;\n        }\n        if (sqlInsert.slice(-1) === ',') {\n          sqlInsert = sqlInsert.slice(0, -1);\n        }\n        sqlInsert += ` ON CONFLICT (identifier, account_id)\n                       DO UPDATE SET\n                        name = EXCLUDED.name,\n                        phone_number = EXCLUDED.phone_number,\n                        updated_at = NOW()`;\n\n        totalContactsImported += (await pgClient.query(sqlInsert, bindInsert))?.rowCount ?? 0;\n\n        const sqlTags = `SELECT id FROM tags WHERE name = '${provider.nameInbox}' LIMIT 1`;\n\n        const tagData = (await pgClient.query(sqlTags))?.rows[0];\n        let tagId = tagData?.id;\n\n        const sqlTag = `INSERT INTO tags (name, taggings_count) VALUES ('${provider.nameInbox}', ${totalContactsImported}) ON CONFLICT (name) DO UPDATE SET taggings_count = tags.taggings_count + ${totalContactsImported} RETURNING id`;\n\n        tagId = (await pgClient.query(sqlTag))?.rows[0]?.id;\n\n        await pgClient.query(sqlTag);\n\n        let sqlInsertLabel = `INSERT INTO taggings (tag_id, taggable_type, taggable_id, context, created_at) VALUES `;\n\n        contactsChunk.forEach((contact) => {\n          const bindTaggableId = `(SELECT id FROM contacts WHERE identifier = '${contact.remoteJid}' AND account_id = ${provider.accountId})`;\n          sqlInsertLabel += `($1, $2, ${bindTaggableId}, $3, NOW()),`;\n        });\n\n        if (sqlInsertLabel.slice(-1) === ',') {\n          sqlInsertLabel = sqlInsertLabel.slice(0, -1);\n        }\n\n        await pgClient.query(sqlInsertLabel, [tagId, 'Contact', 'labels']);\n\n        contactsChunk = this.sliceIntoChunks(contacts, 3000);\n      }\n\n      this.deleteHistoryContacts(instance);\n\n      return totalContactsImported;\n    } catch (error) {\n      this.logger.error(`Error on import history contacts: ${error.toString()}`);\n    }\n  }\n\n  public async getExistingSourceIds(sourceIds: string[], conversationId?: number): Promise<Set<string>> {\n    try {\n      const existingSourceIdsSet = new Set<string>();\n\n      if (sourceIds.length === 0) {\n        return existingSourceIdsSet;\n      }\n\n      // Ensure all sourceIds are consistently prefixed with 'WAID:' as required by downstream systems and database queries.\n      const formattedSourceIds = sourceIds.map((sourceId) => `WAID:${sourceId.replace('WAID:', '')}`);\n      const pgClient = postgresClient.getChatwootConnection();\n\n      const params = conversationId ? [formattedSourceIds, conversationId] : [formattedSourceIds];\n\n      const query = conversationId\n        ? 'SELECT source_id FROM messages WHERE source_id = ANY($1) AND conversation_id = $2'\n        : 'SELECT source_id FROM messages WHERE source_id = ANY($1)';\n\n      const result = await pgClient.query(query, params);\n      for (const row of result.rows) {\n        existingSourceIdsSet.add(row.source_id);\n      }\n\n      return existingSourceIdsSet;\n    } catch (error) {\n      this.logger.error(`Error on getExistingSourceIds: ${error.toString()}`);\n      return new Set<string>();\n    }\n  }\n\n  public async importHistoryMessages(\n    instance: InstanceDto,\n    chatwootService: ChatwootService,\n    inbox: inbox,\n    provider: ChatwootModel,\n  ) {\n    try {\n      const pgClient = postgresClient.getChatwootConnection();\n\n      const chatwootUser = await this.getChatwootUser(provider);\n      if (!chatwootUser) {\n        throw new Error('User not found to import messages.');\n      }\n\n      let totalMessagesImported = 0;\n\n      let messagesOrdered = this.historyMessages.get(instance.instanceName) || [];\n      if (messagesOrdered.length === 0) {\n        return 0;\n      }\n\n      // ordering messages by number and timestamp asc\n      messagesOrdered.sort((a, b) => {\n        const aKey = a.key as {\n          remoteJid: string;\n        };\n\n        const bKey = b.key as {\n          remoteJid: string;\n        };\n\n        const aMessageTimestamp = a.messageTimestamp as any as number;\n        const bMessageTimestamp = b.messageTimestamp as any as number;\n\n        return parseInt(aKey.remoteJid) - parseInt(bKey.remoteJid) || aMessageTimestamp - bMessageTimestamp;\n      });\n\n      const allMessagesMappedByPhoneNumber = this.createMessagesMapByPhoneNumber(messagesOrdered);\n      // Map structure: +552199999999 => { first message timestamp from number, last message timestamp from number}\n      const phoneNumbersWithTimestamp = new Map<string, firstLastTimestamp>();\n      allMessagesMappedByPhoneNumber.forEach((messages: Message[], phoneNumber: string) => {\n        phoneNumbersWithTimestamp.set(phoneNumber, {\n          first: messages[0]?.messageTimestamp as any as number,\n          last: messages[messages.length - 1]?.messageTimestamp as any as number,\n        });\n      });\n\n      const existingSourceIds = await this.getExistingSourceIds(messagesOrdered.map((message: any) => message.key.id));\n      messagesOrdered = messagesOrdered.filter((message: any) => !existingSourceIds.has(message.key.id));\n      // processing messages in batch\n      const batchSize = 4000;\n      let messagesChunk: Message[] = this.sliceIntoChunks(messagesOrdered, batchSize);\n      while (messagesChunk.length > 0) {\n        // Map structure: +552199999999 => Message[]\n        const messagesByPhoneNumber = this.createMessagesMapByPhoneNumber(messagesChunk);\n\n        if (messagesByPhoneNumber.size > 0) {\n          const fksByNumber = await this.selectOrCreateFksFromChatwoot(\n            provider,\n            inbox,\n            phoneNumbersWithTimestamp,\n            messagesByPhoneNumber,\n          );\n\n          // inserting messages in chatwoot db\n          let sqlInsertMsg = `INSERT INTO messages\n            (content, processed_message_content, account_id, inbox_id, conversation_id, message_type, private, content_type,\n            sender_type, sender_id, source_id, created_at, updated_at) VALUES `;\n          const bindInsertMsg = [provider.accountId, inbox.id];\n\n          messagesByPhoneNumber.forEach((messages: any[], phoneNumber: string) => {\n            const fksChatwoot = fksByNumber.get(phoneNumber);\n\n            messages.forEach((message) => {\n              if (!message.message) {\n                return;\n              }\n\n              if (!fksChatwoot?.conversation_id || !fksChatwoot?.contact_id) {\n                return;\n              }\n\n              const contentMessage = this.getContentMessage(chatwootService, message);\n              if (!contentMessage) {\n                return;\n              }\n\n              bindInsertMsg.push(contentMessage);\n              const bindContent = `$${bindInsertMsg.length}`;\n\n              bindInsertMsg.push(fksChatwoot.conversation_id);\n              const bindConversationId = `$${bindInsertMsg.length}`;\n\n              bindInsertMsg.push(message.key.fromMe ? '1' : '0');\n              const bindMessageType = `$${bindInsertMsg.length}`;\n\n              bindInsertMsg.push(message.key.fromMe ? chatwootUser.user_type : 'Contact');\n              const bindSenderType = `$${bindInsertMsg.length}`;\n\n              bindInsertMsg.push(message.key.fromMe ? chatwootUser.user_id : fksChatwoot.contact_id);\n              const bindSenderId = `$${bindInsertMsg.length}`;\n\n              bindInsertMsg.push('WAID:' + message.key.id);\n              const bindSourceId = `$${bindInsertMsg.length}`;\n\n              bindInsertMsg.push(message.messageTimestamp as number);\n              const bindmessageTimestamp = `$${bindInsertMsg.length}`;\n\n              sqlInsertMsg += `(${bindContent}, ${bindContent}, $1, $2, ${bindConversationId}, ${bindMessageType}, FALSE, 0,\n                  ${bindSenderType},${bindSenderId},${bindSourceId}, to_timestamp(${bindmessageTimestamp}), to_timestamp(${bindmessageTimestamp})),`;\n            });\n          });\n          if (bindInsertMsg.length > 2) {\n            if (sqlInsertMsg.slice(-1) === ',') {\n              sqlInsertMsg = sqlInsertMsg.slice(0, -1);\n            }\n            totalMessagesImported += (await pgClient.query(sqlInsertMsg, bindInsertMsg))?.rowCount ?? 0;\n          }\n        }\n        messagesChunk = this.sliceIntoChunks(messagesOrdered, batchSize);\n      }\n\n      this.deleteHistoryMessages(instance);\n      this.deleteRepositoryMessagesCache(instance);\n\n      const providerData: ChatwootDto = {\n        ...provider,\n        ignoreJids: Array.isArray(provider.ignoreJids) ? provider.ignoreJids.map((event) => String(event)) : [],\n      };\n\n      this.importHistoryContacts(instance, providerData);\n\n      return totalMessagesImported;\n    } catch (error) {\n      this.logger.error(`Error on import history messages: ${error.toString()}`);\n\n      this.deleteHistoryMessages(instance);\n      this.deleteRepositoryMessagesCache(instance);\n    }\n  }\n\n  public async selectOrCreateFksFromChatwoot(\n    provider: ChatwootModel,\n    inbox: inbox,\n    phoneNumbersWithTimestamp: Map<string, firstLastTimestamp>,\n    messagesByPhoneNumber: Map<string, Message[]>,\n  ): Promise<Map<string, FksChatwoot>> {\n    const pgClient = postgresClient.getChatwootConnection();\n\n    const bindValues = [provider.accountId, inbox.id];\n    const phoneNumberBind = Array.from(messagesByPhoneNumber.keys())\n      .map((phoneNumber) => {\n        const phoneNumberTimestamp = phoneNumbersWithTimestamp.get(phoneNumber);\n\n        if (phoneNumberTimestamp) {\n          bindValues.push(phoneNumber);\n          let bindStr = `($${bindValues.length},`;\n\n          bindValues.push(phoneNumberTimestamp.first);\n          bindStr += `$${bindValues.length},`;\n\n          bindValues.push(phoneNumberTimestamp.last);\n          return `${bindStr}$${bindValues.length})`;\n        }\n      })\n      .join(',');\n\n    // select (or insert when necessary) data from tables contacts, contact_inboxes, conversations from chatwoot db\n    const sqlFromChatwoot = `WITH\n              phone_number AS (\n                SELECT phone_number, created_at::INTEGER, last_activity_at::INTEGER FROM (\n                  VALUES \n                   ${phoneNumberBind}\n                 ) as t (phone_number, created_at, last_activity_at)\n              ),\n\n              only_new_phone_number AS (\n                SELECT * FROM phone_number\n                WHERE phone_number NOT IN (\n                  SELECT phone_number\n                  FROM contacts\n                    JOIN contact_inboxes ci ON ci.contact_id = contacts.id AND ci.inbox_id = $2\n                    JOIN conversations con ON con.contact_inbox_id = ci.id \n                      AND con.account_id = $1\n                      AND con.inbox_id = $2\n                      AND con.contact_id = contacts.id\n                  WHERE contacts.account_id = $1\n                )\n              ),\n\n              new_contact AS (\n                INSERT INTO contacts (name, phone_number, account_id, identifier, created_at, updated_at)\n                SELECT REPLACE(p.phone_number, '+', ''), p.phone_number, $1, CONCAT(REPLACE(p.phone_number, '+', ''),\n                  '@s.whatsapp.net'), to_timestamp(p.created_at), to_timestamp(p.last_activity_at)\n                FROM only_new_phone_number AS p\n                ON CONFLICT(identifier, account_id) DO UPDATE SET updated_at = EXCLUDED.updated_at\n                RETURNING id, phone_number, created_at, updated_at\n              ),\n\n              new_contact_inbox AS (\n                INSERT INTO contact_inboxes (contact_id, inbox_id, source_id, created_at, updated_at)\n                SELECT new_contact.id, $2, gen_random_uuid(), new_contact.created_at, new_contact.updated_at\n                FROM new_contact \n                RETURNING id, contact_id, created_at, updated_at\n              ),\n\n              new_conversation AS (\n                INSERT INTO conversations (account_id, inbox_id, status, contact_id,\n                  contact_inbox_id, uuid, last_activity_at, created_at, updated_at)\n                SELECT $1, $2, 0, new_contact_inbox.contact_id, new_contact_inbox.id, gen_random_uuid(),\n                  new_contact_inbox.updated_at, new_contact_inbox.created_at, new_contact_inbox.updated_at\n                FROM new_contact_inbox\n                RETURNING id, contact_id\n              )\n\n              SELECT new_contact.phone_number, new_conversation.contact_id, new_conversation.id AS conversation_id\n              FROM new_conversation \n              JOIN new_contact ON new_conversation.contact_id = new_contact.id\n\n              UNION\n\n              SELECT p.phone_number, c.id contact_id, con.id conversation_id\n                FROM phone_number p\n              JOIN contacts c ON c.phone_number = p.phone_number\n              JOIN contact_inboxes ci ON ci.contact_id = c.id AND ci.inbox_id = $2\n              JOIN conversations con ON con.contact_inbox_id = ci.id AND con.account_id = $1\n                AND con.inbox_id = $2 AND con.contact_id = c.id`;\n\n    const fksFromChatwoot = await pgClient.query(sqlFromChatwoot, bindValues);\n\n    return new Map(fksFromChatwoot.rows.map((item: FksChatwoot) => [item.phone_number, item]));\n  }\n\n  public async getChatwootUser(provider: ChatwootModel): Promise<ChatwootUser> {\n    try {\n      const pgClient = postgresClient.getChatwootConnection();\n\n      const sqlUser = `SELECT owner_type AS user_type, owner_id AS user_id\n                         FROM access_tokens\n                       WHERE token = $1`;\n\n      return (await pgClient.query(sqlUser, [provider.token]))?.rows[0] || false;\n    } catch (error) {\n      this.logger.error(`Error on getChatwootUser: ${error.toString()}`);\n    }\n  }\n\n  public createMessagesMapByPhoneNumber(messages: Message[]): Map<string, Message[]> {\n    return messages.reduce((acc: Map<string, Message[]>, message: Message) => {\n      const key = message?.key as {\n        remoteJid: string;\n      };\n      if (!this.isIgnorePhoneNumber(key?.remoteJid)) {\n        const phoneNumber = key?.remoteJid?.split('@')[0];\n        if (phoneNumber) {\n          const phoneNumberPlus = `+${phoneNumber}`;\n          const messages = acc.has(phoneNumberPlus) ? acc.get(phoneNumberPlus) : [];\n          messages.push(message);\n          acc.set(phoneNumberPlus, messages);\n        }\n      }\n\n      return acc;\n    }, new Map());\n  }\n\n  public async getContactsOrderByRecentConversations(\n    inbox: inbox,\n    provider: ChatwootModel,\n    limit = 50,\n  ): Promise<{ id: number; phone_number: string; identifier: string }[]> {\n    try {\n      const pgClient = postgresClient.getChatwootConnection();\n\n      const sql = `SELECT contacts.id, contacts.identifier, contacts.phone_number\n                     FROM conversations\n                   JOIN contacts ON contacts.id = conversations.contact_id\n                   WHERE conversations.account_id = $1\n                     AND inbox_id = $2\n                   ORDER BY conversations.last_activity_at DESC\n                   LIMIT $3`;\n\n      return (await pgClient.query(sql, [provider.accountId, inbox.id, limit]))?.rows;\n    } catch (error) {\n      this.logger.error(`Error on get recent conversations: ${error.toString()}`);\n    }\n  }\n\n  public getContentMessage(chatwootService: ChatwootService, msg: IWebMessageInfo) {\n    const contentMessage = chatwootService.getConversationMessage(msg.message);\n    if (contentMessage) {\n      return contentMessage;\n    }\n\n    if (!configService.get<Chatwoot>('CHATWOOT').IMPORT.PLACEHOLDER_MEDIA_MESSAGE) {\n      return '';\n    }\n\n    const types = {\n      documentMessage: msg.message.documentMessage,\n      documentWithCaptionMessage: msg.message.documentWithCaptionMessage?.message?.documentMessage,\n      imageMessage: msg.message.imageMessage,\n      videoMessage: msg.message.videoMessage,\n      audioMessage: msg.message.audioMessage,\n      stickerMessage: msg.message.stickerMessage,\n      templateMessage: msg.message.templateMessage?.hydratedTemplate?.hydratedContentText,\n    };\n\n    const typeKey = Object.keys(types).find((key) => types[key] !== undefined && types[key] !== null);\n    switch (typeKey) {\n      case 'documentMessage': {\n        const doc = msg.message.documentMessage;\n        const fileName = doc?.fileName || 'document';\n        const caption = doc?.caption ? ` ${doc.caption}` : '';\n        return `_<File: ${fileName}${caption}>_`;\n      }\n\n      case 'documentWithCaptionMessage': {\n        const doc = msg.message.documentWithCaptionMessage?.message?.documentMessage;\n        const fileName = doc?.fileName || 'document';\n        const caption = doc?.caption ? ` ${doc.caption}` : '';\n        return `_<File: ${fileName}${caption}>_`;\n      }\n\n      case 'templateMessage': {\n        const template = msg.message.templateMessage?.hydratedTemplate;\n        return (\n          (template?.hydratedTitleText ? `*${template.hydratedTitleText}*\\n` : '') +\n          (template?.hydratedContentText || '')\n        );\n      }\n\n      case 'imageMessage':\n        return '_<Image Message>_';\n\n      case 'videoMessage':\n        return '_<Video Message>_';\n\n      case 'audioMessage':\n        return '_<Audio Message>_';\n\n      case 'stickerMessage':\n        return '_<Sticker Message>_';\n\n      default:\n        return '';\n    }\n  }\n\n  public sliceIntoChunks(arr: any[], chunkSize: number) {\n    return arr.splice(0, chunkSize);\n  }\n\n  public isGroup(remoteJid: string) {\n    return remoteJid.includes('@g.us');\n  }\n\n  public isIgnorePhoneNumber(remoteJid: string) {\n    return this.isGroup(remoteJid) || remoteJid === 'status@broadcast' || remoteJid === '0@s.whatsapp.net';\n  }\n\n  public updateMessageSourceID(messageId: string | number, sourceId: string) {\n    const pgClient = postgresClient.getChatwootConnection();\n\n    const sql = `UPDATE messages SET source_id = $1, status = 0, created_at = NOW(), updated_at = NOW() WHERE id = $2;`;\n\n    return pgClient.query(sql, [`WAID:${sourceId}`, messageId]);\n  }\n}\n\nexport const chatwootImport = new ChatwootImport();\n"],"mappings":"AAAA,OAAS,mBAAAA,MAAuB,kBAChC,OAAOC,MAAY,SAEnBA,EAAO,OAAO,EAgbP,IAAMC,EAAN,KAAoB,CACzB,aAAc,CACZ,KAAK,QAAQ,CACf,CAIO,IAAaC,EAAU,CAC5B,OAAO,KAAK,IAAIA,CAAG,CACrB,CAEQ,SAAU,CAChB,KAAK,IAAM,KAAK,WAAW,EAC3B,KAAK,IAAI,WAAa,QAAQ,KAAK,WAAa,OAC5C,QAAQ,KAAK,aAAe,SAC9B,KAAK,IAAI,OAAO,KAAO,QAAQ,IAAI,YACnC,KAAK,IAAI,OAAO,KAAO,OAAO,SAAS,QAAQ,IAAI,WAAW,GAAK,KAEvE,CAEQ,YAAkB,CACxB,MAAO,CACL,OAAQ,CACN,KAAM,QAAQ,KAAK,aAAe,YAClC,KAAO,QAAQ,IAAI,aAAoC,OACvD,KAAM,OAAO,SAAS,QAAQ,IAAI,WAAW,GAAK,KAClD,IAAK,QAAQ,IAAI,WACjB,aAAc,QAAQ,KAAK,sBAAwB,OACnD,gBAAiB,QAAQ,KAAK,yBAA2B,MAC3D,EACA,KAAM,CACJ,OAAQ,QAAQ,IAAI,aAAa,MAAM,GAAG,GAAK,CAAC,GAAG,EACnD,QACG,QAAQ,IAAI,cAAc,MAAM,GAAG,GACnC,CAAC,OAAQ,MAAO,MAAO,QAAQ,EAClC,YAAa,QAAQ,KAAK,mBAAqB,MACjD,EACA,SAAU,CACR,QAAS,QAAQ,KAAK,kBAAoB,GAC1C,UAAW,QAAQ,KAAK,oBAAsB,EAChD,EACA,SAAU,CACR,QAAS,QAAQ,KAAK,mBAAqB,OAC3C,KAAM,QAAQ,IAAI,cAClB,KAAM,QAAQ,KAAK,eAAiB,OACpC,OAAQ,QAAQ,KAAK,iBAAmB,WAC1C,EACA,SAAU,CACR,WAAY,CACV,IAAK,QAAQ,IAAI,yBAA2B,GAC5C,YAAa,QAAQ,IAAI,iCAAmC,WAC9D,EACA,SAAU,QAAQ,IAAI,mBAAqB,aAC3C,UAAW,CACT,SAAU,QAAQ,KAAK,8BAAgC,OACvD,YAAa,QAAQ,KAAK,iCAAmC,OAC7D,eAAgB,QAAQ,KAAK,+BAAiC,OAC9D,SAAU,QAAQ,KAAK,8BAAgC,OACvD,MAAO,QAAQ,KAAK,2BAA6B,OACjD,SAAU,QAAQ,KAAK,8BAAgC,OACvD,OAAQ,QAAQ,KAAK,4BAA8B,OACnD,eAAgB,QAAQ,KAAK,+BAAiC,OAC9D,oBAAqB,OAAO,SAAS,QAAQ,KAAK,mCAAqC,GAAG,CAC5F,EACA,YAAa,CACX,uBAAwB,QAAQ,KAAK,0BAA4B,MACnE,CACF,EACA,SAAU,CACR,QAAS,QAAQ,KAAK,mBAAqB,OAC3C,eAAgB,QAAQ,KAAK,0BAA4B,OACzD,WAAY,QAAQ,KAAK,oBACzB,cAAe,QAAQ,KAAK,wBAA0B,qBACtD,IAAK,QAAQ,IAAI,cAAgB,GACjC,UAAW,OAAO,SAAS,QAAQ,IAAI,kBAAkB,GAAK,KAC9D,OAAQ,CACN,oBAAqB,QAAQ,KAAK,sCAAwC,OAC1E,gBAAiB,QAAQ,KAAK,kCAAoC,OAClE,gBAAiB,QAAQ,KAAK,kCAAoC,OAClE,eAAgB,QAAQ,KAAK,iCAAmC,OAChE,aAAc,QAAQ,KAAK,+BAAiC,OAC5D,gBAAiB,QAAQ,KAAK,kCAAoC,OAClE,gBAAiB,QAAQ,KAAK,kCAAoC,OAClE,gBAAiB,QAAQ,KAAK,kCAAoC,OAClE,gBAAiB,QAAQ,KAAK,kCAAoC,OAClE,aAAc,QAAQ,KAAK,+BAAiC,OAC5D,oBAAqB,QAAQ,KAAK,sCAAwC,OAC1E,aAAc,QAAQ,KAAK,+BAAiC,OAC5D,gBAAiB,QAAQ,KAAK,kCAAoC,OAClE,gBAAiB,QAAQ,KAAK,kCAAoC,OAClE,gBAAiB,QAAQ,KAAK,kCAAoC,OAClE,UAAW,QAAQ,KAAK,4BAA8B,OACtD,aAAc,QAAQ,KAAK,+BAAiC,OAC5D,aAAc,QAAQ,KAAK,+BAAiC,OAC5D,aAAc,QAAQ,KAAK,+BAAiC,OAC5D,kBAAmB,QAAQ,KAAK,oCAAsC,OACtE,YAAa,QAAQ,KAAK,8BAAgC,OAC1D,mBAAoB,QAAQ,KAAK,qCAAuC,OACxE,cAAe,QAAQ,KAAK,gCAAkC,OAC9D,aAAc,QAAQ,KAAK,gCAAkC,OAC7D,0BAA2B,QAAQ,KAAK,4CAA8C,OACtF,KAAM,QAAQ,KAAK,uBAAyB,OAC5C,cAAe,QAAQ,KAAK,gCAAkC,OAC9D,sBAAuB,QAAQ,KAAK,wCAA0C,MAChF,CACF,EACA,KAAM,CACJ,QAAS,QAAQ,KAAK,eAAiB,OACvC,eAAgB,QAAQ,KAAK,sBAAwB,OACrD,WAAY,QAAQ,KAAK,gBACzB,cAAe,QAAQ,KAAK,oBAAsB,qBAClD,IAAK,QAAQ,IAAI,UAAY,GAC7B,OAAQ,CACN,oBAAqB,QAAQ,KAAK,kCAAoC,OACtE,gBAAiB,QAAQ,KAAK,8BAAgC,OAC9D,gBAAiB,QAAQ,KAAK,8BAAgC,OAC9D,eAAgB,QAAQ,KAAK,6BAA+B,OAC5D,aAAc,QAAQ,KAAK,2BAA6B,OACxD,gBAAiB,QAAQ,KAAK,8BAAgC,OAC9D,gBAAiB,QAAQ,KAAK,8BAAgC,OAC9D,gBAAiB,QAAQ,KAAK,8BAAgC,OAC9D,gBAAiB,QAAQ,KAAK,8BAAgC,OAC9D,aAAc,QAAQ,KAAK,2BAA6B,OACxD,oBAAqB,QAAQ,KAAK,kCAAoC,OACtE,aAAc,QAAQ,KAAK,2BAA6B,OACxD,gBAAiB,QAAQ,KAAK,8BAAgC,OAC9D,gBAAiB,QAAQ,KAAK,8BAAgC,OAC9D,gBAAiB,QAAQ,KAAK,8BAAgC,OAC9D,UAAW,QAAQ,KAAK,wBAA0B,OAClD,aAAc,QAAQ,KAAK,2BAA6B,OACxD,aAAc,QAAQ,KAAK,2BAA6B,OACxD,aAAc,QAAQ,KAAK,2BAA6B,OACxD,kBAAmB,QAAQ,KAAK,gCAAkC,OAClE,YAAa,QAAQ,KAAK,0BAA4B,OACtD,mBAAoB,QAAQ,KAAK,iCAAmC,OACpE,cAAe,QAAQ,KAAK,4BAA8B,OAC1D,aAAc,QAAQ,KAAK,4BAA8B,OACzD,0BAA2B,QAAQ,KAAK,wCAA0C,OAClF,KAAM,QAAQ,KAAK,mBAAqB,OACxC,cAAe,QAAQ,KAAK,4BAA8B,OAC1D,sBAAuB,QAAQ,KAAK,oCAAsC,MAC5E,CACF,EACA,IAAK,CACH,QAAS,QAAQ,KAAK,cAAgB,OACtC,eAAgB,QAAQ,KAAK,qBAAuB,OACpD,0BAA2B,QAAQ,KAAK,gCAAkC,OAC1E,mBAAoB,QAAQ,KAAK,wBAA0B,SAC3D,cAAe,QAAQ,IAAI,mBAAqB,GAChD,kBAAmB,QAAQ,IAAI,uBAAyB,GACxD,WAAY,QAAQ,IAAI,gBAAkB,GAC1C,OAAQ,QAAQ,IAAI,YAAc,GAClC,iBAAkB,OAAO,SAAS,QAAQ,IAAI,sBAAwB,SAAS,EAC/E,OAAQ,CACN,oBAAqB,QAAQ,KAAK,iCAAmC,OACrE,KAAM,QAAQ,KAAK,kBAAoB,OACvC,aAAc,QAAQ,KAAK,0BAA4B,OACvD,UAAW,QAAQ,KAAK,uBAAyB,OACjD,aAAc,QAAQ,KAAK,0BAA4B,OACvD,aAAc,QAAQ,KAAK,0BAA4B,OACvD,kBAAmB,QAAQ,KAAK,+BAAiC,OACjE,aAAc,QAAQ,KAAK,0BAA4B,OACvD,gBAAiB,QAAQ,KAAK,6BAA+B,OAC7D,gBAAiB,QAAQ,KAAK,6BAA+B,OAC7D,0BAA2B,QAAQ,KAAK,uCAAyC,OACjF,cAAe,QAAQ,KAAK,2BAA6B,OACzD,cAAe,QAAQ,KAAK,2BAA6B,OACzD,mBAAoB,QAAQ,KAAK,gCAAkC,OACnE,YAAa,QAAQ,KAAK,yBAA2B,OACrD,gBAAiB,QAAQ,KAAK,6BAA+B,OAC7D,gBAAiB,QAAQ,KAAK,6BAA+B,OAC7D,gBAAiB,QAAQ,KAAK,6BAA+B,OAC7D,aAAc,QAAQ,KAAK,0BAA4B,OACvD,gBAAiB,QAAQ,KAAK,6BAA+B,OAC7D,gBAAiB,QAAQ,KAAK,6BAA+B,OAC7D,gBAAiB,QAAQ,KAAK,6BAA+B,OAC7D,eAAgB,QAAQ,KAAK,4BAA8B,OAC3D,gBAAiB,QAAQ,KAAK,6BAA+B,OAC7D,aAAc,QAAQ,KAAK,0BAA4B,OACvD,sBAAuB,QAAQ,KAAK,mCAAqC,OACzE,cAAe,QAAQ,KAAK,2BAA6B,MAC3D,CACF,EACA,MAAO,CACL,QAAS,QAAQ,KAAK,gBAAkB,OACxC,UAAW,QAAQ,KAAK,iBAAmB,gBAC3C,QAAS,QAAQ,KAAK,eAAe,MAAM,GAAG,GAAK,CAAC,gBAAgB,EACpE,mBAAoB,OAAO,SAAS,QAAQ,KAAK,0BAA4B,MAAM,EACnF,gBAAiB,OAAO,SAAS,QAAQ,KAAK,uBAAyB,OAAO,EAC9E,eAAgB,QAAQ,KAAK,uBAAyB,OACtD,kBAAmB,QAAQ,KAAK,yBAA2B,0BAC3D,aAAc,QAAQ,KAAK,oBAAsB,YACjD,eAAgB,OAAO,SAAS,QAAQ,KAAK,sBAAwB,GAAG,EACxE,mBAAoB,OAAO,SAAS,QAAQ,KAAK,0BAA4B,GAAG,EAChF,mBAAoB,QAAQ,KAAK,2BAA6B,OAC9D,OAAQ,CACN,oBAAqB,QAAQ,KAAK,mCAAqC,OACvE,gBAAiB,QAAQ,KAAK,+BAAiC,OAC/D,gBAAiB,QAAQ,KAAK,+BAAiC,OAC/D,eAAgB,QAAQ,KAAK,8BAAgC,OAC7D,aAAc,QAAQ,KAAK,4BAA8B,OACzD,gBAAiB,QAAQ,KAAK,+BAAiC,OAC/D,gBAAiB,QAAQ,KAAK,+BAAiC,OAC/D,gBAAiB,QAAQ,KAAK,+BAAiC,OAC/D,gBAAiB,QAAQ,KAAK,+BAAiC,OAC/D,aAAc,QAAQ,KAAK,4BAA8B,OACzD,oBAAqB,QAAQ,KAAK,mCAAqC,OACvE,aAAc,QAAQ,KAAK,4BAA8B,OACzD,gBAAiB,QAAQ,KAAK,+BAAiC,OAC/D,gBAAiB,QAAQ,KAAK,+BAAiC,OAC/D,gBAAiB,QAAQ,KAAK,+BAAiC,OAC/D,UAAW,QAAQ,KAAK,yBAA2B,OACnD,aAAc,QAAQ,KAAK,4BAA8B,OACzD,aAAc,QAAQ,KAAK,4BAA8B,OACzD,aAAc,QAAQ,KAAK,4BAA8B,OACzD,kBAAmB,QAAQ,KAAK,iCAAmC,OACnE,YAAa,QAAQ,KAAK,2BAA6B,OACvD,mBAAoB,QAAQ,KAAK,kCAAoC,OACrE,cAAe,QAAQ,KAAK,6BAA+B,OAC3D,aAAc,QAAQ,KAAK,6BAA+B,OAC1D,0BAA2B,QAAQ,KAAK,yCAA2C,OACnF,KAAM,QAAQ,KAAK,oBAAsB,OACzC,cAAe,QAAQ,KAAK,6BAA+B,OAC3D,sBAAuB,QAAQ,KAAK,qCAAuC,MAC7E,EACA,KACE,QAAQ,KAAK,qBAAuB,OAChC,CACE,QAAS,GACT,UAAW,QAAQ,KAAK,sBAAwB,QAChD,SAAU,QAAQ,KAAK,qBAAuB,GAC9C,SAAU,QAAQ,KAAK,qBAAuB,EAChD,EACA,OACN,IACE,QAAQ,KAAK,oBAAsB,OAC/B,CACE,QAAS,GACT,oBAAqB,QAAQ,KAAK,gCAAkC,QACpE,GAAI,QAAQ,KAAK,aACjB,IAAK,QAAQ,KAAK,cAClB,KAAM,QAAQ,KAAK,cACrB,EACA,MACR,EACA,UAAW,CACT,QAAS,QAAQ,KAAK,oBAAsB,OAC5C,cAAe,QAAQ,KAAK,0BAA4B,OACxD,cAAe,QAAQ,KAAK,uBAC9B,EACA,OAAQ,CACN,QAAS,QAAQ,KAAK,iBAAmB,OACzC,OAAQ,CACN,QAAS,QAAQ,KAAK,wBAA0B,OAChD,OAAQ,QAAQ,KAAK,sBAAwB,GAC7C,IAAK,QAAQ,KAAK,mBAAqB,GACvC,OAAQ,QAAQ,KAAK,sBAAwB,GAC7C,QAAS,QAAQ,KAAK,uBAAyB,GAC/C,QAAS,QAAQ,KAAK,wBAA0B,MAClD,EACA,OAAQ,CACN,oBAAqB,QAAQ,KAAK,oCAAsC,OACxE,gBAAiB,QAAQ,KAAK,gCAAkC,OAChE,gBAAiB,QAAQ,KAAK,gCAAkC,OAChE,eAAgB,QAAQ,KAAK,+BAAiC,OAC9D,aAAc,QAAQ,KAAK,6BAA+B,OAC1D,gBAAiB,QAAQ,KAAK,gCAAkC,OAChE,gBAAiB,QAAQ,KAAK,gCAAkC,OAChE,gBAAiB,QAAQ,KAAK,gCAAkC,OAChE,gBAAiB,QAAQ,KAAK,gCAAkC,OAChE,aAAc,QAAQ,KAAK,6BAA+B,OAC1D,oBAAqB,QAAQ,KAAK,oCAAsC,OACxE,aAAc,QAAQ,KAAK,6BAA+B,OAC1D,gBAAiB,QAAQ,KAAK,gCAAkC,OAChE,gBAAiB,QAAQ,KAAK,gCAAkC,OAChE,gBAAiB,QAAQ,KAAK,gCAAkC,OAChE,UAAW,QAAQ,KAAK,0BAA4B,OACpD,aAAc,QAAQ,KAAK,6BAA+B,OAC1D,aAAc,QAAQ,KAAK,6BAA+B,OAC1D,aAAc,QAAQ,KAAK,6BAA+B,OAC1D,kBAAmB,QAAQ,KAAK,kCAAoC,OACpE,YAAa,QAAQ,KAAK,4BAA8B,OACxD,mBAAoB,QAAQ,KAAK,mCAAqC,OACtE,cAAe,QAAQ,KAAK,8BAAgC,OAC5D,aAAc,QAAQ,KAAK,8BAAgC,OAC3D,0BAA2B,QAAQ,KAAK,0CAA4C,OACpF,KAAM,QAAQ,KAAK,qBAAuB,OAC1C,cAAe,QAAQ,KAAK,8BAAgC,OAC5D,sBAAuB,QAAQ,KAAK,sCAAwC,MAC9E,CACF,EACA,YAAa,CACX,cAAe,QAAQ,IAAI,2BAA6B,YACxD,IAAK,QAAQ,IAAI,iBAAmB,6BACpC,QAAS,QAAQ,IAAI,qBAAuB,QAC5C,SAAU,QAAQ,IAAI,sBAAwB,IAChD,EACA,IAAK,CACH,MACG,QAAQ,KAAK,WAAW,MAAM,GAAG,GACjC,CAAC,QAAS,OAAQ,QAAS,OAAQ,MAAO,UAAW,OAAQ,WAAY,WAAW,EACvF,MAAO,QAAQ,KAAK,YAAc,OAClC,QAAU,QAAQ,KAAK,aAA8B,OACvD,EACA,aAAcH,EAAgB,QAAQ,KAAK,YAAY,EACnD,QAAQ,IAAI,eAAiB,OAC7B,OAAO,SAAS,QAAQ,IAAI,YAAY,GAAK,GACjD,mBAAoBA,EAAgB,QAAQ,KAAK,kBAAkB,EAC/D,QAAQ,IAAI,qBAAuB,OACnC,GACJ,SAAU,QAAQ,KAAK,UAAY,KACnC,QAAS,CACP,OAAQ,CACN,IAAK,QAAQ,KAAK,oBAAsB,GACxC,QAAS,QAAQ,KAAK,yBAA2B,OACjD,kBAAmB,QAAQ,KAAK,mCAAqC,MACvE,EACA,OAAQ,CACN,oBAAqB,QAAQ,KAAK,qCAAuC,OACzE,gBAAiB,QAAQ,KAAK,iCAAmC,OACjE,gBAAiB,QAAQ,KAAK,iCAAmC,OACjE,eAAgB,QAAQ,KAAK,gCAAkC,OAC/D,aAAc,QAAQ,KAAK,8BAAgC,OAC3D,gBAAiB,QAAQ,KAAK,iCAAmC,OACjE,gBAAiB,QAAQ,KAAK,iCAAmC,OACjE,gBAAiB,QAAQ,KAAK,iCAAmC,OACjE,gBAAiB,QAAQ,KAAK,iCAAmC,OACjE,aAAc,QAAQ,KAAK,8BAAgC,OAC3D,oBAAqB,QAAQ,KAAK,qCAAuC,OACzE,aAAc,QAAQ,KAAK,8BAAgC,OAC3D,gBAAiB,QAAQ,KAAK,iCAAmC,OACjE,gBAAiB,QAAQ,KAAK,iCAAmC,OACjE,gBAAiB,QAAQ,KAAK,iCAAmC,OACjE,UAAW,QAAQ,KAAK,2BAA6B,OACrD,aAAc,QAAQ,KAAK,8BAAgC,OAC3D,aAAc,QAAQ,KAAK,8BAAgC,OAC3D,aAAc,QAAQ,KAAK,8BAAgC,OAC3D,kBAAmB,QAAQ,KAAK,mCAAqC,OACrE,YAAa,QAAQ,KAAK,6BAA+B,OACzD,mBAAoB,QAAQ,KAAK,oCAAsC,OACvE,cAAe,QAAQ,KAAK,+BAAiC,OAC7D,aAAc,QAAQ,KAAK,+BAAiC,OAC5D,0BAA2B,QAAQ,KAAK,2CAA6C,OACrF,KAAM,QAAQ,KAAK,sBAAwB,OAC3C,cAAe,QAAQ,KAAK,+BAAiC,OAC7D,sBAAuB,QAAQ,KAAK,uCAAyC,OAC7E,OAAQ,QAAQ,KAAK,wBAA0B,OAC/C,eAAgB,QAAQ,KAAK,+BAAiC,EAChE,EACA,QAAS,CACP,WAAY,OAAO,SAAS,QAAQ,KAAK,0BAA0B,GAAK,GAC1E,EACA,MAAO,CACL,aAAc,OAAO,SAAS,QAAQ,KAAK,0BAA0B,GAAK,GAC1E,sBAAuB,OAAO,SAAS,QAAQ,KAAK,mCAAmC,GAAK,EAC5F,wBAAyB,QAAQ,KAAK,wCAA0C,QAChF,kBAAmB,OAAO,SAAS,QAAQ,KAAK,+BAA+B,GAAK,IACpF,cAAe,OAAO,WAAW,QAAQ,KAAK,2BAA2B,GAAK,GAC9E,2BAA4B,QAAQ,KAAK,0CAA0C,MAAM,GAAG,EAAE,IAAI,MAAM,GAAK,CAC3G,IAAK,IAAK,IAAK,IAAK,GACtB,CACF,CACF,EACA,qBAAsB,CACpB,OAAQ,QAAQ,KAAK,6BAA+B,gBACpD,KAAM,QAAQ,KAAK,2BAA6B,QAClD,EACA,OAAQ,CACN,MAAO,OAAO,SAAS,QAAQ,IAAI,YAAY,GAAK,GACpD,MAAO,QAAQ,IAAI,cAAgB,SACrC,EACA,QAAS,CACP,QAAS,QAAQ,KAAK,kBAAoB,OAC1C,YAAa,QAAQ,KAAK,qBAAuB,MACjD,kBAAmB,QAAQ,KAAK,4BAA8B,MAChE,EACA,SAAU,CACR,QAAS,QAAQ,KAAK,mBAAqB,OAC3C,eAAgB,QAAQ,IAAI,0BAA4B,OACxD,aAAc,QAAQ,IAAI,wBAA0B,OACpD,YAAa,CAAC,QAAQ,IAAI,sBAAwB,QAAQ,IAAI,uBAAyB,OACvF,OAAQ,CACN,SAAU,CACR,WAAY,CACV,IAAK,QAAQ,IAAI,yCAA2C,EAC9D,CACF,EACA,0BAA2B,QAAQ,KAAK,4CAA8C,MACxF,CACF,EACA,OAAQ,CACN,QAAS,QAAQ,KAAK,iBAAmB,OACzC,eAAgB,QAAQ,KAAK,uBAAyB,IACxD,EACA,KAAM,CACJ,QAAS,QAAQ,KAAK,eAAiB,MACzC,EACA,IAAK,CACH,QAAS,QAAQ,KAAK,cAAgB,MACxC,EACA,MAAO,CACL,QAAS,QAAQ,KAAK,gBAAkB,MAC1C,EACA,QAAS,CACP,QAAS,QAAQ,KAAK,kBAAoB,MAC5C,EACA,MAAO,CACL,MAAO,CACL,QAAS,QAAQ,KAAK,sBAAwB,OAC9C,IAAK,QAAQ,KAAK,iBAAmB,GACrC,WAAY,QAAQ,KAAK,wBAA0B,kBACnD,IAAK,OAAO,SAAS,QAAQ,KAAK,eAAe,GAAK,OACtD,eAAgB,QAAQ,KAAK,6BAA+B,MAC9D,EACA,MAAO,CACL,QAAS,QAAQ,KAAK,sBAAwB,OAC9C,IAAK,OAAO,SAAS,QAAQ,KAAK,eAAe,GAAK,KACxD,CACF,EACA,GAAI,CACF,WAAY,QAAQ,KAAK,cACzB,WAAY,QAAQ,KAAK,cACzB,SAAU,QAAQ,KAAK,YACvB,YAAa,QAAQ,KAAK,UAC1B,OAAQ,QAAQ,KAAK,aAAe,OACpC,KAAM,OAAO,SAAS,QAAQ,KAAK,SAAW,MAAM,EACpD,QAAS,QAAQ,KAAK,aAAe,OACrC,OAAQ,QAAQ,KAAK,UACrB,YAAa,QAAQ,KAAK,iBAAmB,OAC7C,WAAY,QAAQ,KAAK,gBAAkB,MAC7C,EACA,eAAgB,CACd,QAAS,CACP,IAAK,QAAQ,IAAI,wBAA0B,WAC7C,EACA,0BAA2B,QAAQ,KAAK,2CAA6C,MACvF,EACA,QAAS,CACP,QAAS,QAAQ,KAAK,qBAAuB,OAC7C,cAAe,QAAQ,KAAK,wBAA0B,OACtD,KAAM,QAAQ,KAAK,aACnB,SAAU,QAAQ,KAAK,iBACvB,YAAa,QAAQ,KAAK,mBAC5B,EACA,UAAW,CACT,QAAS,QAAQ,KAAK,oBAAsB,QAAa,QAAQ,KAAK,oBAAsB,OAC5F,IAAK,QAAQ,KAAK,aACpB,EACA,MAAO,CACL,KAAM,QAAQ,KAAK,WACnB,KAAM,QAAQ,KAAK,WACnB,SAAU,QAAQ,KAAK,eACvB,SAAU,QAAQ,KAAK,eACvB,SAAU,QAAQ,KAAK,cACzB,EACA,gBAAiB,CACf,QAAS,QAAQ,KAAK,oBACtB,QAAS,QAAQ,KAAK,uBACxB,EACA,SAAU,CACR,OAAQ,QAAQ,KAAK,gBACrB,UAAW,QAAQ,KAAK,mBACxB,WAAY,QAAQ,KAAK,mBAC3B,EACA,OAAQ,CACN,IAAK,QAAQ,KAAK,UACpB,EACA,cAAe,CACb,cAAe,OAAO,SAAS,QAAQ,KAAK,2BAA2B,GAAK,EAC9E,CACF,CACF,CACF,EAEaI,EAAgB,IAAIF,EC74BjC,OAAOG,MAAW,QAClB,OAAOC,MAAQ,KAGf,IAAMC,EAAc,KAAK,MAAMC,EAAG,aAAa,iBAAkB,MAAM,CAAC,EAElEC,EAAiBC,GACrBC,EAAMD,CAAS,EACZ,OAAO,EACP,SAAS,EACT,QAAQ,UAAW,EAAE,EAErBE,OACHA,EAAA,IAAM,WACNA,EAAA,KAAO,WACPA,EAAA,KAAO,WACPA,EAAA,MAAQ,WACRA,EAAA,MAAQ,WACRA,EAAA,QAAU,WACVA,EAAA,KAAO,WAPJA,OAAA,IAgBL,IAAKC,OACHA,EAAA,IAAM,oBACNA,EAAA,KAAO,oBACPA,EAAA,KAAO,oBACPA,EAAA,KAAO,oBACPA,EAAA,MAAQ,oBACRA,EAAA,MAAQ,oBACRA,EAAA,QAAU,oBAPPA,OAAA,IAUAC,OACHA,EAAA,IAAM,MACNA,EAAA,KAAO,OACPA,EAAA,KAAO,OACPA,EAAA,KAAO,OACPA,EAAA,MAAQ,QACRA,EAAA,MAAQ,QACRA,EAAA,QAAU,UAPPA,OAAA,IAUAC,OACHA,EAAA,IAAM,WACNA,EAAA,KAAO,WACPA,EAAA,KAAO,WACPA,EAAA,KAAO,WACPA,EAAA,MAAQ,WACRA,EAAA,MAAQ,WACRA,EAAA,QAAU,WAPPA,OAAA,IAUQC,EAAN,KAAa,CAIlB,YAAYC,EAAU,SAAU,CAHhC,KAAiB,cAAgBC,EAOjC,KAAQ,SAAW,KAHjB,KAAK,QAAUD,CACjB,CAIO,WAAWE,EAAe,CAC/B,KAAK,QAAUA,CACjB,CAEO,YAAYA,EAAe,CAChC,KAAK,SAAWA,CAClB,CAEQ,QAAQA,EAAYC,EAAY,CACtC,IAAMC,EAAgB,CAAC,EAEvB,KAAK,cAAc,IAAS,KAAK,EAAE,MAAM,QAASC,GAAUD,EAAM,KAAKP,EAAKQ,CAAK,CAAC,CAAC,EAEnF,IAAMC,EAAY,OAAOJ,EACrBE,EAAM,SAASD,CAAI,IACjBF,EAAc,IAAS,KAAK,EAAE,OAChC,QAAQ,IACmB,UAAiBL,EAAMO,CAAI,EACpD,kBACA,UAAiBI,EAAMJ,CAAI,EAC3B,KAAK,SAAW,IAAI,KAAK,QAAQ,IAAM,GACvC,UAAiBI,EAAMJ,CAAI,EAC3B,IAAIK,EAAY,OAAO,GACvB,UAAiBD,EAAMJ,CAAI,EAC3B,QAAQ,IAAI,SAAS,EACrB,UACA,UAAiBI,EAAMJ,CAAI,EAC3B,IACA,kBACA,GAAGM,EAAc,KAAK,IAAI,CAAC,CAAC,KAC5B,UACAF,EAAMJ,CAAI,EAAIL,EAAWK,CAAI,EAAI,UACjC,GAAGA,CAAI,WACP,kBACA,IAAI,KAAK,OAAO,WAChBI,EAAMJ,CAAI,EAAI,UACd,IAAIG,CAAS,WACbC,EAAMJ,CAAI,EACVG,IAAc,SAAWJ,EAAQ,GACjC,SACF,EACAI,IAAc,UAAW,QAAQ,IAAoBJ,EAAO;AAAA,CAAI,GAEhE,QAAQ,IACN,kBACA,KAAK,SAAW,IAAI,KAAK,QAAQ,IAAM,GACvC,QAAQ,IAAI,SAAS,EACrB,IACA,GAAGO,EAAc,KAAK,IAAI,CAAC,CAAC,KAC5B,GAAGN,CAAI,IACP,IAAI,KAAK,OAAO,IAChB,IAAIG,CAAS,IACbJ,CACF,EAGN,CAEO,IAAIA,EAAY,CACrB,KAAK,QAAQA,EAAO,KAAQ,CAC9B,CAEO,KAAKA,EAAY,CACtB,KAAK,QAAQA,EAAO,MAAS,CAC/B,CAEO,KAAKA,EAAY,CACtB,KAAK,QAAQA,EAAO,MAAS,CAC/B,CAEO,MAAMA,EAAY,CACvB,KAAK,QAAQA,EAAO,OAAU,CAChC,CAEO,QAAQA,EAAY,CACzB,KAAK,QAAQA,EAAO,SAAY,CAClC,CAEO,MAAMA,EAAY,CACvB,KAAK,QAAQA,EAAO,OAAU,CAChC,CAEO,KAAKA,EAAY,CACtB,KAAK,QAAQA,EAAO,MAAS,CAC/B,CACF,ECvJA,OAAOQ,MAAgB,KAEvB,GAAM,CAAE,KAAAC,CAAK,EAAID,EAEXE,EAAN,KAAe,CAAf,cACE,KAAQ,OAAS,IAAIC,EAAO,UAAU,EAEtC,KAAQ,UAAY,GAEpB,cAAcC,EAA0B,CACtC,GAAI,KAAK,UACP,OAAO,KAAK,KAEZ,KAAK,KAAO,IAAIH,EAAK,CACnB,iBAAAG,EACA,IAAK,CACH,mBAAoB,EACtB,CACF,CAAC,EAED,KAAK,KAAK,GAAG,QAAS,IAAM,CAC1B,KAAK,OAAO,MAAM,uBAAuB,EACzC,KAAK,UAAY,EACnB,CAAC,EAED,GAAI,CACF,KAAK,UAAY,EACnB,OAASC,EAAG,CACV,YAAK,UAAY,GACjB,KAAK,OAAO,MAAM,sCAAwCA,CAAC,EACpD,IACT,CAEA,OAAO,KAAK,IAEhB,CAEA,uBAAwB,CACtB,IAAMC,EAAMC,EAAc,IAAc,UAAU,EAAE,OAAO,SAAS,WAAW,IAE/E,OAAO,KAAK,cAAcD,CAAG,CAC/B,CACF,EAEaE,EAAiB,IAAIN,EClBlC,IAAMO,EAAN,KAAqB,CAArB,cACE,KAAQ,OAAS,IAAIC,EAAO,gBAAgB,EAC5C,KAAQ,wBAA0B,IAAI,IACtC,KAAQ,gBAAkB,IAAI,IAC9B,KAAQ,gBAAkB,IAAI,IAEvB,2BAA2BC,EAAuB,CACvD,OAAO,KAAK,wBAAwB,IAAIA,EAAS,YAAY,EACzD,KAAK,wBAAwB,IAAIA,EAAS,YAAY,EACtD,IACN,CAEO,2BAA2BA,EAAuBC,EAAsC,CAC7F,KAAK,wBAAwB,IAAID,EAAS,aAAcC,CAAuB,CACjF,CAEO,8BAA8BD,EAAuB,CAC1D,KAAK,wBAAwB,OAAOA,EAAS,YAAY,CAC3D,CAEO,mBAAmBA,EAAuBE,EAAwB,CACvE,IAAMC,EAAc,KAAK,gBAAgB,IAAIH,EAAS,YAAY,EAC9D,KAAK,gBAAgB,IAAIA,EAAS,YAAY,EAC9C,CAAC,EACL,KAAK,gBAAgB,IAAIA,EAAS,aAAc,CAAC,GAAGG,EAAa,GAAGD,CAAW,CAAC,CAClF,CAEO,mBAAmBF,EAAuBI,EAAwB,CACvE,IAAMD,EAAc,KAAK,gBAAgB,IAAIH,EAAS,YAAY,EAC9D,KAAK,gBAAgB,IAAIA,EAAS,YAAY,EAC9C,CAAC,EACL,KAAK,gBAAgB,IAAIA,EAAS,aAAcG,EAAY,OAAOC,CAAW,CAAC,CACjF,CAEO,sBAAsBJ,EAAuB,CAClD,KAAK,gBAAgB,OAAOA,EAAS,YAAY,CACnD,CAEO,sBAAsBA,EAAuB,CAClD,KAAK,gBAAgB,OAAOA,EAAS,YAAY,CACnD,CAEO,SAASA,EAAuB,CACrC,KAAK,8BAA8BA,CAAQ,EAC3C,KAAK,sBAAsBA,CAAQ,EACnC,KAAK,sBAAsBA,CAAQ,CACrC,CAEO,yBAAyBA,EAAuB,CACrD,OAAO,KAAK,gBAAgB,IAAIA,EAAS,YAAY,GAAG,QAAU,CACpE,CAEA,MAAa,sBAAsBA,EAAuBK,EAAuB,CAC/E,GAAI,CACF,GAAI,KAAK,yBAAyBL,CAAQ,EAAI,EAC5C,OAGF,IAAMM,EAAWC,EAAe,sBAAsB,EAElDC,EAAwB,EAEtBC,EAAW,KAAK,gBAAgB,IAAIT,EAAS,YAAY,GAAK,CAAC,EACrE,GAAIS,EAAS,SAAW,EACtB,MAAO,GAGT,IAAIC,EAA2B,KAAK,gBAAgBD,EAAU,GAAI,EAClE,KAAOC,EAAc,OAAS,GAAG,CAC/B,IAAMC,EAAW,wCAAwCN,EAAS,SAAS,sBAAsBA,EAAS,SAAS,WAE/GO,GAAW,MAAMN,EAAS,MAAMK,CAAQ,IAAI,KAAK,CAAC,GAAG,GAEzD,GAAI,CAACC,EAAS,CAEZ,IAAMC,EAAW,mGAAmGR,EAAS,SAAS,uBAAuBA,EAAS,SAAS,+BAE/KO,GAAW,MAAMN,EAAS,MAAMO,CAAQ,IAAI,KAAK,CAAC,GAAG,EACvD,CAGA,IAAIC,EAAY;AAAA,wFAEVC,EAAa,CAACV,EAAS,SAAS,EAEtC,QAAWW,KAAWN,EAAe,CACnC,IAAMO,EAAU,KAAK,oBAAoBD,EAAQ,SAAS,EAEpDE,EAAcD,EAAU,GAAGD,EAAQ,QAAQ,WAAaA,EAAQ,SACtED,EAAW,KAAKG,CAAW,EAC3B,IAAMC,EAAW,IAAIJ,EAAW,MAAM,GAElCK,EACCH,EAIHG,EAAkB,QAHlBL,EAAW,KAAK,IAAIC,EAAQ,UAAU,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE,EACrDI,EAAkB,IAAIL,EAAW,MAAM,IAIzCA,EAAW,KAAKC,EAAQ,SAAS,EACjC,IAAMK,EAAiB,IAAIN,EAAW,MAAM,GAE5CD,GAAa,IAAIK,CAAQ,KAAKC,CAAe,SAASC,CAAc,kBACtE,CACIP,EAAU,MAAM,EAAE,IAAM,MAC1BA,EAAYA,EAAU,MAAM,EAAG,EAAE,GAEnCA,GAAa;AAAA;AAAA;AAAA;AAAA,4CAMbN,IAA0B,MAAMF,EAAS,MAAMQ,EAAWC,CAAU,IAAI,UAAY,EAEpF,IAAMO,EAAU,qCAAqCjB,EAAS,SAAS,YAGnEkB,GADa,MAAMjB,EAAS,MAAMgB,CAAO,IAAI,KAAK,CAAC,GAClC,GAEfE,EAAS,oDAAoDnB,EAAS,SAAS,MAAMG,CAAqB,6EAA6EA,CAAqB,gBAElNe,GAAS,MAAMjB,EAAS,MAAMkB,CAAM,IAAI,KAAK,CAAC,GAAG,GAEjD,MAAMlB,EAAS,MAAMkB,CAAM,EAE3B,IAAIC,EAAiB,yFAErBf,EAAc,QAASM,GAAY,CACjC,IAAMU,EAAiB,gDAAgDV,EAAQ,SAAS,sBAAsBX,EAAS,SAAS,IAChIoB,GAAkB,YAAYC,CAAc,eAC9C,CAAC,EAEGD,EAAe,MAAM,EAAE,IAAM,MAC/BA,EAAiBA,EAAe,MAAM,EAAG,EAAE,GAG7C,MAAMnB,EAAS,MAAMmB,EAAgB,CAACF,EAAO,UAAW,QAAQ,CAAC,EAEjEb,EAAgB,KAAK,gBAAgBD,EAAU,GAAI,CACrD,CAEA,YAAK,sBAAsBT,CAAQ,EAE5BQ,CACT,OAASmB,EAAO,CACd,KAAK,OAAO,MAAM,qCAAqCA,EAAM,SAAS,CAAC,EAAE,CAC3E,CACF,CAEA,MAAa,qBAAqBC,EAAqBC,EAA+C,CACpG,GAAI,CACF,IAAMC,EAAuB,IAAI,IAEjC,GAAIF,EAAU,SAAW,EACvB,OAAOE,EAIT,IAAMC,EAAqBH,EAAU,IAAKI,GAAa,QAAQA,EAAS,QAAQ,QAAS,EAAE,CAAC,EAAE,EACxF1B,EAAWC,EAAe,sBAAsB,EAEhD0B,EAASJ,EAAiB,CAACE,EAAoBF,CAAc,EAAI,CAACE,CAAkB,EAEpFG,EAAQL,EACV,oFACA,2DAEEM,EAAS,MAAM7B,EAAS,MAAM4B,EAAOD,CAAM,EACjD,QAAWG,KAAOD,EAAO,KACvBL,EAAqB,IAAIM,EAAI,SAAS,EAGxC,OAAON,CACT,OAASH,EAAO,CACd,YAAK,OAAO,MAAM,kCAAkCA,EAAM,SAAS,CAAC,EAAE,EAC/D,IAAI,GACb,CACF,CAEA,MAAa,sBACX3B,EACAqC,EACAC,EACAjC,EACA,CACA,GAAI,CACF,IAAMC,EAAWC,EAAe,sBAAsB,EAEhDgC,EAAe,MAAM,KAAK,gBAAgBlC,CAAQ,EACxD,GAAI,CAACkC,EACH,MAAM,IAAI,MAAM,oCAAoC,EAGtD,IAAIC,EAAwB,EAExBC,EAAkB,KAAK,gBAAgB,IAAIzC,EAAS,YAAY,GAAK,CAAC,EAC1E,GAAIyC,EAAgB,SAAW,EAC7B,MAAO,GAITA,EAAgB,KAAK,CAACC,EAAGC,IAAM,CAC7B,IAAMC,EAAOF,EAAE,IAITG,EAAOF,EAAE,IAITG,EAAoBJ,EAAE,iBACtBK,EAAoBJ,EAAE,iBAE5B,OAAO,SAASC,EAAK,SAAS,EAAI,SAASC,EAAK,SAAS,GAAKC,EAAoBC,CACpF,CAAC,EAED,IAAMC,EAAiC,KAAK,+BAA+BP,CAAe,EAEpFQ,EAA4B,IAAI,IACtCD,EAA+B,QAAQ,CAACE,EAAqBC,IAAwB,CACnFF,EAA0B,IAAIE,EAAa,CACzC,MAAOD,EAAS,CAAC,GAAG,iBACpB,KAAMA,EAASA,EAAS,OAAS,CAAC,GAAG,gBACvC,CAAC,CACH,CAAC,EAED,IAAME,EAAoB,MAAM,KAAK,qBAAqBX,EAAgB,IAAKY,GAAiBA,EAAQ,IAAI,EAAE,CAAC,EAC/GZ,EAAkBA,EAAgB,OAAQY,GAAiB,CAACD,EAAkB,IAAIC,EAAQ,IAAI,EAAE,CAAC,EAEjG,IAAMC,EAAY,IACdC,EAA2B,KAAK,gBAAgBd,EAAiBa,CAAS,EAC9E,KAAOC,EAAc,OAAS,GAAG,CAE/B,IAAMC,EAAwB,KAAK,+BAA+BD,CAAa,EAE/E,GAAIC,EAAsB,KAAO,EAAG,CAClC,IAAMC,EAAc,MAAM,KAAK,8BAC7BpD,EACAiC,EACAW,EACAO,CACF,EAGIE,EAAe;AAAA;AAAA,gFAGbC,EAAgB,CAACtD,EAAS,UAAWiC,EAAM,EAAE,EAEnDkB,EAAsB,QAAQ,CAACN,EAAiBC,IAAwB,CACtE,IAAMS,EAAcH,EAAY,IAAIN,CAAW,EAE/CD,EAAS,QAASG,GAAY,CAK5B,GAJI,CAACA,EAAQ,SAIT,CAACO,GAAa,iBAAmB,CAACA,GAAa,WACjD,OAGF,IAAMC,EAAiB,KAAK,kBAAkBxB,EAAiBgB,CAAO,EACtE,GAAI,CAACQ,EACH,OAGFF,EAAc,KAAKE,CAAc,EACjC,IAAMC,EAAc,IAAIH,EAAc,MAAM,GAE5CA,EAAc,KAAKC,EAAY,eAAe,EAC9C,IAAMG,EAAqB,IAAIJ,EAAc,MAAM,GAEnDA,EAAc,KAAKN,EAAQ,IAAI,OAAS,IAAM,GAAG,EACjD,IAAMW,EAAkB,IAAIL,EAAc,MAAM,GAEhDA,EAAc,KAAKN,EAAQ,IAAI,OAASd,EAAa,UAAY,SAAS,EAC1E,IAAM0B,EAAiB,IAAIN,EAAc,MAAM,GAE/CA,EAAc,KAAKN,EAAQ,IAAI,OAASd,EAAa,QAAUqB,EAAY,UAAU,EACrF,IAAMM,EAAe,IAAIP,EAAc,MAAM,GAE7CA,EAAc,KAAK,QAAUN,EAAQ,IAAI,EAAE,EAC3C,IAAMc,EAAe,IAAIR,EAAc,MAAM,GAE7CA,EAAc,KAAKN,EAAQ,gBAA0B,EACrD,IAAMe,EAAuB,IAAIT,EAAc,MAAM,GAErDD,GAAgB,IAAII,CAAW,KAAKA,CAAW,aAAaC,CAAkB,KAAKC,CAAe;AAAA,oBAC5FC,CAAc,IAAIC,CAAY,IAAIC,CAAY,kBAAkBC,CAAoB,mBAAmBA,CAAoB,KACnI,CAAC,CACH,CAAC,EACGT,EAAc,OAAS,IACrBD,EAAa,MAAM,EAAE,IAAM,MAC7BA,EAAeA,EAAa,MAAM,EAAG,EAAE,GAEzClB,IAA0B,MAAMlC,EAAS,MAAMoD,EAAcC,CAAa,IAAI,UAAY,EAE9F,CACAJ,EAAgB,KAAK,gBAAgBd,EAAiBa,CAAS,CACjE,CAEA,KAAK,sBAAsBtD,CAAQ,EACnC,KAAK,8BAA8BA,CAAQ,EAE3C,IAAMqE,EAA4B,CAChC,GAAGhE,EACH,WAAY,MAAM,QAAQA,EAAS,UAAU,EAAIA,EAAS,WAAW,IAAKiE,GAAU,OAAOA,CAAK,CAAC,EAAI,CAAC,CACxG,EAEA,YAAK,sBAAsBtE,EAAUqE,CAAY,EAE1C7B,CACT,OAASb,EAAO,CACd,KAAK,OAAO,MAAM,qCAAqCA,EAAM,SAAS,CAAC,EAAE,EAEzE,KAAK,sBAAsB3B,CAAQ,EACnC,KAAK,8BAA8BA,CAAQ,CAC7C,CACF,CAEA,MAAa,8BACXK,EACAiC,EACAW,EACAO,EACmC,CACnC,IAAMlD,EAAWC,EAAe,sBAAsB,EAEhDgE,EAAa,CAAClE,EAAS,UAAWiC,EAAM,EAAE,EAmB1CkC,EAAkB;AAAA;AAAA;AAAA;AAAA,qBAlBA,MAAM,KAAKhB,EAAsB,KAAK,CAAC,EAC5D,IAAKL,GAAgB,CACpB,IAAMsB,EAAuBxB,EAA0B,IAAIE,CAAW,EAEtE,GAAIsB,EAAsB,CACxBF,EAAW,KAAKpB,CAAW,EAC3B,IAAIuB,EAAU,KAAKH,EAAW,MAAM,IAEpC,OAAAA,EAAW,KAAKE,EAAqB,KAAK,EAC1CC,GAAW,IAAIH,EAAW,MAAM,IAEhCA,EAAW,KAAKE,EAAqB,IAAI,EAClC,GAAGC,CAAO,IAAIH,EAAW,MAAM,GACxC,CACF,CAAC,EACA,KAAK,GAAG,CAOqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iEAwD1BI,EAAkB,MAAMrE,EAAS,MAAMkE,EAAiBD,CAAU,EAExE,OAAO,IAAI,IAAII,EAAgB,KAAK,IAAKC,GAAsB,CAACA,EAAK,aAAcA,CAAI,CAAC,CAAC,CAC3F,CAEA,MAAa,gBAAgBvE,EAAgD,CAC3E,GAAI,CAOF,OAAQ,MANSE,EAAe,sBAAsB,EAM/B,MAJP;AAAA;AAAA,yCAIsB,CAACF,EAAS,KAAK,CAAC,IAAI,KAAK,CAAC,GAAK,EACvE,OAASsB,EAAO,CACd,KAAK,OAAO,MAAM,6BAA6BA,EAAM,SAAS,CAAC,EAAE,CACnE,CACF,CAEO,+BAA+BuB,EAA6C,CACjF,OAAOA,EAAS,OAAO,CAAC2B,EAA6BxB,IAAqB,CACxE,IAAMyB,EAAMzB,GAAS,IAGrB,GAAI,CAAC,KAAK,oBAAoByB,GAAK,SAAS,EAAG,CAC7C,IAAM3B,EAAc2B,GAAK,WAAW,MAAM,GAAG,EAAE,CAAC,EAChD,GAAI3B,EAAa,CACf,IAAM4B,EAAkB,IAAI5B,CAAW,GACjCD,EAAW2B,EAAI,IAAIE,CAAe,EAAIF,EAAI,IAAIE,CAAe,EAAI,CAAC,EACxE7B,EAAS,KAAKG,CAAO,EACrBwB,EAAI,IAAIE,EAAiB7B,CAAQ,CACnC,CACF,CAEA,OAAO2B,CACT,EAAG,IAAI,GAAK,CACd,CAEA,MAAa,sCACXvC,EACAjC,EACA2E,EAAQ,GAC6D,CACrE,GAAI,CAWF,OAAQ,MAVSzE,EAAe,sBAAsB,EAU/B,MARX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAQsB,CAACF,EAAS,UAAWiC,EAAM,GAAI0C,CAAK,CAAC,IAAI,IAC7E,OAASrD,EAAO,CACd,KAAK,OAAO,MAAM,sCAAsCA,EAAM,SAAS,CAAC,EAAE,CAC5E,CACF,CAEO,kBAAkBU,EAAkC4C,EAAsB,CAC/E,IAAMpB,EAAiBxB,EAAgB,uBAAuB4C,EAAI,OAAO,EACzE,GAAIpB,EACF,OAAOA,EAGT,GAAI,CAACqB,EAAc,IAAc,UAAU,EAAE,OAAO,0BAClD,MAAO,GAGT,IAAMC,EAAQ,CACZ,gBAAiBF,EAAI,QAAQ,gBAC7B,2BAA4BA,EAAI,QAAQ,4BAA4B,SAAS,gBAC7E,aAAcA,EAAI,QAAQ,aAC1B,aAAcA,EAAI,QAAQ,aAC1B,aAAcA,EAAI,QAAQ,aAC1B,eAAgBA,EAAI,QAAQ,eAC5B,gBAAiBA,EAAI,QAAQ,iBAAiB,kBAAkB,mBAClE,EAGA,OADgB,OAAO,KAAKE,CAAK,EAAE,KAAML,GAAQK,EAAML,CAAG,IAAM,QAAaK,EAAML,CAAG,IAAM,IAAI,EAC/E,CACf,IAAK,kBAAmB,CACtB,IAAMM,EAAMH,EAAI,QAAQ,gBAClBI,EAAWD,GAAK,UAAY,WAC5BE,EAAUF,GAAK,QAAU,IAAIA,EAAI,OAAO,GAAK,GACnD,MAAO,WAAWC,CAAQ,GAAGC,CAAO,IACtC,CAEA,IAAK,6BAA8B,CACjC,IAAMF,EAAMH,EAAI,QAAQ,4BAA4B,SAAS,gBACvDI,EAAWD,GAAK,UAAY,WAC5BE,EAAUF,GAAK,QAAU,IAAIA,EAAI,OAAO,GAAK,GACnD,MAAO,WAAWC,CAAQ,GAAGC,CAAO,IACtC,CAEA,IAAK,kBAAmB,CACtB,IAAMC,EAAWN,EAAI,QAAQ,iBAAiB,iBAC9C,OACGM,GAAU,kBAAoB,IAAIA,EAAS,iBAAiB;AAAA,EAAQ,KACpEA,GAAU,qBAAuB,GAEtC,CAEA,IAAK,eACH,MAAO,oBAET,IAAK,eACH,MAAO,oBAET,IAAK,eACH,MAAO,oBAET,IAAK,iBACH,MAAO,sBAET,QACE,MAAO,EACX,CACF,CAEO,gBAAgBC,EAAYC,EAAmB,CACpD,OAAOD,EAAI,OAAO,EAAGC,CAAS,CAChC,CAEO,QAAQC,EAAmB,CAChC,OAAOA,EAAU,SAAS,OAAO,CACnC,CAEO,oBAAoBA,EAAmB,CAC5C,OAAO,KAAK,QAAQA,CAAS,GAAKA,IAAc,oBAAsBA,IAAc,kBACtF,CAEO,sBAAsBC,EAA4B3D,EAAkB,CAKzE,OAJiBzB,EAAe,sBAAsB,EAItC,MAFJ,wGAEe,CAAC,QAAQyB,CAAQ,GAAI2D,CAAS,CAAC,CAC5D,CACF,EAEaC,GAAiB,IAAI9F","names":["isBooleanString","dotenv","ConfigService","key","configService","dayjs","fs","packageJson","fs","formatDateLog","timestamp","dayjs","Color","Level","Type","Background","Logger","context","configService","value","type","types","level","typeValue","Color","packageJson","formatDateLog","postgresql","Pool","Postgres","Logger","connectionString","e","uri","configService","postgresClient","ChatwootImport","Logger","instance","repositoryMessagesCache","messagesRaw","actualValue","contactsRaw","provider","pgClient","postgresClient","totalContactsImported","contacts","contactsChunk","labelSql","labelId","sqlLabel","sqlInsert","bindInsert","contact","isGroup","contactName","bindName","bindPhoneNumber","bindIdentifier","sqlTags","tagId","sqlTag","sqlInsertLabel","bindTaggableId","error","sourceIds","conversationId","existingSourceIdsSet","formattedSourceIds","sourceId","params","query","result","row","chatwootService","inbox","chatwootUser","totalMessagesImported","messagesOrdered","a","b","aKey","bKey","aMessageTimestamp","bMessageTimestamp","allMessagesMappedByPhoneNumber","phoneNumbersWithTimestamp","messages","phoneNumber","existingSourceIds","message","batchSize","messagesChunk","messagesByPhoneNumber","fksByNumber","sqlInsertMsg","bindInsertMsg","fksChatwoot","contentMessage","bindContent","bindConversationId","bindMessageType","bindSenderType","bindSenderId","bindSourceId","bindmessageTimestamp","providerData","event","bindValues","sqlFromChatwoot","phoneNumberTimestamp","bindStr","fksFromChatwoot","item","acc","key","phoneNumberPlus","limit","msg","configService","types","doc","fileName","caption","template","arr","chunkSize","remoteJid","messageId","chatwootImport"]}