@mastra/clickhouse 1.7.0 → 1.7.1-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/storage/db/utils.ts","../src/storage/db/index.ts","../src/storage/domains/background-tasks/index.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/observability/index.ts","../src/storage/domains/observability/v-next/ddl.ts","../src/storage/domains/observability/v-next/helpers.ts","../src/storage/domains/observability/v-next/discovery.ts","../src/storage/domains/observability/v-next/filters.ts","../src/storage/domains/observability/v-next/feedback.ts","../src/storage/domains/observability/v-next/logs.ts","../src/storage/domains/observability/v-next/metrics.ts","../src/storage/domains/observability/v-next/migration.ts","../src/storage/domains/observability/v-next/scores.ts","../src/storage/domains/observability/v-next/trace-roots.ts","../src/storage/domains/observability/v-next/tracing.ts","../src/storage/domains/observability/v-next/index.ts","../src/storage/domains/scores/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/index.ts"],"names":["TABLE_MESSAGES","TABLE_WORKFLOW_SNAPSHOT","TABLE_TRACES","TABLE_THREADS","TABLE_SCORERS","TABLE_RESOURCES","TABLE_SPANS","TABLE_AGENT_VERSIONS","TABLE_DATASETS","TABLE_DATASET_ITEMS","TABLE_DATASET_VERSIONS","TABLE_EXPERIMENTS","TABLE_EXPERIMENT_RESULTS","TABLE_PROMPT_BLOCKS","TABLE_PROMPT_BLOCK_VERSIONS","TABLE_SCORER_DEFINITIONS","TABLE_SCORER_DEFINITION_VERSIONS","TABLE_MCP_CLIENTS","TABLE_MCP_CLIENT_VERSIONS","TABLE_MCP_SERVERS","TABLE_MCP_SERVER_VERSIONS","TABLE_WORKSPACES","TABLE_WORKSPACE_VERSIONS","TABLE_SKILLS","TABLE_SKILL_VERSIONS","TABLE_SKILL_BLOBS","TABLE_SCHEDULES","TABLE_SCHEDULE_TRIGGERS","safelyParseJSON","client","createClient","MastraBase","error","MastraError","createStorageErrorId","ErrorDomain","ErrorCategory","getSqlType","getDefaultValue","TABLE_SCHEMAS","parseJson","BackgroundTasksStorage","TABLE_BACKGROUND_TASKS","MemoryStorage","MessageList","normalizePerPage","calculatePagination","list","ObservabilityStorage","SPAN_SCHEMA","listTracesArgsSchema","TraceStatus","engine","finalClause","toTraceSpans","EntityType","parseFieldKey","queryJson","listFeedbackArgsSchema","sql","rows","listLogsArgsSchema","GROUP_BY_EXCLUDED","METRIC_DISTINCT_COLUMNS","getAggregationSql","getIntervalSql","mergeFilters","toWhereClause","listMetricsArgsSchema","entry","toSeriesName","listScoresArgsSchema","BRANCH_SPAN_TYPES","listBranchesArgsSchema","ScoresStorage","coreTransformScoreRow","saveScorePayloadSchema","SCORERS_SCHEMA","WorkflowsStorage","toDate","MastraCompositeStore"],"mappings":";;;;;;;;;;;AAiCO,IAAM,aAAA,GAA6C;AAAA,EACxD,CAACA,sBAAc,GAAG,CAAA,WAAA,CAAA;AAAA,EAClB,CAACC,+BAAuB,GAAG,CAAA,oBAAA,CAAA;AAAA,EAC3B,CAACC,oBAAY,GAAG,CAAA,WAAA,CAAA;AAAA,EAChB,CAACC,qBAAa,GAAG,CAAA,oBAAA,CAAA;AAAA,EACjB,CAACC,qBAAa,GAAG,CAAA,WAAA,CAAA;AAAA,EACjB,CAACC,uBAAe,GAAG,CAAA,oBAAA,CAAA;AAAA;AAAA;AAAA;AAAA,EAInB,CAACC,mBAAW,GAAG,CAAA,6BAAA,CAAA;AAAA,EACf,aAAA,EAAe,CAAA,oBAAA,CAAA;AAAA,EACf,CAACC,4BAAoB,GAAG,CAAA,WAAA,CAAA;AAAA,EACxB,CAACC,sBAAc,GAAG,CAAA,oBAAA,CAAA;AAAA,EAClB,CAACC,2BAAmB,GAAG,CAAA,oBAAA,CAAA;AAAA,EACvB,CAACC,8BAAsB,GAAG,CAAA,WAAA,CAAA;AAAA,EAC1B,CAACC,yBAAiB,GAAG,CAAA,oBAAA,CAAA;AAAA,EACrB,CAACC,gCAAwB,GAAG,CAAA,WAAA,CAAA;AAAA,EAC5B,CAACC,2BAAmB,GAAG,CAAA,oBAAA,CAAA;AAAA,EACvB,CAACC,mCAA2B,GAAG,CAAA,WAAA,CAAA;AAAA,EAC/B,CAACC,gCAAwB,GAAG,CAAA,oBAAA,CAAA;AAAA,EAC5B,CAACC,wCAAgC,GAAG,CAAA,WAAA,CAAA;AAAA,EACpC,CAACC,yBAAiB,GAAG,CAAA,oBAAA,CAAA;AAAA,EACrB,CAACC,iCAAyB,GAAG,CAAA,WAAA,CAAA;AAAA,EAC7B,CAACC,yBAAiB,GAAG,CAAA,oBAAA,CAAA;AAAA,EACrB,CAACC,iCAAyB,GAAG,CAAA,WAAA,CAAA;AAAA,EAC7B,CAACC,wBAAgB,GAAG,CAAA,oBAAA,CAAA;AAAA,EACpB,CAACC,gCAAwB,GAAG,CAAA,WAAA,CAAA;AAAA,EAC5B,CAACC,oBAAY,GAAG,CAAA,oBAAA,CAAA;AAAA,EAChB,CAACC,4BAAoB,GAAG,CAAA,WAAA,CAAA;AAAA,EACxB,CAACC,yBAAiB,GAAG,CAAA,oBAAA,CAAA;AAAA,EACrB,uBAAA,EAAyB,CAAA,oBAAA,CAAA;AAAA,EACzB,CAACC,uBAAe,GAAG,CAAA,oBAAA,CAAA;AAAA,EACnB,CAACC,+BAAuB,GAAG,CAAA,WAAA,CAAA;AAAA,EAC3B,4BAAA,EAA8B,CAAA,oBAAA,CAAA;AAAA,EAC9B,qBAAA,EAAuB,CAAA,oBAAA;AACzB;AAEO,IAAM,YAAA,GAAsD;AAAA,EACjE,IAAA,EAAM,QAAA;AAAA,EACN,SAAA,EAAW,eAAA;AAAA,EACX,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,QAAA;AAAA,EACP,OAAA,EAAS,OAAA;AAAA,EACT,KAAA,EAAO,SAAA;AAAA,EACP,MAAA,EAAQ,OAAA;AAAA,EACR,OAAA,EAAS;AACX;AAkCA,IAAM,WAAA,GAAc,CAAC,SAAA,EAAW,YAAA,EAAc,YAAY,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA;AAGtG,IAAM,sBAAA,GAAyB,CAAC,cAAA,EAAgB,OAAO,CAAA;AAEhD,SAAS,aAAgB,GAAA,EAAa;AAC3C,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAI,SAAA,EAAW;AACjB,IAAA,GAAA,CAAI,SAAA,GAAY,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AAAA,EACxC;AACA,EAAA,IAAI,IAAI,SAAA,EAAW;AACjB,IAAA,GAAA,CAAI,SAAA,GAAY,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AAAA,EACxC;AACA,EAAA,IAAI,IAAI,SAAA,EAAW;AACjB,IAAA,GAAA,CAAI,SAAA,GAAY,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AAAA,EACxC;AACA,EAAA,IAAI,IAAI,OAAA,EAAS;AACf,IAAA,GAAA,CAAI,OAAA,GAAU,IAAI,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA;AAAA,EACpC;AAGA,EAAA,KAAA,MAAW,SAAS,WAAA,EAAa;AAC/B,IAAA,IAAI,IAAI,KAAK,CAAA,IAAK,OAAO,GAAA,CAAI,KAAK,MAAM,QAAA,EAAU;AAChD,MAAA,GAAA,CAAI,KAAK,CAAA,GAAIC,uBAAA,CAAgB,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,IACzC;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,SAAS,sBAAA,EAAwB;AAC1C,IAAA,IAAI,GAAA,CAAI,KAAK,CAAA,KAAM,EAAA,EAAI;AACrB,MAAA,GAAA,CAAI,KAAK,CAAA,GAAI,IAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,cAAiB,IAAA,EAAkB;AACjD,EAAA,OAAO,KAAK,GAAA,CAAI,CAAC,GAAA,KAAa,YAAA,CAAgB,GAAG,CAAC,CAAA;AACpD;;;AC9GO,SAAS,wBAAwB,MAAA,EAGtC;AAEA,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,GAAA,EAAK,OAAO,GAAA,EAAI;AAAA,EAClD;AAGA,EAAA,MAAMC,WAASC,mBAAA,CAAa;AAAA,IAC1B,KAAK,MAAA,CAAO,GAAA;AAAA,IACZ,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,mBAAA,EAAqB;AAAA,MACnB,sBAAA,EAAwB,aAAA;AAAA,MACxB,uBAAA,EAAyB,KAAA;AAAA,MACzB,oBAAA,EAAsB,CAAA;AAAA,MACtB,uCAAA,EAAyC;AAAA;AAC3C,GACD,CAAA;AAED,EAAA,OAAO,UAAED,QAAA,EAAQ,GAAA,EAAK,MAAA,CAAO,GAAA,EAAI;AACnC;AAEO,IAAM,YAAA,GAAN,cAA2BE,eAAA,CAAW;AAAA,EACjC,GAAA;AAAA,EACA,MAAA;AAAA;AAAA,EAGF,iBAAA,uBAAwB,GAAA,EAAkC;AAAA,EAElE,WAAA,CAAY,EAAE,MAAA,EAAQ,GAAA,EAAI,EAA+D;AACvF,IAAA,KAAA,CAAM;AAAA,MACJ,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,gBAAgB,SAAA,EAA8C;AAC1E,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,SAAS,CAAA;AACnD,IAAA,IAAI,QAAQ,OAAO,MAAA;AAGnB,IAAA,MAAM,WAAW,YAAY;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,UACrC,KAAA,EAAO,kBAAkB,SAAS,CAAA,CAAA;AAAA,UAClC,MAAA,EAAQ;AAAA,SACT,CAAA;AACD,QAAA,MAAM,IAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAK;AAChC,QAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAC,CAAA;AAC7C,QAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,UAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,SAAS,CAAA;AAAA,QACzC;AACA,QAAA,OAAO,OAAA;AAAA,MACT,CAAA,CAAA,MAAQ;AAEN,QAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,SAAS,CAAA;AACvC,QAAA,2BAAW,GAAA,EAAY;AAAA,MACzB;AAAA,IACF,CAAA,GAAG;AACH,IAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA;AAE7C,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,0BAAA,CACZ,SAAA,EACA,MAAA,EAC8B;AAC9B,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA;AACzD,IAAA,IAAI,YAAA,CAAa,IAAA,KAAS,CAAA,EAAG,OAAO,MAAA;AAEpC,IAAA,MAAM,WAAgC,EAAC;AACvC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,MAAA,IAAI,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,EAAG;AACzB,QAAA,QAAA,CAAS,GAAG,CAAA,GAAI,KAAA;AAAA,MAClB;AAAA,IACF;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAM,SAAA,CAAU,KAAA,EAAe,MAAA,EAAkC;AAC/D,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,MACrC,KAAA,EAAO,kBAAkB,KAAK,CAAA,CAAA;AAAA,MAC9B,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,MAAM,OAAA,GAAW,MAAM,MAAA,CAAO,IAAA,EAAK;AACnC,IAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,MAAM,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,SAAA,EAAqC;AACrD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QACrC,KAAA,EAAO,gBAAgB,SAAS,CAAA,CAAA;AAAA,QAChC,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,MAAM,IAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAK;AAChC,MAAA,OAAO,IAAA,CAAK,CAAC,CAAA,EAAG,MAAA,KAAW,CAAA;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,mBAAmB,SAAA,EAA2C;AAClE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QACrC,KAAA,EAAO,CAAA,sGAAA,CAAA;AAAA,QACP,YAAA,EAAc,EAAE,SAAA,EAAU;AAAA,QAC1B,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,MAAM,IAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAK;AAChC,MAAA,OAAO,IAAA,CAAK,CAAC,CAAA,EAAG,WAAA,IAAe,IAAA;AAAA,IACjC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,0BAA0B,SAAA,EAG7B;AAED,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA;AAC/C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,EAAE,cAAA,EAAgB,KAAA,EAAO,iBAAA,EAAmB,IAAA,EAAK;AAAA,IAC1D;AAGA,IAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,CAAK,kBAAA,CAAmB,SAAS,CAAA;AACjE,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,MAAA,OAAO,EAAE,cAAA,EAAgB,KAAA,EAAO,iBAAA,EAAmB,IAAA,EAAK;AAAA,IAC1D;AAGA,IAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,WAAA,EAAY,CAAE,WAAW,WAAW,CAAA;AAC7E,IAAA,OAAO,EAAE,gBAAgB,iBAAA,EAAkB;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,uBAAuB,SAAA,EAG1B;AACD,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QACrC,KAAA,EAAO;AAAA;AAAA;AAAA;AAAA,iBAAA,EAII,SAAS;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAAA,QAKpB,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,MAAM,IAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAK;AAChC,MAAA,MAAM,iBAAiB,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,eAAA,IAAmB,KAAK,EAAE,CAAA;AACnE,MAAA,OAAO;AAAA,QACL,eAAe,cAAA,GAAiB,CAAA;AAAA,QAChC;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,GAAQ,CAAA,gCAAA,EAAmC,KAAK,CAAA,CAAE,CAAA;AAC/D,MAAA,OAAO,EAAE,aAAA,EAAe,KAAA,EAAO,cAAA,EAAgB,CAAA,EAAE;AAAA,IACnD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,MAAM,2BAAA,CAA4B;AAAA,IAChC,SAAA;AAAA,IACA;AAAA,GACF,EAGqB;AAEnB,IAAA,IAAI,cAAczB,mBAAAA,EAAa;AAC7B,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA;AAC/C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,CAAK,kBAAA,CAAmB,SAAS,CAAA;AACjE,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,MAAA,OAAO,KAAA;AAAA,IACT;AAKA,IAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,WAAA,EAAY,CAAE,WAAW,WAAW,CAAA;AAC7E,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,GAAQ,CAAA,6CAAA,EAAgD,iBAAiB,CAAA,CAAE,CAAA;AACxF,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,MAAA,EAAQ,IAAA,GAAO,CAAA,wCAAA,EAA2C,iBAAiB,CAAA,wBAAA,CAA0B,CAAA;AAE1G,IAAA,MAAM,kBAAkB,CAAA,EAAG,SAAS,CAAA,QAAA,EAAW,IAAA,CAAK,KAAK,CAAA,CAAA;AACzD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,GAAM,SAAS,CAAA,EAAG,GAAA;AAEtC,IAAA,IAAI;AAEF,MAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,QACxB,KAAA,EAAO,CAAA,aAAA,EAAgB,SAAS,CAAA,IAAA,EAAO,eAAe,CAAA;AAAA,OACvD,CAAA;AAGD,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAClC,IAAI,CAAC,CAAC,IAAA,EAAM,GAAG,CAAA,KAAM;AACpB,QAAA,IAAI,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AACtC,QAAA,IAAI,UAAA,GAAa,IAAI,QAAA,KAAa,IAAA;AAIlC,QAAA,IAAI,SAAA,KAAcA,mBAAAA,IAAe,IAAA,KAAS,WAAA,EAAa;AACrD,UAAA,UAAA,GAAa,KAAA;AAAA,QACf;AAEA,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,OAAA,GAAU,YAAY,OAAO,CAAA,CAAA,CAAA;AAAA,QAC/B;AACA,QAAA,MAAM,cAAc,EAAC;AACrB,QAAA,IAAI,IAAA,KAAS,eAAe,GAAA,CAAI,IAAA,KAAS,UAAU,GAAA,CAAI,IAAA,KAAS,YAAY,UAAA,EAAY;AACtF,UAAA,WAAA,CAAY,KAAK,cAAc,CAAA;AAAA,QACjC;AACA,QAAA,MAAM,YAAY,IAAA,CAAK,GAAA,GAAM,SAAS,CAAA,EAAG,UAAU,IAAI,CAAA;AACvD,QAAA,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,EAAK,OAAO,IAAI,WAAA,CAAY,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,EAAI,SAAA,GAAY,kBAAkB,SAAA,CAAU,MAAA,IAAU,WAAW,CAAA,aAAA,EAAgB,SAAA,CAAU,QAAQ,CAAA,CAAA,EAAI,SAAA,CAAU,IAAI,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAAA,MAClL,CAAC,CAAA,CACA,IAAA,CAAK,KAAK,CAAA;AAEb,MAAA,MAAM,SAAA,GAAY;AAAA,qBAAA,EACD,SAAS,CAAA;AAAA,UAAA,EACpB,OAAO;AAAA;AAAA,iBAAA,EAEA,aAAA,CAAc,SAAS,CAAA,IAAK,aAAa;AAAA;AAAA;AAAA,QAAA,EAGlD,MAAA,GAAS,CAAA,eAAA,EAAkB,MAAA,CAAO,MAAA,IAAU,WAAW,CAAA,aAAA,EAAgB,MAAA,CAAO,QAAQ,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,CAAA,CAAA,GAAK,EAAE;AAAA;AAAA,MAAA,CAAA;AAIhH,MAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,QACxB,KAAA,EAAO;AAAA,OACR,CAAA;AAID,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QAC7C,KAAA,EAAO,kBAAkB,eAAe,CAAA,CAAA;AAAA,QACxC,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,MAAM,aAAA,GAAiB,MAAM,cAAA,CAAe,IAAA,EAAK;AACjD,MAAA,MAAM,iBAAA,GAAoB,IAAI,GAAA,CAAI,aAAA,CAAc,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAC,CAAA;AAGhE,MAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,OAAO,CAAA,GAAA,KAAO,iBAAA,CAAkB,GAAA,CAAI,GAAG,CAAC,CAAA;AACpF,MAAA,MAAM,UAAA,GAAa,gBAAgB,GAAA,CAAI,CAAA,CAAA,KAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAI/D,MAAA,MAAM,iBAAA,GAAoB,eAAA,CACvB,GAAA,CAAI,CAAA,CAAA,KAAM,CAAA,KAAM,WAAA,GAAc,CAAA,iDAAA,CAAA,GAAsD,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAI,CAAA,CAC7F,IAAA,CAAK,IAAI,CAAA;AAOZ,MAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,QACxB,KAAA,EAAO,CAAA,YAAA,EAAe,SAAS,CAAA,EAAA,EAAK,UAAU,CAAA;AAAA,uBAAA,EAC7B,iBAAiB;AAAA,qBAAA,EACnB,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA,0CAAA;AAAA,OAM/B,CAAA;AAGD,MAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,QACxB,KAAA,EAAO,cAAc,eAAe,CAAA;AAAA,OACrC,CAAA;AAED,MAAA,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA,oDAAA,CAAsD,CAAA;AAC1E,MAAA,OAAO,IAAA;AAAA,IACT,SAAS0B,OAAA,EAAY;AAEnB,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,GAAQ,CAAA,kBAAA,EAAqBA,OAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAEzD,MAAA,IAAI;AAEF,QAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA;AACvD,QAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,WAAA,CAAY,eAAe,CAAA;AAE3D,QAAA,IAAI,CAAC,kBAAkB,YAAA,EAAc;AAEnC,UAAA,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA,iCAAA,CAAmC,CAAA;AACvD,UAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,YACxB,KAAA,EAAO,CAAA,aAAA,EAAgB,eAAe,CAAA,IAAA,EAAO,SAAS,CAAA;AAAA,WACvD,CAAA;AAAA,QACH,CAAA,MAAA,IAAW,kBAAkB,YAAA,EAAc;AAEzC,UAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,YACxB,KAAA,EAAO,wBAAwB,eAAe,CAAA;AAAA,WAC/C,CAAA;AAAA,QACH;AAAA,MACF,SAAS,YAAA,EAAc;AACrB,QAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,GAAQ,CAAA,+BAAA,EAAkC,YAAY,CAAA,CAAE,CAAA;AAAA,MACvE;AAEA,MAAA,MAAM,IAAIC,iBAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAA,CAAqB,YAAA,EAAc,2BAAA,EAA6B,QAAQ,CAAA;AAAA,UAC5E,QAAQC,iBAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,SAAA,EAAW,iBAAA;AAAkB,SAC1C;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEU,WAAW,IAAA,EAAqC;AACxD,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,MAAA;AAAA,MACL,KAAK,MAAA;AAAA,MACL,KAAK,OAAA;AACH,QAAA,OAAO,QAAA;AAAA,MACT,KAAK,WAAA;AACH,QAAA,OAAO,eAAA;AAAA,MACT,KAAK,SAAA;AAAA,MACL,KAAK,QAAA;AACH,QAAA,OAAO,OAAA;AAAA,MACT,KAAK,OAAA;AACH,QAAA,OAAO,SAAA;AAAA,MACT,KAAK,SAAA;AACH,QAAA,OAAO,MAAA;AAAA,MACT;AACE,QAAA,OAAOK,mBAAW,IAAI,CAAA;AAAA;AAC1B,EACF;AAAA,EAEA,MAAM,WAAA,CAAY;AAAA,IAChB,SAAA;AAAA,IACA;AAAA,GACF,EAGkB;AAChB,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAClC,IAAI,CAAC,CAAC,IAAA,EAAM,GAAG,CAAA,KAAM;AACpB,QAAA,IAAI,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AAEtC,QAAA,IAAI,UAAA,GAAa,IAAI,QAAA,KAAa,IAAA;AAKlC,QAAA,IAAI,SAAA,KAAc/B,mBAAAA,IAAe,IAAA,KAAS,WAAA,EAAa;AACrD,UAAA,UAAA,GAAa,KAAA;AAAA,QACf;AAGA,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,OAAA,GAAU,YAAY,OAAO,CAAA,CAAA,CAAA;AAAA,QAC/B;AACA,QAAA,MAAM,cAAc,EAAC;AAIrB,QAAA,IAAI,IAAA,KAAS,eAAe,GAAA,CAAI,IAAA,KAAS,UAAU,GAAA,CAAI,IAAA,KAAS,YAAY,UAAA,EAAY;AACtF,UAAA,WAAA,CAAY,KAAK,cAAc,CAAA;AAAA,QACjC;AACA,QAAA,MAAM,YAAY,IAAA,CAAK,GAAA,GAAM,SAAS,CAAA,EAAG,UAAU,IAAI,CAAA;AACvD,QAAA,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,EAAK,OAAO,IAAI,WAAA,CAAY,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,EAAI,SAAA,GAAY,kBAAkB,SAAA,CAAU,MAAA,IAAU,WAAW,CAAA,aAAA,EAAgB,SAAA,CAAU,QAAQ,CAAA,CAAA,EAAI,SAAA,CAAU,IAAI,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAAA,MAClL,CAAC,CAAA,CACA,IAAA,CAAK,KAAK,CAAA;AAEb,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,GAAM,SAAS,CAAA,EAAG,GAAA;AACtC,MAAA,IAAI,GAAA;AAEJ,MAAA,IAAI,cAAcL,+BAAAA,EAAyB;AACzC,QAAA,GAAA,GAAM;AAAA,uCAAA,EAC2B,SAAS,CAAA;AAAA,cAAA,EAClC,CAAC,WAAW,CAAA,CAAE,MAAA,CAAO,OAAO,CAAC;AAAA;AAAA,qBAAA,EAEtB,aAAA,CAAc,SAAS,CAAA,IAAK,aAAa;AAAA;AAAA;AAAA,YAAA,EAGlD,MAAA,GAAS,CAAA,eAAA,EAAkB,MAAA,CAAO,MAAA,IAAU,WAAW,CAAA,aAAA,EAAgB,MAAA,CAAO,QAAQ,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,CAAA,CAAA,GAAK,EAAE;AAAA;AAAA,cAAA,CAAA;AAAA,MAGpH,CAAA,MAAA,IAAW,cAAcK,mBAAAA,EAAa;AAKpC,QAAA,GAAA,GAAM;AAAA,uCAAA,EAC2B,SAAS,CAAA;AAAA,cAAA,EAClC,OAAO;AAAA;AAAA,qBAAA,EAEA,aAAA,CAAc,SAAS,CAAA,IAAK,aAAa;AAAA;AAAA;AAAA,YAAA,EAGlD,MAAA,GAAS,CAAA,eAAA,EAAkB,MAAA,CAAO,MAAA,IAAU,WAAW,CAAA,aAAA,EAAgB,MAAA,CAAO,QAAQ,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,CAAA,CAAA,GAAK,EAAE;AAAA;AAAA,UAAA,CAAA;AAAA,MAGpH,CAAA,MAAO;AACL,QAAA,GAAA,GAAM;AAAA,uCAAA,EAC2B,SAAS,CAAA;AAAA,cAAA,EAClC,OAAO;AAAA;AAAA,qBAAA,EAEA,aAAA,CAAc,SAAS,CAAA,IAAK,aAAa;AAAA,oCAAA,EAC1B,IAAI,CAAA;AAAA,iCAAA,EACP,IAAI,CAAA;AAAA,YAAA,EACzB,IAAA,CAAK,MAAM,SAAS,CAAA,EAAG,MAAM,CAAA,qCAAA,EAAwC,IAAA,CAAK,IAAI,SAAS,CAAA,CAAE,IAAI,QAAQ,CAAA,CAAA,EAAI,KAAK,GAAA,CAAI,SAAS,EAAE,GAAA,CAAI,IAAI,KAAK,EAAE;AAAA;AAAA,UAAA,CAAA;AAAA,MAGpJ;AAEA,MAAA,MAAM,IAAA,CAAK,OAAO,KAAA,CAAM;AAAA,QACtB,KAAA,EAAO,GAAA;AAAA,QACP,mBAAA,EAAqB;AAAA;AAAA,UAEnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,uBAAA,EAAyB,KAAA;AAAA,UACzB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAAA,IACH,SAAS0B,OAAA,EAAY;AACnB,MAAA,MAAM,IAAIC,iBAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAA,CAAqB,YAAA,EAAc,cAAA,EAAgB,QAAQ,CAAA;AAAA,UAC/D,QAAQC,iBAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,SAAA;AAAU,SACvB;AAAA,QACAJ;AAAA,OACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,SAAS,CAAA;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,CAAW;AAAA,IACf,SAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF,EAIkB;AAChB,IAAA,IAAI;AAEF,MAAA,MAAM,WAAA,GAAc,kBAAkB,SAAS,CAAA,CAAA;AAC/C,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QACrC,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,EAAK;AAC/B,MAAA,MAAM,mBAAA,GAAsB,IAAI,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAa,GAAA,CAAI,IAAA,CAAK,WAAA,EAAa,CAAC,CAAA;AAGvF,MAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,QAAA,IAAI,CAAC,oBAAoB,GAAA,CAAI,UAAA,CAAW,aAAa,CAAA,IAAK,MAAA,CAAO,UAAU,CAAA,EAAG;AAC5E,UAAA,MAAM,SAAA,GAAY,OAAO,UAAU,CAAA;AACnC,UAAA,IAAI,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,IAAI,CAAA;AAC5C,UAAA,IAAI,SAAA,CAAU,aAAa,KAAA,EAAO;AAChC,YAAA,OAAA,GAAU,YAAY,OAAO,CAAA,CAAA,CAAA;AAAA,UAC/B;AACA,UAAA,MAAM,eAAe,SAAA,CAAU,QAAA,KAAa,QAAQM,uBAAA,CAAgB,SAAA,CAAU,IAAI,CAAA,GAAI,EAAA;AAEtF,UAAA,MAAM,QAAA,GACJ,CAAA,YAAA,EAAe,SAAS,CAAA,2BAAA,EAA8B,UAAU,KAAK,OAAO,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA,CAAG,IAAA,EAAK;AAEtG,UAAA,MAAM,IAAA,CAAK,OAAO,KAAA,CAAM;AAAA,YACtB,KAAA,EAAO;AAAA,WACR,CAAA;AACD,UAAA,IAAA,CAAK,QAAQ,KAAA,GAAQ,CAAA,aAAA,EAAgB,UAAU,CAAA,UAAA,EAAa,SAAS,CAAA,CAAE,CAAA;AAAA,QACzE;AAAA,MACF;AAAA,IACF,SAASN,OAAA,EAAY;AACnB,MAAA,MAAM,IAAIC,iBAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAA,CAAqB,YAAA,EAAc,aAAA,EAAe,QAAQ,CAAA;AAAA,UAC9D,QAAQC,iBAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,SAAA;AAAU,SACvB;AAAA,QACAJ;AAAA,OACF;AAAA,IACF,CAAA,SAAE;AAEA,MAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,SAAS,CAAA;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,CAAW,EAAE,SAAA,EAAU,EAA8C;AACzE,IAAA,IAAI;AAIF,MAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ,EAAE,OAAO,CAAA,mBAAA,EAAsB,SAAS,IAAI,CAAA;AACtE,MAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,QACxB,KAAA,EAAO,kBAAkB,SAAS,CAAA;AAAA,OACnC,CAAA;AACD,MAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ,EAAE,OAAO,CAAA,oBAAA,EAAuB,SAAS,IAAI,CAAA;AAAA,IACzE,SAASA,OAAA,EAAY;AACnB,MAAA,MAAM,IAAIC,iBAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAA,CAAqB,YAAA,EAAc,aAAA,EAAe,QAAQ,CAAA;AAAA,UAC9D,QAAQC,iBAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,SAAA;AAAU,SACvB;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,CAAU,EAAE,SAAA,EAAU,EAA8C;AACxE,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,OAAO,KAAA,CAAM;AAAA,QACtB,KAAA,EAAO,wBAAwB,SAAS,CAAA;AAAA,OACzC,CAAA;AAAA,IACH,SAASA,OAAA,EAAY;AACnB,MAAA,MAAM,IAAIC,iBAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAA,CAAqB,YAAA,EAAc,YAAA,EAAc,QAAQ,CAAA;AAAA,UAC7D,QAAQC,iBAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,SAAA;AAAU,SACvB;AAAA,QACAJ;AAAA,OACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,SAAS,CAAA;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,MAAM,MAAA,CAAO,EAAE,SAAA,EAAW,QAAO,EAA2E;AAC1G,IAAA,IAAI;AAEF,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,0BAAA,CAA2B,WAAW,MAAM,CAAA;AAC9E,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA,CAAE,WAAW,CAAA,EAAG;AAG9C,MAAA,MAAM,eAAe,cAAA,CAAe,SAAA,IAAa,cAAA,CAAe,UAAA,wBAAkB,IAAA,EAAK;AACvF,MAAA,MAAM,YAAA,GAAe,cAAA,CAAe,SAAA,oBAAa,IAAI,IAAA,EAAK;AAC1D,MAAA,IAAI,WAAA,IAAe,mBAAmB,MAAM,IAAA,CAAK,gBAAgB,SAAS,CAAA,EAAG,GAAA,CAAI,WAAW,CAAA,EAAG;AAC7F,QAAA,cAAA,CAAe,SAAA,GAAY,YAAA,YAAwB,IAAA,GAAO,YAAA,CAAa,aAAY,GAAI,YAAA;AAAA,MACzF;AACA,MAAA,IAAI,WAAA,IAAe,mBAAmB,MAAM,IAAA,CAAK,gBAAgB,SAAS,CAAA,EAAG,GAAA,CAAI,WAAW,CAAA,EAAG;AAC7F,QAAA,cAAA,CAAe,SAAA,GAAY,YAAA,YAAwB,IAAA,GAAO,YAAA,CAAa,aAAY,GAAI,YAAA;AAAA,MACzF;AAEA,MAAA,MAAM,IAAA,CAAK,OAAO,MAAA,CAAO;AAAA,QACvB,KAAA,EAAO,SAAA;AAAA,QACP,MAAA,EAAQ,CAAC,cAAc,CAAA;AAAA,QACvB,MAAA,EAAQ,aAAA;AAAA,QACR,mBAAA,EAAqB;AAAA;AAAA,UAEnB,uCAAA,EAAyC,CAAA;AAAA,UACzC,sBAAA,EAAwB,aAAA;AAAA,UACxB,oBAAA,EAAsB;AAAA;AACxB,OACD,CAAA;AAAA,IACH,SAASA,OAAA,EAAY;AACnB,MAAA,MAAM,IAAIC,iBAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAA,CAAqB,YAAA,EAAc,QAAA,EAAU,QAAQ,CAAA;AAAA,UACzD,QAAQC,iBAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,SAAA;AAAU,SACvB;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,CAAY,EAAE,SAAA,EAAW,SAAQ,EAA8E;AACnH,IAAA,MAAM,gBAAA,GAAmB,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,MAAW;AAAA,MAC9C,GAAG,MAAA,CAAO,WAAA;AAAA,QACR,MAAA,CAAO,QAAQ,MAAM,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAAA,UAC3C,GAAA;AAAA;AAAA;AAAA,UAGAO,qBAAA,CAAc,SAAwB,CAAA,GAAI,GAAG,GAAG,IAAA,KAAS,WAAA,IAAe,KAAA,IAAS,IAAA,GAC7E,IAAI,IAAA,CAAK,KAAK,CAAA,CAAE,aAAY,GAC5B;AAAA,SACL;AAAA;AACH,KACF,CAAE,CAAA;AAGF,IAAA,MAAM,mBAAA,GAAsB,MAAM,OAAA,CAAQ,GAAA;AAAA,MACxC,iBAAiB,GAAA,CAAI,CAAA,CAAA,KAAK,KAAK,0BAAA,CAA2B,SAAA,EAAW,CAAC,CAAC;AAAA,KACzE;AAEA,IAAA,MAAM,eAAA,GAAkB,oBAAoB,MAAA,CAAO,CAAA,CAAA,KAAK,OAAO,IAAA,CAAK,CAAC,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AACjF,IAAA,IAAI,eAAA,CAAgB,WAAW,CAAA,EAAG;AAElC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,OAAO,MAAA,CAAO;AAAA,QACvB,KAAA,EAAO,SAAA;AAAA,QACP,MAAA,EAAQ,eAAA;AAAA,QACR,MAAA,EAAQ,aAAA;AAAA,QACR,mBAAA,EAAqB;AAAA;AAAA,UAEnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAAA,IACH,SAASP,OAAA,EAAY;AACnB,MAAA,MAAM,IAAIC,iBAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAA,CAAqB,YAAA,EAAc,cAAA,EAAgB,QAAQ,CAAA;AAAA,UAC/D,QAAQC,iBAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,SAAA;AAAU,SACvB;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,CAAQ,EAAE,SAAA,EAAW,MAAK,EAAgF;AAC9G,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,SAAS,CAAA,IAAK,aAAA;AAC3C,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA;AACtC,MAAA,MAAM,aAAa,UAAA,CAChB,GAAA;AAAA,QACC,CAAC,CAAC,GAAG,MACH,CAAA,CAAA,EAAI,GAAG,YAAY,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,UAAA,CAAWO,sBAAc,SAAwB,CAAA,GAAI,GAAG,CAAA,EAAG,IAAA,IAAQ,MAAM,CAAC,CAAA,CAAA;AAAA,OAC7G,CACC,KAAK,OAAO,CAAA;AACf,MAAA,MAAM,MAAA,GAAS,WAAW,MAAA,CAAO,CAAC,KAAK,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACtD,QAAA,OAAO,EAAE,GAAG,GAAA,EAAK,CAAC,OAAO,GAAG,CAAA,CAAE,GAAG,KAAA,EAAM;AAAA,MACzC,CAAA,EAAG,EAAE,CAAA;AAEL,MAAA,MAAM,YAAA,GAAeA,qBAAA,CAAc,SAAwB,CAAA,EAAG,SAAA;AAE9D,MAAA,MAAM,YAAA,GAAe,CAAA,iDAAA,EAAoD,YAAA,GAAe,2CAAA,GAA8C,EAAE,CAAA,CAAA;AAExI,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QACrC,KAAA,EAAO,CAAA,EAAG,YAAY,CAAA,MAAA,EAAS,SAAS,CAAA,CAAA,EAAI,MAAA,CAAO,UAAA,CAAW,oBAAoB,CAAA,GAAI,OAAA,GAAU,EAAE,UAAU,UAAU,CAAA,gCAAA,CAAA;AAAA,QACtH,YAAA,EAAc,MAAA;AAAA,QACd,mBAAA,EAAqB;AAAA;AAAA,UAEnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,uBAAA,EAAyB,KAAA;AAAA,UACzB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAED,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,EAAK;AAE/B,MAAA,IAAI,cAActC,+BAAAA,EAAyB;AACzC,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AAC5B,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,IAAI,OAAO,QAAA,CAAS,QAAA,KAAa,QAAA,EAAU;AACzC,UAAA,QAAA,CAAS,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,QAAQ,CAAA;AAAA,QAClD;AACA,QAAA,OAAO,aAAa,QAAQ,CAAA;AAAA,MAC9B;AAEA,MAAA,MAAM,IAAA,GAAU,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,CAAC,CAAC,CAAA;AACzC,MAAA,OAAO,IAAA;AAAA,IACT,SAAS+B,OAAA,EAAO;AACd,MAAA,MAAM,IAAIC,iBAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAA,CAAqB,YAAA,EAAc,MAAA,EAAQ,QAAQ,CAAA;AAAA,UACvD,QAAQC,iBAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,SAAA;AAAU,SACvB;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACF,CAAA;;;AC5wBA,SAAS,cAAc,CAAA,EAAiB;AACtC,EAAA,IAAI,OAAO,MAAM,QAAA,IAAY,CAAA,IAAK,MAAM,OAAO,IAAA,CAAK,UAAU,CAAC,CAAA;AAC/D,EAAA,OAAO,CAAA,IAAK,EAAA;AACd;AAEA,SAAS,UAAU,GAAA,EAA0C;AAC3D,EAAA,MAAMQ,UAAAA,GAAY,CAAC,GAAA,KAAsB;AACvC,IAAA,IAAI,GAAA,IAAO,IAAA,IAAQ,GAAA,KAAQ,EAAA,EAAI,OAAO,MAAA;AACtC,IAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,MAAA,IAAI;AACF,QAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,MACvB,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,GAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AACA,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,YAAY,GAAA,CAAI,YAAA;AAAA,IAChB,IAAA,EAAMA,UAAAA,CAAU,GAAA,CAAI,IAAI,KAAK,EAAC;AAAA,IAC9B,SAAS,GAAA,CAAI,QAAA;AAAA,IACb,QAAA,EAAU,IAAI,SAAA,IAAa,MAAA;AAAA,IAC3B,UAAA,EAAY,IAAI,WAAA,IAAe,MAAA;AAAA,IAC/B,KAAA,EAAO,IAAI,MAAA,IAAU,EAAA;AAAA,IACrB,MAAA,EAAQA,UAAAA,CAAU,GAAA,CAAI,MAAM,CAAA;AAAA,IAC5B,KAAA,EAAOA,UAAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAAA,IAC1B,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,WAAA,IAAe,CAAC,CAAA;AAAA,IACvC,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,WAAA,IAAe,CAAC,CAAA;AAAA,IACvC,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,UAAA,IAAc,GAAO,CAAA;AAAA,IAC3C,SAAA,EAAW,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AAAA,IACjC,WAAW,GAAA,CAAI,SAAA,GAAY,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,GAAI,MAAA;AAAA,IACrD,aAAa,GAAA,CAAI,WAAA,GAAc,IAAI,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,GAAI;AAAA,GAC7D;AACF;AAEO,IAAM,gCAAA,GAAN,cAA+CC,8BAAA,CAAuB;AAAA,EACjE,MAAA;AAAA,EACV,GAAA;AAAA,EAEA,YAAY,MAAA,EAAgC;AAC1C,IAAA,KAAA,EAAM;AACN,IAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,EAAI,GAAI,wBAAwB,MAAM,CAAA;AACtD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAM,IAAI,YAAA,CAAa,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,IAAA,GAAsB;AAC1B,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,EAAE,SAAA,EAAWC,gCAAwB,MAAA,EAAQH,qBAAAA,CAAcG,8BAAsB,CAAA,EAAG,CAAA;AAAA,EACjH;AAAA,EAEA,MAAM,mBAAA,GAAqC;AACzC,IAAA,MAAM,KAAK,GAAA,CAAI,UAAA,CAAW,EAAE,SAAA,EAAWA,gCAAwB,CAAA;AAAA,EACjE;AAAA,EAEA,MAAM,WAAW,IAAA,EAAqC;AACpD,IAAA,MAAM,IAAA,CAAK,OAAO,MAAA,CAAO;AAAA,MACvB,KAAA,EAAOA,8BAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,IAAI,IAAA,CAAK,EAAA;AAAA,UACT,cAAc,IAAA,CAAK,UAAA;AAAA,UACnB,WAAW,IAAA,CAAK,QAAA;AAAA,UAChB,UAAU,IAAA,CAAK,OAAA;AAAA,UACf,SAAA,EAAW,KAAK,QAAA,IAAY,EAAA;AAAA,UAC5B,WAAA,EAAa,KAAK,UAAA,IAAc,EAAA;AAAA,UAChC,QAAQ,IAAA,CAAK,KAAA;AAAA,UACb,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,IAAA,EAAM,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AAAA,UAC7B,MAAA,EAAQ,aAAA,CAAc,IAAA,CAAK,MAAM,CAAA;AAAA,UACjC,KAAA,EAAO,aAAA,CAAc,IAAA,CAAK,KAAK,CAAA;AAAA,UAC/B,aAAa,IAAA,CAAK,UAAA;AAAA,UAClB,aAAa,IAAA,CAAK,UAAA;AAAA,UAClB,YAAY,IAAA,CAAK,SAAA;AAAA,UACjB,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,WAAA,EAAY;AAAA,UACtC,SAAA,EAAW,IAAA,CAAK,SAAA,EAAW,WAAA,EAAY,IAAK,0BAAA;AAAA,UAC5C,WAAA,EAAa,IAAA,CAAK,WAAA,EAAa,WAAA,EAAY,IAAK;AAAA;AAClD,OACF;AAAA,MACA,MAAA,EAAQ,aAAA;AAAA,MACR,mBAAA,EAAqB,EAAE,sBAAA,EAAwB,aAAA;AAAc,KAC9D,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,UAAA,CAAW,MAAA,EAAgB,MAAA,EAA6C;AAC5E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAC1C,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,MAAM,MAAA,GAAS,EAAE,GAAG,QAAA,EAAS;AAC7B,IAAA,IAAI,QAAA,IAAY,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,MAAA;AAC/C,IAAA,IAAI,QAAA,IAAY,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,MAAA;AAC/C,IAAA,IAAI,OAAA,IAAW,MAAA,EAAQ,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,KAAA;AAC7C,IAAA,IAAI,YAAA,IAAgB,MAAA,EAAQ,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,UAAA;AACvD,IAAA,IAAI,WAAA,IAAe,MAAA,EAAQ,MAAA,CAAO,SAAA,GAAY,MAAA,CAAO,SAAA;AACrD,IAAA,IAAI,aAAA,IAAiB,MAAA,EAAQ,MAAA,CAAO,WAAA,GAAc,MAAA,CAAO,WAAA;AAGzD,IAAA,MAAM,IAAA,CAAK,WAAW,MAAM,CAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,QAAQ,MAAA,EAAgD;AAC5D,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,MACrC,KAAA,EAAO,iBAAiBA,8BAAsB,CAAA,yCAAA,CAAA;AAAA,MAC9C,YAAA,EAAc,EAAE,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC/B,MAAA,EAAQ,aAAA;AAAA,MACR,mBAAA,EAAqB,EAAE,sBAAA,EAAwB,aAAA;AAAc,KAC9D,CAAA;AACD,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,EAA4B;AACtD,IAAA,OAAO,KAAK,MAAA,GAAS,CAAA,GAAI,UAAU,IAAA,CAAK,CAAC,CAAE,CAAA,GAAI,IAAA;AAAA,EACjD;AAAA,EAEQ,kBAAkB,MAAA,EAAoE;AAC5F,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,MAAM,SAA8B,EAAC;AAErC,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAI,MAAA,CAAO,MAAA,GAAS,CAAC,MAAA,CAAO,MAAM,CAAA;AAC9E,MAAA,UAAA,CAAW,KAAK,CAAA,wCAAA,CAA0C,CAAA;AAC1D,MAAA,MAAA,CAAO,YAAA,GAAe,QAAA;AAAA,IACxB;AACA,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,UAAA,CAAW,KAAK,CAAA,6BAAA,CAA+B,CAAA;AAC/C,MAAA,MAAA,CAAO,YAAY,MAAA,CAAO,OAAA;AAAA,IAC5B;AACA,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,UAAA,CAAW,KAAK,CAAA,+BAAA,CAAiC,CAAA;AACjD,MAAA,MAAA,CAAO,aAAa,MAAA,CAAO,QAAA;AAAA,IAC7B;AACA,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,UAAA,CAAW,KAAK,CAAA,yBAAA,CAA2B,CAAA;AAC3C,MAAA,MAAA,CAAO,UAAU,MAAA,CAAO,KAAA;AAAA,IAC1B;AACA,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,UAAA,CAAW,KAAK,CAAA,6BAAA,CAA+B,CAAA;AAC/C,MAAA,MAAA,CAAO,WAAW,MAAA,CAAO,QAAA;AAAA,IAC3B;AAIA,IAAA,MAAM,OAAA,GACJ,OAAO,YAAA,KAAiB,WAAA,GACpB,cACA,MAAA,CAAO,YAAA,KAAiB,gBACtB,aAAA,GACA,WAAA;AACR,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,mDAAA,CAAqD,CAAA;AAC/E,MAAA,MAAA,CAAO,aAAA,GAAgB,MAAA,CAAO,QAAA,CAAS,WAAA,EAAY;AAAA,IACrD;AACA,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,gDAAA,CAAkD,CAAA;AAC5E,MAAA,MAAA,CAAO,WAAA,GAAc,MAAA,CAAO,MAAA,CAAO,WAAA,EAAY;AAAA,IACjD;AAEA,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAA,GAAS,CAAA,GAAI,SAAS,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAC5E,IAAA,OAAO,EAAE,OAAO,MAAA,EAAO;AAAA,EACzB;AAAA,EAEA,MAAM,UAAU,MAAA,EAA6C;AAC3D,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,IAAA,CAAK,kBAAkB,MAAM,CAAA;AAGvD,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,MAC1C,KAAA,EAAO,CAAA,6BAAA,EAAgCA,8BAAsB,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAAA,MAC5E,YAAA,EAAc,MAAA;AAAA,MACd,MAAA,EAAQ,aAAA;AAAA,MACR,mBAAA,EAAqB,EAAE,sBAAA,EAAwB,aAAA;AAAc,KAC9D,CAAA;AACD,IAAA,MAAM,SAAA,GAAa,MAAM,WAAA,CAAY,IAAA,EAAK;AAC1C,IAAA,MAAM,QAAQ,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,EAAG,SAAS,CAAC,CAAA;AAE7C,IAAA,MAAM,QAAA,GACJ,OAAO,OAAA,KAAY,WAAA,GAAc,cAAc,MAAA,CAAO,OAAA,KAAY,gBAAgB,aAAA,GAAgB,WAAA;AACpG,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,cAAA,KAAmB,MAAA,GAAS,MAAA,GAAS,KAAA;AAC9D,IAAA,IAAI,GAAA,GAAM,iBAAiBA,8BAAsB,CAAA,OAAA,EAAU,KAAK,CAAA,UAAA,EAAa,QAAQ,IAAI,SAAS,CAAA,CAAA;AAClG,IAAA,IAAI,MAAA,CAAO,WAAW,IAAA,EAAM;AAC1B,MAAA,GAAA,IAAO,CAAA,yBAAA,CAAA;AACP,MAAA,MAAA,CAAO,YAAY,MAAA,CAAO,OAAA;AAC1B,MAAA,IAAI,MAAA,CAAO,QAAQ,IAAA,EAAM;AACvB,QAAA,GAAA,IAAO,CAAA,2BAAA,CAAA;AACP,QAAA,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,OAAA;AAAA,MAC3C;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,MACrC,KAAA,EAAO,GAAA;AAAA,MACP,YAAA,EAAc,MAAA;AAAA,MACd,MAAA,EAAQ,aAAA;AAAA,MACR,mBAAA,EAAqB,EAAE,sBAAA,EAAwB,aAAA;AAAc,KAC9D,CAAA;AACD,IAAA,MAAM,SAAS,MAAM,MAAA,CAAO,IAAA,EAA4B,EAAG,IAAI,SAAS,CAAA;AAExE,IAAA,OAAO,EAAE,OAAO,KAAA,EAAM;AAAA,EACxB;AAAA,EAEA,MAAM,WAAW,MAAA,EAA+B;AAC9C,IAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,MACxB,KAAA,EAAO,eAAeA,8BAAsB,CAAA,2BAAA,CAAA;AAAA,MAC5C,YAAA,EAAc,EAAE,MAAA,EAAQ,MAAA;AAAO,KAChC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,MAAA,EAAmC;AACnD,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,IAAA,CAAK,kBAAkB,MAAM,CAAA;AAIvD,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,MACxB,KAAA,EAAO,CAAA,YAAA,EAAeA,8BAAsB,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAAA,MACrD,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,eAAA,GAAmC;AACvC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,MACrC,KAAA,EAAO,gCAAgCA,8BAAsB,CAAA,+BAAA,CAAA;AAAA,MAC7D,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,MAAM,IAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAK;AAChC,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,SAAS,CAAC,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,uBAAuB,OAAA,EAAkC;AAC7D,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,MACrC,KAAA,EAAO,gCAAgCA,8BAAsB,CAAA,iEAAA,CAAA;AAAA,MAC7D,YAAA,EAAc,EAAE,SAAA,EAAW,OAAA,EAAQ;AAAA,MACnC,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,MAAM,IAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAK;AAChC,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,SAAS,CAAC,CAAA;AAAA,EACnC;AACF;ACxNA,SAAS,kBAAkB,QAAA,EAAuD;AAChF,EAAA,IAAI,CAAC,QAAA,IAAY,MAAA,CAAO,KAAK,QAAQ,CAAA,CAAE,WAAW,CAAA,EAAG;AACnD,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA,CAAK,UAAU,QAAQ,CAAA;AAChC;AAMA,SAAS,cAAc,QAAA,EAA4C;AACjE,EAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AACvB,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,EAAU,OAAO,QAAA;AACzC,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,EAAU,OAAO,EAAC;AAE1C,EAAA,MAAM,OAAA,GAAU,SAAS,IAAA,EAAK;AAC9B,EAAA,IAAI,OAAA,KAAY,EAAA,IAAM,OAAA,KAAY,MAAA,SAAe,EAAC;AAElD,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEO,IAAM,uBAAA,GAAN,cAAsCC,qBAAA,CAAc;AAAA,EAC/C,MAAA;AAAA,EACV,GAAA;AAAA,EACA,YAAY,MAAA,EAAgC;AAC1C,IAAA,KAAA,EAAM;AACN,IAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,EAAI,GAAI,wBAAwB,MAAM,CAAA;AACtD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAM,IAAI,YAAA,CAAa,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,IAAA,GAAsB;AAC1B,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,EAAE,SAAA,EAAWxC,uBAAe,MAAA,EAAQoC,qBAAAA,CAAcpC,qBAAa,CAAA,EAAG,CAAA;AAC7F,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,EAAE,SAAA,EAAWH,wBAAgB,MAAA,EAAQuC,qBAAAA,CAAcvC,sBAAc,CAAA,EAAG,CAAA;AAC/F,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,EAAE,SAAA,EAAWK,yBAAiB,MAAA,EAAQkC,qBAAAA,CAAclC,uBAAe,CAAA,EAAG,CAAA;AAEjG,IAAA,MAAM,IAAA,CAAK,IAAI,UAAA,CAAW;AAAA,MACxB,SAAA,EAAWL,sBAAAA;AAAA,MACX,MAAA,EAAQuC,sBAAcvC,sBAAc,CAAA;AAAA,MACpC,WAAA,EAAa,CAAC,YAAY;AAAA,KAC3B,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,mBAAA,GAAqC;AACzC,IAAA,MAAM,KAAK,GAAA,CAAI,UAAA,CAAW,EAAE,SAAA,EAAWA,wBAAgB,CAAA;AACvD,IAAA,MAAM,KAAK,GAAA,CAAI,UAAA,CAAW,EAAE,SAAA,EAAWK,yBAAiB,CAAA;AACxD,IAAA,MAAM,KAAK,GAAA,CAAI,UAAA,CAAW,EAAE,SAAA,EAAWF,uBAAe,CAAA;AAAA,EACxD;AAAA,EAEA,MAAM,eAAe,UAAA,EAAqC;AACxD,IAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAE5C,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QACrC,KAAA,EAAO,kCAAkCH,sBAAc,CAAA,uCAAA,CAAA;AAAA,QACvD,YAAA,EAAc,EAAE,UAAA,EAAW;AAAA,QAC3B,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,MAAM,IAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAK;AAChC,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,SAAS,CAAA;AAG3C,MAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,QACxB,KAAA,EAAO,eAAeA,sBAAc,CAAA,uCAAA,CAAA;AAAA,QACpC,YAAA,EAAc,EAAE,UAAA;AAAW,OAC5B,CAAA;AAGD,MAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AAExB,QAAA,MAAM,GAAA,GAAA,qBAAU,IAAA,EAAK,EAAE,aAAY,CAAE,OAAA,CAAQ,KAAK,EAAE,CAAA;AACpD,QAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,UACxB,KAAA,EAAO,eAAeG,qBAAa,CAAA,6EAAA,CAAA;AAAA,UACnC,YAAA,EAAc,EAAE,GAAA,EAAK,SAAA;AAAU,SAChC,CAAA;AAAA,MACH;AAAA,IACF,SAAS6B,OAAA,EAAO;AACd,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,iBAAA,EAAmB,QAAQ,CAAA;AAAA,UAClE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,KAAA,EAAO,UAAA,CAAW,MAAA;AAAO,SACtC;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,gBAAA,CAAiB,EAAE,UAAA,EAAW,EAAuE;AAChH,IAAA,IAAI,WAAW,MAAA,KAAW,CAAA,SAAU,EAAE,QAAA,EAAU,EAAC,EAAE;AAEnD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QACrC,KAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EASChC,sBAAc,CAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAAA,QAItB,YAAA,EAAc;AAAA,UACZ;AAAA,SACF;AAAA,QACA,mBAAA,EAAqB;AAAA;AAAA,UAEnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,uBAAA,EAAyB,KAAA;AAAA,UACzB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAED,MAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,EAAK;AAC/B,MAAA,MAAM,QAAA,GAAkB,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AAG/C,MAAA,QAAA,CAAS,QAAQ,CAAA,OAAA,KAAW;AAC1B,QAAA,IAAI,OAAO,OAAA,CAAQ,OAAA,KAAY,QAAA,EAAU;AACvC,UAAA,IAAI;AACF,YAAA,OAAA,CAAQ,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA;AAAA,UAC9C,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAED,MAAA,MAAM,OAAO,IAAI4C,iBAAA,EAAY,CAAE,GAAA,CAAI,UAAmD,QAAQ,CAAA;AAC9F,MAAA,OAAO,EAAE,QAAA,EAAU,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,IAAG,EAAE;AAAA,IACvC,SAASZ,OAAA,EAAO;AACd,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,qBAAA,EAAuB,QAAQ,CAAA;AAAA,UACtE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,SAAS,EAAE,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA;AAAE,SACpD;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,aAAa,IAAA,EAAoE;AAC5F,IAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAY,OAAA,EAAS,MAAA,EAAQ,SAAS,YAAA,EAAc,IAAA,GAAO,CAAA,EAAG,OAAA,EAAQ,GAAI,IAAA;AAG5F,IAAA,MAAM,eAAe,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,GAAW,CAAC,QAAQ,CAAA;AACnE,IAAA,MAAM,SAAA,GAAY,YAAA,CACf,MAAA,CAAO,CAAA,EAAA,KAAM,EAAA,KAAO,UAAa,EAAA,KAAO,IAAI,CAAA,CAC5C,GAAA,CAAI,CAAA,EAAA,KAAA,CAAO,OAAO,OAAO,QAAA,GAAW,EAAA,GAAK,MAAA,CAAO,EAAE,CAAA,EAAG,IAAA,EAAM,CAAA,CAC3D,MAAA,CAAO,CAAA,EAAA,KAAM,EAAA,CAAG,MAAA,GAAS,CAAC,CAAA;AAE7B,IAAA,IAAI,OAAO,CAAA,EAAG;AACZ,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,eAAA,EAAiB,cAAc,CAAA;AAAA,UACtE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,IAAA;AAAA,UACxB,OAAA,EAAS,EAAE,IAAA;AAAK,SAClB;AAAA,QACA,IAAI,MAAM,mBAAmB;AAAA,OAC/B;AAAA,IACF;AAGA,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAIH,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,eAAA,EAAiB,mBAAmB,CAAA;AAAA,UAC3E,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,QAAA,EAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA;AAAE,SAC7F;AAAA,QACA,IAAI,MAAM,mEAAmE;AAAA,OAC/E;AAAA,IACF;AAEA,IAAA,MAAM,eAAA,GAAkBS,wBAAA,CAAiB,YAAA,EAAc,EAAE,CAAA;AACzD,IAAA,MAAM,EAAE,QAAQ,OAAA,EAAS,kBAAA,KAAuBC,2BAAA,CAAoB,IAAA,EAAM,cAAc,eAAe,CAAA;AAEvG,IAAA,IAAI;AAGF,MAAA,MAAM,kBACJ,SAAA,CAAU,MAAA,KAAW,CAAA,GACjB,CAAA,8BAAA,CAAA,GACA,iBAAiB,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,CAAA,SAAA,EAAY,CAAC,UAAU,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAElF,MAAA,IAAI,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EASP9C,sBAAc;AAAA,cAAA,EACb,eAAe;AAAA,MAAA,CAAA;AAEzB,MAAA,MAAM,aAAkB,EAAC;AACzB,MAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM;AAC5B,QAAA,UAAA,CAAW,CAAA,QAAA,EAAW,CAAC,CAAA,CAAE,CAAA,GAAI,GAAA;AAAA,MAC/B,CAAC,CAAA;AAED,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,SAAA,IAAa,CAAA,qCAAA,CAAA;AACb,QAAA,UAAA,CAAW,UAAA,GAAa,UAAA;AAAA,MAC1B;AAEA,MAAA,IAAI,MAAA,EAAQ,WAAW,KAAA,EAAO;AAC5B,QAAA,MAAM,YACJ,MAAA,CAAO,SAAA,CAAU,KAAA,YAAiB,IAAA,GAC9B,OAAO,SAAA,CAAU,KAAA,CAAM,WAAA,EAAY,GACnC,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,KAAK,EAAE,WAAA,EAAY;AACnD,QAAA,MAAM,OAAA,GAAU,MAAA,CAAO,SAAA,CAAU,cAAA,GAAiB,GAAA,GAAM,IAAA;AACxD,QAAA,SAAA,IAAa,kBAAkB,OAAO,CAAA,gDAAA,CAAA;AACtC,QAAA,UAAA,CAAW,QAAA,GAAW,SAAA;AAAA,MACxB;AAEA,MAAA,IAAI,MAAA,EAAQ,WAAW,GAAA,EAAK;AAC1B,QAAA,MAAM,UACJ,MAAA,CAAO,SAAA,CAAU,GAAA,YAAe,IAAA,GAC5B,OAAO,SAAA,CAAU,GAAA,CAAI,WAAA,EAAY,GACjC,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,GAAG,EAAE,WAAA,EAAY;AACjD,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,SAAA,CAAU,YAAA,GAAe,GAAA,GAAM,IAAA;AACpD,QAAA,SAAA,IAAa,kBAAkB,KAAK,CAAA,8CAAA,CAAA;AACpC,QAAA,UAAA,CAAW,MAAA,GAAS,OAAA;AAAA,MACtB;AAGA,MAAA,MAAM,EAAE,KAAA,EAAO,SAAA,KAAc,IAAA,CAAK,YAAA,CAAa,SAAS,KAAK,CAAA;AAC7D,MAAA,SAAA,IAAa,CAAA,WAAA,EAAc,KAAK,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA;AAG9C,MAAA,IAAI,oBAAoB,CAAA,KAAM,CAAC,OAAA,IAAW,OAAA,CAAQ,WAAW,CAAA,CAAA,EAAI;AAC/D,QAAA,OAAO,EAAE,QAAA,EAAU,EAAC,EAAG,KAAA,EAAO,GAAG,IAAA,EAAM,OAAA,EAAS,kBAAA,EAAoB,OAAA,EAAS,KAAA,EAAM;AAAA,MACrF;AAGA,MAAA,IAAI,eAAA,KAAoB,CAAA,IAAK,OAAA,IAAW,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC1D,QAAA,MAAM,gBAAgB,MAAM,IAAA,CAAK,oBAAA,CAAqB,EAAE,SAAS,CAAA;AACjE,QAAA,MAAM+C,QAAO,IAAIH,iBAAA,EAAY,CAAE,GAAA,CAAI,eAAe,QAAQ,CAAA;AAC1D,QAAA,OAAO;AAAA,UACL,QAAA,EAAU,KAAK,aAAA,CAAcG,KAAAA,CAAK,IAAI,GAAA,CAAI,EAAA,EAAG,EAAG,KAAA,EAAO,SAAS,CAAA;AAAA,UAChE,KAAA,EAAO,CAAA;AAAA,UACP,IAAA;AAAA,UACA,OAAA,EAAS,kBAAA;AAAA,UACT,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAGA,MAAA,IAAI,uBAAuB,KAAA,EAAO,CAElC,MAAO;AACL,QAAA,SAAA,IAAa,CAAA,0CAAA,CAAA;AACb,QAAA,UAAA,CAAW,KAAA,GAAQ,eAAA;AACnB,QAAA,UAAA,CAAW,MAAA,GAAS,MAAA;AAAA,MACtB;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QACrC,KAAA,EAAO,SAAA;AAAA,QACP,YAAA,EAAc,UAAA;AAAA,QACd,mBAAA,EAAqB;AAAA,UACnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,uBAAA,EAAyB,KAAA;AAAA,UACzB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAED,MAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,EAAK;AAC/B,MAAA,MAAM,iBAAA,GAAoB,aAAA,CAA+B,IAAA,CAAK,IAAI,CAAA;AAClE,MAAA,MAAM,iBAAiB,iBAAA,CAAkB,MAAA;AAGzC,MAAA,IAAI,UAAA,GAAa,CAAA,6BAAA,EAAgC/C,sBAAc,CAAA,OAAA,EAAU,eAAe,CAAA,CAAA;AACxF,MAAA,MAAM,cAAmB,EAAC;AAC1B,MAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM;AAC5B,QAAA,WAAA,CAAY,CAAA,QAAA,EAAW,CAAC,CAAA,CAAE,CAAA,GAAI,GAAA;AAAA,MAChC,CAAC,CAAA;AAED,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,UAAA,IAAc,CAAA,qCAAA,CAAA;AACd,QAAA,WAAA,CAAY,UAAA,GAAa,UAAA;AAAA,MAC3B;AAEA,MAAA,IAAI,MAAA,EAAQ,WAAW,KAAA,EAAO;AAC5B,QAAA,MAAM,YACJ,MAAA,CAAO,SAAA,CAAU,KAAA,YAAiB,IAAA,GAC9B,OAAO,SAAA,CAAU,KAAA,CAAM,WAAA,EAAY,GACnC,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,KAAK,EAAE,WAAA,EAAY;AACnD,QAAA,MAAM,OAAA,GAAU,MAAA,CAAO,SAAA,CAAU,cAAA,GAAiB,GAAA,GAAM,IAAA;AACxD,QAAA,UAAA,IAAc,kBAAkB,OAAO,CAAA,gDAAA,CAAA;AACvC,QAAA,WAAA,CAAY,QAAA,GAAW,SAAA;AAAA,MACzB;AAEA,MAAA,IAAI,MAAA,EAAQ,WAAW,GAAA,EAAK;AAC1B,QAAA,MAAM,UACJ,MAAA,CAAO,SAAA,CAAU,GAAA,YAAe,IAAA,GAC5B,OAAO,SAAA,CAAU,GAAA,CAAI,WAAA,EAAY,GACjC,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,GAAG,EAAE,WAAA,EAAY;AACjD,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,SAAA,CAAU,YAAA,GAAe,GAAA,GAAM,IAAA;AACpD,QAAA,UAAA,IAAc,kBAAkB,KAAK,CAAA,8CAAA,CAAA;AACrC,QAAA,WAAA,CAAY,MAAA,GAAS,OAAA;AAAA,MACvB;AAEA,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QAC1C,KAAA,EAAO,UAAA;AAAA,QACP,YAAA,EAAc,WAAA;AAAA,QACd,mBAAA,EAAqB;AAAA,UACnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,uBAAA,EAAyB,KAAA;AAAA,UACzB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AACD,MAAA,MAAM,SAAA,GAAY,MAAM,WAAA,CAAY,IAAA,EAAK;AACzC,MAAA,MAAM,KAAA,GAAS,SAAA,CAAkB,IAAA,CAAK,CAAC,CAAA,CAAE,KAAA;AAGzC,MAAA,IAAI,KAAA,KAAU,KAAK,cAAA,KAAmB,CAAA,KAAM,CAAC,OAAA,IAAW,OAAA,CAAQ,WAAW,CAAA,CAAA,EAAI;AAC7E,QAAA,OAAO;AAAA,UACL,UAAU,EAAC;AAAA,UACX,KAAA,EAAO,CAAA;AAAA,UACP,IAAA;AAAA,UACA,OAAA,EAAS,kBAAA;AAAA,UACT,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAGA,MAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,iBAAA,CAAkB,IAAI,CAAC,CAAA,KAAuB,CAAA,CAAE,EAAE,CAAC,CAAA;AAE9E,MAAA,IAAI,OAAA,IAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACjC,QAAA,MAAM,kBAAkB,MAAM,IAAA,CAAK,oBAAA,CAAqB,EAAE,SAAS,CAAA;AAGnE,QAAA,KAAA,MAAW,cAAc,eAAA,EAAiB;AACxC,UAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,UAAA,CAAW,EAAE,CAAA,EAAG;AAClC,YAAA,iBAAA,CAAkB,KAAK,UAAU,CAAA;AACjC,YAAA,UAAA,CAAW,GAAA,CAAI,WAAW,EAAE,CAAA;AAAA,UAC9B;AAAA,QACF;AAAA,MACF;AAGA,MAAA,MAAM,OAAO,IAAI4C,iBAAA,EAAY,CAAE,GAAA,CAAI,mBAAmB,QAAQ,CAAA;AAC9D,MAAA,MAAM,aAAA,GAAgB,KAAK,aAAA,CAAc,IAAA,CAAK,IAAI,GAAA,CAAI,EAAA,EAAG,EAAG,KAAA,EAAO,SAAS,CAAA;AAK5E,MAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,SAAS,CAAA;AACrC,MAAA,MAAM,2BAA2B,IAAI,GAAA;AAAA,QACnC,aAAA,CAAc,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,YAAY,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,EAAE;AAAA,OACpF;AACA,MAAA,MAAM,yBAAA,GAA4B,yBAAyB,IAAA,IAAQ,KAAA;AACnE,MAAA,MAAM,UACJ,kBAAA,KAAuB,KAAA,GAAQ,QAAQ,yBAAA,GAA4B,KAAA,GAAQ,SAAS,cAAA,GAAiB,KAAA;AAEvG,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,aAAA;AAAA,QACV,KAAA;AAAA,QACA,IAAA;AAAA,QACA,OAAA,EAAS,kBAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF,SAASZ,OAAA,EAAY;AACnB,MAAA,MAAM,cAAc,IAAIC,iBAAAA;AAAA,QACtB;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,eAAA,EAAiB,QAAQ,CAAA;AAAA,UAChE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS;AAAA,YACP,QAAA,EAAU,MAAM,OAAA,CAAQ,QAAQ,IAAI,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA,GAAI,QAAA;AAAA,YACzD,YAAY,UAAA,IAAc;AAAA;AAC5B,SACF;AAAA,QACAJ;AAAA,OACF;AACA,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,GAAQ,WAAA,CAAY,QAAA,EAAU,CAAA;AAC3C,MAAA,IAAA,CAAK,MAAA,EAAQ,iBAAiB,WAAW,CAAA;AACzC,MAAA,OAAO;AAAA,QACL,UAAU,EAAC;AAAA,QACX,KAAA,EAAO,CAAA;AAAA,QACP,IAAA;AAAA,QACA,OAAA,EAAS,kBAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,aAAA,CAAc,QAAA,EAA6B,KAAA,EAAe,SAAA,EAAsC;AACtG,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAC7B,MAAA,MAAM,WAAA,GAAc,KAAA,KAAU,WAAA,IAAe,KAAA,KAAU,WAAA;AACvD,MAAA,MAAM,MAAA,GAAS,WAAA,GAAc,IAAI,IAAA,CAAM,CAAA,CAAU,KAAK,CAAC,CAAA,CAAE,OAAA,EAAQ,GAAK,CAAA,CAAU,KAAK,CAAA;AACrF,MAAA,MAAM,MAAA,GAAS,WAAA,GAAc,IAAI,IAAA,CAAM,CAAA,CAAU,KAAK,CAAC,CAAA,CAAE,OAAA,EAAQ,GAAK,CAAA,CAAU,KAAK,CAAA;AAErF,MAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,QAAA,OAAO,CAAA,CAAE,EAAA,CAAG,aAAA,CAAc,CAAA,CAAE,EAAE,CAAA;AAAA,MAChC;AAEA,MAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,OAAO,WAAW,QAAA,EAAU;AAC5D,QAAA,OAAO,SAAA,KAAc,KAAA,GAAQ,MAAA,GAAS,MAAA,GAAS,MAAA,GAAS,MAAA;AAAA,MAC1D;AACA,MAAA,OAAO,cAAc,KAAA,GACjB,MAAA,CAAO,MAAM,CAAA,CAAE,cAAc,MAAA,CAAO,MAAM,CAAC,CAAA,GAC3C,OAAO,MAAM,CAAA,CAAE,aAAA,CAAc,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,IACjD,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,oBAAA,CAAqB;AAAA,IACjC;AAAA,GACF,EAE+B;AAC7B,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,SAAU,EAAC;AAG9C,IAAA,MAAM,SAAA,GAAY,QAAQ,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,EAAE,CAAA,CAAE,OAAO,OAAO,CAAA;AAC3D,IAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAEpC,IAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAW,GAAI,MAAM,KAAK,gBAAA,CAAiB,EAAE,UAAA,EAAY,SAAA,EAAW,CAAA;AACtF,IAAA,MAAM,YAAY,IAAI,GAAA;AAAA,MACpB,UAAA,CAAW,GAAA,CAAI,CAAC,GAAA,KAAa,CAAC,GAAA,CAAI,EAAA,EAAI,EAAE,QAAA,EAAU,IAAI,QAAA,EAAU,SAAA,EAAW,GAAA,CAAI,SAAA,EAAW,CAAC;AAAA,KAC7F;AAIA,IAAA,MAAM,eAAyB,EAAC;AAChC,IAAA,MAAM,SAA8B,EAAC;AACrC,IAAA,IAAI,QAAA,GAAW,CAAA;AAEf,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,MAAA,MAAM,EAAE,EAAA,EAAI,oBAAA,GAAuB,CAAA,EAAG,gBAAA,GAAmB,GAAE,GAAI,GAAA;AAC/D,MAAA,MAAM,MAAA,GAAS,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA;AAC/B,MAAA,IAAI,CAAC,MAAA,EAAQ;AAGb,MAAA,MAAM,WAAA,GAAc,cAAc,QAAQ,CAAA,CAAA;AAC1C,MAAA,MAAM,cAAA,GAAiB,iBAAiB,QAAQ,CAAA,CAAA;AAChD,MAAA,MAAM,UAAA,GAAa,aAAa,QAAQ,CAAA,CAAA;AACxC,MAAA,YAAA,CAAa,IAAA,CAAK;AAAA;AAAA,cAAA,EAERhC,sBAAc,CAAA;AAAA,2BAAA,EACD,WAAW,CAAA;AAAA,sDAAA,EACgB,cAAc,CAAA;AAAA;AAAA,eAAA,EAErD,UAAU,CAAA;AAAA,MAAA,CACpB,CAAA;AACD,MAAA,MAAA,CAAO,WAAW,IAAI,MAAA,CAAO,QAAA;AAC7B,MAAA,MAAA,CAAO,cAAc,IAAI,MAAA,CAAO,SAAA;AAChC,MAAA,MAAA,CAAO,UAAU,IAAI,oBAAA,GAAuB,CAAA;AAC5C,MAAA,QAAA,EAAA;AAGA,MAAA,IAAI,mBAAmB,CAAA,EAAG;AACxB,QAAA,MAAM,YAAA,GAAe,cAAc,QAAQ,CAAA,CAAA;AAC3C,QAAA,MAAM,eAAA,GAAkB,iBAAiB,QAAQ,CAAA,CAAA;AACjD,QAAA,MAAM,WAAA,GAAc,aAAa,QAAQ,CAAA,CAAA;AACzC,QAAA,YAAA,CAAa,IAAA,CAAK;AAAA;AAAA,gBAAA,EAERA,sBAAc,CAAA;AAAA,6BAAA,EACD,YAAY,CAAA;AAAA,uDAAA,EACc,eAAe,CAAA;AAAA;AAAA,iBAAA,EAErD,WAAW,CAAA;AAAA,QAAA,CACrB,CAAA;AACD,QAAA,MAAA,CAAO,YAAY,IAAI,MAAA,CAAO,QAAA;AAC9B,QAAA,MAAA,CAAO,eAAe,IAAI,MAAA,CAAO,SAAA;AACjC,QAAA,MAAA,CAAO,WAAW,CAAA,GAAI,gBAAA;AACtB,QAAA,QAAA,EAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAIvC,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,MAAA,UAAA,GAAa,aAAa,CAAC,CAAA;AAAA,IAC7B,CAAA,MAAO;AACL,MAAA,UAAA,GAAa,CAAA,eAAA,EAAkB,YAAA,CAAa,IAAA,CAAK,aAAa,CAAC,CAAA,kCAAA,CAAA;AAAA,IACjE;AAEA,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,MAC5C,KAAA,EAAO,UAAA;AAAA,MACP,YAAA,EAAc,MAAA;AAAA,MACd,mBAAA,EAAqB;AAAA,QACnB,sBAAA,EAAwB,aAAA;AAAA,QACxB,uBAAA,EAAyB,KAAA;AAAA,QACzB,oBAAA,EAAsB,CAAA;AAAA,QACtB,uCAAA,EAAyC;AAAA;AAC3C,KACD,CAAA;AAED,IAAA,MAAM,WAAA,GAAc,MAAM,aAAA,CAAc,IAAA,EAAK;AAG7C,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,OAAO,aAAA,CAA+B,WAAA,CAAY,IAAI,CAAA,CAAE,OAAO,CAAA,GAAA,KAAO;AACpE,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,EAAE,GAAG,OAAO,KAAA;AAC7B,MAAA,IAAA,CAAK,GAAA,CAAI,IAAI,EAAE,CAAA;AACf,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,IAAA,EAAiF;AAClG,IAAA,MAAM,EAAE,UAAS,GAAI,IAAA;AACrB,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,EAAE,QAAA,EAAS;AAE7C,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,aAAa,OAAA,CAAQ,UAAA;AAC3B,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,MAC3C;AAEA,MAAA,IAAI,CAAC,QAAQ,QAAA,EAAU;AACrB,QAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,MACzC;AAGA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,CAAc,EAAE,QAAA,EAAU,OAAA,CAAQ,UAAU,CAAA;AACtE,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,OAAA,CAAQ,QAAQ,CAAA,UAAA,CAAY,CAAA;AAAA,MACxD;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAI;AAE5B,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,QAAA,CAAS,GAAA,CAAI,OAAM,CAAA,KAAK;AACtB,QAAA,MAAM,aAAa,CAAA,CAAE,UAAA;AACrB,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,QAC3C;AAEA,QAAA,IAAI,CAAC,EAAE,QAAA,EAAU;AACf,UAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,QACzC;AAGA,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,CAAc,EAAE,QAAA,EAAU,CAAA,CAAE,UAAU,CAAA;AAChE,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,CAAA,CAAE,QAAQ,CAAA,UAAA,CAAY,CAAA;AAAA,QAClD;AAEA,QAAA,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,QAAA,EAAU,MAAM,CAAA;AAAA,MACpC,CAAC;AAAA,KACH;AAEA,IAAA,IAAI;AAKF,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QAC7C,KAAA,EAAO,6BAA6BA,sBAAc,CAAA,kCAAA,CAAA;AAAA,QAClD,YAAA,EAAc;AAAA,UACZ,GAAA,EAAK,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,EAAE;AAAA,SAC7B;AAAA,QACA,mBAAA,EAAqB;AAAA;AAAA,UAEnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,uBAAA,EAAyB,KAAA;AAAA,UACzB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA,SAC3C;AAAA,QACA,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,MAAM,YAAA,GAAyD,MAAM,cAAA,CAAe,IAAA,EAAK;AAEzF,MAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,CAAA,GAAA,KAAO,CAAA,EAAG,GAAA,CAAI,EAAE,CAAA,EAAA,EAAK,GAAA,CAAI,SAAS,EAAE,CAAC,CAAA;AAMlF,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,WAAA,CAAY,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,EAAE,CAAA,EAAA,EAAK,CAAA,CAAE,QAAQ,EAAE,CAAC,CAAA;AAChF,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,WAAA,CAAY,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,EAAE,CAAA,EAAA,EAAK,CAAA,CAAE,QAAQ,EAAE,CAAC,CAAA;AAG/E,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK;AAClC,QAAA,MAAM,cAAc,YAAA,CAAa,IAAA,CAAK,SAAO,GAAA,CAAI,EAAA,KAAO,EAAE,EAAE,CAAA;AAC5D,QAAA,OAAO,WAAA,IAAe,WAAA,CAAY,SAAA,KAAc,CAAA,CAAE,QAAA;AAAA,MACpD,CAAC,CAAA;AAGD,MAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,GAAA,CAAI,CAAA,OAAA,KAAW;AAC3C,QAAA,MAAM,cAAc,YAAA,CAAa,IAAA,CAAK,SAAO,GAAA,CAAI,EAAA,KAAO,QAAQ,EAAE,CAAA;AAClE,QAAA,IAAI,CAAC,WAAA,EAAa,OAAO,OAAA,CAAQ,OAAA,EAAQ;AAEzC,QAAA,OAAO,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,UACzB,KAAA,EAAO,eAAeA,sBAAc,CAAA,sEAAA,CAAA;AAAA,UACpC,YAAA,EAAc;AAAA,YACZ,QAAQ,OAAA,CAAQ,EAAA;AAAA,YAChB,mBAAmB,WAAA,CAAY;AAAA,WACjC;AAAA,UACA,mBAAA,EAAqB;AAAA,YACnB,sBAAA,EAAwB,aAAA;AAAA,YACxB,oBAAA,EAAsB,CAAA;AAAA,YACtB,uCAAA,EAAyC;AAAA;AAC3C,SACD,CAAA;AAAA,MACH,CAAC,CAAA;AAED,MAAA,MAAM,iBAAiB,QAAA,CAAS,GAAA;AAAA,QAAI,CAAA,OAAA,KAClC,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ;AAAA,UAClB,KAAA,EAAO;AAAA,kBAAA,EACGA,sBAAc;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,UAIxB,YAAA,EAAc;AAAA,YACZ,WAAA,EAAa,OAAO,OAAA,CAAQ,OAAA,KAAY,QAAA,GAAW,QAAQ,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,OAAO,CAAA;AAAA,YACnG,UAAU,OAAA,CAAQ,IAAA;AAAA,YAClB,QAAA,EAAU,QAAQ,IAAA,IAAQ,IAAA;AAAA,YAC1B,gBAAgB,OAAA,CAAQ,UAAA;AAAA,YACxB,QAAQ,OAAA,CAAQ,EAAA;AAAA,YAChB,eAAe,OAAA,CAAQ;AAAA,WACzB;AAAA,UACA,mBAAA,EAAqB;AAAA;AAAA,YAEnB,sBAAA,EAAwB,aAAA;AAAA,YACxB,oBAAA,EAAsB,CAAA;AAAA,YACtB,uCAAA,EAAyC;AAAA;AAC3C,SACD;AAAA,OACH;AAGA,MAAA,MAAM,QAAQ,GAAA,CAAI;AAAA;AAAA,QAEhB,IAAA,CAAK,OAAO,MAAA,CAAO;AAAA,UACjB,KAAA,EAAOA,sBAAAA;AAAA,UACP,MAAA,EAAQ,aAAA;AAAA,UACR,MAAA,EAAQ,QAAA,CAAS,GAAA,CAAI,CAAA,OAAA,MAAY;AAAA,YAC/B,IAAI,OAAA,CAAQ,EAAA;AAAA,YACZ,WAAW,OAAA,CAAQ,QAAA;AAAA,YACnB,YAAY,OAAA,CAAQ,UAAA;AAAA,YACpB,OAAA,EAAS,OAAO,OAAA,CAAQ,OAAA,KAAY,QAAA,GAAW,QAAQ,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,OAAO,CAAA;AAAA,YAC/F,SAAA,EAAW,OAAA,CAAQ,SAAA,CAAU,WAAA,EAAY;AAAA,YACzC,MAAM,OAAA,CAAQ,IAAA;AAAA,YACd,IAAA,EAAM,QAAQ,IAAA,IAAQ;AAAA,WACxB,CAAE,CAAA;AAAA,UACF,mBAAA,EAAqB;AAAA;AAAA,YAEnB,sBAAA,EAAwB,aAAA;AAAA,YACxB,oBAAA,EAAsB,CAAA;AAAA,YACtB,uCAAA,EAAyC;AAAA;AAC3C,SACD,CAAA;AAAA,QACD,GAAG,cAAA;AAAA,QACH,GAAG,cAAA;AAAA;AAAA,QAEH,IAAA,CAAK,OAAO,MAAA,CAAO;AAAA,UACjB,KAAA,EAAOG,qBAAAA;AAAA,UACP,MAAA,EAAQ,aAAA;AAAA,UACR,MAAA,EAAQ,MAAM,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA,CAAE,IAAI,CAAA,MAAA,MAAW;AAAA,YACtD,IAAI,MAAA,CAAO,EAAA;AAAA,YACX,YAAY,MAAA,CAAO,UAAA;AAAA,YACnB,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,QAAA,EAAU,iBAAA,CAAkB,MAAA,CAAO,QAAQ,CAAA;AAAA,YAC3C,WAAW,MAAA,CAAO,SAAA;AAAA,YAClB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,WACpC,CAAE,CAAA;AAAA,UACF,mBAAA,EAAqB;AAAA,YACnB,sBAAA,EAAwB,aAAA;AAAA,YACxB,oBAAA,EAAsB,CAAA;AAAA,YACtB,uCAAA,EAAyC;AAAA;AAC3C,SACD;AAAA,OACF,CAAA;AAED,MAAA,MAAM,OAAO,IAAIyC,iBAAA,EAAY,CAAE,GAAA,CAAI,UAAmD,QAAQ,CAAA;AAE9F,MAAA,OAAO,EAAE,QAAA,EAAU,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,IAAG,EAAE;AAAA,IACvC,SAASZ,OAAA,EAAY;AACnB,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,eAAA,EAAiB,QAAQ,CAAA;AAAA,UAChE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,aAAA,CAAc,EAAE,QAAA,EAAS,EAA4D;AACzF,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QACrC,KAAA,EAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAOC7B,qBAAa,CAAA;AAAA;AAAA;AAAA,eAAA,CAAA;AAAA,QAIrB,YAAA,EAAc,EAAE,MAAA,EAAQ,QAAA,EAAS;AAAA,QACjC,mBAAA,EAAqB;AAAA;AAAA,UAEnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,uBAAA,EAAyB,KAAA;AAAA,UACzB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAED,MAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,EAAK;AAC/B,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,CAAC,CAAC,CAAA;AAExC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO;AAAA,QACL,GAAG,MAAA;AAAA,QACH,QAAA,EAAU,aAAA,CAAc,MAAA,CAAO,QAAQ,CAAA;AAAA,QACvC,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,WAAW,MAAA,CAAO;AAAA,OACpB;AAAA,IACF,SAAS6B,OAAA,EAAY;AACnB,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,kBAAA,EAAoB,QAAQ,CAAA;AAAA,UACnE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,QAAA;AAAS,SACtB;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,CAAW,EAAE,MAAA,EAAO,EAA8D;AACtF,IAAA,IAAI;AAGF,MAAA,MAAM,IAAA,CAAK,OAAO,MAAA,CAAO;AAAA,QACvB,KAAA,EAAO7B,qBAAAA;AAAA,QACP,MAAA,EAAQ;AAAA,UACN;AAAA,YACE,GAAG,MAAA;AAAA,YACH,QAAA,EAAU,iBAAA,CAAkB,MAAA,CAAO,QAAQ,CAAA;AAAA,YAC3C,SAAA,EAAW,MAAA,CAAO,SAAA,CAAU,WAAA,EAAY;AAAA,YACxC,SAAA,EAAW,MAAA,CAAO,SAAA,CAAU,WAAA;AAAY;AAC1C,SACF;AAAA,QACA,MAAA,EAAQ,aAAA;AAAA,QACR,mBAAA,EAAqB;AAAA;AAAA,UAEnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAED,MAAA,OAAO,MAAA;AAAA,IACT,SAAS6B,OAAA,EAAO;AACd,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,aAAA,EAAe,QAAQ,CAAA;AAAA,UAC9D,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,QAAA,EAAU,MAAA,CAAO,EAAA;AAAG,SACjC;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,YAAA,CAAa;AAAA,IACjB,EAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF,EAI+B;AAC7B,IAAA,IAAI;AAEF,MAAA,MAAM,iBAAiB,MAAM,IAAA,CAAK,cAAc,EAAE,QAAA,EAAU,IAAI,CAAA;AAChE,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,EAAE,CAAA,UAAA,CAAY,CAAA;AAAA,MAC1C;AAGA,MAAA,MAAM,cAAA,GAAiB;AAAA,QACrB,GAAG,cAAA,CAAe,QAAA;AAAA,QAClB,GAAG;AAAA,OACL;AAEA,MAAA,MAAM,aAAA,GAAgB;AAAA,QACpB,GAAG,cAAA;AAAA,QACH,KAAA;AAAA,QACA,QAAA,EAAU,cAAA;AAAA,QACV,SAAA,sBAAe,IAAA;AAAK,OACtB;AAEA,MAAA,MAAM,IAAA,CAAK,OAAO,MAAA,CAAO;AAAA,QACvB,KAAA,EAAO7B,qBAAAA;AAAA,QACP,MAAA,EAAQ,aAAA;AAAA,QACR,MAAA,EAAQ;AAAA,UACN;AAAA,YACE,IAAI,aAAA,CAAc,EAAA;AAAA,YAClB,YAAY,aAAA,CAAc,UAAA;AAAA,YAC1B,OAAO,aAAA,CAAc,KAAA;AAAA,YACrB,QAAA,EAAU,iBAAA,CAAkB,aAAA,CAAc,QAAQ,CAAA;AAAA,YAClD,WAAW,aAAA,CAAc,SAAA;AAAA,YACzB,SAAA,EAAW,aAAA,CAAc,SAAA,CAAU,WAAA;AAAY;AACjD,SACF;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAED,MAAA,OAAO,aAAA;AAAA,IACT,SAAS6B,OAAA,EAAO;AACd,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,eAAA,EAAiB,QAAQ,CAAA;AAAA,UAChE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,QAAA,EAAU,EAAA,EAAI,KAAA;AAAM,SACjC;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,YAAA,CAAa,EAAE,QAAA,EAAS,EAAwC;AACpE,IAAA,IAAI;AAEF,MAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,QACxB,KAAA,EAAO,gBAAgBhC,sBAAc,CAAA,2CAAA,CAAA;AAAA,QACrC,YAAA,EAAc,EAAE,aAAA,EAAe,QAAA,EAAS;AAAA,QACxC,mBAAA,EAAqB;AAAA,UACnB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAGD,MAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,QACxB,KAAA,EAAO,gBAAgBG,qBAAa,CAAA,6BAAA,CAAA;AAAA,QACpC,YAAA,EAAc,EAAE,MAAA,EAAQ,QAAA,EAAS;AAAA,QACjC,mBAAA,EAAqB;AAAA,UACnB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAAA,IACH,SAAS6B,OAAA,EAAO;AACd,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,eAAA,EAAiB,QAAQ,CAAA;AAAA,UAChE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,QAAA;AAAS,SACtB;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,YAAY,IAAA,EAAkE;AACzF,IAAA,MAAM,EAAE,IAAA,GAAO,CAAA,EAAG,SAAS,YAAA,EAAc,OAAA,EAAS,QAAO,GAAI,IAAA;AAE7D,IAAA,IAAI;AAGF,MAAA,IAAA,CAAK,uBAAA,CAAwB,IAAA,EAAM,YAAA,IAAgB,GAAG,CAAA;AAAA,IACxD,SAASA,OAAA,EAAO;AACd,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,cAAA,EAAgB,cAAc,CAAA;AAAA,UACrE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,IAAA;AAAA,UACxB,OAAA,EAAS,EAAE,IAAA,EAAM,GAAI,iBAAiB,MAAA,IAAa,EAAE,OAAA,EAAS,YAAA,EAAa;AAAG,SAChF;AAAA,QACAJ,OAAA,YAAiB,KAAA,GAAQA,OAAA,GAAQ,IAAI,MAAM,+BAA+B;AAAA,OAC5E;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAUa,wBAAA,CAAiB,YAAA,EAAc,GAAG,CAAA;AAGlD,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,oBAAA,CAAqB,QAAQ,QAAQ,CAAA;AAAA,IAC5C,SAASb,OAAA,EAAO;AACd,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,cAAA,EAAgB,sBAAsB,CAAA;AAAA,UAC7E,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,IAAA;AAAA,UACxB,OAAA,EAAS,EAAE,YAAA,EAAc,MAAA,EAAQ,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,IAAI,EAAA;AAAG,SAC3F;AAAA,QACAJ,OAAA,YAAiB,KAAA,GAAQA,OAAA,GAAQ,IAAI,MAAM,sBAAsB;AAAA,OACnE;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,QAAQ,OAAA,EAAS,kBAAA,KAAuBc,2BAAA,CAAoB,IAAA,EAAM,cAAc,OAAO,CAAA;AAC/F,IAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAU,GAAI,IAAA,CAAK,aAAa,OAAO,CAAA;AAEtD,IAAA,IAAI;AAEF,MAAA,MAAM,eAAyB,EAAC;AAChC,MAAA,MAAM,cAAmC,EAAC;AAE1C,MAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,QAAA,YAAA,CAAa,KAAK,kCAAkC,CAAA;AACpD,QAAA,WAAA,CAAY,aAAa,MAAA,CAAO,UAAA;AAAA,MAClC;AAGA,MAAA,IAAI,MAAA,EAAQ,YAAY,MAAA,CAAO,IAAA,CAAK,OAAO,QAAQ,CAAA,CAAE,SAAS,CAAA,EAAG;AAC/D,QAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,QAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC1D,UAAA,MAAM,SAAA,GAAY,WAAW,aAAa,CAAA,CAAA;AAE1C,UAAA,YAAA,CAAa,IAAA,CAAK,CAAA,0BAAA,EAA6B,GAAG,CAAA,MAAA,EAAS,SAAS,CAAA,QAAA,CAAU,CAAA;AAC9E,UAAA,WAAA,CAAY,SAAS,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAC7C,UAAA,aAAA,EAAA;AAAA,QACF;AAAA,MACF;AAGA,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QAC1C,KAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAA,EAOI3C,qBAAa;AAAA;AAAA;AAAA;AAAA,4BAAA,EAIF,YAAA,CAAa,SAAS,CAAA,GAAI,CAAA,IAAA,EAAO,aAAa,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAE;AAAA,QAAA,CAAA;AAAA,QAExF,YAAA,EAAc,WAAA;AAAA,QACd,mBAAA,EAAqB;AAAA,UACnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,uBAAA,EAAyB,KAAA;AAAA,UACzB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AACD,MAAA,MAAM,SAAA,GAAY,MAAM,WAAA,CAAY,IAAA,EAAK;AACzC,MAAA,MAAM,KAAA,GAAS,SAAA,CAAkB,IAAA,CAAK,CAAC,CAAA,CAAE,KAAA;AAEzC,MAAA,IAAI,UAAU,CAAA,EAAG;AACf,QAAA,OAAO;AAAA,UACL,SAAS,EAAC;AAAA,UACV,KAAA,EAAO,CAAA;AAAA,UACP,IAAA;AAAA,UACA,OAAA,EAAS,kBAAA;AAAA,UACT,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAIA,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QACzC,KAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAUQA,qBAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAAA,EAUF,YAAA,CAAa,SAAS,CAAA,GAAI,CAAA,IAAA,EAAO,aAAa,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAE;AAAA,wBAAA,EAC1E,KAAK,CAAA,EAAA,EAAK,SAAA,KAAc,MAAA,GAAS,SAAS,KAAK;AAAA;AAAA,YAAA,CAAA;AAAA,QAGjE,YAAA,EAAc;AAAA,UACZ,GAAG,WAAA;AAAA,UACH,OAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,uBAAA,EAAyB,KAAA;AAAA,UACzB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAED,MAAA,MAAM,IAAA,GAAO,MAAM,UAAA,CAAW,IAAA,EAAK;AACnC,MAAA,MAAM,UAAU,aAAA,CAAiC,IAAA,CAAK,IAAI,CAAA,CAAE,IAAI,CAAA,MAAA,MAAW;AAAA,QACzE,GAAG,MAAA;AAAA,QACH,QAAA,EAAU,aAAA,CAAc,MAAA,CAAO,QAAQ;AAAA,OACzC,CAAE,CAAA;AAEF,MAAA,OAAO;AAAA,QACL,OAAA;AAAA,QACA,KAAA;AAAA,QACA,IAAA;AAAA,QACA,OAAA,EAAS,kBAAA;AAAA,QACT,OAAA,EAAS,SAAS,OAAA,GAAU;AAAA,OAC9B;AAAA,IACF,SAAS6B,OAAA,EAAO;AACd,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,cAAA,EAAgB,QAAQ,CAAA;AAAA,UAC/D,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS;AAAA,YACP,GAAI,MAAA,EAAQ,UAAA,IAAc,EAAE,UAAA,EAAY,OAAO,UAAA,EAAW;AAAA,YAC1D,iBAAA,EAAmB,CAAC,CAAC,MAAA,EAAQ,QAAA;AAAA,YAC7B;AAAA;AACF,SACF;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,IAAA,EAMU;AAC7B,IAAA,MAAM,EAAE,UAAS,GAAI,IAAA;AAErB,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,EAAE,CAAA;AAGzC,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QAC7C,KAAA,EAAO,CAAA,wFAAA,EAA2FhC,sBAAc,CAAA,cAAA,EAAiB,WAAW,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,OAAO,CAAC,CAAA,QAAA,CAAU,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,QACvL,cAAc,UAAA,CAAW,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,EAAG,OAAO,EAAE,GAAG,GAAA,EAAK,CAAC,MAAM,CAAC,CAAA,CAAE,GAAG,CAAA,EAAE,CAAA,EAAI,EAAE,CAAA;AAAA,QAC/E,mBAAA,EAAqB;AAAA,UACnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,uBAAA,EAAyB,KAAA;AAAA,UACzB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAED,MAAA,MAAM,YAAA,GAAe,MAAM,cAAA,CAAe,IAAA,EAAK;AAC/C,MAAA,MAAM,gBAAA,GAAmB,aAAA,CAA+B,YAAA,CAAa,IAAI,CAAA;AAEzE,MAAA,IAAI,gBAAA,CAAiB,WAAW,CAAA,EAAG;AACjC,QAAA,OAAO,EAAC;AAAA,MACV;AAGA,MAAA,MAAM,sBAAA,GAAyB,gBAAA,CAAiB,GAAA,CAAI,CAAA,GAAA,KAAO;AACzD,QAAA,IAAI,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,EAAU;AACnC,UAAA,IAAI;AACF,YAAA,GAAA,CAAI,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA;AAAA,UACtC,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AACA,QAAA,OAAO,GAAA;AAAA,MACT,CAAC,CAAA;AAED,MAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAY;AAC1C,MAAA,MAAM,iBAAiC,EAAC;AAExC,MAAA,KAAA,MAAW,mBAAmB,sBAAA,EAAwB;AACpD,QAAA,MAAM,gBAAgB,QAAA,CAAS,IAAA,CAAK,OAAK,CAAA,CAAE,EAAA,KAAO,gBAAgB,EAAE,CAAA;AACpE,QAAA,IAAI,CAAC,aAAA,EAAe;AAEpB,QAAA,MAAM,EAAE,EAAA,EAAI,GAAG,cAAA,EAAe,GAAI,aAAA;AAClC,QAAA,IAAI,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA,CAAE,WAAW,CAAA,EAAG;AAE9C,QAAA,iBAAA,CAAkB,GAAA,CAAI,gBAAgB,QAAS,CAAA;AAC/C,QAAA,IAAI,aAAA,CAAc,QAAA,IAAY,aAAA,CAAc,QAAA,KAAa,gBAAgB,QAAA,EAAU;AACjF,UAAA,iBAAA,CAAkB,GAAA,CAAI,cAAc,QAAQ,CAAA;AAAA,QAC9C;AAEA,QAAA,MAAM,aAAuB,EAAC;AAC9B,QAAA,MAAM,SAAc,EAAC;AACrB,QAAA,IAAI,QAAA,GAAW,CAAA;AACf,QAAA,IAAI,UAAA,GAAkB,IAAA;AAEtB,QAAA,MAAM,eAAA,GAAkB,EAAE,GAAG,cAAA,EAAe;AAG5C,QAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,UAAA,MAAM,eAAA,GAAkB,eAAA,CAAgB,OAAA,IAAW,EAAC;AACpD,UAAA,MAAM,gBAAA,GAAmB,eAAA,CAAgB,QAAA,IAAY,EAAC;AACtD,UAAA,MAAM,cAAA,GAAiB,eAAA,CAAgB,OAAA,CAAQ,QAAA,IAAY,EAAC;AAE5D,UAAA,UAAA,GAAa;AAAA,YACX,GAAG,eAAA;AAAA,YACH,GAAG,eAAA,CAAgB,OAAA;AAAA;AAAA,YAEnB,QAAA,EAAU;AAAA,cACR,GAAG,gBAAA;AAAA,cACH,GAAG;AAAA;AACL,WACF;AAGA,UAAA,UAAA,CAAW,IAAA,CAAK,CAAA,uBAAA,EAA0B,QAAQ,CAAA,QAAA,CAAU,CAAA;AAC5D,UAAA,MAAA,CAAO,eAAe,QAAQ,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,UAAU,UAAU,CAAA;AAC7D,UAAA,QAAA,EAAA;AACA,UAAA,OAAO,eAAA,CAAgB,OAAA;AAAA,QACzB;AAGA,QAAA,KAAA,MAAW,OAAO,eAAA,EAAiB;AACjC,UAAA,IAAI,OAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,eAAA,EAAiB,GAAG,CAAA,EAAG;AAC9D,YAAA,MAAM,QAAA,GAAW,GAAA,KAAQ,UAAA,GAAa,WAAA,GAAc,GAAA;AACpD,YAAA,UAAA,CAAW,KAAK,CAAA,CAAA,EAAI,QAAQ,YAAY,GAAG,CAAA,CAAA,EAAI,QAAQ,CAAA,QAAA,CAAU,CAAA;AACjE,YAAA,MAAA,CAAO,OAAO,GAAG,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,CAAA,GAAI,gBAAgB,GAAmC,CAAA;AACtF,YAAA,QAAA,EAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,UAAA,MAAA,CAAO,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAE,CAAA,GAAI,EAAA;AAG/B,UAAA,MAAM,WAAA,GAAc;AAAA,4BAAA,EACAA,sBAAc;AAAA,uBAAA,EACnB,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC;AAAA,mCAAA,EACT,QAAQ,CAAA;AAAA,cAAA,CAAA;AAGnC,UAAA,OAAA,CAAQ,KAAK,mBAAA,EAAqB,EAAA,EAAI,aAAA,EAAe,WAAA,EAAa,WAAW,MAAM,CAAA;AAEnF,UAAA,cAAA,CAAe,IAAA;AAAA,YACb,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,cAClB,KAAA,EAAO,WAAA;AAAA,cACP,YAAA,EAAc,MAAA;AAAA,cACd,mBAAA,EAAqB;AAAA,gBACnB,sBAAA,EAAwB,aAAA;AAAA,gBACxB,oBAAA,EAAsB,CAAA;AAAA,gBACtB,uCAAA,EAAyC;AAAA;AAC3C,aACD;AAAA,WACH;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,QAAA,MAAM,OAAA,CAAQ,IAAI,cAAc,CAAA;AAAA,MAClC;AAGA,MAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,QACxB,KAAA,EAAO,kBAAkBA,sBAAc,CAAA,MAAA,CAAA;AAAA,QACvC,mBAAA,EAAqB;AAAA,UACnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAGD,MAAA,KAAA,MAAW,mBAAmB,sBAAA,EAAwB;AACpD,QAAA,MAAM,gBAAgB,QAAA,CAAS,IAAA,CAAK,OAAK,CAAA,CAAE,EAAA,KAAO,gBAAgB,EAAE,CAAA;AACpE,QAAA,IAAI,CAAC,aAAA,EAAe;AAEpB,QAAA,MAAM,EAAE,EAAA,EAAI,GAAG,cAAA,EAAe,GAAI,aAAA;AAClC,QAAA,IAAI,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA,CAAE,WAAW,CAAA,EAAG;AAG9C,QAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,UAC3C,KAAA,EAAO,2FAA2FA,sBAAc,CAAA,8BAAA,CAAA;AAAA,UAChH,YAAA,EAAc,EAAE,SAAA,EAAW,EAAA,EAAG;AAAA,UAC9B,mBAAA,EAAqB;AAAA,YACnB,sBAAA,EAAwB,aAAA;AAAA,YACxB,uBAAA,EAAyB,KAAA;AAAA,YACzB,oBAAA,EAAsB,CAAA;AAAA,YACtB,uCAAA,EAAyC;AAAA;AAC3C,SACD,CAAA;AAED,QAAA,MAAM,UAAA,GAAa,MAAM,YAAA,CAAa,IAAA,EAAK;AAC3C,QAAA,IAAI,UAAA,CAAW,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAC9B,UAAA,MAAM,cAAA,GAAiB,aAAA,CAA+B,UAAA,CAAW,IAAI,EAAE,CAAC,CAAA;AAExE,UAAA,IAAI,cAAA,EAAgB;AAElB,YAAA,IAAI,UAAA,GAAa,KAAA;AACjB,YAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,EAAG;AACzD,cAAA,IAAI,QAAQ,SAAA,EAAW;AAErB,gBAAA,MAAM,kBAAkB,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,IAAA,CAAK,UAAU,KAAK,CAAA;AAChF,gBAAA,MAAM,aAAA,GACJ,OAAO,cAAA,CAAe,OAAA,KAAY,QAAA,GAC9B,eAAe,OAAA,GACf,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,OAAO,CAAA;AAC3C,gBAAA,IAAI,kBAAkB,eAAA,EAAiB;AACrC,kBAAA,UAAA,GAAa,IAAA;AACb,kBAAA;AAAA,gBACF;AAAA,cACF,CAAA,MAAA,IAAW,cAAA,CAAe,GAA4B,CAAA,KAAM,KAAA,EAAO;AACjE,gBAAA,UAAA,GAAa,IAAA;AACb,gBAAA;AAAA,cACF;AAAA,YACF;AAEA,YAAA,IAAI,UAAA,EAAY;AACd,cAAA,OAAA,CAAQ,IAAA,CAAK,4EAA4E,EAAE,CAAA;AAE3F,cAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,gBACxB,KAAA,EAAO,eAAeA,sBAAc,CAAA,8BAAA,CAAA;AAAA,gBACpC,YAAA,EAAc,EAAE,SAAA,EAAW,EAAA,EAAG;AAAA,gBAC9B,mBAAA,EAAqB;AAAA,kBACnB,sBAAA,EAAwB,aAAA;AAAA,kBACxB,oBAAA,EAAsB,CAAA;AAAA,kBACtB,uCAAA,EAAyC;AAAA;AAC3C,eACD,CAAA;AAGD,cAAA,IAAI,cAAA,GAAiB,eAAA,CAAgB,OAAA,IAAW,EAAC;AACjD,cAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,gBAAA,MAAM,eAAA,GAAkB,eAAA,CAAgB,OAAA,IAAW,EAAC;AACpD,gBAAA,MAAM,gBAAA,GAAmB,eAAA,CAAgB,QAAA,IAAY,EAAC;AACtD,gBAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,OAAA,CAAQ,QAAA,IAAY,EAAC;AAE3D,gBAAA,cAAA,GAAiB;AAAA,kBACf,GAAG,eAAA;AAAA,kBACH,GAAG,cAAA,CAAe,OAAA;AAAA,kBAClB,QAAA,EAAU;AAAA,oBACR,GAAG,gBAAA;AAAA,oBACH,GAAG;AAAA;AACL,iBACF;AAAA,cACF;AAEA,cAAA,MAAM,kBAAA,GAAqB;AAAA,gBACzB,GAAG,eAAA;AAAA,gBACH,GAAG,cAAA;AAAA,gBACH,OAAA,EAAS;AAAA,eACX;AAEA,cAAA,MAAM,IAAA,CAAK,OAAO,MAAA,CAAO;AAAA,gBACvB,KAAA,EAAOA,sBAAAA;AAAA,gBACP,MAAA,EAAQ,aAAA;AAAA,gBACR,MAAA,EAAQ;AAAA,kBACN;AAAA,oBACE,IAAI,kBAAA,CAAmB,EAAA;AAAA,oBACvB,WAAW,kBAAA,CAAmB,QAAA;AAAA,oBAC9B,YAAY,kBAAA,CAAmB,UAAA;AAAA,oBAC/B,OAAA,EACE,OAAO,kBAAA,CAAmB,OAAA,KAAY,QAAA,GAClC,mBAAmB,OAAA,GACnB,IAAA,CAAK,SAAA,CAAU,kBAAA,CAAmB,OAAO,CAAA;AAAA,oBAC/C,SAAA,EAAW,kBAAA,CAAmB,SAAA,CAAU,WAAA,EAAY;AAAA,oBACpD,MAAM,kBAAA,CAAmB,IAAA;AAAA,oBACzB,IAAA,EAAM,mBAAmB,IAAA,IAAQ;AAAA;AACnC,iBACF;AAAA,gBACA,mBAAA,EAAqB;AAAA,kBACnB,sBAAA,EAAwB,aAAA;AAAA,kBACxB,oBAAA,EAAsB,CAAA;AAAA,kBACtB,uCAAA,EAAyC;AAAA;AAC3C,eACD,CAAA;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,iBAAA,CAAkB,OAAO,CAAA,EAAG;AAE9B,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAEpD,QAAA,MAAM,GAAA,GAAA,qBAAU,IAAA,EAAK,EAAE,aAAY,CAAE,OAAA,CAAQ,KAAK,EAAE,CAAA;AAGpD,QAAA,MAAM,uBAAuB,KAAA,CAAM,IAAA,CAAK,iBAAiB,CAAA,CAAE,GAAA,CAAI,OAAM,QAAA,KAAY;AAE/E,UAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,YAC3C,KAAA,EAAO,0DAA0DG,qBAAa,CAAA,6DAAA,CAAA;AAAA,YAC9E,YAAA,EAAc,EAAE,QAAA,EAAS;AAAA,YACzB,mBAAA,EAAqB;AAAA,cACnB,sBAAA,EAAwB,aAAA;AAAA,cACxB,uBAAA,EAAyB,KAAA;AAAA,cACzB,oBAAA,EAAsB,CAAA;AAAA,cACtB,uCAAA,EAAyC;AAAA;AAC3C,WACD,CAAA;AAED,UAAA,MAAM,UAAA,GAAa,MAAM,YAAA,CAAa,IAAA,EAAK;AAC3C,UAAA,IAAI,UAAA,CAAW,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAC9B,YAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA;AAGxC,YAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,cACxB,KAAA,EAAO,eAAeA,qBAAa,CAAA,6BAAA,CAAA;AAAA,cACnC,YAAA,EAAc,EAAE,QAAA,EAAS;AAAA,cACzB,mBAAA,EAAqB;AAAA,gBACnB,sBAAA,EAAwB,aAAA;AAAA,gBACxB,oBAAA,EAAsB,CAAA;AAAA,gBACtB,uCAAA,EAAyC;AAAA;AAC3C,aACD,CAAA;AAGD,YAAA,MAAM,IAAA,CAAK,OAAO,MAAA,CAAO;AAAA,cACvB,KAAA,EAAOA,qBAAAA;AAAA,cACP,MAAA,EAAQ,aAAA;AAAA,cACR,MAAA,EAAQ;AAAA,gBACN;AAAA,kBACE,IAAI,cAAA,CAAe,EAAA;AAAA,kBACnB,YAAY,cAAA,CAAe,UAAA;AAAA,kBAC3B,OAAO,cAAA,CAAe,KAAA;AAAA,kBACtB,QAAA,EACE,OAAO,cAAA,CAAe,QAAA,KAAa,WAC/B,cAAA,CAAe,QAAA,GACf,iBAAA,CAAkB,cAAA,CAAe,QAAmC,CAAA;AAAA,kBAC1E,WAAW,cAAA,CAAe,SAAA;AAAA,kBAC1B,SAAA,EAAW;AAAA;AACb,eACF;AAAA,cACA,mBAAA,EAAqB;AAAA,gBACnB,sBAAA,EAAwB,aAAA;AAAA,gBACxB,oBAAA,EAAsB,CAAA;AAAA,gBACtB,uCAAA,EAAyC;AAAA;AAC3C,aACD,CAAA;AAAA,UACH;AAAA,QACF,CAAC,CAAA;AAED,QAAA,MAAM,OAAA,CAAQ,IAAI,oBAAoB,CAAA;AAAA,MACxC;AAGA,MAAA,MAAM,kBAAqC,EAAC;AAC5C,MAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,QAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,UAC5C,KAAA,EAAO,2FAA2FH,sBAAc,CAAA,8BAAA,CAAA;AAAA,UAChH,YAAA,EAAc,EAAE,SAAA,EAAU;AAAA,UAC1B,mBAAA,EAAqB;AAAA,YACnB,sBAAA,EAAwB,aAAA;AAAA,YACxB,uBAAA,EAAyB,KAAA;AAAA,YACzB,oBAAA,EAAsB,CAAA;AAAA,YACtB,uCAAA,EAAyC;AAAA;AAC3C,SACD,CAAA;AACD,QAAA,MAAM,WAAA,GAAc,MAAM,aAAA,CAAc,IAAA,EAAK;AAC7C,QAAA,IAAI,WAAA,CAAY,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAC/B,UAAA,MAAM,OAAA,GAAU,aAAA,CAA+B,WAAA,CAAY,IAAI,EAAE,CAAC,CAAA;AAClE,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,eAAA,CAAgB,KAAK,OAAO,CAAA;AAAA,UAC9B;AAAA,QACF;AAAA,MACF;AAGA,MAAA,OAAO,eAAA,CAAgB,IAAI,CAAA,OAAA,KAAW;AACpC,QAAA,IAAI,OAAO,OAAA,CAAQ,OAAA,KAAY,QAAA,EAAU;AACvC,UAAA,IAAI;AACF,YAAA,OAAA,CAAQ,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA;AAAA,UAC9C,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AACA,QAAA,OAAO,OAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,SAASgC,OAAA,EAAO;AACd,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,iBAAA,EAAmB,QAAQ,CAAA;AAAA,UAClE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,UAAA,EAAY,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAE,SAC3D;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,eAAA,CAAgB,EAAE,UAAA,EAAW,EAAgE;AACjG,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QACrC,KAAA,EAAO,iEAAiE3B,uBAAe,CAAA,+DAAA,CAAA;AAAA,QACvF,YAAA,EAAc,EAAE,UAAA,EAAW;AAAA,QAC3B,mBAAA,EAAqB;AAAA,UACnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,uBAAA,EAAyB,KAAA;AAAA,UACzB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAED,MAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,EAAK;AAC/B,MAAA,IAAI,IAAA,CAAK,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC1B,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AAC5B,MAAA,OAAO;AAAA,QACL,IAAI,QAAA,CAAS,EAAA;AAAA,QACb,aAAA,EACE,QAAA,CAAS,aAAA,IAAiB,OAAO,QAAA,CAAS,aAAA,KAAkB,QAAA,GACxD,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,aAAa,CAAA,GACrC,QAAA,CAAS,aAAA;AAAA,QACf,QAAA,EAAU,aAAA,CAAc,QAAA,CAAS,QAAQ,CAAA;AAAA,QACzC,SAAA,EAAW,IAAI,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA;AAAA,QACtC,SAAA,EAAW,IAAI,IAAA,CAAK,QAAA,CAAS,SAAS;AAAA,OACxC;AAAA,IACF,SAAS2B,OAAA,EAAO;AACd,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,oBAAA,EAAsB,QAAQ,CAAA;AAAA,UACrE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,UAAA;AAAW,SACxB;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,YAAA,CAAa,EAAE,QAAA,EAAS,EAAoE;AAChG,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,OAAO,MAAA,CAAO;AAAA,QACvB,KAAA,EAAO3B,uBAAAA;AAAA,QACP,MAAA,EAAQ,aAAA;AAAA,QACR,MAAA,EAAQ;AAAA,UACN;AAAA,YACE,IAAI,QAAA,CAAS,EAAA;AAAA,YACb,eAAe,QAAA,CAAS,aAAA;AAAA,YACxB,QAAA,EAAU,iBAAA,CAAkB,QAAA,CAAS,QAAQ,CAAA;AAAA,YAC7C,SAAA,EAAW,QAAA,CAAS,SAAA,CAAU,WAAA,EAAY;AAAA,YAC1C,SAAA,EAAW,QAAA,CAAS,SAAA,CAAU,WAAA;AAAY;AAC5C,SACF;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAGD,MAAA,OAAO;AAAA,QACL,GAAG,QAAA;AAAA,QACH,QAAA,EAAU,QAAA,CAAS,QAAA,IAAY;AAAC,OAClC;AAAA,IACF,SAAS2B,OAAA,EAAO;AACd,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,eAAA,EAAiB,QAAQ,CAAA;AAAA,UAChE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,UAAA,EAAY,QAAA,CAAS,EAAA;AAAG,SACrC;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,cAAA,CAAe;AAAA,IACnB,UAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF,EAIiC;AAC/B,IAAA,IAAI;AACF,MAAA,MAAM,mBAAmB,MAAM,IAAA,CAAK,eAAA,CAAgB,EAAE,YAAY,CAAA;AAElE,MAAA,IAAI,CAAC,gBAAA,EAAkB;AAErB,QAAA,MAAM,WAAA,GAAmC;AAAA,UACvC,EAAA,EAAI,UAAA;AAAA,UACJ,aAAA;AAAA,UACA,QAAA,EAAU,YAAY,EAAC;AAAA,UACvB,SAAA,sBAAe,IAAA,EAAK;AAAA,UACpB,SAAA,sBAAe,IAAA;AAAK,SACtB;AACA,QAAA,OAAO,IAAA,CAAK,YAAA,CAAa,EAAE,QAAA,EAAU,aAAa,CAAA;AAAA,MACpD;AAEA,MAAA,MAAM,eAAA,GAAkB;AAAA,QACtB,GAAG,gBAAA;AAAA,QACH,aAAA,EAAe,aAAA,KAAkB,MAAA,GAAY,aAAA,GAAgB,gBAAA,CAAiB,aAAA;AAAA,QAC9E,QAAA,EAAU;AAAA,UACR,GAAG,gBAAA,CAAiB,QAAA;AAAA,UACpB,GAAG;AAAA,SACL;AAAA,QACA,SAAA,sBAAe,IAAA;AAAK,OACtB;AAGA,MAAA,MAAM,WAAA,GAAc;AAAA,wBAAA,EACA3B,uBAAe;AAAA;AAAA;AAAA,UAAA,CAAA;AAKnC,MAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,QACxB,KAAA,EAAO,WAAA;AAAA,QACP,YAAA,EAAc;AAAA,UACZ,eAAe,eAAA,CAAgB,aAAA;AAAA,UAC/B,QAAA,EAAU,IAAA,CAAK,SAAA,CAAU,eAAA,CAAgB,QAAQ,CAAA;AAAA,UACjD,WAAW,eAAA,CAAgB,SAAA,CAAU,aAAY,CAAE,OAAA,CAAQ,KAAK,EAAE,CAAA;AAAA,UAClE;AAAA,SACF;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAGD,MAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,QACxB,KAAA,EAAO,kBAAkBA,uBAAe,CAAA,MAAA,CAAA;AAAA,QACxC,mBAAA,EAAqB;AAAA,UACnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAED,MAAA,OAAO,eAAA;AAAA,IACT,SAAS2B,OAAA,EAAO;AACd,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,iBAAA,EAAmB,QAAQ,CAAA;AAAA,UAClE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,UAAA;AAAW,SACxB;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACF;ACriDO,IAAM,8BAAA,GAAN,cAA6CgB,4BAAA,CAAqB;AAAA,EAC7D,MAAA;AAAA,EACV,GAAA;AAAA,EAEA,YAAY,MAAA,EAAgC;AAC1C,IAAA,KAAA,EAAM;AACN,IAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,EAAI,GAAI,wBAAwB,MAAM,CAAA;AACtD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAM,IAAI,YAAA,CAAa,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,IAAA,GAAsB;AAE1B,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,GAAA,CAAI,0BAA0B1C,mBAAW,CAAA;AAE5E,IAAA,IAAI,gBAAgB,cAAA,EAAgB;AASlC,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,GAAA,CAAI,uBAAuBA,mBAAW,CAAA;AACvE,MAAA,MAAM,gBAAA,GAAmB,cAAc,aAAA,GACnC;AAAA,MAAA,EAAW,cAAc,cAAc,CAAA;AAAA,CAAA,GACvC,EAAA;AAEJ,MAAA,MAAM,YAAA,GACJ;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,CAAA,GAOA,gBAAA,GACA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AAcF,MAAA,MAAM,IAAI2B,iBAAAA,CAAY;AAAA,QACpB,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,oBAAA,EAAsB,oBAAoB,CAAA;AAAA,QACjF,QAAQC,iBAAAA,CAAY,OAAA;AAAA,QACpB,UAAUC,mBAAAA,CAAc,IAAA;AAAA,QACxB,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,IAAA,CAAK,IAAI,WAAA,CAAY,EAAE,WAAW9B,mBAAAA,EAAa,MAAA,EAAQ2C,qBAAa,CAAA;AAE1E,IAAA,MAAM,IAAA,CAAK,IAAI,UAAA,CAAW;AAAA,MACxB,SAAA,EAAW3C,mBAAAA;AAAA,MACX,MAAA,EAAQ2C,mBAAA;AAAA,MACR,WAAA,EAAa,CAAC,gBAAgB;AAAA,KAC/B,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,mBAAA,GAAqC;AACzC,IAAA,MAAM,KAAK,GAAA,CAAI,UAAA,CAAW,EAAE,SAAA,EAAW3C,qBAAa,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YAAA,GAKH;AAED,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,GAAA,CAAI,0BAA0BA,mBAAW,CAAA;AAE5E,IAAA,IAAI,CAAC,gBAAgB,cAAA,EAAgB;AACnC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,eAAA,EAAiB,IAAA;AAAA,QACjB,iBAAA,EAAmB,CAAA;AAAA,QACnB,OAAA,EAAS,CAAA,gEAAA;AAAA,OACX;AAAA,IACF;AAGA,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,GAAA,CAAI,uBAAuBA,mBAAW,CAAA;AAEvE,IAAA,IAAI,cAAc,aAAA,EAAe;AAC/B,MAAA,IAAA,CAAK,MAAA,EAAQ,IAAA;AAAA,QACX,CAAA,MAAA,EAAS,cAAc,cAAc,CAAA,mFAAA;AAAA,OACvC;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA,2DAAA,CAA6D,CAAA;AAAA,IACnF;AAGA,IAAA,MAAM,IAAA,CAAK,IAAI,2BAAA,CAA4B,EAAE,WAAWA,mBAAAA,EAAa,MAAA,EAAQ2C,qBAAa,CAAA;AAE1F,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,eAAA,EAAiB,KAAA;AAAA,MACjB,mBAAmB,aAAA,CAAc,cAAA;AAAA,MACjC,SAAS,aAAA,CAAc,aAAA,GACnB,sEAAsE3C,mBAAW,CAAA,CAAA,CAAA,GACjF,+CAA+CA,mBAAW,CAAA,CAAA;AAAA,KAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,yBAAA,GAMH;AACD,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,GAAA,CAAI,0BAA0BA,mBAAW,CAAA;AAE5E,IAAA,IAAI,CAAC,gBAAgB,cAAA,EAAgB;AACnC,MAAA,OAAO;AAAA,QACL,cAAA,EAAgB,KAAA;AAAA,QAChB,aAAA,EAAe,KAAA;AAAA,QACf,cAAA,EAAgB,CAAA;AAAA,QAChB,gBAAA,EAAkB,IAAA;AAAA,QAClB,SAAA,EAAWA;AAAA,OACb;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,GAAA,CAAI,uBAAuBA,mBAAW,CAAA;AACvE,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,IAAA;AAAA,MAChB,eAAe,aAAA,CAAc,aAAA;AAAA,MAC7B,gBAAgB,aAAA,CAAc,cAAA;AAAA,MAC9B,gBAAA,EAAkB,KAAA;AAAA,MAClB,SAAA,EAAWA;AAAA,KACb;AAAA,EACF;AAAA,EAEA,IAAoB,eAAA,GAGlB;AAIA,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,aAAA;AAAA,MACX,SAAA,EAAW,CAAC,aAAa;AAAA,KAC3B;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,IAAA,EAAqC;AACpD,IAAA,MAAM,EAAE,MAAK,GAAI,IAAA;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,GAAG,IAAA;AAAA;AAAA,QAEH,SAAA,EAAW,KAAK,SAAA,YAAqB,IAAA,GAAO,KAAK,SAAA,CAAU,OAAA,KAAY,IAAA,CAAK,SAAA;AAAA,QAC5E,OAAA,EAAS,KAAK,OAAA,YAAmB,IAAA,GAAO,KAAK,OAAA,CAAQ,OAAA,KAAY,IAAA,CAAK,OAAA;AAAA,QACtE,SAAA,EAAW,GAAA;AAAA,QACX,SAAA,EAAW;AAAA,OACb;AACA,MAAA,MAAM,KAAK,GAAA,CAAI,MAAA,CAAO,EAAE,SAAA,EAAWA,mBAAAA,EAAa,QAAQ,CAAA;AAAA,IAC1D,SAAS0B,OAAA,EAAO;AACd,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,aAAA,EAAe,QAAQ,CAAA;AAAA,UAC9D,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS;AAAA,YACP,QAAQ,IAAA,CAAK,MAAA;AAAA,YACb,SAAS,IAAA,CAAK,OAAA;AAAA,YACd,UAAU,IAAA,CAAK,QAAA;AAAA,YACf,UAAU,IAAA,CAAK;AAAA;AACjB,SACF;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,IAAA,EAAoD;AAChE,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,IAAA;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc1B,mBAAW,CAAA,IAAK,aAAA;AAC7C,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QACrC,KAAA,EAAO;AAAA;AAAA,eAAA,EAEEA,mBAAW,CAAA,CAAA,EAAI,MAAA,CAAO,WAAW,oBAAoB,CAAA,GAAI,UAAU,EAAE;AAAA;AAAA;AAAA,QAAA,CAAA;AAAA,QAI9E,YAAA,EAAc,EAAE,OAAA,EAAS,MAAA,EAAO;AAAA,QAChC,MAAA,EAAQ,aAAA;AAAA,QACR,mBAAA,EAAqB;AAAA,UACnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,uBAAA,EAAyB,KAAA;AAAA,UACzB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAED,MAAA,MAAM,IAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAK;AAChC,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC9B,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,KAAA,GAAQ,cAAc,IAAI,CAAA;AAChC,MAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB,SAAS0B,OAAA,EAAO;AACd,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,UAAA,EAAY,QAAQ,CAAA;AAAA,UAC3D,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,OAAA,EAAS,MAAA;AAAO,SAC7B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,IAAA,EAA4D;AAC5E,IAAA,MAAM,EAAE,SAAQ,GAAI,IAAA;AACpB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc1B,mBAAW,CAAA,IAAK,aAAA;AAC7C,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QACrC,KAAA,EAAO;AAAA;AAAA,eAAA,EAEEA,mBAAW,CAAA,CAAA,EAAI,MAAA,CAAO,WAAW,oBAAoB,CAAA,GAAI,UAAU,EAAE;AAAA;AAAA;AAAA,QAAA,CAAA;AAAA,QAI9E,YAAA,EAAc,EAAE,OAAA,EAAQ;AAAA,QACxB,MAAA,EAAQ,aAAA;AAAA,QACR,mBAAA,EAAqB;AAAA,UACnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,uBAAA,EAAyB,KAAA;AAAA,UACzB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAED,MAAA,MAAM,IAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAK;AAChC,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC9B,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,KAAA,GAAQ,cAAc,IAAI,CAAA;AAChC,MAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB,SAAS0B,OAAA,EAAO;AACd,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,eAAA,EAAiB,QAAQ,CAAA;AAAA,UAChE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,OAAA;AAAQ,SACrB;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,IAAA,EAAsD;AACnE,IAAA,MAAM,EAAE,SAAQ,GAAI,IAAA;AACpB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc1B,mBAAW,CAAA,IAAK,aAAA;AAC7C,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QACrC,KAAA,EAAO;AAAA;AAAA,eAAA,EAEEA,mBAAW,CAAA,CAAA,EAAI,MAAA,CAAO,WAAW,oBAAoB,CAAA,GAAI,UAAU,EAAE;AAAA;AAAA;AAAA,QAAA,CAAA;AAAA,QAI9E,YAAA,EAAc,EAAE,OAAA,EAAQ;AAAA,QACxB,MAAA,EAAQ,aAAA;AAAA,QACR,mBAAA,EAAqB;AAAA,UACnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,uBAAA,EAAyB,KAAA;AAAA,UACzB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAED,MAAA,MAAM,IAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAK;AAChC,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC9B,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO;AAAA,QACL,OAAA;AAAA,QACA,KAAA,EAAO,cAAc,IAAI;AAAA,OAC3B;AAAA,IACF,SAAS0B,OAAA,EAAO;AACd,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,WAAA,EAAa,QAAQ,CAAA;AAAA,UAC5D,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,OAAA;AAAQ,SACrB;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,IAAA,EAA2D;AAC7E,IAAA,MAAM,EAAE,SAAQ,GAAI,IAAA;AACpB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc1B,mBAAW,CAAA,IAAK,aAAA;AAC7C,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QACrC,KAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,eAAA,EAKEA,mBAAW,CAAA,CAAA,EAAI,MAAA,CAAO,WAAW,oBAAoB,CAAA,GAAI,UAAU,EAAE;AAAA;AAAA;AAAA,QAAA,CAAA;AAAA,QAI9E,YAAA,EAAc,EAAE,OAAA,EAAQ;AAAA,QACxB,MAAA,EAAQ,aAAA;AAAA,QACR,mBAAA,EAAqB;AAAA,UACnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,uBAAA,EAAyB,KAAA;AAAA,UACzB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAED,MAAA,MAAM,IAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAK;AAChC,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC9B,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO;AAAA,QACL,OAAA;AAAA,QACA,KAAA,EAAO,cAAc,IAAI;AAAA,OAC3B;AAAA,IACF,SAAS0B,OAAA,EAAO;AACd,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,iBAAA,EAAmB,QAAQ,CAAA;AAAA,UAClE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,OAAA;AAAQ,SACrB;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,IAAA,EAAqC;AACpD,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAQ,GAAI,IAAA;AACrC,IAAA,IAAI;AAEF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAiB;AAAA,QAC/C,SAAA,EAAW1B,mBAAAA;AAAA,QACX,IAAA,EAAM,EAAE,MAAA,EAAQ,OAAA;AAAQ,OACzB,CAAA;AAED,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,MAAM,IAAI2B,iBAAAA,CAAY;AAAA,UACpB,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,aAAA,EAAe,WAAW,CAAA;AAAA,UACjE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,MAAA,EAAQ,OAAA;AAAQ,SAC5B,CAAA;AAAA,MACH;AAGA,MAAA,MAAM,IAAA,GAA4B,EAAE,GAAG,OAAA,EAAQ;AAC/C,MAAA,IAAI,IAAA,CAAK,mBAAmB,IAAA,EAAM;AAChC,QAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAQ;AAAA,MACtC;AACA,MAAA,IAAI,IAAA,CAAK,qBAAqB,IAAA,EAAM;AAClC,QAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,OAAA,EAAQ;AAAA,MAC1C;AAGA,MAAA,MAAM,OAAA,GAAU;AAAA,QACd,GAAG,QAAA;AAAA,QACH,GAAG,IAAA;AAAA,QACH,SAAA,EAAW,KAAK,GAAA;AAAI,OACtB;AAEA,MAAA,MAAM,IAAA,CAAK,OAAO,MAAA,CAAO;AAAA,QACvB,KAAA,EAAO9B,mBAAAA;AAAA,QACP,MAAA,EAAQ,CAAC,OAAO,CAAA;AAAA,QAChB,MAAA,EAAQ,aAAA;AAAA,QACR,mBAAA,EAAqB;AAAA,UACnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAAA,IACH,SAAS0B,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,aAAA,EAAe,QAAQ,CAAA;AAAA,UAC9D,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,MAAA,EAAQ,OAAA;AAAQ,SAC7B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,IAAA,EAAmD;AAElE,IAAA,MAAM,EAAE,OAAA,EAAS,UAAA,EAAY,SAAQ,GAAIkB,4BAAA,CAAqB,MAAM,IAAI,CAAA;AACxE,IAAA,MAAM,IAAA,GAAO,YAAY,IAAA,IAAQ,CAAA;AACjC,IAAA,MAAM,OAAA,GAAU,YAAY,OAAA,IAAW,EAAA;AAEvC,IAAA,IAAI;AAEF,MAAA,MAAM,UAAA,GAAuB,CAAC,CAAA,2CAAA,CAA6C,CAAA;AAC3E,MAAA,MAAM,SAA8B,EAAC;AACrC,MAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,MAAA,IAAI,OAAA,EAAS;AAEX,QAAA,IAAI,OAAA,CAAQ,WAAW,KAAA,EAAO;AAC5B,UAAA,UAAA,CAAW,KAAK,CAAA,2CAAA,CAA6C,CAAA;AAE7D,UAAA,MAAA,CAAO,cAAA,GAAiB,OAAA,CAAQ,SAAA,CAAU,KAAA,CAAM,OAAA,EAAQ;AAAA,QAC1D;AACA,QAAA,IAAI,OAAA,CAAQ,WAAW,GAAA,EAAK;AAC1B,UAAA,UAAA,CAAW,KAAK,CAAA,yCAAA,CAA2C,CAAA;AAC3D,UAAA,MAAA,CAAO,YAAA,GAAe,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAI,OAAA,EAAQ;AAAA,QACtD;AACA,QAAA,IAAI,OAAA,CAAQ,SAAS,KAAA,EAAO;AAC1B,UAAA,UAAA,CAAW,KAAK,CAAA,uCAAA,CAAyC,CAAA;AACzD,UAAA,MAAA,CAAO,YAAA,GAAe,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,OAAA,EAAQ;AAAA,QACtD;AACA,QAAA,IAAI,OAAA,CAAQ,SAAS,GAAA,EAAK;AACxB,UAAA,UAAA,CAAW,KAAK,CAAA,qCAAA,CAAuC,CAAA;AACvD,UAAA,MAAA,CAAO,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,OAAA,EAAQ;AAAA,QAClD;AAGA,QAAA,IAAI,OAAA,CAAQ,aAAa,MAAA,EAAW;AAClC,UAAA,UAAA,CAAW,KAAK,CAAA,4BAAA,CAA8B,CAAA;AAC9C,UAAA,MAAA,CAAO,WAAW,OAAA,CAAQ,QAAA;AAAA,QAC5B;AAGA,QAAA,IAAI,OAAA,CAAQ,eAAe,MAAA,EAAW;AACpC,UAAA,UAAA,CAAW,KAAK,CAAA,gCAAA,CAAkC,CAAA;AAClD,UAAA,MAAA,CAAO,aAAa,OAAA,CAAQ,UAAA;AAAA,QAC9B;AACA,QAAA,IAAI,OAAA,CAAQ,aAAa,MAAA,EAAW;AAClC,UAAA,UAAA,CAAW,KAAK,CAAA,4BAAA,CAA8B,CAAA;AAC9C,UAAA,MAAA,CAAO,WAAW,OAAA,CAAQ,QAAA;AAAA,QAC5B;AACA,QAAA,IAAI,OAAA,CAAQ,eAAe,MAAA,EAAW;AACpC,UAAA,UAAA,CAAW,KAAK,CAAA,gCAAA,CAAkC,CAAA;AAClD,UAAA,MAAA,CAAO,aAAa,OAAA,CAAQ,UAAA;AAAA,QAC9B;AAGA,QAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAW;AAChC,UAAA,UAAA,CAAW,KAAK,CAAA,wBAAA,CAA0B,CAAA;AAC1C,UAAA,MAAA,CAAO,SAAS,OAAA,CAAQ,MAAA;AAAA,QAC1B;AACA,QAAA,IAAI,OAAA,CAAQ,mBAAmB,MAAA,EAAW;AACxC,UAAA,UAAA,CAAW,KAAK,CAAA,wCAAA,CAA0C,CAAA;AAC1D,UAAA,MAAA,CAAO,iBAAiB,OAAA,CAAQ,cAAA;AAAA,QAClC;AACA,QAAA,IAAI,OAAA,CAAQ,eAAe,MAAA,EAAW;AACpC,UAAA,UAAA,CAAW,KAAK,CAAA,gCAAA,CAAkC,CAAA;AAClD,UAAA,MAAA,CAAO,aAAa,OAAA,CAAQ,UAAA;AAAA,QAC9B;AAGA,QAAA,IAAI,OAAA,CAAQ,UAAU,MAAA,EAAW;AAC/B,UAAA,UAAA,CAAW,KAAK,CAAA,sBAAA,CAAwB,CAAA;AACxC,UAAA,MAAA,CAAO,QAAQ,OAAA,CAAQ,KAAA;AAAA,QACzB;AACA,QAAA,IAAI,OAAA,CAAQ,cAAc,MAAA,EAAW;AACnC,UAAA,UAAA,CAAW,KAAK,CAAA,8BAAA,CAAgC,CAAA;AAChD,UAAA,MAAA,CAAO,YAAY,OAAA,CAAQ,SAAA;AAAA,QAC7B;AACA,QAAA,IAAI,OAAA,CAAQ,aAAa,MAAA,EAAW;AAClC,UAAA,UAAA,CAAW,KAAK,CAAA,4BAAA,CAA8B,CAAA;AAC9C,UAAA,MAAA,CAAO,WAAW,OAAA,CAAQ,QAAA;AAAA,QAC5B;AACA,QAAA,IAAI,OAAA,CAAQ,cAAc,MAAA,EAAW;AACnC,UAAA,UAAA,CAAW,KAAK,CAAA,8BAAA,CAAgC,CAAA;AAChD,UAAA,MAAA,CAAO,YAAY,OAAA,CAAQ,SAAA;AAAA,QAC7B;AAGA,QAAA,IAAI,OAAA,CAAQ,gBAAgB,MAAA,EAAW;AACrC,UAAA,UAAA,CAAW,KAAK,CAAA,kCAAA,CAAoC,CAAA;AACpD,UAAA,MAAA,CAAO,cAAc,OAAA,CAAQ,WAAA;AAAA,QAC/B;AACA,QAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAW;AAChC,UAAA,UAAA,CAAW,KAAK,CAAA,wBAAA,CAA0B,CAAA;AAC1C,UAAA,MAAA,CAAO,SAAS,OAAA,CAAQ,MAAA;AAAA,QAC1B;AACA,QAAA,IAAI,OAAA,CAAQ,gBAAgB,MAAA,EAAW;AACrC,UAAA,UAAA,CAAW,KAAK,CAAA,kCAAA,CAAoC,CAAA;AACpD,UAAA,MAAA,CAAO,cAAc,OAAA,CAAQ,WAAA;AAAA,QAC/B;AAGA,QAAA,IAAI,OAAA,CAAQ,SAAS,IAAA,EAAM;AACzB,UAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,EAAG;AAExD,YAAA,IAAI,CAAC,0BAAA,CAA2B,IAAA,CAAK,GAAG,CAAA,EAAG;AACzC,cAAA,MAAM,IAAIjB,iBAAAA,CAAY;AAAA,gBACpB,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,aAAA,EAAe,oBAAoB,CAAA;AAAA,gBAC1E,QAAQC,iBAAAA,CAAY,OAAA;AAAA,gBACpB,UAAUC,mBAAAA,CAAc,IAAA;AAAA,gBACxB,OAAA,EAAS,EAAE,GAAA;AAAI,eAChB,CAAA;AAAA,YACH;AACA,YAAA,MAAM,SAAA,GAAY,CAAA,MAAA,EAAS,GAAG,CAAA,CAAA,EAAI,UAAA,EAAY,CAAA,CAAA;AAC9C,YAAA,UAAA,CAAW,IAAA,CAAK,CAAA,0BAAA,EAA6B,GAAG,CAAA,MAAA,EAAS,SAAS,CAAA,QAAA,CAAU,CAAA;AAC5E,YAAA,MAAA,CAAO,SAAS,IAAI,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,UAC9E;AAAA,QACF;AAGA,QAAA,IAAI,OAAA,CAAQ,YAAY,IAAA,EAAM;AAC5B,UAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAE3D,YAAA,IAAI,CAAC,0BAAA,CAA2B,IAAA,CAAK,GAAG,CAAA,EAAG;AACzC,cAAA,MAAM,IAAIH,iBAAAA,CAAY;AAAA,gBACpB,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,aAAA,EAAe,oBAAoB,CAAA;AAAA,gBAC1E,QAAQC,iBAAAA,CAAY,OAAA;AAAA,gBACpB,UAAUC,mBAAAA,CAAc,IAAA;AAAA,gBACxB,OAAA,EAAS,EAAE,GAAA;AAAI,eAChB,CAAA;AAAA,YACH;AACA,YAAA,MAAM,SAAA,GAAY,CAAA,SAAA,EAAY,GAAG,CAAA,CAAA,EAAI,UAAA,EAAY,CAAA,CAAA;AACjD,YAAA,UAAA,CAAW,IAAA,CAAK,CAAA,6BAAA,EAAgC,GAAG,CAAA,MAAA,EAAS,SAAS,CAAA,QAAA,CAAU,CAAA;AAC/E,YAAA,MAAA,CAAO,SAAS,IAAI,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,UAC9E;AAAA,QACF;AAIA,QAAA,IAAI,QAAQ,IAAA,IAAQ,IAAA,IAAQ,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,EAAG;AACnD,UAAA,KAAA,MAAW,GAAA,IAAO,QAAQ,IAAA,EAAM;AAC9B,YAAA,MAAM,SAAA,GAAY,OAAO,UAAA,EAAY,CAAA,CAAA;AACrC,YAAA,UAAA,CAAW,IAAA,CAAK,CAAA,yCAAA,EAA4C,SAAS,CAAA,SAAA,CAAW,CAAA;AAChF,YAAA,MAAA,CAAO,SAAS,CAAA,GAAI,GAAA;AAAA,UACtB;AAAA,QACF;AAGA,QAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAW;AAChC,UAAA,QAAQ,QAAQ,MAAA;AAAQ,YACtB,KAAKe,mBAAA,CAAY,KAAA;AAEf,cAAA,UAAA,CAAW,KAAK,CAAA,mCAAA,CAAqC,CAAA;AACrD,cAAA;AAAA,YACF,KAAKA,mBAAA,CAAY,OAAA;AAGf,cAAA,UAAA,CAAW,KAAK,CAAA,iDAAA,CAAmD,CAAA;AACnE,cAAA;AAAA,YACF,KAAKA,mBAAA,CAAY,OAAA;AAGf,cAAA,UAAA,CAAW,KAAK,CAAA,qDAAA,CAAuD,CAAA;AACvE,cAAA;AAAA;AACJ,QACF;AAGA,QAAA,IAAI,OAAA,CAAQ,kBAAkB,MAAA,EAAW;AACvC,UAAA,MAAMC,OAAAA,GAAS,aAAA,CAAc9C,mBAAW,CAAA,IAAK,aAAA;AAC7C,UAAA,MAAM+C,YAAAA,GAAcD,OAAAA,CAAO,UAAA,CAAW,oBAAoB,IAAI,OAAA,GAAU,EAAA;AACxE,UAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,YAAA,UAAA,CAAW,IAAA,CAAK,CAAA;AAAA,4BAAA,EACE9C,mBAAW,IAAI+C,YAAW,CAAA;AAAA,gCAAA,EACtB/C,mBAAW,CAAA;AAAA,aAAA,CAC/B,CAAA;AAAA,UACJ,CAAA,MAAO;AACL,YAAA,UAAA,CAAW,IAAA,CAAK,CAAA;AAAA,4BAAA,EACEA,mBAAW,IAAI+C,YAAW,CAAA;AAAA,gCAAA,EACtB/C,mBAAW,CAAA;AAAA,aAAA,CAC/B,CAAA;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAEA,MAAA,MAAM,WAAA,GAAc,WAAW,MAAA,GAAS,CAAA,GAAI,SAAS,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAClF,MAAA,MAAM,MAAA,GAAS,aAAA,CAAcA,mBAAW,CAAA,IAAK,aAAA;AAC7C,MAAA,MAAM,WAAA,GAAc,MAAA,CAAO,UAAA,CAAW,oBAAoB,IAAI,OAAA,GAAU,EAAA;AAOxE,MAAA,MAAM,SAAA,GAAY,SAAS,KAAA,IAAS,WAAA;AACpC,MAAA,MAAM,aAAA,GAAgB,SAAS,SAAA,IAAa,MAAA;AAC5C,MAAA,IAAI,WAAA;AACJ,MAAA,IAAI,cAAc,SAAA,EAAW;AAI3B,QAAA,MAAM,aAAA,GAAgB,aAAA,KAAkB,MAAA,GAAS,CAAA,GAAI,CAAA;AACrD,QAAA,MAAM,gBAAA,GAAmB,aAAA,KAAkB,MAAA,GAAS,CAAA,GAAI,CAAA;AACxD,QAAA,WAAA,GAAc,CAAA,mBAAA,EAAsB,SAAS,CAAA,cAAA,EAAiB,aAAa,SAAS,gBAAgB,CAAA,MAAA,EAAS,SAAS,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA;AAAA,MACzI,CAAA,MAAO;AACL,QAAA,WAAA,GAAc,CAAA,SAAA,EAAY,SAAS,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA;AAAA,MACtD;AAGA,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QAC1C,OAAO,CAAA,8BAAA,EAAiCA,mBAAW,CAAA,CAAA,EAAI,WAAW,IAAI,WAAW,CAAA,CAAA;AAAA,QACjF,YAAA,EAAc,MAAA;AAAA,QACd,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,MAAM,SAAA,GAAa,MAAM,WAAA,CAAY,IAAA,EAAK;AAC1C,MAAA,MAAM,QAAQ,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,EAAG,SAAS,CAAC,CAAA;AAE7C,MAAA,IAAI,UAAU,CAAA,EAAG;AACf,QAAA,OAAO;AAAA,UACL,YAAY,EAAE,KAAA,EAAO,GAAG,IAAA,EAAM,OAAA,EAAS,SAAS,KAAA,EAAM;AAAA,UACtD,OAAO;AAAC,SACV;AAAA,MACF;AAGA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QACrC,KAAA,EAAO;AAAA;AAAA,eAAA,EAEEA,mBAAW,IAAI,WAAW;AAAA,UAAA,EAC/B,WAAW;AAAA,UAAA,EACX,WAAW;AAAA;AAAA;AAAA,QAAA,CAAA;AAAA,QAIf,YAAA,EAAc,EAAE,GAAG,MAAA,EAAQ,OAAO,OAAA,EAAS,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,QAClE,MAAA,EAAQ,aAAA;AAAA,QACR,mBAAA,EAAqB;AAAA,UACnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,uBAAA,EAAyB,KAAA;AAAA,UACzB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAED,MAAA,MAAM,IAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAK;AAEhC,MAAA,MAAM,KAAA,GAAS,aAAA,CAAc,IAAI,CAAA,CAAmB,IAAI,CAAA,IAAA,MAAS;AAAA,QAC/D,GAAG,IAAA;AAAA,QACH,KAAA,EAAO,IAAA,CAAK,KAAA,KAAU,EAAA,GAAK,OAAO,IAAA,CAAK;AAAA,OACzC,CAAE,CAAA;AAEF,MAAA,OAAO;AAAA,QACL,UAAA,EAAY;AAAA,UACV,KAAA;AAAA,UACA,IAAA;AAAA,UACA,OAAA;AAAA,UACA,OAAA,EAAA,CAAU,IAAA,GAAO,CAAA,IAAK,OAAA,GAAU;AAAA,SAClC;AAAA,QACA,KAAA,EAAOgD,qBAAa,KAAK;AAAA,OAC3B;AAAA,IACF,SAAStB,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,aAAA,EAAe,QAAQ,CAAA;AAAA,UAC9D,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,IAAA,EAA2C;AAChE,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,MAAM,IAAA,CAAK,IAAI,WAAA,CAAY;AAAA,QACzB,SAAA,EAAW1B,mBAAAA;AAAA,QACX,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,MAAW;AAAA,UACnC,GAAG,MAAA;AAAA;AAAA,UAEH,SAAA,EAAW,OAAO,SAAA,YAAqB,IAAA,GAAO,OAAO,SAAA,CAAU,OAAA,KAAY,MAAA,CAAO,SAAA;AAAA,UAClF,OAAA,EAAS,OAAO,OAAA,YAAmB,IAAA,GAAO,OAAO,OAAA,CAAQ,OAAA,KAAY,MAAA,CAAO,OAAA;AAAA,UAC5E,SAAA,EAAW,GAAA;AAAA,UACX,SAAA,EAAW;AAAA,SACb,CAAE;AAAA,OACH,CAAA;AAAA,IACH,SAAS0B,OAAA,EAAO;AACd,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,oBAAA,EAAsB,QAAQ,CAAA;AAAA,UACrE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,IAAA,EAA2C;AAChE,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAOrB,MAAA,KAAA,MAAW,MAAA,IAAU,KAAK,OAAA,EAAS;AACjC,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAiB;AAAA,UAC/C,SAAA,EAAW1B,mBAAAA;AAAA,UACX,MAAM,EAAE,MAAA,EAAQ,OAAO,MAAA,EAAQ,OAAA,EAAS,OAAO,OAAA;AAAQ,SACxD,CAAA;AAED,QAAA,IAAI,QAAA,EAAU;AAEZ,UAAA,MAAM,OAAA,GAA+B,EAAE,GAAG,MAAA,CAAO,OAAA,EAAQ;AACzD,UAAA,IAAI,OAAA,CAAQ,qBAAqB,IAAA,EAAM;AACrC,YAAA,OAAA,CAAQ,SAAA,GAAY,OAAA,CAAQ,SAAA,CAAU,OAAA,EAAQ;AAAA,UAChD;AACA,UAAA,IAAI,OAAA,CAAQ,mBAAmB,IAAA,EAAM;AACnC,YAAA,OAAA,CAAQ,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAQ;AAAA,UAC5C;AAEA,UAAA,MAAM,OAAA,GAAU;AAAA,YACd,GAAG,QAAA;AAAA,YACH,GAAG,OAAA;AAAA,YACH,SAAA,EAAW;AAAA,WACb;AAEA,UAAA,MAAM,IAAA,CAAK,OAAO,MAAA,CAAO;AAAA,YACvB,KAAA,EAAOA,mBAAAA;AAAA,YACP,MAAA,EAAQ,CAAC,OAAO,CAAA;AAAA,YAChB,MAAA,EAAQ,aAAA;AAAA,YACR,mBAAA,EAAqB;AAAA,cACnB,sBAAA,EAAwB,aAAA;AAAA,cACxB,oBAAA,EAAsB,CAAA;AAAA,cACtB,uCAAA,EAAyC;AAAA;AAC3C,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF,SAAS0B,OAAA,EAAO;AACd,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,oBAAA,EAAsB,QAAQ,CAAA;AAAA,UACrE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB,IAAA,EAA4C;AAClE,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAEhC,MAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,QACxB,KAAA,EAAO,eAAe1B,mBAAW,CAAA,0CAAA,CAAA;AAAA,QACjC,YAAA,EAAc,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA;AAAS,OACzC,CAAA;AAAA,IACH,SAAS0B,OAAA,EAAO;AACd,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,qBAAA,EAAuB,QAAQ,CAAA;AAAA,UACtE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACF;;;AC7yBO,IAAM,iBAAA,GAAoB,oBAAA;AAC1B,IAAM,iBAAA,GAAoB,oBAAA;AAC1B,IAAM,oBAAA,GAAuB,uBAAA;AAC7B,IAAM,mBAAA,GAAsB,sBAAA;AAC5B,IAAM,gBAAA,GAAmB,mBAAA;AACzB,IAAM,kBAAA,GAAqB,qBAAA;AAC3B,IAAM,qBAAA,GAAwB,wBAAA;AAC9B,IAAM,sBAAA,GAAyB,yBAAA;AAC/B,IAAM,qBAAA,GAAwB,wBAAA;AAM9B,IAAM,cAAA,GAAiB,uBAAA;AACvB,IAAM,iBAAA,GAAoB,0BAAA;AAC1B,IAAM,mBAAA,GAAsB,4BAAA;AAC5B,IAAM,kBAAA,GAAqB,2BAAA;AAW3B,IAAM,uBAAA,GAA0B;AAAA,EACrC,WAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA;AAMO,IAAM,eAAA,GAAkB;AAAA,2BAAA,EACF,iBAAiB,CAAA;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;AAAA;AAAA,CAAA;AAsEvC,IAAM,eAAA,GAAkB;AAAA,2BAAA,EACF,iBAAiB,CAAA;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;AAAA;AAAA,CAAA;AAsEvC,IAAM,kBAAA,GAAqB;AAAA,uCAAA,EACO,cAAc;AAAA,GAAA,EAClD,iBAAiB;AAAA;AAAA;AAAA,KAAA,EAGf,iBAAiB;AAAA;AAAA,CAAA;AAgBjB,IAAM,kBAAA,GAAqB;AAAA,2BAAA,EACL,oBAAoB,CAAA;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;AAAA;AAAA,CAAA;AAsE1C,IAAM,qBAAA,GAAwB;AAAA,uCAAA,EACI,iBAAiB;AAAA,GAAA,EACrD,oBAAoB;AAAA;AAAA;AAAA,KAAA,EAGlB,iBAAiB;AAAA,mBAAA,EACH,uBAAA,CAAwB,IAAI,CAAA,CAAA,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,CAAA;AAOnE,IAAM,iBAAA,GAAoB;AAAA,2BAAA,EACJ,mBAAmB,CAAA;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA6EzC,IAAM,cAAA,GAAiB;AAAA,2BAAA,EACD,gBAAgB,CAAA;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,CAAA;AAyDtC,IAAM,gBAAA,GAAmB;AAAA,2BAAA,EACH,kBAAkB,CAAA;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,CAAA;AAiExC,IAAM,mBAAA,GAAsB;AAAA,2BAAA,EACN,qBAAqB,CAAA;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,CAAA;AAoE3C,IAAM,oBAAA,GAAuB;AAAA,2BAAA,EACP,sBAAsB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAa5C,IAAM,mBAAA,GAAsB;AAAA,2BAAA,EACN,qBAAqB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAelD,IAAM,aAAA,GAAgB,CAAC,iBAAA,EAAmB,mBAAA,EAAqB,gBAAgB,CAAA;AAE/E,SAAS,wBAAA,CACP,MACA,QAAA,EACA,SAAA,EACA,YAAY,EAAA,EACZ,UAAA,GAAa,EAAA,EACb,MAAA,GAA4B,aAAA,EACpB;AACR,EAAA,OAAO,MAAA,CACJ,GAAA;AAAA,IACC,OACE,CAAA,QAAA,EAAW,IAAI,CAAA,WAAA,EAAc,QAAQ,aAAa,SAAS,CAAA,eAAA,EAAkB,CAAC,CAAA,EAAG,SAAS,CAAA,EAAG,UAAA,GAAa,CAAA,OAAA,EAAU,UAAU,KAAK,EAAE,CAAA;AAAA,GACzI,CACC,KAAK,aAAa,CAAA;AACvB;AAEO,IAAM,uBAAA,GAA0B;AAAA,uCAAA,EACE,mBAAmB;AAAA;AAAA,GAAA,EAEvD,sBAAsB;AAAA;AAAA;AAAA;AAAA,EAAA,EAIvB,yBAAyB,YAAA,EAAc,IAAA,EAAM,YAAA,EAAc,EAAA,EAAI,6CAA6C,CAAC;AAAA;AAAA;AAAA,EAAA,EAG7G,yBAAyB,aAAA,EAAe,IAAA,EAAM,aAAA,EAAe,EAAA,EAAI,+CAA+C,CAAC;AAAA;AAAA;AAAA,EAAA,EAGjH,yBAAyB,aAAA,EAAe,IAAA,EAAM,aAAA,EAAe,EAAA,EAAI,+CAA+C,CAAC;AAAA;AAAA;AAAA,EAAA,EAGjH,yBAAyB,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,yBAAA,EAA2B,2DAA2D,CAAC;AAAA;AAAA;AAAA,EAAA,EAG5I,wBAAA,CAAyB,cAAc,IAAA,EAAM,MAAA,EAAQ,IAAI,YAAA,EAAc,CAAC,mBAAmB,CAAC,CAAC;AAAA;AAAA;AAAA,EAAA,EAG7F,wBAAA,CAAyB,kBAAkB,MAAA,EAAQ,UAAA,EAAY,2CAA2C,+BAAA,EAAiC,CAAC,mBAAmB,CAAC,CAAC;AAAA;AAAA,CAAA;AAS9J,IAAM,sBAAA,GAAyB;AAAA,uCAAA,EACG,kBAAkB;AAAA;AAAA,GAAA,EAEtD,qBAAqB;AAAA;AAAA;AAAA;AAAA,EAAA,EAItB,aAAA,CAAc,GAAA;AAAA,EACd,CAAA,CAAA,KACE,6FAA6F,CAAC,CAAA,kGAAA;AAClG,CAAA,CAAE,IAAA,CAAK,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA,OAAA,EAId,mBAAmB;AAAA;AAAA;AAAA;AAAA,CAAA;AAUrB,IAAM,aAAA,GAAgB;AAAA,EAC3B,eAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,mBAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF,CAAA;AAEO,IAAM,UAAA,GAAa,CAAC,kBAAA,EAAoB,qBAAqB,CAAA;AAG7D,IAAM,gBAAA,GAAmB,CAAC,uBAAA,EAAyB,sBAAsB,CAAA;AAOzE,IAAM,cAAA,GAAiB;AAAA;AAAA,EAE5B,eAAe,iBAAiB,CAAA,0DAAA,CAAA;AAAA,EAChC,eAAe,iBAAiB,CAAA,gEAAA,CAAA;AAAA,EAChC,eAAe,iBAAiB,CAAA,8DAAA,CAAA;AAAA;AAAA,EAEhC,eAAe,iBAAiB,CAAA,0DAAA,CAAA;AAAA,EAChC,eAAe,iBAAiB,CAAA,gEAAA,CAAA;AAAA,EAChC,eAAe,iBAAiB,CAAA,8DAAA,CAAA;AAAA;AAAA,EAEhC,eAAe,mBAAmB,CAAA,0DAAA,CAAA;AAAA,EAClC,eAAe,mBAAmB,CAAA,gEAAA,CAAA;AAAA,EAClC,eAAe,mBAAmB,CAAA,8DAAA,CAAA;AAAA;AAAA,EAElC,eAAe,gBAAgB,CAAA,0DAAA,CAAA;AAAA,EAC/B,eAAe,gBAAgB,CAAA,gEAAA,CAAA;AAAA,EAC/B,eAAe,gBAAgB,CAAA,8DAAA,CAAA;AAAA;AAAA,EAE/B,eAAe,kBAAkB,CAAA,0DAAA,CAAA;AAAA,EACjC,eAAe,kBAAkB,CAAA,gEAAA,CAAA;AAAA,EACjC,eAAe,kBAAkB,CAAA,8DAAA,CAAA;AAAA;AAAA,EAEjC,eAAe,qBAAqB,CAAA,0DAAA,CAAA;AAAA,EACpC,eAAe,qBAAqB,CAAA,gEAAA,CAAA;AAAA,EACpC,eAAe,qBAAqB,CAAA,8DAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKpC,eAAe,mBAAmB,CAAA,kFAAA,CAAA;AAAA,EAClC,eAAe,mBAAmB,CAAA,oFAAA,CAAA;AAAA,EAClC,eAAe,mBAAmB,CAAA,wFAAA,CAAA;AAAA,EAClC,eAAe,mBAAmB,CAAA,gFAAA,CAAA;AAAA,EAClC,eAAe,mBAAmB,CAAA,gGAAA,CAAA;AAAA,EAClC,eAAe,mBAAmB,CAAA,4FAAA,CAAA;AAAA,EAClC,eAAe,mBAAmB,CAAA,8EAAA,CAAA;AAAA,EAClC,eAAe,mBAAmB,CAAA,sFAAA,CAAA;AAAA,EAClC,eAAe,mBAAmB,CAAA,sFAAA;AACpC,CAAA;AAqBO,IAAM,eAAA,GAAkB;AAAA,EAC7B,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,oBAAA;AAAA,EACA,mBAAA;AAAA,EACA,gBAAA;AAAA,EACA,kBAAA;AAAA,EACA,qBAAA;AAAA,EACA,sBAAA;AAAA,EACA;AACF,CAAA;AA4BA,IAAM,kBAAA,GAA6C;AAAA,EACjD,CAAC,iBAAiB,GAAG,SAAA;AAAA,EACrB,CAAC,iBAAiB,GAAG,SAAA;AAAA,EACrB,CAAC,oBAAoB,GAAG,SAAA;AAAA,EACxB,CAAC,mBAAmB,GAAG,WAAA;AAAA,EACvB,CAAC,gBAAgB,GAAG,WAAA;AAAA,EACpB,CAAC,kBAAkB,GAAG,WAAA;AAAA,EACtB,CAAC,qBAAqB,GAAG;AAC3B,CAAA;AAGA,IAAM,gBAAA,GAA4D;AAAA,EAChE,OAAA,EAAS,CAAC,iBAAA,EAAmB,iBAAA,EAAmB,oBAAoB,CAAA;AAAA,EACpE,IAAA,EAAM,CAAC,gBAAgB,CAAA;AAAA,EACvB,OAAA,EAAS,CAAC,mBAAmB,CAAA;AAAA,EAC7B,MAAA,EAAQ,CAAC,kBAAkB,CAAA;AAAA,EAC3B,QAAA,EAAU,CAAC,qBAAqB;AAClC,CAAA;AAQO,SAAS,kBAAkB,SAAA,EAAsC;AACtE,EAAA,MAAM,aAAuB,EAAC;AAE9B,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,IAAI,CAAC,CAAA;AACxC,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,IAAK,YAAY,CAAA,EAAG;AAEjD,IAAA,MAAM,MAAA,GAAS,iBAAiB,MAA+B,CAAA;AAC/D,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,GAAA,GAAM,mBAAmB,KAAK,CAAA;AACpC,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,UAAA,CAAW,KAAK,CAAA,YAAA,EAAe,KAAK,eAAe,GAAG,CAAA,YAAA,EAAe,QAAQ,CAAA,IAAA,CAAM,CAAA;AAAA,IACrF;AAAA,EACF;AAEA,EAAA,OAAO,UAAA;AACT;ACzzBO,IAAM,WAAA,GAAc;AAAA,EACzB,sBAAA,EAAwB,aAAA;AAAA,EACxB,uBAAA,EAAyB,KAAA;AAAA,EACzB,oBAAA,EAAsB,CAAA;AAAA,EACtB,uCAAA,EAAyC;AAC3C,CAAA;AAEO,IAAM,kBAAA,GAAqB;AAAA,EAChC,sBAAA,EAAwB,aAAA;AAAA,EACxB,oBAAA,EAAsB,CAAA;AAAA,EACtB,uCAAA,EAAyC;AAC3C,CAAA;AAEA,IAAM,aAAA,uBAAoB,GAAA,CAAI;AAAA,EAC5B,cAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,uBAAA;AAAA,EACA,qBAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,SAAS,eAAe,KAAA,EAA+B;AACrD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAY,KAAA,KAAU,EAAA,GAAK,IAAA,GAAO,KAAA,GAAS,KAAA,IAAS,IAAA,GAAO,IAAA,GAAO,MAAA,CAAO,KAAK,CAAA;AACxG;AAEA,SAAS,mBAAmB,KAAA,EAAmC;AAC7D,EAAA,MAAM,UAAA,GAAa,eAAe,KAAK,CAAA;AACvC,EAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AACxB,EAAA,OAAO,OAAO,MAAA,CAAOuB,kBAAU,EAAE,QAAA,CAAS,UAAwB,IAAK,UAAA,GAA4B,IAAA;AACrG;AAEO,SAAS,cAAc,IAAA,EAAyB;AACrD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,SAAU,EAAC;AAClC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AAC3B,IAAA,MAAM,OAAA,GAAU,EAAE,IAAA,EAAK;AACvB,IAAA,IAAI,OAAA,KAAY,EAAA,IAAM,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,EAAG;AACzC,IAAA,IAAA,CAAK,IAAI,OAAO,CAAA;AAChB,IAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,gBAAgB,MAAA,EAA4E;AAC1G,EAAA,IAAI,UAAU,IAAA,IAAQ,OAAO,MAAA,KAAW,QAAA,SAAiB,EAAC;AAC1D,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC3C,IAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AAC3B,IAAA,MAAM,QAAA,GAAW,EAAE,IAAA,EAAK;AACxB,IAAA,MAAM,QAAA,GAAW,EAAE,IAAA,EAAK;AACxB,IAAA,IAAI,QAAA,KAAa,EAAA,IAAM,QAAA,KAAa,EAAA,EAAI;AACxC,IAAA,MAAA,CAAO,QAAQ,CAAA,GAAI,QAAA;AAAA,EACrB;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,oBAAoB,QAAA,EAA8E;AAChH,EAAA,IAAI,YAAY,IAAA,IAAQ,OAAO,QAAA,KAAa,QAAA,SAAiB,EAAC;AAC9D,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC7C,IAAA,IAAI,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,EAAG;AAC1B,IAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AAC3B,IAAA,MAAM,OAAA,GAAU,EAAE,IAAA,EAAK;AACvB,IAAA,IAAI,YAAY,EAAA,EAAI;AACpB,IAAA,MAAA,CAAO,CAAC,CAAA,GAAI,OAAA;AAAA,EACd;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,WAAW,KAAA,EAA+B;AACxD,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,IAAA;AAC1B,EAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAC7B;AAEO,SAAS,UAAU,KAAA,EAAyB;AACjD,EAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,KAAA,KAAU,EAAA,EAAI,OAAO,IAAA;AAC1C,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,EACzB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,aAAa,KAAA,EAA6B;AACxD,EAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,KAAA,KAAU,EAAA,EAAI,OAAO,IAAA;AAC1C,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,KAAwB,CAAA;AAC3C,EAAA,IAAI,KAAA,CAAM,EAAE,OAAA,EAAS,KAAK,CAAA,CAAE,OAAA,EAAQ,KAAM,CAAA,EAAG,OAAO,IAAA;AACpD,EAAA,OAAO,CAAA;AACT;AAEO,SAAS,OAAO,KAAA,EAAsB;AAC3C,EAAA,MAAM,CAAA,GAAI,aAAa,KAAK,CAAA;AAC5B,EAAA,IAAI,KAAK,IAAA,EAAM,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,KAAK,CAAA,CAAE,CAAA;AACvD,EAAA,OAAO,CAAA;AACT;AAEO,SAAS,YAAY,KAAA,EAAuC;AACjE,EAAA,IAAI,KAAA,YAAiB,IAAA,EAAM,OAAO,KAAA,CAAM,WAAA,EAAY;AACpD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU,OAAO,IAAI,IAAA,CAAK,KAAK,EAAE,WAAA,EAAY;AAClE,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,cAAA,CAAe,SAAiB,MAAA,EAAwB;AACtE,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAC7B;AAEO,SAAS,gBAAgB,GAAA,EAAsC;AACpE,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AACtC,EAAA,MAAM,UAAU,GAAA,CAAI,OAAA,GAAU,SAAA,GAAY,YAAA,CAAa,IAAI,OAAO,CAAA;AAClE,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAEjC,EAAA,OAAO;AAAA,IACL,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,YAAA,EAAc,cAAA,CAAe,GAAA,CAAI,YAAY,CAAA;AAAA,IAC7C,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,UAAU,GAAA,CAAI,QAAA;AAAA,IACd,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AAAA,IAC5B,SAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA,EAAY,kBAAA,CAAmB,GAAA,CAAI,UAAU,CAAA;AAAA,IAC7C,QAAA,EAAU,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AAAA,IACrC,UAAA,EAAY,cAAA,CAAe,GAAA,CAAI,UAAU,CAAA;AAAA,IACzC,eAAA,EAAiB,cAAA,CAAe,GAAA,CAAI,eAAe,CAAA;AAAA,IACnD,qBAAA,EAAuB,cAAA,CAAe,GAAA,CAAI,qBAAqB,CAAA;AAAA,IAC/D,gBAAA,EAAkB,kBAAA,CAAmB,GAAA,CAAI,gBAAgB,CAAA;AAAA,IACzD,cAAA,EAAgB,cAAA,CAAe,GAAA,CAAI,cAAc,CAAA;AAAA,IACjD,gBAAA,EAAkB,cAAA,CAAe,GAAA,CAAI,gBAAgB,CAAA;AAAA,IACrD,mBAAA,EAAqB,cAAA,CAAe,GAAA,CAAI,mBAAmB,CAAA;AAAA,IAC3D,cAAA,EAAgB,kBAAA,CAAmB,GAAA,CAAI,cAAc,CAAA;AAAA,IACrD,YAAA,EAAc,cAAA,CAAe,GAAA,CAAI,YAAY,CAAA;AAAA,IAC7C,cAAA,EAAgB,cAAA,CAAe,GAAA,CAAI,cAAc,CAAA;AAAA,IACjD,MAAA,EAAQ,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA;AAAA,IACjC,cAAA,EAAgB,cAAA,CAAe,GAAA,CAAI,cAAc,CAAA;AAAA,IACjD,UAAA,EAAY,cAAA,CAAe,GAAA,CAAI,UAAU,CAAA;AAAA,IACzC,KAAA,EAAO,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA;AAAA,IAC/B,SAAA,EAAW,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AAAA,IACvC,QAAA,EAAU,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AAAA,IACrC,SAAA,EAAW,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AAAA,IACvC,WAAA,EAAa,cAAA,CAAe,GAAA,CAAI,WAAW,CAAA;AAAA,IAC3C,MAAA,EAAQ,cAAA,CAAe,GAAA,CAAI,eAAe,CAAA;AAAA,IAC1C,WAAA,EAAa,cAAA,CAAe,GAAA,CAAI,WAAW,CAAA;AAAA,IAC3C,YAAA,EAAc,cAAA,CAAe,GAAA,CAAI,YAAY,CAAA;AAAA,IAC7C,IAAA,EAAM,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AAAA,IAC5B,QAAA,EAAW,SAAA,CAAU,GAAA,CAAI,WAAW,CAAA,IAAwC,MAAA;AAAA,IAC5E,KAAA,EAAQ,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,IAAwC,MAAA;AAAA,IACnE,UAAA,EAAa,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA,IAAwC,MAAA;AAAA,IAC7E,KAAA,EAAQ,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,IAA0C,MAAA;AAAA,IACrE,KAAA,EAAO,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,IAAK,MAAA;AAAA,IAC/B,MAAA,EAAQ,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA,IAAK,MAAA;AAAA,IACjC,OAAO,KAAA,IAAS,MAAA;AAAA,IAChB,cAAA,EAAiB,SAAA,CAAU,GAAA,CAAI,cAAc,CAAA,IAAwC,MAAA;AAAA,IACrF,SAAA,EAAW,SAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AACF;AAMO,SAAS,gBAAgB,IAAA,EAAiD;AAC/E,EAAA,MAAM,UAAU,IAAA,CAAK,OAAA,GAAU,KAAK,SAAA,GAAa,IAAA,CAAK,WAAW,IAAA,CAAK,SAAA;AACtE,EAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,IAAA;AAElC,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,cAAA,CAAe,IAAA,CAAK,OAAA,EAAS,KAAK,MAAM,CAAA;AAAA,IACnD,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,YAAA,EAAc,KAAK,YAAA,IAAgB,IAAA;AAAA,IACnC,YAAA,EAAc,KAAK,YAAA,IAAgB,IAAA;AAAA,IACnC,UAAA,EAAY,KAAK,UAAA,IAAc,IAAA;AAAA,IAC/B,QAAA,EAAU,KAAK,QAAA,IAAY,IAAA;AAAA,IAC3B,UAAA,EAAY,KAAK,UAAA,IAAc,IAAA;AAAA,IAC/B,eAAA,EAAiB,KAAK,eAAA,IAAmB,IAAA;AAAA,IACzC,qBAAA,EAAuB,KAAK,qBAAA,IAAyB,IAAA;AAAA,IACrD,gBAAA,EAAkB,KAAK,gBAAA,IAAoB,IAAA;AAAA,IAC3C,cAAA,EAAgB,KAAK,cAAA,IAAkB,IAAA;AAAA,IACvC,gBAAA,EAAkB,KAAK,gBAAA,IAAoB,IAAA;AAAA,IAC3C,mBAAA,EAAqB,KAAK,mBAAA,IAAuB,IAAA;AAAA,IACjD,cAAA,EAAgB,KAAK,cAAA,IAAkB,IAAA;AAAA,IACvC,YAAA,EAAc,KAAK,YAAA,IAAgB,IAAA;AAAA,IACnC,cAAA,EAAgB,KAAK,cAAA,IAAkB,IAAA;AAAA,IACvC,MAAA,EAAQ,KAAK,MAAA,IAAU,IAAA;AAAA,IACvB,cAAA,EAAgB,KAAK,cAAA,IAAkB,IAAA;AAAA,IACvC,UAAA,EAAY,KAAK,UAAA,IAAc,IAAA;AAAA,IAC/B,KAAA,EAAO,KAAK,KAAA,IAAS,IAAA;AAAA,IACrB,SAAA,EAAW,KAAK,SAAA,IAAa,IAAA;AAAA,IAC7B,QAAA,EAAU,KAAK,QAAA,IAAY,IAAA;AAAA,IAC3B,SAAA,EAAW,KAAK,SAAA,IAAa,IAAA;AAAA,IAC7B,WAAA,EAAa,KAAK,WAAA,IAAe,IAAA;AAAA,IACjC,eAAA,EAAiB,KAAK,MAAA,IAAU,IAAA;AAAA,IAChC,WAAA,EAAa,KAAK,WAAA,IAAe,IAAA;AAAA,IACjC,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,SAAA,EAAW,WAAA,CAAY,IAAA,CAAK,SAAS,CAAA;AAAA,IACrC,OAAA,EAAS,YAAY,OAAO,CAAA;AAAA,IAC5B,IAAA,EAAM,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AAAA,IAC7B,cAAA,EAAgB,oBAAoB,QAAQ,CAAA;AAAA,IAC5C,WAAA,EAAa,WAAW,QAAQ,CAAA;AAAA,IAChC,KAAA,EAAO,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA;AAAA,IAC5B,UAAA,EAAY,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA;AAAA,IACtC,KAAA,EAAO,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA;AAAA,IAC5B,KAAA,EAAO,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA;AAAA,IAC5B,MAAA,EAAQ,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AAAA,IAC9B,KAAA,EAAO,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA;AAAA,IAC5B,cAAA,EAAgB,UAAA,CAAW,IAAA,CAAK,cAAc;AAAA,GAChD;AACF;AAEO,SAAS,eAAe,GAAA,EAAqC;AAClE,EAAA,OAAO;AAAA,IACL,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AAAA,IAC/B,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,IAAA,EAAO,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,IAAwC,MAAA;AAAA,IACjE,OAAA,EAAS,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA;AAAA,IACnC,MAAA,EAAQ,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA;AAAA,IACjC,YAAA,EAAc,cAAA,CAAe,GAAA,CAAI,YAAY,CAAA;AAAA,IAC7C,UAAA,EAAY,kBAAA,CAAmB,GAAA,CAAI,UAAU,CAAA;AAAA,IAC7C,QAAA,EAAU,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AAAA,IACrC,UAAA,EAAY,cAAA,CAAe,GAAA,CAAI,UAAU,CAAA;AAAA,IACzC,eAAA,EAAiB,cAAA,CAAe,GAAA,CAAI,eAAe,CAAA;AAAA,IACnD,qBAAA,EAAuB,cAAA,CAAe,GAAA,CAAI,qBAAqB,CAAA;AAAA,IAC/D,gBAAA,EAAkB,kBAAA,CAAmB,GAAA,CAAI,gBAAgB,CAAA;AAAA,IACzD,cAAA,EAAgB,cAAA,CAAe,GAAA,CAAI,cAAc,CAAA;AAAA,IACjD,gBAAA,EAAkB,cAAA,CAAe,GAAA,CAAI,gBAAgB,CAAA;AAAA,IACrD,mBAAA,EAAqB,cAAA,CAAe,GAAA,CAAI,mBAAmB,CAAA;AAAA,IAC3D,cAAA,EAAgB,kBAAA,CAAmB,GAAA,CAAI,cAAc,CAAA;AAAA,IACrD,YAAA,EAAc,cAAA,CAAe,GAAA,CAAI,YAAY,CAAA;AAAA,IAC7C,cAAA,EAAgB,cAAA,CAAe,GAAA,CAAI,cAAc,CAAA;AAAA,IACjD,MAAA,EAAQ,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA;AAAA,IACjC,cAAA,EAAgB,cAAA,CAAe,GAAA,CAAI,cAAc,CAAA;AAAA,IACjD,UAAA,EAAY,cAAA,CAAe,GAAA,CAAI,UAAU,CAAA;AAAA,IACzC,KAAA,EAAO,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA;AAAA,IAC/B,SAAA,EAAW,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AAAA,IACvC,QAAA,EAAU,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AAAA,IACrC,SAAA,EAAW,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AAAA,IACvC,WAAA,EAAa,cAAA,CAAe,GAAA,CAAI,WAAW,CAAA;AAAA,IAC3C,eAAA,EAAiB,cAAA,CAAe,GAAA,CAAI,eAAe,CAAA;AAAA,IACnD,WAAA,EAAa,cAAA,CAAe,GAAA,CAAI,WAAW,CAAA;AAAA,IAC3C,KAAA,EAAQ,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,IAAwC,MAAA;AAAA,IACnE,IAAA,EAAM,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AAAA,IAC5B,QAAA,EAAW,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA,IAAwC;AAAA,GAC3E;AACF;AAEO,SAAS,eAAe,GAAA,EAA+C;AAC5E,EAAA,OAAO;AAAA,IACL,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,SAAA,EAAW,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA;AAAA,IACpC,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,IAAA,EAAM,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AAAA,IACzB,OAAA,EAAS,IAAI,OAAA,IAAW,IAAA;AAAA,IACxB,MAAA,EAAQ,IAAI,MAAA,IAAU,IAAA;AAAA,IACtB,YAAA,EAAc,IAAI,YAAA,IAAgB,IAAA;AAAA,IAClC,UAAA,EAAY,IAAI,UAAA,IAAc,IAAA;AAAA,IAC9B,QAAA,EAAU,IAAI,QAAA,IAAY,IAAA;AAAA,IAC1B,UAAA,EAAY,IAAI,UAAA,IAAc,IAAA;AAAA,IAC9B,eAAA,EAAiB,IAAI,eAAA,IAAmB,IAAA;AAAA,IACxC,qBAAA,EAAuB,IAAI,qBAAA,IAAyB,IAAA;AAAA,IACpD,gBAAA,EAAkB,IAAI,gBAAA,IAAoB,IAAA;AAAA,IAC1C,cAAA,EAAgB,IAAI,cAAA,IAAkB,IAAA;AAAA,IACtC,gBAAA,EAAkB,IAAI,gBAAA,IAAoB,IAAA;AAAA,IAC1C,mBAAA,EAAqB,IAAI,mBAAA,IAAuB,IAAA;AAAA,IAChD,cAAA,EAAgB,IAAI,cAAA,IAAkB,IAAA;AAAA,IACtC,YAAA,EAAc,IAAI,YAAA,IAAgB,IAAA;AAAA,IAClC,cAAA,EAAgB,IAAI,cAAA,IAAkB,IAAA;AAAA,IACtC,MAAA,EAAQ,IAAI,MAAA,IAAU,IAAA;AAAA,IACtB,cAAA,EAAgB,IAAI,cAAA,IAAkB,IAAA;AAAA,IACtC,UAAA,EAAY,IAAI,UAAA,IAAc,IAAA;AAAA,IAC9B,KAAA,EAAO,IAAI,KAAA,IAAS,IAAA;AAAA,IACpB,SAAA,EAAW,IAAI,SAAA,IAAa,IAAA;AAAA,IAC5B,QAAA,EAAU,IAAI,QAAA,IAAY,IAAA;AAAA,IAC1B,SAAA,EAAW,IAAI,SAAA,IAAa,IAAA;AAAA,IAC5B,WAAA,EAAa,IAAI,WAAA,IAAe,IAAA;AAAA,IAChC,eAAA,EAAiB,GAAA,CAAI,eAAA,IAAmB,GAAA,CAAI,MAAA,IAAU,IAAA;AAAA,IACtD,WAAA,EAAa,IAAI,WAAA,IAAe,IAAA;AAAA,IAChC,IAAA,EAAM,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AAAA,IAC5B,QAAA,EAAU,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA;AAAA,IACjC,KAAA,EAAO,UAAA,CAAW,GAAA,CAAI,KAAK;AAAA,GAC7B;AACF;AAEO,SAAS,kBAAkB,GAAA,EAAwC;AACxE,EAAA,OAAO;AAAA,IACL,UAAU,GAAA,CAAI,QAAA;AAAA,IACd,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AAAA,IAC/B,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAAA,IACvB,OAAA,EAAS,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA;AAAA,IACnC,MAAA,EAAQ,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA;AAAA,IACjC,YAAA,EAAc,cAAA,CAAe,GAAA,CAAI,YAAY,CAAA;AAAA,IAC7C,UAAA,EAAY,kBAAA,CAAmB,GAAA,CAAI,UAAU,CAAA;AAAA,IAC7C,QAAA,EAAU,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AAAA,IACrC,UAAA,EAAY,cAAA,CAAe,GAAA,CAAI,UAAU,CAAA;AAAA,IACzC,eAAA,EAAiB,cAAA,CAAe,GAAA,CAAI,eAAe,CAAA;AAAA,IACnD,qBAAA,EAAuB,cAAA,CAAe,GAAA,CAAI,qBAAqB,CAAA;AAAA,IAC/D,gBAAA,EAAkB,kBAAA,CAAmB,GAAA,CAAI,gBAAgB,CAAA;AAAA,IACzD,cAAA,EAAgB,cAAA,CAAe,GAAA,CAAI,cAAc,CAAA;AAAA,IACjD,gBAAA,EAAkB,cAAA,CAAe,GAAA,CAAI,gBAAgB,CAAA;AAAA,IACrD,mBAAA,EAAqB,cAAA,CAAe,GAAA,CAAI,mBAAmB,CAAA;AAAA,IAC3D,cAAA,EAAgB,kBAAA,CAAmB,GAAA,CAAI,cAAc,CAAA;AAAA,IACrD,YAAA,EAAc,cAAA,CAAe,GAAA,CAAI,YAAY,CAAA;AAAA,IAC7C,cAAA,EAAgB,cAAA,CAAe,GAAA,CAAI,cAAc,CAAA;AAAA,IACjD,MAAA,EAAQ,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA;AAAA,IACjC,cAAA,EAAgB,cAAA,CAAe,GAAA,CAAI,cAAc,CAAA;AAAA,IACjD,UAAA,EAAY,cAAA,CAAe,GAAA,CAAI,UAAU,CAAA;AAAA,IACzC,KAAA,EAAO,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA;AAAA,IAC/B,SAAA,EAAW,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AAAA,IACvC,QAAA,EAAU,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AAAA,IACrC,SAAA,EAAW,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AAAA,IACvC,WAAA,EAAa,cAAA,CAAe,GAAA,CAAI,WAAW,CAAA;AAAA,IAC3C,eAAA,EAAiB,cAAA,CAAe,GAAA,CAAI,eAAe,CAAA;AAAA,IACnD,WAAA,EAAa,cAAA,CAAe,GAAA,CAAI,WAAW,CAAA;AAAA,IAC3C,KAAA,EAAQ,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,IAAwC,MAAA;AAAA,IACnE,QAAA,EAAU,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AAAA,IACrC,KAAA,EAAO,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA;AAAA,IAC/B,eAAe,GAAA,CAAI,aAAA,IAAiB,OAAO,MAAA,GAAY,MAAA,CAAO,IAAI,aAAa,CAAA;AAAA,IAC/E,QAAA,EAAU,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AAAA,IACrC,YAAA,EAAe,SAAA,CAAU,GAAA,CAAI,YAAY,CAAA,IAAwC,MAAA;AAAA,IACjF,IAAA,EAAM,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AAAA,IAC5B,MAAA,EAAQ,eAAA,CAAgB,GAAA,CAAI,MAAoD,CAAA;AAAA,IAChF,QAAA,EAAW,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA,IAAwC;AAAA,GAC3E;AACF;AAEO,SAAS,kBAAkB,MAAA,EAAqD;AACrF,EAAA,OAAO;AAAA,IACL,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,SAAA,EAAW,WAAA,CAAY,MAAA,CAAO,SAAS,CAAA;AAAA,IACvC,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,OAAA,EAAS,OAAO,OAAA,IAAW,IAAA;AAAA,IAC3B,MAAA,EAAQ,OAAO,MAAA,IAAU,IAAA;AAAA,IACzB,YAAA,EAAc,OAAO,YAAA,IAAgB,IAAA;AAAA,IACrC,UAAA,EAAY,OAAO,UAAA,IAAc,IAAA;AAAA,IACjC,QAAA,EAAU,OAAO,QAAA,IAAY,IAAA;AAAA,IAC7B,UAAA,EAAY,OAAO,UAAA,IAAc,IAAA;AAAA,IACjC,eAAA,EAAiB,OAAO,eAAA,IAAmB,IAAA;AAAA,IAC3C,qBAAA,EAAuB,OAAO,qBAAA,IAAyB,IAAA;AAAA,IACvD,gBAAA,EAAkB,OAAO,gBAAA,IAAoB,IAAA;AAAA,IAC7C,cAAA,EAAgB,OAAO,cAAA,IAAkB,IAAA;AAAA,IACzC,gBAAA,EAAkB,OAAO,gBAAA,IAAoB,IAAA;AAAA,IAC7C,mBAAA,EAAqB,OAAO,mBAAA,IAAuB,IAAA;AAAA,IACnD,cAAA,EAAgB,OAAO,cAAA,IAAkB,IAAA;AAAA,IACzC,YAAA,EAAc,OAAO,YAAA,IAAgB,IAAA;AAAA,IACrC,cAAA,EAAgB,OAAO,cAAA,IAAkB,IAAA;AAAA,IACzC,MAAA,EAAQ,OAAO,MAAA,IAAU,IAAA;AAAA,IACzB,cAAA,EAAgB,OAAO,cAAA,IAAkB,IAAA;AAAA,IACzC,UAAA,EAAY,OAAO,UAAA,IAAc,IAAA;AAAA,IACjC,KAAA,EAAO,OAAO,KAAA,IAAS,IAAA;AAAA,IACvB,SAAA,EAAW,OAAO,SAAA,IAAa,IAAA;AAAA,IAC/B,QAAA,EAAU,OAAO,QAAA,IAAY,IAAA;AAAA,IAC7B,SAAA,EAAW,OAAO,SAAA,IAAa,IAAA;AAAA,IAC/B,WAAA,EAAa,OAAO,WAAA,IAAe,IAAA;AAAA,IACnC,eAAA,EAAiB,MAAA,CAAO,eAAA,IAAmB,MAAA,CAAO,MAAA,IAAU,IAAA;AAAA,IAC5D,WAAA,EAAa,OAAO,WAAA,IAAe,IAAA;AAAA,IACnC,QAAA,EAAU,OAAO,QAAA,IAAY,IAAA;AAAA,IAC7B,KAAA,EAAO,OAAO,KAAA,IAAS,IAAA;AAAA,IACvB,aAAA,EAAe,OAAO,aAAA,IAAiB,IAAA;AAAA,IACvC,QAAA,EAAU,OAAO,QAAA,IAAY,IAAA;AAAA,IAC7B,IAAA,EAAM,aAAA,CAAc,MAAA,CAAO,IAAI,CAAA;AAAA,IAC/B,MAAA,EAAQ,eAAA,CAAgB,MAAA,CAAO,MAAM,CAAA;AAAA,IACrC,YAAA,EAAc,UAAA,CAAW,MAAA,CAAO,YAAY,CAAA;AAAA,IAC5C,QAAA,EAAU,UAAA,CAAW,MAAA,CAAO,QAAQ,CAAA;AAAA,IACpC,KAAA,EAAO,UAAA,CAAW,MAAA,CAAO,KAAK;AAAA,GAChC;AACF;AAEO,SAAS,iBAAiB,GAAA,EAAuC;AACtE,EAAA,OAAO;AAAA,IACL,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AAAA;AAAA,IAE/B,OAAA,EAAS,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA;AAAA,IACnC,MAAA,EAAQ,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA;AAAA,IACjC,YAAA,EAAc,cAAA,CAAe,GAAA,CAAI,YAAY,CAAA;AAAA,IAC7C,YAAA,EAAc,cAAA,CAAe,GAAA,CAAI,YAAY,CAAA;AAAA,IAC7C,UAAA,EAAY,kBAAA,CAAmB,GAAA,CAAI,UAAU,CAAA;AAAA,IAC7C,QAAA,EAAU,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AAAA,IACrC,UAAA,EAAY,cAAA,CAAe,GAAA,CAAI,UAAU,CAAA;AAAA,IACzC,eAAA,EAAiB,cAAA,CAAe,GAAA,CAAI,eAAe,CAAA;AAAA,IACnD,qBAAA,EAAuB,cAAA,CAAe,GAAA,CAAI,qBAAqB,CAAA;AAAA,IAC/D,gBAAA,EAAkB,kBAAA,CAAmB,GAAA,CAAI,gBAAgB,CAAA;AAAA,IACzD,cAAA,EAAgB,cAAA,CAAe,GAAA,CAAI,cAAc,CAAA;AAAA,IACjD,gBAAA,EAAkB,cAAA,CAAe,GAAA,CAAI,gBAAgB,CAAA;AAAA,IACrD,mBAAA,EAAqB,cAAA,CAAe,GAAA,CAAI,mBAAmB,CAAA;AAAA,IAC3D,cAAA,EAAgB,kBAAA,CAAmB,GAAA,CAAI,cAAc,CAAA;AAAA,IACrD,YAAA,EAAc,cAAA,CAAe,GAAA,CAAI,YAAY,CAAA;AAAA,IAC7C,cAAA,EAAgB,cAAA,CAAe,GAAA,CAAI,cAAc,CAAA;AAAA,IACjD,MAAA,EAAQ,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA;AAAA,IACjC,cAAA,EAAgB,cAAA,CAAe,GAAA,CAAI,cAAc,CAAA;AAAA,IACjD,UAAA,EAAY,cAAA,CAAe,GAAA,CAAI,UAAU,CAAA;AAAA,IACzC,KAAA,EAAO,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA;AAAA,IAC/B,SAAA,EAAW,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AAAA,IACvC,QAAA,EAAU,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AAAA,IACrC,SAAA,EAAW,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AAAA,IACvC,WAAA,EAAa,cAAA,CAAe,GAAA,CAAI,WAAW,CAAA;AAAA,IAC3C,eAAA,EAAiB,cAAA,CAAe,GAAA,CAAI,eAAe,CAAA;AAAA,IACnD,WAAA,EAAa,cAAA,CAAe,GAAA,CAAI,WAAW,CAAA;AAAA,IAC3C,UAAU,GAAA,CAAI,QAAA;AAAA,IACd,aAAA,EAAe,cAAA,CAAe,GAAA,CAAI,aAAa,CAAA;AAAA,IAC/C,WAAA,EAAa,cAAA,CAAe,GAAA,CAAI,WAAW,CAAA;AAAA,IAC3C,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAAA,IACvB,MAAA,EAAQ,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA;AAAA,IACjC,IAAA,EAAM,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AAAA,IAC5B,QAAA,EAAW,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA,IAAwC,MAAA;AAAA,IACzE,KAAA,EAAQ,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,IAAwC;AAAA,GACrE;AACF;AAEO,SAAS,iBAAiB,KAAA,EAAmD;AAClF,EAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,IAAA;AACnC,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,MAAA,IAAU,IAAA;AAEzD,EAAA,OAAO;AAAA,IACL,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,SAAA,EAAW,WAAA,CAAY,KAAA,CAAM,SAAS,CAAA;AAAA,IACtC,OAAA,EAAS,MAAM,OAAA,IAAW,IAAA;AAAA,IAC1B,MAAA,EAAQ,MAAM,MAAA,IAAU,IAAA;AAAA,IACxB,YAAA,EAAc,MAAM,YAAA,IAAgB,IAAA;AAAA,IACpC,YAAA,EAAc,MAAM,YAAA,IAAgB,IAAA;AAAA,IACpC,UAAA,EAAY,MAAM,UAAA,IAAc,IAAA;AAAA,IAChC,QAAA,EAAU,MAAM,QAAA,IAAY,IAAA;AAAA,IAC5B,UAAA,EAAY,MAAM,UAAA,IAAc,IAAA;AAAA,IAChC,eAAA,EAAiB,MAAM,eAAA,IAAmB,IAAA;AAAA,IAC1C,qBAAA,EAAuB,MAAM,qBAAA,IAAyB,IAAA;AAAA,IACtD,gBAAA,EAAkB,MAAM,gBAAA,IAAoB,IAAA;AAAA,IAC5C,cAAA,EAAgB,MAAM,cAAA,IAAkB,IAAA;AAAA,IACxC,gBAAA,EAAkB,MAAM,gBAAA,IAAoB,IAAA;AAAA,IAC5C,mBAAA,EAAqB,MAAM,mBAAA,IAAuB,IAAA;AAAA,IAClD,cAAA,EAAgB,MAAM,cAAA,IAAkB,IAAA;AAAA,IACxC,YAAA,EAAc,MAAM,YAAA,IAAgB,IAAA;AAAA,IACpC,cAAA,EAAgB,MAAM,cAAA,IAAkB,IAAA;AAAA,IACxC,MAAA,EAAQ,MAAM,MAAA,IAAU,IAAA;AAAA,IACxB,cAAA,EAAgB,MAAM,cAAA,IAAkB,IAAA;AAAA,IACxC,UAAA,EAAY,MAAM,UAAA,IAAc,IAAA;AAAA,IAChC,KAAA,EAAO,MAAM,KAAA,IAAS,IAAA;AAAA,IACtB,SAAA,EAAW,MAAM,SAAA,IAAa,IAAA;AAAA,IAC9B,QAAA,EAAU,MAAM,QAAA,IAAY,IAAA;AAAA,IAC5B,SAAA,EAAW,MAAM,SAAA,IAAa,IAAA;AAAA,IAC9B,WAAA,EAAa,MAAM,WAAA,IAAe,IAAA;AAAA,IAClC,eAAA,EAAiB,MAAM,eAAA,IAAmB,IAAA;AAAA,IAC1C,WAAA,EAAa,MAAM,WAAA,IAAe,IAAA;AAAA,IAClC,UAAU,KAAA,CAAM,QAAA;AAAA,IAChB,aAAA,EAAe,MAAM,aAAA,IAAiB,IAAA;AAAA,IACtC,WAAA;AAAA,IACA,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,MAAA,EAAQ,MAAM,MAAA,IAAU,IAAA;AAAA,IACxB,IAAA,EAAM,aAAA,CAAc,KAAA,CAAM,IAAI,CAAA;AAAA,IAC9B,QAAA,EAAU,WAAW,QAAQ,CAAA;AAAA,IAC7B,KAAA,EAAO,UAAA,CAAW,KAAA,CAAM,KAAK;AAAA,GAC/B;AACF;AAEO,SAAS,oBAAoB,GAAA,EAA0C;AAC5E,EAAA,MAAM,SAAA,GAAY,IAAI,WAAA,IAAe,IAAA;AACrC,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,GAAA,CAAI,cAAc,CAAA;AACxD,EAAA,MAAM,iBAAiB,cAAA,CAAe,GAAA,CAAI,cAAc,CAAA,IAAK,cAAA,CAAe,IAAI,MAAM,CAAA;AACtF,EAAA,OAAO;AAAA,IACL,YAAY,GAAA,CAAI,UAAA;AAAA,IAChB,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AAAA;AAAA,IAE/B,OAAA,EAAS,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA;AAAA,IACnC,MAAA,EAAQ,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA;AAAA,IACjC,YAAA,EAAc,cAAA,CAAe,GAAA,CAAI,YAAY,CAAA;AAAA,IAC7C,UAAA,EAAY,kBAAA,CAAmB,GAAA,CAAI,UAAU,CAAA;AAAA,IAC7C,QAAA,EAAU,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AAAA,IACrC,UAAA,EAAY,cAAA,CAAe,GAAA,CAAI,UAAU,CAAA;AAAA,IACzC,eAAA,EAAiB,cAAA,CAAe,GAAA,CAAI,eAAe,CAAA;AAAA,IACnD,qBAAA,EAAuB,cAAA,CAAe,GAAA,CAAI,qBAAqB,CAAA;AAAA,IAC/D,gBAAA,EAAkB,kBAAA,CAAmB,GAAA,CAAI,gBAAgB,CAAA;AAAA,IACzD,cAAA,EAAgB,cAAA,CAAe,GAAA,CAAI,cAAc,CAAA;AAAA,IACjD,gBAAA,EAAkB,cAAA,CAAe,GAAA,CAAI,gBAAgB,CAAA;AAAA,IACrD,mBAAA,EAAqB,cAAA,CAAe,GAAA,CAAI,mBAAmB,CAAA;AAAA,IAC3D,cAAA,EAAgB,kBAAA,CAAmB,GAAA,CAAI,cAAc,CAAA;AAAA,IACrD,YAAA,EAAc,cAAA,CAAe,GAAA,CAAI,YAAY,CAAA;AAAA,IAC7C,cAAA,EAAgB,cAAA,CAAe,GAAA,CAAI,cAAc,CAAA;AAAA,IACjD,MAAA,EAAQ,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA;AAAA,IACjC,cAAA,EAAgB,cAAA,CAAe,GAAA,CAAI,cAAc,CAAA;AAAA,IACjD,UAAA,EAAY,cAAA,CAAe,GAAA,CAAI,UAAU,CAAA;AAAA,IACzC,KAAA,EAAO,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA;AAAA,IAC/B,SAAA,EAAW,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AAAA,IACvC,QAAA,EAAU,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AAAA,IACrC,SAAA,EAAW,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AAAA,IACvC,WAAA,EAAa,cAAA,CAAe,GAAA,CAAI,WAAW,CAAA;AAAA,IAC3C,eAAA,EAAiB,cAAA,CAAe,GAAA,CAAI,eAAe,CAAA;AAAA,IACnD,WAAA,EAAa,cAAA,CAAe,GAAA,CAAI,WAAW,CAAA;AAAA,IAC3C,cAAA;AAAA,IACA,QAAA,EAAU,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AAAA,IACrC,cAAA;AAAA,IACA,cAAc,GAAA,CAAI,YAAA;AAAA,IAClB,KAAA,EAAO,YAAY,MAAA,CAAO,GAAA,CAAI,WAAW,CAAA,GAAK,cAAA,CAAe,GAAA,CAAI,WAAW,CAAA,IAAK,EAAA;AAAA,IACjF,OAAA,EAAS,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA;AAAA,IACnC,IAAA,EAAM,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AAAA,IAC5B,QAAA,EAAW,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA,IAAwC,MAAA;AAAA,IACzE,KAAA,EAAQ,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,IAAwC;AAAA,GACrE;AACF;AAEO,SAAS,oBAAoB,QAAA,EAAyD;AAC3F,EAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,IAAA;AACtC,EAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,cAAA,IAAkB,QAAA,CAAS,MAAA,IAAU,EAAA;AACrE,EAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,cAAA,IAAkB,QAAA,CAAS,MAAA,IAAU,IAAA;AAErE,EAAA,OAAO;AAAA,IACL,YAAY,QAAA,CAAS,UAAA;AAAA,IACrB,SAAA,EAAW,WAAA,CAAY,QAAA,CAAS,SAAS,CAAA;AAAA,IACzC,OAAA,EAAS,SAAS,OAAA,IAAW,IAAA;AAAA,IAC7B,MAAA,EAAQ,SAAS,MAAA,IAAU,IAAA;AAAA,IAC3B,YAAA,EAAc,SAAS,YAAA,IAAgB,IAAA;AAAA,IACvC,UAAA,EAAY,SAAS,UAAA,IAAc,IAAA;AAAA,IACnC,QAAA,EAAU,SAAS,QAAA,IAAY,IAAA;AAAA,IAC/B,UAAA,EAAY,SAAS,UAAA,IAAc,IAAA;AAAA,IACnC,eAAA,EAAiB,SAAS,eAAA,IAAmB,IAAA;AAAA,IAC7C,qBAAA,EAAuB,SAAS,qBAAA,IAAyB,IAAA;AAAA,IACzD,gBAAA,EAAkB,SAAS,gBAAA,IAAoB,IAAA;AAAA,IAC/C,cAAA,EAAgB,SAAS,cAAA,IAAkB,IAAA;AAAA,IAC3C,gBAAA,EAAkB,SAAS,gBAAA,IAAoB,IAAA;AAAA,IAC/C,mBAAA,EAAqB,SAAS,mBAAA,IAAuB,IAAA;AAAA,IACrD,cAAA,EAAgB,SAAS,cAAA,IAAkB,IAAA;AAAA,IAC3C,YAAA,EAAc,SAAS,YAAA,IAAgB,IAAA;AAAA,IACvC,cAAA,EAAgB,SAAS,cAAA,IAAkB,IAAA;AAAA,IAC3C,MAAA,EAAQ,cAAA;AAAA,IACR,cAAA,EAAgB,SAAS,cAAA,IAAkB,IAAA;AAAA,IAC3C,UAAA,EAAY,SAAS,UAAA,IAAc,IAAA;AAAA,IACnC,KAAA,EAAO,SAAS,KAAA,IAAS,IAAA;AAAA,IACzB,SAAA,EAAW,SAAS,SAAA,IAAa,IAAA;AAAA,IACjC,QAAA,EAAU,SAAS,QAAA,IAAY,IAAA;AAAA,IAC/B,SAAA,EAAW,SAAS,SAAA,IAAa,IAAA;AAAA,IACjC,WAAA,EAAa,SAAS,WAAA,IAAe,IAAA;AAAA,IACrC,eAAA,EAAiB,SAAS,eAAA,IAAmB,IAAA;AAAA,IAC7C,WAAA,EAAa,SAAS,WAAA,IAAe,IAAA;AAAA,IACrC,cAAA;AAAA,IACA,QAAA,EAAU,SAAS,QAAA,IAAY,IAAA;AAAA,IAC/B,cAAA;AAAA,IACA,cAAc,QAAA,CAAS,YAAA;AAAA,IACvB,aAAa,OAAO,QAAA,CAAS,KAAA,KAAU,QAAA,GAAW,SAAS,KAAA,GAAQ,IAAA;AAAA,IACnE,aAAa,OAAO,QAAA,CAAS,KAAA,KAAU,QAAA,GAAW,SAAS,KAAA,GAAQ,IAAA;AAAA,IACnE,OAAA,EAAS,SAAS,OAAA,IAAW,IAAA;AAAA,IAC7B,IAAA,EAAM,aAAA,CAAc,QAAA,CAAS,IAAI,CAAA;AAAA,IACjC,QAAA,EAAU,WAAW,QAAQ,CAAA;AAAA,IAC7B,KAAA,EAAO,UAAA,CAAW,QAAA,CAAS,KAAK;AAAA,GAClC;AACF;;;AChjBA,eAAe,SAAA,CACb,MAAA,EACA,KAAA,EACA,MAAA,GAAkC,EAAC,EACrB;AACd,EAAA,OAAQ,MAAA,CACN,MAAM,MAAA,CAAO,KAAA,CAAM;AAAA,IACjB,KAAA;AAAA,IACA,YAAA,EAAc,MAAA;AAAA,IACd,MAAA,EAAQ,aAAA;AAAA,IACR,mBAAA,EAAqB;AAAA,GACtB,GACD,IAAA,EAAK;AACT;AAIA,eAAsB,cAAA,CACpB,QACA,KAAA,EACiC;AACjC,EAAA,MAAM,OAAO,MAAM,SAAA;AAAA,IACjB,MAAA;AAAA,IACA,qBAAqB,sBAAsB,CAAA,yCAAA;AAAA,GAC7C;AAEA,EAAA,MAAM,aAAa,IAAI,GAAA,CAAI,MAAA,CAAO,MAAA,CAAOA,kBAAU,CAAC,CAAA;AACpD,EAAA,MAAM,cAA4B,EAAC;AACnC,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IAAI,UAAA,CAAW,GAAA,CAAI,GAAA,CAAI,KAAmB,CAAA,EAAG;AAC3C,MAAA,WAAA,CAAY,IAAA,CAAK,IAAI,KAAmB,CAAA;AAAA,IAC1C;AAAA,EACF;AACA,EAAA,OAAO,EAAE,WAAA,EAAY;AACvB;AAEA,eAAsB,cAAA,CACpB,QACA,IAAA,EACiC;AACjC,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,uBAAA,CAAyB,CAAA;AAC7C,EAAA,MAAM,SAAkC,EAAC;AAEzC,EAAA,IAAI,KAAK,UAAA,EAAY;AACnB,IAAA,UAAA,CAAW,KAAK,4BAA4B,CAAA;AAC5C,IAAA,MAAA,CAAO,aAAa,IAAA,CAAK,UAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,OAAO,MAAM,SAAA;AAAA,IACjB,MAAA;AAAA,IACA,qBAAqB,qBAAqB,CAAA,OAAA,EAAU,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,eAAA,CAAA;AAAA,IAC5E;AAAA,GACF;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA,EAAE;AACzC;AAIA,eAAsB,eAAA,CACpB,QACA,KAAA,EACkC;AAClC,EAAA,MAAM,OAAO,MAAM,SAAA;AAAA,IACjB,MAAA;AAAA,IACA,qBAAqB,sBAAsB,CAAA,0CAAA;AAAA,GAC7C;AACA,EAAA,OAAO,EAAE,YAAA,EAAc,IAAA,CAAK,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA,EAAE;AAChD;AAEA,eAAsB,eAAA,CACpB,QACA,KAAA,EACkC;AAClC,EAAA,MAAM,OAAO,MAAM,SAAA;AAAA,IACjB,MAAA;AAAA,IACA,qBAAqB,sBAAsB,CAAA,0CAAA;AAAA,GAC7C;AACA,EAAA,OAAO,EAAE,YAAA,EAAc,IAAA,CAAK,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA,EAAE;AAChD;AAIA,eAAsB,OAAA,CAAQ,QAA0B,IAAA,EAA6C;AACnG,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,YAAA,CAAc,CAAA;AAClC,EAAA,MAAM,SAAkC,EAAC;AAEzC,EAAA,IAAI,KAAK,UAAA,EAAY;AACnB,IAAA,UAAA,CAAW,KAAK,4BAA4B,CAAA;AAC5C,IAAA,MAAA,CAAO,aAAa,IAAA,CAAK,UAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,OAAO,MAAM,SAAA;AAAA,IACjB,MAAA;AAAA,IACA,qBAAqB,sBAAsB,CAAA,OAAA,EAAU,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,eAAA,CAAA;AAAA,IAC7E;AAAA,GACF;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA,EAAE;AACxC;AC7EA,SAAS,8BAAA,CACP,MAAA,EACA,WAAA,EACA,UAAA,EACM;AACN,EAAA,IAAI,WAAW,MAAA,EAAW;AAC1B,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kDAAA,EAAqD,UAAU,CAAA,QAAA,EAAW,WAAW,CAAA,WAAA,CAAa,CAAA;AACpH;AAMA,SAAS,YAAA,CAAa,MAAA,EAAgB,KAAA,EAA8B,MAAA,EAAgB,GAAA,EAAyB;AAC3G,EAAA,IAAI,CAAC,KAAA,EAAO;AACZ,EAAA,IAAI,MAAM,KAAA,EAAO;AACf,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,cAAA,GAAiB,GAAA,GAAM,IAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,GAAG,MAAM,CAAA,KAAA,CAAA;AACvB,IAAA,GAAA,CAAI,UAAA,CAAW,KAAK,CAAA,EAAG,MAAM,IAAI,EAAE,CAAA,EAAA,EAAK,KAAK,CAAA,eAAA,CAAiB,CAAA;AAC9D,IAAA,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA,GAAI,KAAA,CAAM,MAAM,OAAA,EAAQ;AAAA,EAC1C;AACA,EAAA,IAAI,MAAM,GAAA,EAAK;AACb,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,YAAA,GAAe,GAAA,GAAM,IAAA;AACtC,IAAA,MAAM,KAAA,GAAQ,GAAG,MAAM,CAAA,GAAA,CAAA;AACvB,IAAA,GAAA,CAAI,UAAA,CAAW,KAAK,CAAA,EAAG,MAAM,IAAI,EAAE,CAAA,EAAA,EAAK,KAAK,CAAA,eAAA,CAAiB,CAAA;AAC9D,IAAA,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA,GAAI,KAAA,CAAM,IAAI,OAAA,EAAQ;AAAA,EACxC;AACF;AAMA,SAAS,KAAA,CAAM,MAAA,EAAgB,KAAA,EAAgB,SAAA,EAAmB,WAAmB,GAAA,EAAyB;AAC5G,EAAA,IAAI,SAAS,IAAA,EAAM;AACnB,EAAA,GAAA,CAAI,UAAA,CAAW,KAAK,CAAA,EAAG,MAAM,OAAO,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,CAAG,CAAA;AAC7D,EAAA,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,GAAI,KAAA;AAC1B;AAEA,SAAS,KAAA,CAAM,MAAA,EAAgB,MAAA,EAA8B,SAAA,EAAmB,GAAA,EAAyB;AACvG,EAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACrB,EAAA,GAAA,CAAI,WAAW,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,KAAA,EAAQ,SAAS,CAAA,eAAA,CAAiB,CAAA;AAC/D,EAAA,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,GAAI,MAAA;AAC1B;AAEA,SAAS,OAAA,CAAQ,MAAA,EAAgB,IAAA,EAAe,GAAA,EAAyB;AACvE,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,WAAW,CAAA,EAAG;AAC/C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,IAAA,OAAW,EAAA,EAAI;AAClD,IAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA,CAAA;AACtB,IAAA,GAAA,CAAI,WAAW,IAAA,CAAK,CAAA,IAAA,EAAO,MAAM,CAAA,GAAA,EAAM,KAAK,CAAA,SAAA,CAAW,CAAA;AACvD,IAAA,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA,GAAI,GAAA;AAAA,EACtB;AACF;AAEA,SAAS,mBAAA,CACP,MAAA,EACA,MAAA,EACA,SAAA,EACA,aACA,GAAA,EACM;AACN,EAAA,IAAI,MAAA,IAAU,IAAA,IAAQ,OAAO,MAAA,KAAW,QAAA,EAAU;AAClD,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC/B,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AAClC,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AACpC,IAAA,GAAA,CAAI,UAAA,CAAW,KAAK,CAAA,EAAG,MAAM,KAAK,QAAQ,CAAA,aAAA,EAAgB,QAAQ,CAAA,QAAA,CAAU,CAAA;AAC5E,IAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA,GAAI,GAAA;AACvB,IAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA,GAAI,KAAA;AACvB,IAAA,CAAA,EAAA;AAAA,EACF;AACF;AAMA,SAAS,qBAAA,CACP,OAAA,EA0BA,UAAA,EACA,GAAA,EACM;AACN,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,KAAkB,UAAA,GAAa,GAAG,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAK,IAAA;AAEtE,EAAA,YAAA,CAAa,IAAI,WAAW,CAAA,EAAG,OAAA,CAAQ,SAAA,EAAoC,aAAa,GAAG,CAAA;AAC3F,EAAA,KAAA,CAAM,IAAI,SAAS,CAAA,EAAG,QAAQ,OAAA,EAAS,SAAA,EAAW,UAAU,GAAG,CAAA;AAC/D,EAAA,KAAA,CAAM,IAAI,QAAQ,CAAA,EAAG,QAAQ,MAAA,EAAQ,QAAA,EAAU,UAAU,GAAG,CAAA;AAC5D,EAAA,KAAA,CAAM,IAAI,YAAY,CAAA,EAAG,QAAQ,UAAA,EAAY,YAAA,EAAc,UAAU,GAAG,CAAA;AACxE,EAAA,KAAA,CAAM,IAAI,YAAY,CAAA,EAAG,QAAQ,UAAA,EAAY,YAAA,EAAc,UAAU,GAAG,CAAA;AACxE,EAAA,KAAA,CAAM,IAAI,iBAAiB,CAAA,EAAG,QAAQ,eAAA,EAAiB,iBAAA,EAAmB,UAAU,GAAG,CAAA;AACvF,EAAA,KAAA,CAAM,IAAI,uBAAuB,CAAA,EAAG,QAAQ,qBAAA,EAAuB,uBAAA,EAAyB,UAAU,GAAG,CAAA;AACzG,EAAA,KAAA,CAAM,IAAI,kBAAkB,CAAA,EAAG,QAAQ,gBAAA,EAAkB,kBAAA,EAAoB,UAAU,GAAG,CAAA;AAC1F,EAAA,KAAA,CAAM,IAAI,kBAAkB,CAAA,EAAG,QAAQ,gBAAA,EAAkB,kBAAA,EAAoB,UAAU,GAAG,CAAA;AAC1F,EAAA,KAAA,CAAM,IAAI,qBAAqB,CAAA,EAAG,QAAQ,mBAAA,EAAqB,qBAAA,EAAuB,UAAU,GAAG,CAAA;AACnG,EAAA,KAAA,CAAM,IAAI,gBAAgB,CAAA,EAAG,QAAQ,cAAA,EAAgB,gBAAA,EAAkB,UAAU,GAAG,CAAA;AACpF,EAAA,KAAA,CAAM,IAAI,gBAAgB,CAAA,EAAG,QAAQ,cAAA,EAAgB,gBAAA,EAAkB,UAAU,GAAG,CAAA;AACpF,EAAA,KAAA,CAAM,IAAI,QAAQ,CAAA,EAAG,QAAQ,MAAA,EAAQ,QAAA,EAAU,UAAU,GAAG,CAAA;AAC5D,EAAA,KAAA,CAAM,IAAI,gBAAgB,CAAA,EAAG,QAAQ,cAAA,EAAgB,gBAAA,EAAkB,UAAU,GAAG,CAAA;AACpF,EAAA,KAAA,CAAM,IAAI,cAAc,CAAA,EAAG,QAAQ,YAAA,EAAc,cAAA,EAAgB,UAAU,GAAG,CAAA;AAC9E,EAAA,KAAA,CAAM,IAAI,YAAY,CAAA,EAAG,QAAQ,UAAA,EAAY,YAAA,EAAc,UAAU,GAAG,CAAA;AACxE,EAAA,KAAA,CAAM,IAAI,OAAO,CAAA,EAAG,QAAQ,KAAA,EAAO,OAAA,EAAS,UAAU,GAAG,CAAA;AACzD,EAAA,KAAA,CAAM,IAAI,WAAW,CAAA,EAAG,QAAQ,SAAA,EAAW,WAAA,EAAa,UAAU,GAAG,CAAA;AACrE,EAAA,KAAA,CAAM,IAAI,UAAU,CAAA,EAAG,QAAQ,QAAA,EAAU,UAAA,EAAY,UAAU,GAAG,CAAA;AAClE,EAAA,KAAA,CAAM,IAAI,WAAW,CAAA,EAAG,QAAQ,SAAA,EAAW,WAAA,EAAa,UAAU,GAAG,CAAA;AACrE,EAAA,KAAA,CAAM,IAAI,aAAa,CAAA,EAAG,QAAQ,WAAA,EAAa,aAAA,EAAe,UAAU,GAAG,CAAA;AAC3E,EAAA,KAAA,CAAM,IAAI,aAAa,CAAA,EAAG,QAAQ,WAAA,EAAa,aAAA,EAAe,UAAU,GAAG,CAAA;AAC3E,EAAA,KAAA,CAAM,IAAI,iBAAiB,CAAA,EAAG,QAAQ,eAAA,EAAiB,iBAAA,EAAmB,UAAU,GAAG,CAAA;AACvF,EAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG,OAAA,CAAQ,MAAM,GAAG,CAAA;AACxC;AAMO,SAAS,0BAAA,CAA2B,SAAmC,UAAA,EAAmC;AAC/G,EAAA,MAAM,MAAoB,EAAE,UAAA,EAAY,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAE;AACvD,EAAA,IAAI,CAAC,SAAS,OAAO,GAAA;AAErB,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,KAA+B,GAAG,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAK;AAEtE,EAAA,YAAA,CAAa,IAAI,WAAW,CAAA,EAAG,OAAA,CAAQ,SAAA,EAAoC,aAAa,GAAG,CAAA;AAC3F,EAAA,YAAA,CAAa,IAAI,SAAS,CAAA,EAAG,OAAA,CAAQ,OAAA,EAAkC,WAAW,GAAG,CAAA;AACrF,EAAA,KAAA,CAAM,IAAI,UAAU,CAAA,EAAG,QAAQ,QAAA,EAAU,UAAA,EAAY,UAAU,GAAG,CAAA;AAClE,EAAA,KAAA,CAAM,IAAI,YAAY,CAAA,EAAG,QAAQ,UAAA,EAAY,YAAA,EAAc,UAAU,GAAG,CAAA;AACxE,EAAA,KAAA,CAAM,IAAI,UAAU,CAAA,EAAG,QAAQ,QAAA,EAAU,UAAA,EAAY,UAAU,GAAG,CAAA;AAClE,EAAA,KAAA,CAAM,IAAI,YAAY,CAAA,EAAG,QAAQ,UAAA,EAAY,YAAA,EAAc,UAAU,GAAG,CAAA;AACxE,EAAA,KAAA,CAAM,IAAI,iBAAiB,CAAA,EAAG,QAAQ,eAAA,EAAiB,iBAAA,EAAmB,UAAU,GAAG,CAAA;AACvF,EAAA,KAAA,CAAM,IAAI,uBAAuB,CAAA,EAAG,QAAQ,qBAAA,EAAuB,uBAAA,EAAyB,UAAU,GAAG,CAAA;AACzG,EAAA,KAAA,CAAM,IAAI,kBAAkB,CAAA,EAAG,QAAQ,gBAAA,EAAkB,kBAAA,EAAoB,UAAU,GAAG,CAAA;AAC1F,EAAA,KAAA,CAAM,IAAI,gBAAgB,CAAA,EAAG,QAAQ,cAAA,EAAgB,gBAAA,EAAkB,UAAU,GAAG,CAAA;AACpF,EAAA,KAAA,CAAM,IAAI,kBAAkB,CAAA,EAAG,QAAQ,gBAAA,EAAkB,kBAAA,EAAoB,UAAU,GAAG,CAAA;AAC1F,EAAA,KAAA,CAAM,IAAI,qBAAqB,CAAA,EAAG,QAAQ,mBAAA,EAAqB,qBAAA,EAAuB,UAAU,GAAG,CAAA;AACnG,EAAA,KAAA,CAAM,IAAI,gBAAgB,CAAA,EAAG,QAAQ,cAAA,EAAgB,gBAAA,EAAkB,UAAU,GAAG,CAAA;AACpF,EAAA,KAAA,CAAM,IAAI,cAAc,CAAA,EAAG,QAAQ,YAAA,EAAc,cAAA,EAAgB,UAAU,GAAG,CAAA;AAC9E,EAAA,KAAA,CAAM,IAAI,gBAAgB,CAAA,EAAG,QAAQ,cAAA,EAAgB,gBAAA,EAAkB,UAAU,GAAG,CAAA;AACpF,EAAA,KAAA,CAAM,IAAI,cAAc,CAAA,EAAG,QAAQ,YAAA,EAAc,cAAA,EAAgB,UAAU,GAAG,CAAA;AAC9E,EAAA,KAAA,CAAM,IAAI,QAAQ,CAAA,EAAG,QAAQ,MAAA,EAAQ,QAAA,EAAU,UAAU,GAAG,CAAA;AAC5D,EAAA,KAAA,CAAM,IAAI,gBAAgB,CAAA,EAAG,QAAQ,cAAA,EAAgB,gBAAA,EAAkB,UAAU,GAAG,CAAA;AACpF,EAAA,KAAA,CAAM,IAAI,YAAY,CAAA,EAAG,QAAQ,UAAA,EAAY,YAAA,EAAc,UAAU,GAAG,CAAA;AACxE,EAAA,KAAA,CAAM,IAAI,OAAO,CAAA,EAAG,QAAQ,KAAA,EAAO,OAAA,EAAS,UAAU,GAAG,CAAA;AACzD,EAAA,KAAA,CAAM,IAAI,WAAW,CAAA,EAAG,QAAQ,SAAA,EAAW,WAAA,EAAa,UAAU,GAAG,CAAA;AACrE,EAAA,KAAA,CAAM,IAAI,UAAU,CAAA,EAAG,QAAQ,QAAA,EAAU,UAAA,EAAY,UAAU,GAAG,CAAA;AAClE,EAAA,KAAA,CAAM,IAAI,WAAW,CAAA,EAAG,QAAQ,SAAA,EAAW,WAAA,EAAa,UAAU,GAAG,CAAA;AACrE,EAAA,KAAA,CAAM,IAAI,aAAa,CAAA,EAAG,QAAQ,WAAA,EAAa,aAAA,EAAe,UAAU,GAAG,CAAA;AAE3E,EAAA,KAAA,CAAM,IAAI,iBAAiB,CAAA,EAAG,QAAQ,MAAA,EAAQ,QAAA,EAAU,UAAU,GAAG,CAAA;AACrE,EAAA,KAAA,CAAM,IAAI,aAAa,CAAA,EAAG,QAAQ,WAAA,EAAa,aAAA,EAAe,UAAU,GAAG,CAAA;AAE3E,EAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG,OAAA,CAAQ,MAAM,GAAG,CAAA;AACtC,EAAA,mBAAA,CAAoB,IAAI,gBAAgB,CAAA,EAAG,QAAQ,QAAA,EAAU,QAAA,EAAU,UAAU,GAAG,CAAA;AAEpF,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAWJ,mBAAAA,CAAY,KAAA,EAAO;AACxC,IAAA,GAAA,CAAI,WAAW,IAAA,CAAK,CAAA,EAAG,GAAA,CAAI,OAAO,CAAC,CAAA,YAAA,CAAc,CAAA;AAAA,EACnD,CAAA,MAAA,IAAW,OAAA,CAAQ,MAAA,KAAWA,mBAAAA,CAAY,OAAA,EAAS;AACjD,IAAA,GAAA,CAAI,WAAW,IAAA,CAAK,CAAA,EAAG,GAAA,CAAI,OAAO,CAAC,CAAA,QAAA,CAAU,CAAA;AAAA,EAC/C,CAAA,MAAA,IAAW,OAAA,CAAQ,MAAA,KAAWA,mBAAAA,CAAY,OAAA,EAAS;AACjD,IAAA,GAAA,CAAI,UAAA,CAAW,KAAK,OAAO,CAAA;AAAA,EAC7B;AAEA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,yBAAA,CAA0B,SAAiC,UAAA,EAAmC;AAC5G,EAAA,MAAM,MAAoB,EAAE,UAAA,EAAY,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAE;AACvD,EAAA,IAAI,CAAC,SAAS,OAAO,GAAA;AAErB,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,KAA+B,GAAG,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAK;AACtE,EAAA,8BAAA,CAA+B,OAAA,CAAQ,MAAA,EAAQ,iBAAA,EAAmB,MAAM,CAAA;AACxE,EAAA,qBAAA,CAAsB,OAAA,EAAS,YAAY,GAAG,CAAA;AAE9C,EAAA,IAAI,OAAO,OAAA,CAAQ,KAAA,KAAU,QAAA,EAAU;AACrC,IAAA,KAAA,CAAM,IAAI,OAAO,CAAA,EAAG,QAAQ,KAAA,EAAO,OAAA,EAAS,UAAU,GAAG,CAAA;AAAA,EAC3D,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvC,IAAA,KAAA,CAAM,IAAI,OAAO,CAAA,EAAG,OAAA,CAAQ,KAAA,EAAO,UAAU,GAAG,CAAA;AAAA,EAClD;AAEA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,4BAAA,CAA6B,SAAoC,UAAA,EAAmC;AAClH,EAAA,MAAM,MAAoB,EAAE,UAAA,EAAY,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAE;AACvD,EAAA,IAAI,CAAC,SAAS,OAAO,GAAA;AAErB,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,KAAkB,UAAA,GAAa,GAAG,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAK,IAAA;AACtE,EAAA,8BAAA,CAA+B,OAAA,CAAQ,MAAA,EAAQ,iBAAA,EAAmB,SAAS,CAAA;AAC3E,EAAA,qBAAA,CAAsB,OAAA,EAAS,YAAY,GAAG,CAAA;AAC9C,EAAA,KAAA,CAAM,IAAI,MAAM,CAAA,EAAG,OAAA,CAAQ,IAAA,EAAM,eAAe,GAAG,CAAA;AACnD,EAAA,KAAA,CAAM,IAAI,UAAU,CAAA,EAAG,QAAQ,QAAA,EAAU,UAAA,EAAY,UAAU,GAAG,CAAA;AAClE,EAAA,KAAA,CAAM,IAAI,OAAO,CAAA,EAAG,QAAQ,KAAA,EAAO,OAAA,EAAS,UAAU,GAAG,CAAA;AACzD,EAAA,KAAA,CAAM,IAAI,UAAU,CAAA,EAAG,QAAQ,QAAA,EAAU,UAAA,EAAY,UAAU,GAAG,CAAA;AAClE,EAAA,mBAAA,CAAoB,IAAI,QAAQ,CAAA,EAAG,QAAQ,MAAA,EAAQ,SAAA,EAAW,WAAW,GAAG,CAAA;AAE5E,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,2BAAA,CAA4B,SAAmC,UAAA,EAAmC;AAChH,EAAA,MAAM,MAAoB,EAAE,UAAA,EAAY,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAE;AACvD,EAAA,IAAI,CAAC,SAAS,OAAO,GAAA;AACrB,EAAA,8BAAA,CAA+B,OAAA,CAAQ,MAAA,EAAQ,gCAAA,EAAkC,QAAQ,CAAA;AAEzF,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,KAAkB,UAAA,GAAa,GAAG,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAK,IAAA;AAGtE,EAAA,qBAAA,CAAsB,OAAA,EAAS,YAAY,GAAG,CAAA;AAG9C,EAAA,KAAA,CAAM,IAAI,aAAa,CAAA,EAAG,QAAQ,WAAA,EAAa,aAAA,EAAe,UAAU,GAAG,CAAA;AAE3E,EAAA,IAAI,OAAO,OAAA,CAAQ,QAAA,KAAa,QAAA,EAAU;AACxC,IAAA,KAAA,CAAM,IAAI,UAAU,CAAA,EAAG,QAAQ,QAAA,EAAU,UAAA,EAAY,UAAU,GAAG,CAAA;AAAA,EACpE,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC1C,IAAA,KAAA,CAAM,IAAI,UAAU,CAAA,EAAG,OAAA,CAAQ,QAAA,EAAU,aAAa,GAAG,CAAA;AAAA,EAC3D;AAEA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,6BAAA,CAA8B,SAAqC,UAAA,EAAmC;AACpH,EAAA,MAAM,MAAoB,EAAE,UAAA,EAAY,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAE;AACvD,EAAA,IAAI,CAAC,SAAS,OAAO,GAAA;AACrB,EAAA,8BAAA,CAA+B,OAAA,CAAQ,MAAA,EAAQ,mCAAA,EAAqC,UAAU,CAAA;AAE9F,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,KAAkB,UAAA,GAAa,GAAG,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAK,IAAA;AAGtE,EAAA,qBAAA,CAAsB,OAAA,EAAS,YAAY,GAAG,CAAA;AAG9C,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,cAAA,IAAkB,OAAA,CAAQ,MAAA;AAElD,EAAA,KAAA,CAAM,IAAI,gBAAgB,CAAA,EAAG,OAAA,EAAS,gBAAA,EAAkB,UAAU,GAAG,CAAA;AAErE,EAAA,KAAA,CAAM,IAAI,gBAAgB,CAAA,EAAG,QAAQ,cAAA,EAAgB,gBAAA,EAAkB,UAAU,GAAG,CAAA;AAEpF,EAAA,IAAI,OAAO,OAAA,CAAQ,YAAA,KAAiB,QAAA,EAAU;AAC5C,IAAA,KAAA,CAAM,IAAI,cAAc,CAAA,EAAG,QAAQ,YAAA,EAAc,cAAA,EAAgB,UAAU,GAAG,CAAA;AAAA,EAChF,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,YAAY,CAAA,EAAG;AAC9C,IAAA,KAAA,CAAM,IAAI,cAAc,CAAA,EAAG,OAAA,CAAQ,YAAA,EAAc,iBAAiB,GAAG,CAAA;AAAA,EACvE;AAEA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,uBAAA,CAAwB,SAAwB,UAAA,EAA6B;AAC3F,EAAA,OAAO,mBAAmB,CAAC,WAAA,EAAa,SAAS,CAAA,EAAY,OAAA,EAAS,YAAY,WAAW,CAAA;AAC/F;AAEA,SAAS,kBAAA,CACP,aAAA,EACA,OAAA,EACA,UAAA,EACA,YAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,SAAS,KAAA,IAAS,aAAA,CAAc,SAAS,OAAA,CAAQ,KAAK,CAAA,GAAI,OAAA,CAAQ,KAAA,GAAQ,YAAA;AACxF,EAAA,MAAM,SAAA,GAAY,OAAA,EAAS,SAAA,KAAc,KAAA,GAAQ,KAAA,GAAQ,MAAA;AACzD,EAAA,MAAM,MAAM,UAAA,GAAa,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,KAAA;AACpD,EAAA,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAC5B;AAEO,SAAS,wBAAA,CACd,aAAA,EACA,OAAA,EAOA,UAAA,EACA,eAAe,WAAA,EACP;AACR,EAAA,OAAO,kBAAA;AAAA,IACL,aAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,sBAAsB,UAAA,EAKpC;AACA,EAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,UAAA,EAAY,IAAA,IAAQ,CAAC,CAAC,CAAA;AACtD,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,UAAA,EAAY,OAAA,IAAW,EAAE,CAAC,CAAA;AAC7D,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA,EAAO,OAAA;AAAA,IACP,QAAQ,IAAA,GAAO;AAAA,GACjB;AACF;;;ACrVA,IAAM,sBAAA,uBAA6B,GAAA,CAAI;AAAA,EACrC,WAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,uBAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,kBAAA;AAAA,EACA,qBAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,UAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,oCAAoB,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,OAAA,EAAS,MAAM,CAAC,CAAA;AAE/D,SAAS,iBAAA,CAAkB,WAAA,EAA8B,OAAA,GAAU,aAAA,EAAuB;AACxF,EAAA,QAAQ,WAAA;AAAa,IACnB,KAAK,KAAA;AACH,MAAA,OAAO,OAAO,OAAO,CAAA,CAAA,CAAA;AAAA,IACvB,KAAK,KAAA;AACH,MAAA,OAAO,OAAO,OAAO,CAAA,CAAA,CAAA;AAAA,IACvB,KAAK,KAAA;AACH,MAAA,OAAO,OAAO,OAAO,CAAA,CAAA,CAAA;AAAA,IACvB,KAAK,KAAA;AACH,MAAA,OAAO,OAAO,OAAO,CAAA,CAAA,CAAA;AAAA,IACvB,KAAK,OAAA;AACH,MAAA,OAAO,mBAAmB,OAAO,CAAA,EAAA,CAAA;AAAA,IACnC,KAAK,MAAA;AACH,MAAA,OAAO,UAAU,OAAO,CAAA,YAAA,CAAA;AAAA,IAC1B;AACE,MAAA,OAAO,OAAO,OAAO,CAAA,CAAA,CAAA;AAAA;AAE3B;AAEA,SAAS,eAAe,QAAA,EAAuC;AAC7D,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,IAAA;AACH,MAAA,OAAO,mBAAA;AAAA,IACT,KAAK,IAAA;AACH,MAAA,OAAO,mBAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,oBAAA;AAAA,IACT,KAAK,IAAA;AACH,MAAA,OAAO,iBAAA;AAAA,IACT,KAAK,IAAA;AACH,MAAA,OAAO,gBAAA;AAAA,IACT;AACE,MAAA,OAAO,iBAAA;AAAA;AAEb;AAEA,SAAS,gBAAgB,KAAA,EAAqC;AAC5D,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,UAAA,CAAW,IAAA,CAAK,GAAG,IAAA,CAAK,UAAU,CAAA;AAClC,IAAA,MAAA,CAAO,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,MAAM,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,EAAE,YAAY,MAAA,EAAO;AAC9B;AAEA,SAAS,cAAc,MAAA,EAA8B;AACnD,EAAA,OAAO,MAAA,CAAO,WAAW,MAAA,GAAS,CAAA,MAAA,EAAS,OAAO,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AACjF;AAEA,SAAS,4BACP,IAAA,EACc;AACd,EAAA,MAAM,UAAA,GAAuB,CAAC,0CAA0C,CAAA;AACxE,EAAA,MAAM,MAAA,GAAkC,EAAE,gBAAA,EAAkB,IAAA,CAAK,YAAA,EAAa;AAE9E,EAAA,IAAI,IAAA,CAAK,mBAAmB,MAAA,EAAW;AACrC,IAAA,UAAA,CAAW,KAAK,8CAA8C,CAAA;AAC9D,IAAA,MAAA,CAAO,qBAAqB,IAAA,CAAK,cAAA;AAAA,EACnC;AAGA,EAAA,UAAA,CAAW,KAAK,yBAAyB,CAAA;AAEzC,EAAA,OAAO,EAAE,YAAY,MAAA,EAAO;AAC9B;AAEA,SAAS,uBAAuB,OAAA,EAA2E;AACzG,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,EAAK,KAAA,KAAU;AACjC,IAAA,MAAM,MAAA,GAASK,oBAAc,GAAG,CAAA;AAChC,IAAA,IAAI,CAAC,uBAAuB,GAAA,CAAI,MAAM,KAAK,iBAAA,CAAkB,GAAA,CAAI,MAAM,CAAA,EAAG;AACxE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,GAAG,CAAA,CAAE,CAAA;AAAA,IACrD;AACA,IAAA,MAAM,KAAA,GAAQ,YAAY,KAAK,CAAA,CAAA;AAC/B,IAAA,OAAO,EAAE,KAAK,SAAA,EAAW,CAAA,EAAG,MAAM,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,QAAA,EAAU,KAAA,EAAM;AAAA,EACpE,CAAC,CAAA;AACH;AAEA,SAAS,aAAa,MAAA,EAA2B;AAC/C,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAM,CAAA,IAAK,IAAA,GAAO,EAAA,GAAK,MAAA,CAAO,CAAC,CAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC/D;AAEA,eAAeC,UAAAA,CAAa,MAAA,EAA0B,KAAA,EAAe,MAAA,EAA+C;AAClH,EAAA,OAAQ,MAAA,CACN,MAAM,MAAA,CAAO,KAAA,CAAM;AAAA,IACjB,KAAA;AAAA,IACA,YAAA,EAAc,MAAA;AAAA,IACd,MAAA,EAAQ,aAAA;AAAA,IACR,mBAAA,EAAqB;AAAA,GACtB,GACD,IAAA,EAAK;AACT;AAMA,eAAsB,cAAA,CAAe,QAA0B,IAAA,EAAyC;AACtG,EAAA,MAAM,mBAAA,CAAoB,QAAQ,EAAE,SAAA,EAAW,CAAC,IAAA,CAAK,QAAQ,GAAG,CAAA;AAClE;AAEA,eAAsB,mBAAA,CAAoB,QAA0B,IAAA,EAA8C;AAChH,EAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AAEjC,EAAA,MAAM,OAAO,MAAA,CAAO;AAAA,IAClB,KAAA,EAAO,qBAAA;AAAA,IACP,MAAA,EAAQ,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,mBAAmB,CAAA;AAAA,IAC9C,MAAA,EAAQ,aAAA;AAAA,IACR,mBAAA,EAAqB;AAAA,GACtB,CAAA;AACH;AAMA,eAAsB,YAAA,CAAa,QAA0B,IAAA,EAAuD;AAClH,EAAA,MAAM,MAAA,GAASC,8BAAA,CAAuB,KAAA,CAAM,IAAI,CAAA;AAChD,EAAA,MAAM,MAAA,GAAS,6BAAA,CAA8B,MAAA,CAAO,OAAA,EAAS,GAAG,CAAA;AAChE,EAAA,MAAM,UAAA,GAAa,qBAAA,CAAsB,MAAA,CAAO,UAAU,CAAA;AAC1D,EAAA,MAAM,UAAU,wBAAA,CAAyB,CAAC,WAAW,CAAA,EAAG,MAAA,CAAO,SAAS,GAAG,CAAA;AAC3E,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,UAAA,CAAW,MAAA,GAAS,CAAA,MAAA,EAAS,OAAO,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAE5F,EAAA,MAAM,cAAc,MAAMD,UAAAA;AAAA,IACxB,MAAA;AAAA,IACA,CAAA,6BAAA,EAAgC,qBAAqB,CAAA,MAAA,EAAS,WAAW,CAAA,CAAA;AAAA,IACzE,MAAA,CAAO;AAAA,GACT;AAEA,EAAA,MAAM,OAAO,MAAMA,UAAAA;AAAA,IACjB,MAAA;AAAA,IACA,CAAA,cAAA,EAAiB,qBAAqB,CAAA,MAAA,EAAS,WAAW,aAAa,OAAO,CAAA,4CAAA,CAAA;AAAA,IAC9E,EAAE,GAAG,MAAA,CAAO,MAAA,EAAQ,OAAO,UAAA,CAAW,KAAA,EAAO,MAAA,EAAQ,UAAA,CAAW,MAAA;AAAO,GACzE;AAEA,EAAA,MAAM,QAAQ,MAAA,CAAO,WAAA,CAAY,CAAC,CAAA,EAAG,SAAS,CAAC,CAAA;AAE/C,EAAA,OAAO;AAAA,IACL,UAAA,EAAY;AAAA,MACV,KAAA;AAAA,MACA,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,OAAA,EAAA,CAAU,UAAA,CAAW,IAAA,GAAO,CAAA,IAAK,WAAW,OAAA,GAAU;AAAA,KACxD;AAAA,IACA,QAAA,EAAU,IAAA,CAAK,GAAA,CAAI,mBAAmB;AAAA,GACxC;AACF;AAMA,eAAsB,oBAAA,CACpB,QACA,IAAA,EACuC;AACvC,EAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,IAAA,CAAK,WAAW,CAAA;AACjD,EAAA,MAAM,QAAA,GAAW,4BAA4B,IAAI,CAAA;AACjD,EAAA,MAAM,YAAA,GAAe,6BAAA,CAA8B,IAAA,CAAK,OAAO,CAAA;AAC/D,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,EAAU,YAAY,CAAA;AACpD,EAAA,MAAM,WAAA,GAAc,cAAc,QAAQ,CAAA;AAE1C,EAAA,MAAM,MAAM,CAAA,OAAA,EAAU,MAAM,CAAA,eAAA,EAAkB,qBAAqB,IAAI,WAAW,CAAA,CAAA;AAClF,EAAA,MAAM,SAAS,MAAMA,UAAAA,CAAmC,MAAA,EAAQ,GAAA,EAAK,SAAS,MAAM,CAAA;AACpF,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,KAAA,IAAS,IAAA,GAAO,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,KAAK,CAAA;AAEvE,EAAA,IAAI,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,OAAA,EAAS,SAAA,EAAW;AACjD,IAAA,MAAM,EAAA,GAAK,KAAK,OAAA,CAAQ,SAAA;AACxB,IAAA,IAAI,EAAA,CAAG,KAAA,IAAS,EAAA,CAAG,GAAA,EAAK;AACtB,MAAA,MAAM,WAAW,EAAA,CAAG,GAAA,CAAI,SAAQ,GAAI,EAAA,CAAG,MAAM,OAAA,EAAQ;AACrD,MAAA,IAAI,SAAA;AACJ,MAAA,IAAI,OAAA;AAEJ,MAAA,QAAQ,KAAK,aAAA;AAAe,QAC1B,KAAK,iBAAA;AACH,UAAA,SAAA,GAAY,IAAI,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,OAAA,KAAY,QAAQ,CAAA;AAClD,UAAA,OAAA,GAAU,IAAI,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,OAAA,KAAY,QAAQ,CAAA;AAC9C,UAAA;AAAA,QACF,KAAK,cAAA;AACH,UAAA,SAAA,GAAY,IAAI,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,OAAA,KAAY,KAAQ,CAAA;AAClD,UAAA,OAAA,GAAU,IAAI,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,OAAA,KAAY,KAAQ,CAAA;AAC9C,UAAA;AAAA,QACF,KAAK,eAAA;AACH,UAAA,SAAA,GAAY,IAAI,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,OAAA,KAAY,MAAS,CAAA;AACnD,UAAA,OAAA,GAAU,IAAI,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,OAAA,KAAY,MAAS,CAAA;AAC/C,UAAA;AAAA,QACF;AACE,UAAA,SAAA,GAAY,IAAI,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,OAAA,KAAY,QAAQ,CAAA;AAClD,UAAA,OAAA,GAAU,IAAI,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,OAAA,KAAY,QAAQ,CAAA;AAAA;AAGlD,MAAA,MAAM,WAAA,GAAc;AAAA,QAClB,GAAI,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,QACrB,SAAA,EAAW,EAAE,KAAA,EAAO,SAAA,EAAW,GAAA,EAAK,OAAA,EAAS,cAAA,EAAgB,EAAA,CAAG,cAAA,EAAgB,YAAA,EAAc,EAAA,CAAG,YAAA;AAAa,OAChH;AACA,MAAA,MAAM,gBAAA,GAAmB,8BAA8B,WAAW,CAAA;AAClE,MAAA,MAAM,YAAA,GAAe,YAAA,CAAa,QAAA,EAAU,gBAAgB,CAAA;AAC5D,MAAA,MAAM,eAAA,GAAkB,cAAc,YAAY,CAAA;AAElD,MAAA,MAAM,aAAa,MAAMA,UAAAA;AAAA,QACvB,MAAA;AAAA,QACA,CAAA,OAAA,EAAU,MAAM,CAAA,eAAA,EAAkB,qBAAqB,IAAI,eAAe,CAAA,CAAA;AAAA,QAC1E,YAAA,CAAa;AAAA,OACf;AACA,MAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,CAAC,CAAA,EAAG,KAAA,IAAS,IAAA,GAAO,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA,EAAG,KAAK,CAAA;AAEvF,MAAA,IAAI,aAAA,GAA+B,IAAA;AACnC,MAAA,IAAI,aAAA,KAAkB,IAAA,IAAQ,aAAA,KAAkB,CAAA,IAAK,UAAU,IAAA,EAAM;AACnE,QAAA,aAAA,GAAA,CAAkB,KAAA,GAAQ,aAAA,IAAiB,IAAA,CAAK,GAAA,CAAI,aAAa,CAAA,GAAK,GAAA;AAAA,MACxE;AAEA,MAAA,OAAO,EAAE,KAAA,EAAO,aAAA,EAAe,aAAA,EAAc;AAAA,IAC/C;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,KAAA,EAAM;AACjB;AAEA,eAAsB,oBAAA,CACpB,QACA,IAAA,EACuC;AACvC,EAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,IAAA,CAAK,WAAW,CAAA;AACjD,EAAA,MAAM,QAAA,GAAW,4BAA4B,IAAI,CAAA;AACjD,EAAA,MAAM,YAAA,GAAe,6BAAA,CAA8B,IAAA,CAAK,OAAO,CAAA;AAC/D,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,EAAU,YAAY,CAAA;AACpD,EAAA,MAAM,WAAA,GAAc,cAAc,QAAQ,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,sBAAA,CAAuB,IAAA,CAAK,OAAO,CAAA;AAEpD,EAAA,MAAM,GAAA,GAAM,CAAA,OAAA,EAAU,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA,EAAK,MAAM,kBAAkB,qBAAqB,CAAA,CAAA,EAAI,WAAW,CAAA,UAAA,EAAa,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,oBAAA,CAAA;AACrL,EAAA,MAAM,OAAO,MAAMA,UAAAA,CAAmC,MAAA,EAAQ,GAAA,EAAK,SAAS,MAAM,CAAA;AAElF,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,MACvB,YAAY,MAAA,CAAO,WAAA;AAAA,QACjB,QAAA,CAAS,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,KAAU;AAC7B,UAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,SAAA,EAAY,KAAK,CAAA,CAAE,CAAA;AACjC,UAAA,OAAO,CAAC,MAAM,GAAA,EAAK,CAAA,IAAK,OAAO,IAAA,GAAO,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,QACjD,CAAC;AAAA,OACH;AAAA,MACA,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,CAAC;AAAA,KAC9B,CAAE;AAAA,GACJ;AACF;AAEA,eAAsB,qBAAA,CACpB,QACA,IAAA,EACwC;AACxC,EAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,IAAA,CAAK,WAAW,CAAA;AACjD,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA;AAChD,EAAA,MAAM,QAAA,GAAW,4BAA4B,IAAI,CAAA;AACjD,EAAA,MAAM,YAAA,GAAe,6BAAA,CAA8B,IAAA,CAAK,OAAO,CAAA;AAC/D,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,EAAU,YAAY,CAAA;AACpD,EAAA,MAAM,WAAA,GAAc,cAAc,QAAQ,CAAA;AAE1C,EAAA,IAAI,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC3C,IAAA,MAAM,QAAA,GAAW,sBAAA,CAAuB,IAAA,CAAK,OAAO,CAAA;AACpD,IAAA,MAAME,IAAAA,GAAM;AAAA,0CAAA,EAC4B,WAAW,CAAA;AAAA,aAAA,EACxC,QAAA,CAAS,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,aAAA,EACzC,MAAM,CAAA;AAAA,WAAA,EACR,qBAAqB,IAAI,WAAW;AAAA,uBAAA,EACxB,QAAA,CAAS,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA,IAAA,CAAA;AAG7D,IAAA,MAAMC,QAAO,MAAMH,UAAAA,CAAmC,MAAA,EAAQE,IAAAA,EAAK,SAAS,MAAM,CAAA;AAClF,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAA4E;AAElG,IAAA,KAAA,MAAW,OAAOC,KAAAA,EAAM;AACtB,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAG,UAAU,GAAA,CAAI,CAAA,SAAA,EAAY,KAAK,CAAA,CAAE,CAAC,CAAA;AACvE,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA;AACtC,MAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,EAAG;AACvB,QAAA,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,EAAE,IAAA,EAAM,YAAA,CAAa,WAAW,CAAA,EAAG,MAAA,EAAQ,EAAC,EAAG,CAAA;AAAA,MACpE;AACA,MAAA,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,CAAG,MAAA,CAAO,IAAA,CAAK;AAAA,QAC9B,SAAA,EAAW,GAAA,CAAI,MAAA,YAAkB,IAAA,GAAO,GAAA,CAAI,MAAA,GAAS,IAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,QAChF,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,CAAC;AAAA,OAC7B,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,CAAM,KAAK,SAAA,CAAU,MAAA,EAAQ,CAAA,EAAE;AAAA,EAClD;AAEA,EAAA,MAAM,GAAA,GAAM;AAAA,wCAAA,EAC4B,WAAW,CAAA;AAAA,WAAA,EACxC,MAAM,CAAA;AAAA,SAAA,EACR,qBAAqB,IAAI,WAAW;AAAA;AAAA;AAAA,EAAA,CAAA;AAI7C,EAAA,MAAM,OAAO,MAAMH,UAAAA,CAAmC,MAAA,EAAQ,GAAA,EAAK,SAAS,MAAM,CAAA;AAElF,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,IAAA,EAAM,IAAA,CAAK,cAAA,GAAiB,CAAA,EAAG,IAAA,CAAK,YAAY,CAAA,CAAA,EAAI,IAAA,CAAK,cAAc,CAAA,CAAA,GAAK,IAAA,CAAK,YAAA;AAAA,QACjF,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,UACvB,SAAA,EAAW,GAAA,CAAI,MAAA,YAAkB,IAAA,GAAO,GAAA,CAAI,MAAA,GAAS,IAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,UAChF,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,CAAC;AAAA,SAC9B,CAAE;AAAA;AACJ;AACF,GACF;AACF;AAEA,eAAsB,sBAAA,CACpB,QACA,IAAA,EACyC;AACzC,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA;AAChD,EAAA,MAAM,QAAA,GAAW,4BAA4B,IAAI,CAAA;AACjD,EAAA,MAAM,YAAA,GAAe,6BAAA,CAA8B,IAAA,CAAK,OAAO,CAAA;AAC/D,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,EAAU,YAAY,CAAA;AACpD,EAAA,MAAM,WAAA,GAAc,cAAc,QAAQ,CAAA;AAE1C,EAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA,IAAK,IAAA,CAAK,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AACrE,IAAA,MAAM,IAAI,MAAM,8DAA8D,CAAA;AAAA,EAChF;AAEA,EAAA,MAAM,SAAS,EAAC;AAChB,EAAA,KAAA,MAAW,CAAA,IAAK,KAAK,WAAA,EAAa;AAChC,IAAA,IAAI,CAAC,OAAO,QAAA,CAAS,CAAC,KAAK,CAAA,GAAI,CAAA,IAAK,IAAI,CAAA,EAAG;AACzC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8DAAA,EAAiE,CAAC,CAAA,CAAE,CAAA;AAAA,IACtF;AACA,IAAA,MAAM,GAAA,GAAM;AAAA,0CAAA,EAC4B,WAAW,CAAA;AAAA,sBAAA,EAC/B,CAAC,CAAA;AAAA,WAAA,EACZ,qBAAqB;AAAA,MAAA,EAC1B,WAAW;AAAA;AAAA;AAAA,IAAA,CAAA;AAIf,IAAA,MAAM,OAAO,MAAMA,UAAAA,CAAmC,MAAA,EAAQ,GAAA,EAAK,SAAS,MAAM,CAAA;AAElF,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,UAAA,EAAY,CAAA;AAAA,MACZ,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,QACvB,SAAA,EAAW,GAAA,CAAI,MAAA,YAAkB,IAAA,GAAO,GAAA,CAAI,MAAA,GAAS,IAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,QAChF,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,MAAA,IAAU,CAAC;AAAA,OAC/B,CAAE;AAAA,KACH,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,EAAE,MAAA,EAAO;AAClB;ACnZA,eAAsB,eAAA,CAAgB,QAA0B,IAAA,EAA0C;AACxG,EAAA,IAAI,IAAA,CAAK,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAE5B,EAAA,MAAM,OAAO,MAAA,CAAO;AAAA,IAClB,KAAA,EAAO,gBAAA;AAAA,IACP,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,cAAc,CAAA;AAAA,IACpC,MAAA,EAAQ,aAAA;AAAA,IACR,mBAAA,EAAqB;AAAA,GACtB,CAAA;AACH;AAEA,eAAsB,QAAA,CAAS,QAA0B,IAAA,EAA+C;AACtG,EAAA,MAAM,MAAA,GAASI,0BAAA,CAAmB,KAAA,CAAM,IAAI,CAAA;AAC5C,EAAA,MAAM,MAAA,GAAS,yBAAA,CAA0B,MAAA,CAAO,OAAA,EAAS,GAAG,CAAA;AAC5D,EAAA,MAAM,UAAA,GAAa,qBAAA,CAAsB,MAAA,CAAO,UAAU,CAAA;AAC1D,EAAA,MAAM,UAAU,wBAAA,CAAyB,CAAC,WAAW,CAAA,EAAG,MAAA,CAAO,SAAS,GAAG,CAAA;AAC3E,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,UAAA,CAAW,MAAA,GAAS,CAAA,MAAA,EAAS,OAAO,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAE5F,EAAA,MAAM,WAAA,GAAe,MAAA,CACnB,MAAM,MAAA,CAAO,KAAA,CAAM;AAAA,IACjB,KAAA,EAAO,CAAA,6BAAA,EAAgC,gBAAgB,CAAA,MAAA,EAAS,WAAW,CAAA,CAAA;AAAA,IAC3E,cAAc,MAAA,CAAO,MAAA;AAAA,IACrB,MAAA,EAAQ,aAAA;AAAA,IACR,mBAAA,EAAqB;AAAA,GACtB,GACD,IAAA,EAAK;AAEP,EAAA,MAAM,IAAA,GAAQ,MAAA,CACZ,MAAM,MAAA,CAAO,KAAA,CAAM;AAAA,IACjB,KAAA,EAAO;AAAA;AAAA,aAAA,EAEE,gBAAgB,CAAA;AAAA,QAAA,EACrB,WAAW;AAAA,iBAAA,EACF,OAAO;AAAA;AAAA,MAAA,CAAA;AAAA,IAGpB,YAAA,EAAc;AAAA,MACZ,GAAG,MAAA,CAAO,MAAA;AAAA,MACV,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,QAAQ,UAAA,CAAW;AAAA,KACrB;AAAA,IACA,MAAA,EAAQ,aAAA;AAAA,IACR,mBAAA,EAAqB;AAAA,GACtB,GACD,IAAA,EAAK;AAEP,EAAA,MAAM,QAAQ,MAAA,CAAO,WAAA,CAAY,CAAC,CAAA,EAAG,SAAS,CAAC,CAAA;AAE/C,EAAA,OAAO;AAAA,IACL,UAAA,EAAY;AAAA,MACV,KAAA;AAAA,MACA,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,OAAA,EAAA,CAAU,UAAA,CAAW,IAAA,GAAO,CAAA,IAAK,WAAW,OAAA,GAAU;AAAA,KACxD;AAAA,IACA,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,cAAc;AAAA,GAC/B;AACF;AC7BA,IAAM,oBAAA,uBAA2B,GAAA,CAAI;AAAA,EACnC,WAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,uBAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,kBAAA;AAAA,EACA,qBAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGD,IAAMC,kBAAAA,uBAAwB,GAAA,CAAI,CAAC,YAAY,OAAA,EAAS,cAAA,EAAgB,MAAM,CAAC,CAAA;AAE/E,SAAS,yBAAyB,cAAA,EAA0D;AAC1F,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,MAAM,IAAI,MAAM,CAAA,+DAAA,CAAiE,CAAA;AAAA,EACnF;AAGA,EAAA,IAAI,CAAEC,+BAAA,CAA8C,QAAA,CAAS,cAAc,CAAA,EAAG;AAC5E,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,cAAc,CAAA,CAAE,CAAA;AAAA,EAC7D;AACA,EAAA,OAAOP,oBAAc,cAAc,CAAA;AACrC;AAEA,SAASQ,kBAAAA,CACP,WAAA,EACA,OAAA,GAAU,OAAA,EACV,cAAA,EACQ;AACR,EAAA,QAAQ,WAAA;AAAa,IACnB,KAAK,KAAA;AACH,MAAA,OAAO,OAAO,OAAO,CAAA,CAAA,CAAA;AAAA,IACvB,KAAK,KAAA;AACH,MAAA,OAAO,OAAO,OAAO,CAAA,CAAA,CAAA;AAAA,IACvB,KAAK,KAAA;AACH,MAAA,OAAO,OAAO,OAAO,CAAA,CAAA,CAAA;AAAA,IACvB,KAAK,KAAA;AACH,MAAA,OAAO,OAAO,OAAO,CAAA,CAAA,CAAA;AAAA,IACvB,KAAK,OAAA;AACH,MAAA,OAAO,mBAAmB,OAAO,CAAA,EAAA,CAAA;AAAA,IACnC,KAAK,gBAAA,EAAkB;AAErB,MAAA,OAAO,CAAA,eAAA,EAAkB,wBAAA,CAAyB,cAAc,CAAC,CAAA,EAAA,CAAA;AAAA,IACnE;AAAA,IACA,KAAK,MAAA;AACH,MAAA,OAAO,UAAU,OAAO,CAAA,YAAA,CAAA;AAAA,IAC1B;AACE,MAAA,OAAO,OAAO,OAAO,CAAA,CAAA,CAAA;AAAA;AAE3B;AAEA,SAASC,gBAAe,QAAA,EAAuC;AAC7D,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,IAAA;AACH,MAAA,OAAO,mBAAA;AAAA,IACT,KAAK,IAAA;AACH,MAAA,OAAO,mBAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,oBAAA;AAAA,IACT,KAAK,IAAA;AACH,MAAA,OAAO,iBAAA;AAAA,IACT,KAAK,IAAA;AACH,MAAA,OAAO,gBAAA;AAAA,IACT;AACE,MAAA,OAAO,iBAAA;AAAA;AAEb;AAEA,SAAS,oBAAA,CAAqB,SAAS,EAAA,EAAY;AACjD,EAAA,MAAM,MAAM,CAAC,GAAA,KAAgB,CAAA,EAAG,MAAM,GAAG,GAAG,CAAA,CAAA;AAG5C,EAAA,OAAO,CAAA,MAAA,EAAS,IAAI,eAAe,CAAC,KAAK,GAAA,CAAI,eAAe,CAAC,CAAA,8DAAA,EAAiE,GAAA,CAAI,UAAU,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,UAAU,CAAC,CAAA,6BAAA,EAAgC,GAAA,CAAI,UAAU,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,UAAU,CAAC,CAAA,2CAAA,CAAA;AACtO;AAOA,SAAS,wBAAwB,GAAA,EAA2C;AAC1E,EAAA,OAAO;AAAA,IACL,eAAe,GAAA,CAAI,iBAAA,IAAqB,OAAO,IAAA,GAAO,MAAA,CAAO,IAAI,iBAAiB,CAAA;AAAA,IAClF,QAAA,EAAU,GAAA,CAAI,YAAA,IAAgB,IAAA,IAAQ,GAAA,CAAI,iBAAiB,EAAA,GAAK,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,YAAY;AAAA,GAChG;AACF;AAEA,SAAS,sBAAsB,KAAA,EAA+B;AAC5D,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,CAAC,CAAA,mCAAA,CAAqC,CAAA;AAAA,IAClD,MAAA,EAAQ,EAAE,WAAA,EAAa,KAAA;AAAM,GAC/B;AACF;AAEA,SAASC,iBAAgB,KAAA,EAAqC;AAC5D,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,UAAA,CAAW,IAAA,CAAK,GAAG,IAAA,CAAK,UAAU,CAAA;AAClC,IAAA,MAAA,CAAO,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,MAAM,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,EAAE,YAAY,MAAA,EAAO;AAC9B;AAEA,SAASC,eAAc,MAAA,EAA8B;AACnD,EAAA,OAAO,MAAA,CAAO,WAAW,MAAA,GAAS,CAAA,MAAA,EAAS,OAAO,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AACjF;AAWA,SAAS,eAAe,OAAA,EAAsC;AAC5D,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,EAAK,KAAA,KAAU;AACjC,IAAA,IAAI,oBAAA,CAAqB,GAAA,CAAI,GAAG,CAAA,EAAG;AACjC,MAAA,MAAM,MAAA,GAASX,oBAAc,GAAG,CAAA;AAChC,MAAA,IAAIM,kBAAAA,CAAkB,GAAA,CAAI,MAAM,CAAA,EAAG;AACjC,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,GAAG,CAAA,CAAE,CAAA;AAAA,MACrD;AACA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,GAAA;AAAA,QACA,QAAA,EAAU,MAAA;AAAA,QACV,SAAA,EAAW,CAAA,EAAG,MAAM,CAAA,IAAA,EAAO,MAAM,CAAA,CAAA;AAAA,QACjC,QAAA,EAAU,MAAA;AAAA,QACV,SAAA,EAAW;AAAA,OACb;AAAA,IACF;AAGA,IAAA,MAAM,KAAA,GAAQ,YAAY,KAAK,CAAA,CAAA;AAC/B,IAAA,MAAM,QAAA,GAAW,qBAAqB,KAAK,CAAA,SAAA,CAAA;AAC3C,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,GAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA,EAAW,CAAA,EAAG,QAAQ,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA;AAAA,MAClC,QAAA,EAAU,KAAA;AAAA,MACV,SAAA,EAAW;AAAA,KACb;AAAA,EACF,CAAC,CAAA;AACH;AAEA,SAAS,sBAAsB,QAAA,EAAsD;AACnF,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,IAAI,QAAA,CAAS,CAAC,CAAA,CAAG,IAAA,KAAS,OAAA,EAAS;AACjC,MAAA,MAAA,CAAO,aAAa,CAAC,CAAA,CAAE,CAAA,GAAI,QAAA,CAAS,CAAC,CAAA,CAAG,GAAA;AAAA,IAC1C;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,8BAA8B,QAAA,EAAuC;AAC5E,EAAA,OAAO,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,OAAO,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAG,CAAA,CAAE,QAAQ,CAAA,MAAA,CAAQ,CAAA;AAChF;AAEA,SAAS,qBAAqB,KAAA,EAAwB;AACpD,EAAA,OAAO,SAAS,IAAA,IAAQ,KAAA,KAAU,EAAA,GAAK,EAAA,GAAK,OAAO,KAAK,CAAA;AAC1D;AAEA,eAAeL,UAAAA,CAAa,MAAA,EAA0B,KAAA,EAAe,MAAA,EAA+C;AAClH,EAAA,OAAQ,MAAA,CACN,MAAM,MAAA,CAAO,KAAA,CAAM;AAAA,IACjB,KAAA;AAAA,IACA,YAAA,EAAc,MAAA;AAAA,IACd,MAAA,EAAQ,aAAA;AAAA,IACR,mBAAA,EAAqB;AAAA,GACtB,GACD,IAAA,EAAK;AACT;AAMA,eAAsB,kBAAA,CAAmB,QAA0B,IAAA,EAA6C;AAC9G,EAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAE/B,EAAA,MAAM,OAAO,MAAA,CAAO;AAAA,IAClB,KAAA,EAAO,mBAAA;AAAA,IACP,MAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,iBAAiB,CAAA;AAAA,IAC1C,MAAA,EAAQ,aAAA;AAAA,IACR,mBAAA,EAAqB;AAAA,GACtB,CAAA;AACH;AAMA,eAAsB,WAAA,CAAY,QAA0B,IAAA,EAAqD;AAC/G,EAAA,MAAM,MAAA,GAASW,6BAAA,CAAsB,KAAA,CAAM,IAAI,CAAA;AAC/C,EAAA,MAAM,MAAA,GAAS,4BAAA,CAA6B,MAAA,CAAO,OAAA,EAAS,GAAG,CAAA;AAC/D,EAAA,MAAM,UAAA,GAAa,qBAAA,CAAsB,MAAA,CAAO,UAAU,CAAA;AAC1D,EAAA,MAAM,UAAU,wBAAA,CAAyB,CAAC,WAAW,CAAA,EAAG,MAAA,CAAO,SAAS,GAAG,CAAA;AAC3E,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,UAAA,CAAW,MAAA,GAAS,CAAA,MAAA,EAAS,OAAO,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAE5F,EAAA,MAAM,cAAc,MAAMX,UAAAA;AAAA,IACxB,MAAA;AAAA,IACA,CAAA,6BAAA,EAAgC,mBAAmB,CAAA,MAAA,EAAS,WAAW,CAAA,CAAA;AAAA,IACvE,MAAA,CAAO;AAAA,GACT;AAEA,EAAA,MAAM,OAAO,MAAMA,UAAAA;AAAA,IACjB,MAAA;AAAA,IACA,CAAA,cAAA,EAAiB,mBAAmB,CAAA,MAAA,EAAS,WAAW,aAAa,OAAO,CAAA,4CAAA,CAAA;AAAA,IAC5E,EAAE,GAAG,MAAA,CAAO,MAAA,EAAQ,OAAO,UAAA,CAAW,KAAA,EAAO,MAAA,EAAQ,UAAA,CAAW,MAAA;AAAO,GACzE;AAEA,EAAA,MAAM,QAAQ,MAAA,CAAO,WAAA,CAAY,CAAC,CAAA,EAAG,SAAS,CAAC,CAAA;AAE/C,EAAA,OAAO;AAAA,IACL,UAAA,EAAY;AAAA,MACV,KAAA;AAAA,MACA,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,OAAA,EAAA,CAAU,UAAA,CAAW,IAAA,GAAO,CAAA,IAAK,WAAW,OAAA,GAAU;AAAA,KACxD;AAAA,IACA,OAAA,EAAS,IAAA,CAAK,GAAA,CAAI,iBAAiB;AAAA,GACrC;AACF;AAMA,eAAsB,kBAAA,CACpB,QACA,IAAA,EACqC;AACrC,EAAA,MAAM,SAASO,kBAAAA,CAAkB,IAAA,CAAK,WAAA,EAAa,OAAA,EAAS,KAAK,cAAc,CAAA;AAC/E,EAAA,MAAM,UAAA,GAAa,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAA;AAClD,EAAA,MAAM,YAAA,GAAe,4BAAA,CAA6B,IAAA,CAAK,OAAO,CAAA;AAC9D,EAAA,MAAM,QAAA,GAAWE,aAAAA,CAAa,UAAA,EAAY,YAAY,CAAA;AACtD,EAAA,MAAM,WAAA,GAAcC,eAAc,QAAQ,CAAA;AAE1C,EAAA,MAAM,GAAA,GAAM,UAAU,MAAM,CAAA,WAAA,EAAc,sBAAsB,CAAA,MAAA,EAAS,mBAAmB,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AAC3G,EAAA,MAAM,SAAS,MAAMV,UAAAA,CAAmC,MAAA,EAAQ,GAAA,EAAK,SAAS,MAAM,CAAA;AACpF,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAC,CAAA,IAAK,EAAC;AAC1B,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA,IAAS,OAAO,IAAA,GAAO,MAAA,CAAO,IAAI,KAAK,CAAA;AACzD,EAAA,MAAM,WAAA,GAAc,wBAAwB,GAAG,CAAA;AAG/C,EAAA,IAAI,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,OAAA,EAAS,SAAA,EAAW;AACjD,IAAA,MAAM,EAAA,GAAK,KAAK,OAAA,CAAQ,SAAA;AACxB,IAAA,IAAI,EAAA,CAAG,KAAA,IAAS,EAAA,CAAG,GAAA,EAAK;AACtB,MAAA,MAAM,WAAW,EAAA,CAAG,GAAA,CAAI,SAAQ,GAAI,EAAA,CAAG,MAAM,OAAA,EAAQ;AACrD,MAAA,IAAI,SAAA;AACJ,MAAA,IAAI,OAAA;AAEJ,MAAA,QAAQ,KAAK,aAAA;AAAe,QAC1B,KAAK,iBAAA;AACH,UAAA,SAAA,GAAY,IAAI,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,OAAA,KAAY,QAAQ,CAAA;AAClD,UAAA,OAAA,GAAU,IAAI,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,OAAA,KAAY,QAAQ,CAAA;AAC9C,UAAA;AAAA,QACF,KAAK,cAAA;AACH,UAAA,SAAA,GAAY,IAAI,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,OAAA,KAAY,KAAQ,CAAA;AAClD,UAAA,OAAA,GAAU,IAAI,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,OAAA,KAAY,KAAQ,CAAA;AAC9C,UAAA;AAAA,QACF,KAAK,eAAA;AACH,UAAA,SAAA,GAAY,IAAI,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,OAAA,KAAY,MAAS,CAAA;AACnD,UAAA,OAAA,GAAU,IAAI,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,OAAA,KAAY,MAAS,CAAA;AAC/C,UAAA;AAAA,QACF;AACE,UAAA,SAAA,GAAY,IAAI,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,OAAA,KAAY,QAAQ,CAAA;AAClD,UAAA,OAAA,GAAU,IAAI,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,OAAA,KAAY,QAAQ,CAAA;AAAA;AAGlD,MAAA,MAAM,WAAA,GAAc;AAAA,QAClB,GAAI,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,QACrB,SAAA,EAAW;AAAA,UACT,KAAA,EAAO,SAAA;AAAA,UACP,GAAA,EAAK,OAAA;AAAA,UACL,gBAAgB,EAAA,CAAG,cAAA;AAAA,UACnB,cAAc,EAAA,CAAG;AAAA;AACnB,OACF;AACA,MAAA,MAAM,gBAAA,GAAmB,6BAA6B,WAAW,CAAA;AACjE,MAAA,MAAM,YAAA,GAAeS,aAAAA,CAAa,UAAA,EAAY,gBAAgB,CAAA;AAC9D,MAAA,MAAM,eAAA,GAAkBC,eAAc,YAAY,CAAA;AAElD,MAAA,MAAM,OAAA,GAAU,UAAU,MAAM,CAAA,WAAA,EAAc,sBAAsB,CAAA,MAAA,EAAS,mBAAmB,CAAA,CAAA,EAAI,eAAe,CAAA,CAAA;AACnH,MAAA,MAAM,aAAa,MAAMV,UAAAA,CAAmC,MAAA,EAAQ,OAAA,EAAS,aAAa,MAAM,CAAA;AAChG,MAAA,MAAM,OAAA,GAAU,UAAA,CAAW,CAAC,CAAA,IAAK,EAAC;AAClC,MAAA,MAAM,gBAAgB,OAAA,CAAQ,KAAA,IAAS,OAAO,IAAA,GAAO,MAAA,CAAO,QAAQ,KAAK,CAAA;AACzE,MAAA,MAAM,mBAAA,GAAsB,wBAAwB,OAAO,CAAA;AAE3D,MAAA,IAAI,aAAA,GAA+B,IAAA;AACnC,MAAA,IAAI,aAAA,KAAkB,IAAA,IAAQ,aAAA,KAAkB,CAAA,IAAK,UAAU,IAAA,EAAM;AACnE,QAAA,aAAA,GAAA,CAAkB,KAAA,GAAQ,aAAA,IAAiB,IAAA,CAAK,GAAA,CAAI,aAAa,CAAA,GAAK,GAAA;AAAA,MACxE;AAEA,MAAA,IAAI,iBAAA,GAAmC,IAAA;AACvC,MAAA,IACE,mBAAA,CAAoB,kBAAkB,IAAA,IACtC,mBAAA,CAAoB,kBAAkB,CAAA,IACtC,WAAA,CAAY,kBAAkB,IAAA,EAC9B;AACA,QAAA,iBAAA,GAAA,CACI,WAAA,CAAY,gBAAgB,mBAAA,CAAoB,aAAA,IAChD,KAAK,GAAA,CAAI,mBAAA,CAAoB,aAAa,CAAA,GAC5C,GAAA;AAAA,MACJ;AAEA,MAAA,OAAO;AAAA,QACL,KAAA;AAAA,QACA,eAAe,WAAA,CAAY,aAAA;AAAA,QAC3B,UAAU,WAAA,CAAY,QAAA;AAAA,QACtB,aAAA;AAAA,QACA,uBAAuB,mBAAA,CAAoB,aAAA;AAAA,QAC3C,aAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,aAAA,EAAe,YAAY,aAAA,EAAe,QAAA,EAAU,YAAY,QAAA,EAAS;AAC3F;AAEA,eAAsB,kBAAA,CACpB,QACA,IAAA,EACqC;AACrC,EAAA,MAAM,SAASO,kBAAAA,CAAkB,IAAA,CAAK,WAAA,EAAa,OAAA,EAAS,KAAK,cAAc,CAAA;AAC/E,EAAA,MAAM,UAAA,GAAa,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAA;AAClD,EAAA,MAAM,YAAA,GAAe,4BAAA,CAA6B,IAAA,CAAK,OAAO,CAAA;AAC9D,EAAA,MAAM,QAAA,GAAWE,aAAAA,CAAa,UAAA,EAAY,YAAY,CAAA;AAEtD,EAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA;AACnD,EAAA,MAAM,WAAA,GAAc,sBAAsB,eAAe,CAAA;AACzD,EAAA,MAAM,eAAA,GAAkB,8BAA8B,eAAe,CAAA;AACrE,EAAA,MAAM,aAAA,GAAgB,gBAAgB,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,SAAS,CAAA,CAAE,KAAK,IAAI,CAAA;AACrE,EAAA,MAAM,WAAA,GAAc,gBAAgB,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,QAAQ,CAAA,CAAE,KAAK,IAAI,CAAA;AAGlE,EAAA,MAAM,gBAAgB,CAAC,GAAG,QAAA,CAAS,UAAA,EAAY,GAAG,eAAe,CAAA;AACjE,EAAA,MAAM,eAAA,GAAkB,cAAc,MAAA,GAAS,CAAA,MAAA,EAAS,cAAc,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAExF,EAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,cAAA,KAAmB,KAAA,GAAQ,KAAA,GAAQ,MAAA;AAC/D,EAAA,MAAM,WAAA,GAAc,OAAO,IAAA,CAAK,KAAA,KAAU,WAAW,CAAA,8BAAA,CAAA,GAAmC,EAAA;AACxF,EAAA,MAAM,WAAA,GAAuC,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,GAAW,EAAE,eAAA,EAAiB,IAAA,CAAK,KAAA,EAAM,GAAI,EAAC;AAEjH,EAAA,MAAM,GAAA,GAAM;AAAA,WAAA,EACD,aAAa,CAAA,EAAA,EAAK,MAAM,CAAA,WAAA,EAAc,sBAAsB;AAAA,SAAA,EAC9D,mBAAmB;AAAA,IAAA,EACxB,eAAe;AAAA,aAAA,EACN,WAAW;AAAA,mBAAA,EACL,cAAc;AAAA,IAAA,EAC7B,WAAW;AAAA,EAAA,CAAA;AAEf,EAAA,MAAM,IAAA,GAAO,MAAMT,UAAAA,CAAmC,MAAA,EAAQ,GAAA,EAAK;AAAA,IACjE,GAAG,QAAA,CAAS,MAAA;AAAA,IACZ,GAAG,WAAA;AAAA,IACH,GAAG;AAAA,GACJ,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO;AAC7B,IAAA,MAAM,aAA4C,EAAC;AACnD,IAAA,KAAA,MAAW,SAAS,eAAA,EAAiB;AACnC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA;AAC/B,MAAA,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,GAAI,GAAA,IAAO,QAAQ,GAAA,KAAQ,EAAA,GAAK,IAAA,GAAO,MAAA,CAAO,GAAG,CAAA;AAAA,IACvE;AACA,IAAA,MAAM,EAAA,GAAK,wBAAwB,GAAG,CAAA;AACtC,IAAA,OAAO;AAAA,MACL,UAAA;AAAA,MACA,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,CAAC,CAAA;AAAA,MAC5B,eAAe,EAAA,CAAG,aAAA;AAAA,MAClB,UAAU,EAAA,CAAG;AAAA,KACf;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,EAAE,MAAA,EAAO;AAClB;AAEA,eAAsB,mBAAA,CACpB,QACA,IAAA,EACsC;AACtC,EAAA,MAAM,SAASO,kBAAAA,CAAkB,IAAA,CAAK,WAAA,EAAa,OAAA,EAAS,KAAK,cAAc,CAAA;AAC/E,EAAA,MAAM,WAAA,GAAcC,eAAAA,CAAe,IAAA,CAAK,QAAQ,CAAA;AAChD,EAAA,MAAM,UAAA,GAAa,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAA;AAClD,EAAA,MAAM,YAAA,GAAe,4BAAA,CAA6B,IAAA,CAAK,OAAO,CAAA;AAC9D,EAAA,MAAM,QAAA,GAAWC,aAAAA,CAAa,UAAA,EAAY,YAAY,CAAA;AACtD,EAAA,MAAM,WAAA,GAAcC,eAAc,QAAQ,CAAA;AAE1C,EAAA,IAAI,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC3C,IAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA;AACnD,IAAA,MAAM,WAAA,GAAc,sBAAsB,eAAe,CAAA;AACzD,IAAA,MAAM,eAAA,GAAkB,8BAA8B,eAAe,CAAA;AACrE,IAAA,MAAM,aAAA,GAAgB,gBAAgB,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,SAAS,CAAA,CAAE,KAAK,IAAI,CAAA;AACrE,IAAA,MAAM,WAAA,GAAc,gBAAgB,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,QAAQ,CAAA,CAAE,KAAK,IAAI,CAAA;AAElE,IAAA,MAAM,gBAAgB,CAAC,GAAG,QAAA,CAAS,UAAA,EAAY,GAAG,eAAe,CAAA;AACjE,IAAA,MAAM,aAAA,GAAgB,cAAc,MAAA,GAAS,CAAA,MAAA,EAAS,cAAc,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAEtF,IAAA,MAAMR,IAAAA,GAAM;AAAA,0CAAA,EAC4B,WAAW,CAAA;AAAA,aAAA,EACxC,aAAa,CAAA;AAAA,aAAA,EACb,MAAM,CAAA;AAAA,aAAA,EACN,sBAAsB;AAAA,WAAA,EACxB,mBAAmB;AAAA,MAAA,EACxB,aAAa;AAAA,uBAAA,EACI,WAAW;AAAA;AAAA,IAAA,CAAA;AAGhC,IAAA,MAAMC,KAAAA,GAAO,MAAMH,UAAAA,CAAmC,MAAA,EAAQE,IAAAA,EAAK,EAAE,GAAG,QAAA,CAAS,MAAA,EAAQ,GAAG,WAAA,EAAa,CAAA;AAEzG,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAOpB;AAEF,IAAA,KAAA,MAAW,OAAOC,KAAAA,EAAM;AACtB,MAAA,MAAM,eAAA,GAAkB,gBAAgB,GAAA,CAAI,CAAAS,WAAS,GAAA,CAAIA,MAAAA,CAAM,SAAS,CAAC,CAAA;AACzE,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,eAAe,CAAA;AAChD,MAAA,MAAM,OAAO,eAAA,CAAgB,GAAA,CAAI,oBAAoB,CAAA,CAAE,KAAK,GAAG,CAAA;AAC/D,MAAA,MAAM,EAAA,GAAK,wBAAwB,GAAG,CAAA;AAEtC,MAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA,EAAG;AAC7B,QAAA,SAAA,CAAU,GAAA,CAAI,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA,kBAAW,IAAI,GAAA,EAAI,EAAG,MAAA,EAAQ,EAAC,EAAG,CAAA;AAAA,MACrE;AACA,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA;AACrC,MAAA,IAAI,GAAG,QAAA,EAAU,KAAA,CAAM,SAAA,CAAU,GAAA,CAAI,GAAG,QAAQ,CAAA;AAChD,MAAA,KAAA,CAAM,OAAO,IAAA,CAAK;AAAA,QAChB,SAAA,EAAW,GAAA,CAAI,MAAA,YAAkB,IAAA,GAAO,GAAA,CAAI,MAAA,GAAS,IAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,QAChF,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,CAAC,CAAA;AAAA,QAC5B,eAAe,EAAA,CAAG;AAAA,OACnB,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,CAAE,IAAI,CAAA,CAAA,MAAM;AAAA,MACtD,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,QAAA,EAAU,CAAA,CAAE,SAAA,CAAU,IAAA,KAAS,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA,CAAE,CAAC,CAAA,GAAK,IAAA;AAAA,MACjE,QAAQ,CAAA,CAAE;AAAA,KACZ,CAAE,CAAA;AAEF,IAAA,OAAO,EAAE,MAAA,EAAO;AAAA,EAClB;AAGA,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AACrC,EAAA,MAAM,GAAA,GAAM;AAAA,wCAAA,EAC4B,WAAW,CAAA;AAAA,WAAA,EACxC,MAAM,CAAA;AAAA,WAAA,EACN,sBAAsB;AAAA,SAAA,EACxB,mBAAmB;AAAA,IAAA,EACxB,WAAW;AAAA;AAAA;AAAA,EAAA,CAAA;AAIf,EAAA,MAAM,OAAO,MAAMZ,UAAAA,CAAmC,MAAA,EAAQ,GAAA,EAAK,SAAS,MAAM,CAAA;AAElF,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAY;AACzC,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,EAAA,GAAK,wBAAwB,GAAG,CAAA;AACtC,IAAA,IAAI,EAAA,CAAG,QAAA,EAAU,gBAAA,CAAiB,GAAA,CAAI,GAAG,QAAQ,CAAA;AAAA,EACnD;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,QAAA,EAAU,iBAAiB,IAAA,KAAS,CAAA,GAAI,MAAM,IAAA,CAAK,gBAAgB,CAAA,CAAE,CAAC,CAAA,GAAK,IAAA;AAAA,QAC3E,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO;AACtB,UAAA,MAAM,EAAA,GAAK,wBAAwB,GAAG,CAAA;AACtC,UAAA,OAAO;AAAA,YACL,SAAA,EAAW,GAAA,CAAI,MAAA,YAAkB,IAAA,GAAO,GAAA,CAAI,MAAA,GAAS,IAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,YAChF,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,CAAC,CAAA;AAAA,YAC5B,eAAe,EAAA,CAAG;AAAA,WACpB;AAAA,QACF,CAAC;AAAA;AACH;AACF,GACF;AACF;AAEA,eAAsB,oBAAA,CACpB,QACA,IAAA,EACuC;AACvC,EAAA,MAAM,WAAA,GAAcQ,eAAAA,CAAe,IAAA,CAAK,QAAQ,CAAA;AAChD,EAAA,MAAM,YAAA,GAAe,4BAAA,CAA6B,IAAA,CAAK,OAAO,CAAA;AAC9D,EAAA,MAAM,UAAA,GAA2B;AAAA,IAC/B,UAAA,EAAY,CAAC,CAAA,8BAAA,CAAgC,CAAA;AAAA,IAC7C,MAAA,EAAQ,EAAE,cAAA,EAAgB,IAAA,CAAK,IAAA;AAAK,GACtC;AACA,EAAA,MAAM,QAAA,GAAWC,aAAAA,CAAa,UAAA,EAAY,YAAY,CAAA;AACtD,EAAA,MAAM,WAAA,GAAcC,eAAc,QAAQ,CAAA;AAE1C,EAAA,MAAM,SAAS,EAAC;AAChB,EAAA,KAAA,MAAW,CAAA,IAAK,KAAK,WAAA,EAAa;AAChC,IAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,EAAG;AAClB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8CAAA,EAAiD,CAAC,CAAA,CAAE,CAAA;AAAA,IACtE;AACA,IAAA,MAAM,GAAA,GAAM;AAAA,0CAAA,EAC4B,WAAW,CAAA;AAAA,sBAAA,EAC/B,CAAC,CAAA;AAAA,WAAA,EACZ,mBAAmB;AAAA,MAAA,EACxB,WAAW;AAAA;AAAA;AAAA,IAAA,CAAA;AAIf,IAAA,MAAM,OAAO,MAAMV,UAAAA,CAAmC,MAAA,EAAQ,GAAA,EAAK,SAAS,MAAM,CAAA;AAElF,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,UAAA,EAAY,CAAA;AAAA,MACZ,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,QACvB,SAAA,EAAW,GAAA,CAAI,MAAA,YAAkB,IAAA,GAAO,GAAA,CAAI,MAAA,GAAS,IAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,QAChF,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,MAAA,IAAU,CAAC;AAAA,OAC/B,CAAE;AAAA,KACH,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,EAAE,MAAA,EAAO;AAClB;AAOA,eAAsB,cAAA,CACpB,QACA,IAAA,EACiC;AACjC,EAAA,MAAM,UAAA,GAAuB,CAAC,CAAA,mBAAA,CAAqB,CAAA;AACnD,EAAA,MAAM,SAAkC,EAAC;AAEzC,EAAA,IAAI,KAAK,MAAA,EAAQ;AACf,IAAA,UAAA,CAAW,KAAK,CAAA,8BAAA,CAAgC,CAAA;AAChD,IAAA,MAAA,CAAO,UAAA,GAAa,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,CAAA,CAAA;AAAA,EACpC;AAEA,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,GAAQ,CAAA,wBAAA,CAAA,GAA6B,EAAA;AAC9D,EAAA,IAAI,IAAA,CAAK,KAAA,EAAO,MAAA,CAAO,SAAA,GAAY,IAAA,CAAK,KAAA;AAExC,EAAA,MAAM,OAAO,MAAMA,UAAAA;AAAA,IACjB,MAAA;AAAA,IACA,CAAA,kBAAA,EAAqB,sBAAsB,CAAA,OAAA,EAAU,UAAA,CAAW,KAAK,OAAO,CAAC,mBAAmB,WAAW,CAAA,CAAA;AAAA,IAC3G;AAAA,GACF;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA,EAAE;AACzC;AAEA,eAAsB,kBAAA,CACpB,QACA,IAAA,EACqC;AACrC,EAAA,MAAM,OAAO,MAAMA,UAAAA;AAAA,IACjB,MAAA;AAAA,IACA,qBAAqB,sBAAsB,CAAA,4EAAA,CAAA;AAAA,IAC3C,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA;AAAW,GAChC;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA,EAAE;AACxC;AAEA,eAAsB,oBAAA,CACpB,QACA,IAAA,EACuC;AACvC,EAAA,MAAM,UAAA,GAAuB,CAAC,CAAA,yBAAA,CAAA,EAA6B,CAAA,0BAAA,CAAA,EAA8B,CAAA,wBAAA,CAA0B,CAAA;AACnH,EAAA,MAAM,MAAA,GAAkC;AAAA,IACtC,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,UAAU,IAAA,CAAK;AAAA,GACjB;AAEA,EAAA,IAAI,KAAK,MAAA,EAAQ;AACf,IAAA,UAAA,CAAW,KAAK,CAAA,6BAAA,CAA+B,CAAA;AAC/C,IAAA,MAAA,CAAO,SAAA,GAAY,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,CAAA,CAAA;AAAA,EACnC;AAEA,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,GAAQ,CAAA,uBAAA,CAAA,GAA4B,EAAA;AAC7D,EAAA,IAAI,IAAA,CAAK,KAAA,EAAO,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,KAAA;AAEvC,EAAA,MAAM,OAAO,MAAMA,UAAAA;AAAA,IACjB,MAAA;AAAA,IACA,CAAA,kBAAA,EAAqB,qBAAqB,CAAA,OAAA,EAAU,UAAA,CAAW,KAAK,OAAO,CAAC,mBAAmB,WAAW,CAAA,CAAA;AAAA,IAC1G;AAAA,GACF;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,CAAK,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA,EAAE;AAC1C;AC9mBA,IAAM,iBAAA,GAAuC;AAAA,EAC3C,EAAE,KAAA,EAAO,mBAAA,EAAqB,SAAA,EAAW,iBAAA,EAAmB,UAAU,UAAA,EAAW;AAAA,EACjF,EAAE,KAAA,EAAO,gBAAA,EAAkB,SAAA,EAAW,cAAA,EAAgB,UAAU,OAAA,EAAQ;AAAA,EACxE,EAAE,KAAA,EAAO,kBAAA,EAAoB,SAAA,EAAW,gBAAA,EAAkB,UAAU,SAAA,EAAU;AAAA,EAC9E,EAAE,KAAA,EAAO,qBAAA,EAAuB,SAAA,EAAW,mBAAA,EAAqB,UAAU,YAAA;AAC5E,CAAA;AAKO,SAAS,2BAA2B,MAAA,EAAyB;AAClE,EAAA,OAAO,MAAA,CAAO,SAAS,oBAAoB,CAAA;AAC7C;AAEA,eAAe,cAAA,CAAe,QAA0B,KAAA,EAAuC;AAC7F,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA,CAAM;AAAA,IAChC,KAAA,EAAO,CAAA,6FAAA,CAAA;AAAA,IACP,YAAA,EAAc,EAAE,KAAA,EAAM;AAAA,IACtB,MAAA,EAAQ;AAAA,GACT,CAAA;AACD,EAAA,MAAM,IAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAK;AAChC,EAAA,OAAO,IAAA,CAAK,CAAC,CAAA,EAAG,MAAA,IAAU,IAAA;AAC5B;AAEA,eAAe,eAAA,CAAgB,QAA0B,KAAA,EAAkC;AACzF,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA,CAAM,EAAE,KAAA,EAAO,CAAA,eAAA,EAAkB,KAAK,CAAA,CAAA,EAAI,MAAA,EAAQ,aAAA,EAAe,CAAA;AAC7F,EAAA,MAAM,IAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAK;AAChC,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA;AAC7B;AAEA,SAAS,sBAAA,CAAuB,SAAA,EAAmB,KAAA,EAAe,SAAA,EAA2B;AAC3F,EAAA,OAAO,UAAU,OAAA,CAAQ,CAAA,2BAAA,EAA8B,KAAK,CAAA,CAAA,EAAI,CAAA,aAAA,EAAgB,SAAS,CAAA,CAAE,CAAA;AAC7F;AAEA,eAAe,iBAAA,CAAkB,QAA0B,KAAA,EAA8B;AACvF,EAAA,IAAK,MAAM,cAAA,CAAe,MAAA,EAAQ,KAAK,MAAO,IAAA,EAAM;AAClD,IAAA,MAAM,OAAO,OAAA,CAAQ,EAAE,OAAO,CAAA,WAAA,EAAc,KAAK,IAAI,CAAA;AAAA,EACvD;AACF;AAEA,SAAS,oBAAA,CAAqB,MAA2CzB,OAAA,EAA6B;AACpG,EAAA,OAAO,IAAIC,iBAAAA;AAAA,IACT;AAAA,MACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,uBAAA,EAAyB,QAAQ,CAAA;AAAA,MACxE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,MACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,MACxB,OAAA,EAAS;AAAA,KACX;AAAA,IACAJ;AAAA,GACF;AACF;AAEA,eAAsB,iCAAiC,MAAA,EAA0D;AAC/G,EAAA,MAAM,SAAuC,EAAC;AAE9C,EAAA,KAAA,MAAW,EAAE,KAAA,EAAO,QAAA,EAAS,IAAK,iBAAA,EAAmB;AACnD,IAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,MAAA,EAAQ,KAAK,CAAA;AACjD,IAAA,IAAI,CAAC,MAAA,IAAU,0BAAA,CAA2B,MAAM,CAAA,EAAG;AACjD,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAAA,EACzC;AAEA,EAAA,OAAO;AAAA,IACL,cAAA,EAAgB,OAAO,MAAA,GAAS,CAAA;AAAA,IAChC;AAAA,GACF;AACF;AAQA,eAAsB,mBAAA,CAAoB,QAA0B,MAAA,EAAuC;AACzG,EAAA,KAAA,MAAW,EAAE,KAAA,EAAO,SAAA,EAAW,QAAA,MAAc,iBAAA,EAAmB;AAC9D,IAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,MAAA,EAAQ,KAAK,CAAA;AACjD,IAAA,IAAI,CAAC,MAAA,IAAU,0BAAA,CAA2B,MAAM,CAAA,EAAG;AAEnD,IAAA,MAAA,EAAQ,OAAO,CAAA,UAAA,EAAa,KAAK,SAAS,MAAM,CAAA,4BAAA,EAA+B,QAAQ,CAAA,OAAA,CAAS,CAAA;AAEhG,IAAA,MAAM,OAAO,CAAA,EAAG,KAAK,CAAA,WAAA,EAAc,IAAA,CAAK,KAAK,CAAA,CAAA;AAE7C,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,CAAO,QAAQ,EAAE,KAAA,EAAO,uBAAuB,SAAA,EAAW,KAAA,EAAO,IAAI,CAAA,EAAG,CAAA;AAE9E,MAAA,MAAM,UAAA,GAAa,MAAM,eAAA,CAAgB,MAAA,EAAQ,IAAI,CAAA;AACrD,MAAA,MAAM,iBAAiB,IAAI,GAAA,CAAI,MAAM,eAAA,CAAgB,MAAA,EAAQ,KAAK,CAAC,CAAA;AAEnE,MAAA,MAAM,UAAA,GAAa,WAAW,GAAA,CAAI,CAAA,CAAA,KAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC1D,MAAA,MAAM,WAAA,GAAc,UAAA,CACjB,GAAA,CAAI,CAAA,CAAA,KAAK;AACR,QAAA,IAAI,MAAM,QAAA,EAAU;AAClB,UAAA,OAAO,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,GACvB,CAAA,iBAAA,EAAoB,CAAC,CAAA,wCAAA,EAA2C,CAAC,CAAA,CAAA,CAAA,GACjE,CAAA,+BAAA,EAAkC,CAAC,CAAA,CAAA,CAAA;AAAA,QACzC;AACA,QAAA,OAAO,cAAA,CAAe,IAAI,CAAC,CAAA,GAAI,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,YAAY,CAAC,CAAA,CAAA,CAAA;AAAA,MACzD,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAEZ,MAAA,MAAM,OAAO,OAAA,CAAQ;AAAA,QACnB,KAAA,EAAO,eAAe,IAAI,CAAA,EAAA,EAAK,UAAU,CAAA,SAAA,EAAY,WAAW,SAAS,KAAK,CAAA;AAAA,OAC/E,CAAA;AAED,MAAA,MAAM,MAAA,CAAO,QAAQ,EAAE,KAAA,EAAO,mBAAmB,IAAI,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAA,EAAI,CAAA;AACtE,MAAA,MAAM,OAAO,OAAA,CAAQ,EAAE,OAAO,CAAA,WAAA,EAAc,IAAI,IAAI,CAAA;AAEpD,MAAA,MAAA,EAAQ,IAAA,GAAO,CAAA,sBAAA,EAAyB,KAAK,CAAA,CAAE,CAAA;AAAA,IACjD,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,EAAQ,QAAQ,CAAA,aAAA,EAAgB,KAAK,CAAA,SAAA,EAAa,KAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AAC3E,MAAA,IAAI;AACF,QAAA,MAAM,iBAAA,CAAkB,QAAQ,IAAI,CAAA;AAAA,MACtC,SAAS,YAAA,EAAc;AACrB,QAAA,MAAA,EAAQ,QAAQ,CAAA,mCAAA,EAAsC,IAAI,CAAA,EAAA,EAAM,YAAA,CAAuB,OAAO,CAAA,CAAE,CAAA;AAAA,MAClG;AACA,MAAA,MAAM,oBAAA,CAAqB,EAAE,KAAA,EAAO,QAAA,IAAY,KAAK,CAAA;AAAA,IACvD;AAAA,EACF;AACF;AC5HA,IAAM,mBAAA,uBAA0B,GAAA,CAAI;AAAA,EAClC,WAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,uBAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,kBAAA;AAAA,EACA,qBAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM8B,qCAAoB,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,OAAA,EAAS,MAAM,CAAC,CAAA;AAE/D,SAASE,kBAAAA,CAAkB,WAAA,EAA8B,OAAA,GAAU,OAAA,EAAiB;AAClF,EAAA,QAAQ,WAAA;AAAa,IACnB,KAAK,KAAA;AACH,MAAA,OAAO,OAAO,OAAO,CAAA,CAAA,CAAA;AAAA,IACvB,KAAK,KAAA;AACH,MAAA,OAAO,OAAO,OAAO,CAAA,CAAA,CAAA;AAAA,IACvB,KAAK,KAAA;AACH,MAAA,OAAO,OAAO,OAAO,CAAA,CAAA,CAAA;AAAA,IACvB,KAAK,KAAA;AACH,MAAA,OAAO,OAAO,OAAO,CAAA,CAAA,CAAA;AAAA,IACvB,KAAK,OAAA;AACH,MAAA,OAAO,mBAAmB,OAAO,CAAA,EAAA,CAAA;AAAA,IACnC,KAAK,MAAA;AACH,MAAA,OAAO,UAAU,OAAO,CAAA,YAAA,CAAA;AAAA,IAC1B;AACE,MAAA,OAAO,OAAO,OAAO,CAAA,CAAA,CAAA;AAAA;AAE3B;AAEA,SAASC,gBAAe,QAAA,EAAuC;AAC7D,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,IAAA;AACH,MAAA,OAAO,mBAAA;AAAA,IACT,KAAK,IAAA;AACH,MAAA,OAAO,mBAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,oBAAA;AAAA,IACT,KAAK,IAAA;AACH,MAAA,OAAO,iBAAA;AAAA,IACT,KAAK,IAAA;AACH,MAAA,OAAO,gBAAA;AAAA,IACT;AACE,MAAA,OAAO,iBAAA;AAAA;AAEb;AAEA,SAASC,iBAAgB,KAAA,EAAqC;AAC5D,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,UAAA,CAAW,IAAA,CAAK,GAAG,IAAA,CAAK,UAAU,CAAA;AAClC,IAAA,MAAA,CAAO,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,MAAM,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,EAAE,YAAY,MAAA,EAAO;AAC9B;AAEA,SAASC,eAAc,MAAA,EAA8B;AACnD,EAAA,OAAO,MAAA,CAAO,WAAW,MAAA,GAAS,CAAA,MAAA,EAAS,OAAO,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AACjF;AAEA,SAAS,yBAAyB,IAAA,EAA6E;AAC7G,EAAA,MAAM,UAAA,GAAuB,CAAC,kCAAkC,CAAA;AAChE,EAAA,MAAM,MAAA,GAAkC,EAAE,YAAA,EAAc,IAAA,CAAK,QAAA,EAAS;AAEtE,EAAA,IAAI,IAAA,CAAK,gBAAgB,MAAA,EAAW;AAClC,IAAA,UAAA,CAAW,KAAK,wCAAwC,CAAA;AACxD,IAAA,MAAA,CAAO,kBAAkB,IAAA,CAAK,WAAA;AAAA,EAChC;AAEA,EAAA,OAAO,EAAE,YAAY,MAAA,EAAO;AAC9B;AAEA,SAAS,oBAAoB,OAAA,EAA2E;AACtG,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,EAAK,KAAA,KAAU;AACjC,IAAA,MAAM,MAAA,GAASX,oBAAc,GAAG,CAAA;AAChC,IAAA,IAAI,CAAC,oBAAoB,GAAA,CAAI,MAAM,KAAKM,kBAAAA,CAAkB,GAAA,CAAI,MAAM,CAAA,EAAG;AACrE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,GAAG,CAAA,CAAE,CAAA;AAAA,IACrD;AACA,IAAA,MAAM,KAAA,GAAQ,YAAY,KAAK,CAAA,CAAA;AAC/B,IAAA,OAAO,EAAE,KAAK,SAAA,EAAW,CAAA,EAAG,MAAM,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,QAAA,EAAU,KAAA,EAAM;AAAA,EACpE,CAAC,CAAA;AACH;AAEA,SAASQ,cAAa,MAAA,EAA2B;AAC/C,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAM,CAAA,IAAK,IAAA,GAAO,EAAA,GAAK,MAAA,CAAO,CAAC,CAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC/D;AAEA,eAAeb,UAAAA,CAAa,MAAA,EAA0B,KAAA,EAAe,MAAA,EAA+C;AAClH,EAAA,OAAQ,MAAA,CACN,MAAM,MAAA,CAAO,KAAA,CAAM;AAAA,IACjB,KAAA;AAAA,IACA,YAAA,EAAc,MAAA;AAAA,IACd,MAAA,EAAQ,aAAA;AAAA,IACR,mBAAA,EAAqB;AAAA,GACtB,GACD,IAAA,EAAK;AACT;AAMA,eAAsB,WAAA,CAAY,QAA0B,IAAA,EAAsC;AAChG,EAAA,MAAM,iBAAA,CAAkB,QAAQ,EAAE,MAAA,EAAQ,CAAC,IAAA,CAAK,KAAK,GAAG,CAAA;AAC1D;AAEA,eAAsB,iBAAA,CAAkB,QAA0B,IAAA,EAA4C;AAC5G,EAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAE9B,EAAA,MAAM,OAAO,MAAA,CAAO;AAAA,IAClB,KAAA,EAAO,kBAAA;AAAA,IACP,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,gBAAgB,CAAA;AAAA,IACxC,MAAA,EAAQ,aAAA;AAAA,IACR,mBAAA,EAAqB;AAAA,GACtB,CAAA;AACH;AAMA,eAAsB,UAAA,CAAW,QAA0B,IAAA,EAAmD;AAC5G,EAAA,MAAM,MAAA,GAASc,4BAAA,CAAqB,KAAA,CAAM,IAAI,CAAA;AAC9C,EAAA,MAAM,MAAA,GAAS,2BAAA,CAA4B,MAAA,CAAO,OAAA,EAAS,GAAG,CAAA;AAC9D,EAAA,MAAM,UAAA,GAAa,qBAAA,CAAsB,MAAA,CAAO,UAAU,CAAA;AAC1D,EAAA,MAAM,OAAA,GAAU,yBAAyB,CAAC,WAAA,EAAa,OAAO,CAAA,EAAG,MAAA,CAAO,SAAS,GAAG,CAAA;AACpF,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,UAAA,CAAW,MAAA,GAAS,CAAA,MAAA,EAAS,OAAO,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAE5F,EAAA,MAAM,cAAc,MAAMd,UAAAA;AAAA,IACxB,MAAA;AAAA,IACA,CAAA,6BAAA,EAAgC,kBAAkB,CAAA,MAAA,EAAS,WAAW,CAAA,CAAA;AAAA,IACtE,MAAA,CAAO;AAAA,GACT;AAEA,EAAA,MAAM,OAAO,MAAMA,UAAAA;AAAA,IACjB,MAAA;AAAA,IACA,CAAA,cAAA,EAAiB,kBAAkB,CAAA,MAAA,EAAS,WAAW,aAAa,OAAO,CAAA,4CAAA,CAAA;AAAA,IAC3E,EAAE,GAAG,MAAA,CAAO,MAAA,EAAQ,OAAO,UAAA,CAAW,KAAA,EAAO,MAAA,EAAQ,UAAA,CAAW,MAAA;AAAO,GACzE;AAEA,EAAA,MAAM,QAAQ,MAAA,CAAO,WAAA,CAAY,CAAC,CAAA,EAAG,SAAS,CAAC,CAAA;AAE/C,EAAA,OAAO;AAAA,IACL,UAAA,EAAY;AAAA,MACV,KAAA;AAAA,MACA,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,OAAA,EAAA,CAAU,UAAA,CAAW,IAAA,GAAO,CAAA,IAAK,WAAW,OAAA,GAAU;AAAA,KACxD;AAAA,IACA,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,gBAAgB;AAAA,GACnC;AACF;AAEA,eAAsB,YAAA,CAAa,QAA0B,OAAA,EAA8C;AACzG,EAAA,MAAM,OAAO,MAAMA,UAAAA;AAAA,IACjB,MAAA;AAAA,IACA,iBAAiB,kBAAkB,CAAA,yCAAA,CAAA;AAAA,IACnC,EAAE,OAAA;AAAQ,GACZ;AAEA,EAAA,OAAO,KAAK,CAAC,CAAA,GAAI,iBAAiB,IAAA,CAAK,CAAC,CAAC,CAAA,GAAI,IAAA;AAC/C;AAMA,eAAsB,iBAAA,CACpB,QACA,IAAA,EACoC;AACpC,EAAA,MAAM,MAAA,GAASO,kBAAAA,CAAkB,IAAA,CAAK,WAAW,CAAA;AACjD,EAAA,MAAM,QAAA,GAAW,yBAAyB,IAAI,CAAA;AAC9C,EAAA,MAAM,YAAA,GAAe,2BAAA,CAA4B,IAAA,CAAK,OAAO,CAAA;AAC7D,EAAA,MAAM,QAAA,GAAWE,aAAAA,CAAa,QAAA,EAAU,YAAY,CAAA;AACpD,EAAA,MAAM,WAAA,GAAcC,eAAc,QAAQ,CAAA;AAE1C,EAAA,MAAM,MAAM,CAAA,OAAA,EAAU,MAAM,CAAA,eAAA,EAAkB,kBAAkB,IAAI,WAAW,CAAA,CAAA;AAC/E,EAAA,MAAM,SAAS,MAAMV,UAAAA,CAAmC,MAAA,EAAQ,GAAA,EAAK,SAAS,MAAM,CAAA;AACpF,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,KAAA,IAAS,IAAA,GAAO,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,KAAK,CAAA;AAEvE,EAAA,IAAI,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,OAAA,EAAS,SAAA,EAAW;AACjD,IAAA,MAAM,EAAA,GAAK,KAAK,OAAA,CAAQ,SAAA;AACxB,IAAA,IAAI,EAAA,CAAG,KAAA,IAAS,EAAA,CAAG,GAAA,EAAK;AACtB,MAAA,MAAM,WAAW,EAAA,CAAG,GAAA,CAAI,SAAQ,GAAI,EAAA,CAAG,MAAM,OAAA,EAAQ;AACrD,MAAA,IAAI,SAAA;AACJ,MAAA,IAAI,OAAA;AAEJ,MAAA,QAAQ,KAAK,aAAA;AAAe,QAC1B,KAAK,iBAAA;AACH,UAAA,SAAA,GAAY,IAAI,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,OAAA,KAAY,QAAQ,CAAA;AAClD,UAAA,OAAA,GAAU,IAAI,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,OAAA,KAAY,QAAQ,CAAA;AAC9C,UAAA;AAAA,QACF,KAAK,cAAA;AACH,UAAA,SAAA,GAAY,IAAI,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,OAAA,KAAY,KAAQ,CAAA;AAClD,UAAA,OAAA,GAAU,IAAI,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,OAAA,KAAY,KAAQ,CAAA;AAC9C,UAAA;AAAA,QACF,KAAK,eAAA;AACH,UAAA,SAAA,GAAY,IAAI,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,OAAA,KAAY,MAAS,CAAA;AACnD,UAAA,OAAA,GAAU,IAAI,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,OAAA,KAAY,MAAS,CAAA;AAC/C,UAAA;AAAA,QACF;AACE,UAAA,SAAA,GAAY,IAAI,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,OAAA,KAAY,QAAQ,CAAA;AAClD,UAAA,OAAA,GAAU,IAAI,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,OAAA,KAAY,QAAQ,CAAA;AAAA;AAGlD,MAAA,MAAM,WAAA,GAAc;AAAA,QAClB,GAAI,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,QACrB,SAAA,EAAW,EAAE,KAAA,EAAO,SAAA,EAAW,GAAA,EAAK,OAAA,EAAS,cAAA,EAAgB,EAAA,CAAG,cAAA,EAAgB,YAAA,EAAc,EAAA,CAAG,YAAA;AAAa,OAChH;AACA,MAAA,MAAM,gBAAA,GAAmB,4BAA4B,WAAW,CAAA;AAChE,MAAA,MAAM,YAAA,GAAeS,aAAAA,CAAa,QAAA,EAAU,gBAAgB,CAAA;AAC5D,MAAA,MAAM,eAAA,GAAkBC,eAAc,YAAY,CAAA;AAElD,MAAA,MAAM,aAAa,MAAMV,UAAAA;AAAA,QACvB,MAAA;AAAA,QACA,CAAA,OAAA,EAAU,MAAM,CAAA,eAAA,EAAkB,kBAAkB,IAAI,eAAe,CAAA,CAAA;AAAA,QACvE,YAAA,CAAa;AAAA,OACf;AACA,MAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,CAAC,CAAA,EAAG,KAAA,IAAS,IAAA,GAAO,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA,EAAG,KAAK,CAAA;AAEvF,MAAA,IAAI,aAAA,GAA+B,IAAA;AACnC,MAAA,IAAI,aAAA,KAAkB,IAAA,IAAQ,aAAA,KAAkB,CAAA,IAAK,UAAU,IAAA,EAAM;AACnE,QAAA,aAAA,GAAA,CAAkB,KAAA,GAAQ,aAAA,IAAiB,IAAA,CAAK,GAAA,CAAI,aAAa,CAAA,GAAK,GAAA;AAAA,MACxE;AAEA,MAAA,OAAO,EAAE,KAAA,EAAO,aAAA,EAAe,aAAA,EAAc;AAAA,IAC/C;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,KAAA,EAAM;AACjB;AAEA,eAAsB,iBAAA,CACpB,QACA,IAAA,EACoC;AACpC,EAAA,MAAM,MAAA,GAASO,kBAAAA,CAAkB,IAAA,CAAK,WAAW,CAAA;AACjD,EAAA,MAAM,QAAA,GAAW,yBAAyB,IAAI,CAAA;AAC9C,EAAA,MAAM,YAAA,GAAe,2BAAA,CAA4B,IAAA,CAAK,OAAO,CAAA;AAC7D,EAAA,MAAM,QAAA,GAAWE,aAAAA,CAAa,QAAA,EAAU,YAAY,CAAA;AACpD,EAAA,MAAM,WAAA,GAAcC,eAAc,QAAQ,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,IAAA,CAAK,OAAO,CAAA;AAEjD,EAAA,MAAM,GAAA,GAAM,CAAA,OAAA,EAAU,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA,EAAK,MAAM,kBAAkB,kBAAkB,CAAA,CAAA,EAAI,WAAW,CAAA,UAAA,EAAa,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,oBAAA,CAAA;AAClL,EAAA,MAAM,OAAO,MAAMV,UAAAA,CAAmC,MAAA,EAAQ,GAAA,EAAK,SAAS,MAAM,CAAA;AAElF,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,MACvB,YAAY,MAAA,CAAO,WAAA;AAAA,QACjB,QAAA,CAAS,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,KAAU;AAC7B,UAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,SAAA,EAAY,KAAK,CAAA,CAAE,CAAA;AACjC,UAAA,OAAO,CAAC,MAAM,GAAA,EAAK,CAAA,IAAK,OAAO,IAAA,GAAO,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,QACjD,CAAC;AAAA,OACH;AAAA,MACA,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,CAAC;AAAA,KAC9B,CAAE;AAAA,GACJ;AACF;AAEA,eAAsB,kBAAA,CACpB,QACA,IAAA,EACqC;AACrC,EAAA,MAAM,MAAA,GAASO,kBAAAA,CAAkB,IAAA,CAAK,WAAW,CAAA;AACjD,EAAA,MAAM,WAAA,GAAcC,eAAAA,CAAe,IAAA,CAAK,QAAQ,CAAA;AAChD,EAAA,MAAM,QAAA,GAAW,yBAAyB,IAAI,CAAA;AAC9C,EAAA,MAAM,YAAA,GAAe,2BAAA,CAA4B,IAAA,CAAK,OAAO,CAAA;AAC7D,EAAA,MAAM,QAAA,GAAWC,aAAAA,CAAa,QAAA,EAAU,YAAY,CAAA;AACpD,EAAA,MAAM,WAAA,GAAcC,eAAc,QAAQ,CAAA;AAE1C,EAAA,IAAI,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC3C,IAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,IAAA,CAAK,OAAO,CAAA;AACjD,IAAA,MAAMR,IAAAA,GAAM;AAAA,0CAAA,EAC4B,WAAW,CAAA;AAAA,aAAA,EACxC,QAAA,CAAS,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,aAAA,EACzC,MAAM,CAAA;AAAA,WAAA,EACR,kBAAkB,IAAI,WAAW;AAAA,uBAAA,EACrB,QAAA,CAAS,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA,IAAA,CAAA;AAG7D,IAAA,MAAMC,QAAO,MAAMH,UAAAA,CAAmC,MAAA,EAAQE,IAAAA,EAAK,SAAS,MAAM,CAAA;AAClF,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAA4E;AAElG,IAAA,KAAA,MAAW,OAAOC,KAAAA,EAAM;AACtB,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAG,UAAU,GAAA,CAAI,CAAA,SAAA,EAAY,KAAK,CAAA,CAAE,CAAC,CAAA;AACvE,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA;AACtC,MAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,EAAG;AACvB,QAAA,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,EAAE,IAAA,EAAMU,aAAAA,CAAa,WAAW,CAAA,EAAG,MAAA,EAAQ,EAAC,EAAG,CAAA;AAAA,MACpE;AACA,MAAA,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,CAAG,MAAA,CAAO,IAAA,CAAK;AAAA,QAC9B,SAAA,EAAW,GAAA,CAAI,MAAA,YAAkB,IAAA,GAAO,GAAA,CAAI,MAAA,GAAS,IAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,QAChF,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,CAAC;AAAA,OAC7B,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,CAAM,KAAK,SAAA,CAAU,MAAA,EAAQ,CAAA,EAAE;AAAA,EAClD;AAEA,EAAA,MAAM,GAAA,GAAM;AAAA,wCAAA,EAC4B,WAAW,CAAA;AAAA,WAAA,EACxC,MAAM,CAAA;AAAA,SAAA,EACR,kBAAkB,IAAI,WAAW;AAAA;AAAA;AAAA,EAAA,CAAA;AAI1C,EAAA,MAAM,OAAO,MAAMb,UAAAA,CAAmC,MAAA,EAAQ,GAAA,EAAK,SAAS,MAAM,CAAA;AAElF,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,IAAA,EAAM,IAAA,CAAK,WAAA,GAAc,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,WAAW,CAAA,CAAA,GAAK,IAAA,CAAK,QAAA;AAAA,QACvE,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,UACvB,SAAA,EAAW,GAAA,CAAI,MAAA,YAAkB,IAAA,GAAO,GAAA,CAAI,MAAA,GAAS,IAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,UAChF,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,CAAC;AAAA,SAC9B,CAAE;AAAA;AACJ;AACF,GACF;AACF;AAEA,eAAsB,mBAAA,CACpB,QACA,IAAA,EACsC;AACtC,EAAA,MAAM,WAAA,GAAcQ,eAAAA,CAAe,IAAA,CAAK,QAAQ,CAAA;AAChD,EAAA,MAAM,QAAA,GAAW,yBAAyB,IAAI,CAAA;AAC9C,EAAA,MAAM,YAAA,GAAe,2BAAA,CAA4B,IAAA,CAAK,OAAO,CAAA;AAC7D,EAAA,MAAM,QAAA,GAAWC,aAAAA,CAAa,QAAA,EAAU,YAAY,CAAA;AACpD,EAAA,MAAM,WAAA,GAAcC,eAAc,QAAQ,CAAA;AAE1C,EAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA,IAAK,IAAA,CAAK,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AACrE,IAAA,MAAM,IAAI,MAAM,8DAA8D,CAAA;AAAA,EAChF;AAEA,EAAA,MAAM,SAAS,EAAC;AAChB,EAAA,KAAA,MAAW,CAAA,IAAK,KAAK,WAAA,EAAa;AAChC,IAAA,IAAI,CAAC,OAAO,QAAA,CAAS,CAAC,KAAK,CAAA,GAAI,CAAA,IAAK,IAAI,CAAA,EAAG;AACzC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8DAAA,EAAiE,CAAC,CAAA,CAAE,CAAA;AAAA,IACtF;AACA,IAAA,MAAM,GAAA,GAAM;AAAA,0CAAA,EAC4B,WAAW,CAAA;AAAA,sBAAA,EAC/B,CAAC,CAAA;AAAA,WAAA,EACZ,kBAAkB;AAAA,MAAA,EACvB,WAAW;AAAA;AAAA;AAAA,IAAA,CAAA;AAIf,IAAA,MAAM,OAAO,MAAMV,UAAAA,CAAmC,MAAA,EAAQ,GAAA,EAAK,SAAS,MAAM,CAAA;AAElF,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,UAAA,EAAY,CAAA;AAAA,MACZ,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,QACvB,SAAA,EAAW,GAAA,CAAI,MAAA,YAAkB,IAAA,GAAO,GAAA,CAAI,MAAA,GAAS,IAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,QAChF,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,MAAA,IAAU,CAAC;AAAA,OAC/B,CAAE;AAAA,KACH,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,EAAE,MAAA,EAAO;AAClB;AC1YA,eAAsB,WAAA,CACpB,QACA,IAAA,EACqC;AACrC,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA,CAAM;AAAA,IAChC,KAAA,EAAO;AAAA;AAAA,WAAA,EAEE,iBAAiB;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,IAI1B,YAAA,EAAc,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,EAAQ;AAAA,IACtC,MAAA,EAAQ,aAAA;AAAA,IACR,mBAAA,EAAqB;AAAA,GACtB,CAAA;AAED,EAAA,MAAM,IAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAK;AAChC,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,GAAG,OAAO,IAAA;AAEvC,EAAA,OAAO,EAAE,IAAA,EAAM,eAAA,CAAgB,IAAA,CAAK,CAAC,CAAE,CAAA,EAAE;AAC3C;AAgBA,eAAsB,UAAA,CAAW,QAA0B,IAAA,EAAmD;AAE5G,EAAA,MAAM,EAAE,OAAA,EAAS,UAAA,EAAY,SAAQ,GAAIP,4BAAAA,CAAqB,MAAM,IAAI,CAAA;AACxE,EAAA,MAAM,IAAA,GAAO,YAAY,IAAA,IAAQ,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,YAAY,OAAA,IAAW,EAAA;AAGvC,EAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAO,GAAI,0BAAA,CAA2B,SAAS,GAAG,CAAA;AAGtE,EAAA,IAAI,OAAA,EAAS,iBAAiB,IAAA,EAAM;AAClC,IAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA;AAAA,sBAAA,EACE,iBAAiB,CAAA;AAAA;AAAA;AAAA;AAAA,OAAA,CAIjC,CAAA;AAAA,IACJ,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA;AAAA,sBAAA,EACE,iBAAiB,CAAA;AAAA;AAAA;AAAA;AAAA,OAAA,CAIjC,CAAA;AAAA,IACJ;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,WAAW,MAAA,GAAS,CAAA,GAAI,SAAS,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAElF,EAAA,MAAM,WAAA,GAAc,wBAAwB,OAAO,CAAA;AAGnD,EAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,KAAA,CAAM;AAAA,IACrC,KAAA,EAAO;AAAA;AAAA;AAAA,aAAA,EAGI,iBAAiB,CAAA;AAAA,QAAA,EACtB,WAAW;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,IAKjB,YAAA,EAAc,MAAA;AAAA,IACd,MAAA,EAAQ,aAAA;AAAA,IACR,mBAAA,EAAqB;AAAA,GACtB,CAAA;AAED,EAAA,MAAM,SAAA,GAAa,MAAM,WAAA,CAAY,IAAA,EAAK;AAC1C,EAAA,MAAM,QAAQ,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,EAAG,OAAO,CAAC,CAAA;AAE3C,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,OAAO;AAAA,MACL,YAAY,EAAE,KAAA,EAAO,GAAG,IAAA,EAAM,OAAA,EAAS,SAAS,KAAA,EAAM;AAAA,MACtD,OAAO;AAAC,KACV;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,KAAA,CAAM;AAAA,IACpC,KAAA,EAAO;AAAA;AAAA;AAAA,aAAA,EAGI,iBAAiB,CAAA;AAAA,QAAA,EACtB,WAAW;AAAA;AAAA;AAAA;AAAA,eAAA,EAIJ,WAAW;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,IAIxB,YAAA,EAAc;AAAA,MACZ,GAAG,MAAA;AAAA,MACH,KAAA,EAAO,OAAA;AAAA,MACP,QAAQ,IAAA,GAAO;AAAA,KACjB;AAAA,IACA,MAAA,EAAQ,aAAA;AAAA,IACR,mBAAA,EAAqB;AAAA,GACtB,CAAA;AAED,EAAA,MAAM,IAAA,GAAQ,MAAM,UAAA,CAAW,IAAA,EAAK;AACpC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,eAAe,CAAA;AAEtC,EAAA,OAAO;AAAA,IACL,UAAA,EAAY;AAAA,MACV,KAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA,EAAA,CAAU,IAAA,GAAO,CAAA,IAAK,OAAA,GAAU;AAAA,KAClC;AAAA,IACA,KAAA,EAAOI,qBAAa,KAAK;AAAA,GAC3B;AACF;ACtHA,IAAM,yBAAA,GAA4BkB,0BAAkB,GAAA,CAAI,CAAA,CAAA,KAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAOhF,eAAsB,UAAA,CAAW,QAA0B,IAAA,EAAqC;AAC9F,EAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AACrC,EAAA,MAAM,OAAO,MAAA,CAAO;AAAA,IAClB,KAAA,EAAO,iBAAA;AAAA,IACP,MAAA,EAAQ,CAAC,GAAG,CAAA;AAAA,IACZ,MAAA,EAAQ,aAAA;AAAA,IACR,mBAAA,EAAqB;AAAA,GACtB,CAAA;AACH;AAGA,eAAsB,gBAAA,CAAiB,QAA0B,IAAA,EAA2C;AAC1G,EAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAE/B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA;AAC7C,EAAA,MAAM,OAAO,MAAA,CAAO;AAAA,IAClB,KAAA,EAAO,iBAAA;AAAA,IACP,MAAA,EAAQ,IAAA;AAAA,IACR,MAAA,EAAQ,aAAA;AAAA,IACR,mBAAA,EAAqB;AAAA,GACtB,CAAA;AACH;AAeA,eAAsB,QAAA,CAAS,QAA0B,IAAA,EAA+C;AACtG,EAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC7B,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,KAAA,EAAO,EAAC,EAAE;AAAA,EAC5C;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA,CAAM;AAAA,IAChC,KAAA,EAAO;AAAA;AAAA;AAAA,aAAA,EAGI,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,IAO5B,cAAc,EAAE,OAAA,EAAS,KAAK,OAAA,EAAS,OAAA,EAAS,KAAK,OAAA,EAAQ;AAAA,IAC7D,MAAA,EAAQ,aAAA;AAAA,IACR,mBAAA,EAAqB;AAAA,GACtB,CAAA;AAED,EAAA,MAAM,IAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAK;AAChC,EAAA,MAAM,KAAA,GAAsB,IAAA,CAAK,GAAA,CAAI,eAAe,CAAA;AACpD,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,KAAA,EAAM;AACxC;AAGA,eAAsB,OAAA,CAAQ,QAA0B,IAAA,EAAoD;AAC1G,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA,CAAM;AAAA,IAChC,KAAA,EAAO;AAAA;AAAA,WAAA,EAEE,iBAAiB;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,IAI1B,cAAc,EAAE,OAAA,EAAS,KAAK,OAAA,EAAS,MAAA,EAAQ,KAAK,MAAA,EAAO;AAAA,IAC3D,MAAA,EAAQ,aAAA;AAAA,IACR,mBAAA,EAAqB;AAAA,GACtB,CAAA;AAED,EAAA,MAAM,IAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAK;AAChC,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,GAAG,OAAO,IAAA;AAEvC,EAAA,OAAO,EAAE,IAAA,EAAM,eAAA,CAAgB,IAAA,CAAK,CAAC,CAAE,CAAA,EAAE;AAC3C;AASA,eAAsB,QAAA,CAAS,QAA0B,IAAA,EAAsD;AAC7G,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA,CAAM;AAAA,IAChC,KAAA,EAAO;AAAA;AAAA;AAAA,aAAA,EAGI,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,IAO5B,YAAA,EAAc,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,EAAQ;AAAA,IACtC,MAAA,EAAQ,aAAA;AAAA,IACR,mBAAA,EAAqB;AAAA,GACtB,CAAA;AAED,EAAA,MAAM,IAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAK;AAChC,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,GAAG,OAAO,IAAA;AAEvC,EAAA,MAAM,KAAA,GAAsB,IAAA,CAAK,GAAA,CAAI,eAAe,CAAA;AACpD,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,KAAA,EAAM;AACxC;AAKA,eAAsB,aAAA,CACpB,QACA,IAAA,EACuC;AACvC,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA,CAAM;AAAA,IAChC,KAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAOI,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,IAO5B,YAAA,EAAc,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,EAAQ;AAAA,IACtC,MAAA,EAAQ,aAAA;AAAA,IACR,mBAAA,EAAqB;AAAA,GACtB,CAAA;AAED,EAAA,MAAM,IAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAK;AAChC,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,GAAG,OAAO,IAAA;AAEvC,EAAA,MAAM,KAAA,GAA2B,IAAA,CAAK,GAAA,CAAI,eAAe,CAAA;AACzD,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,KAAA,EAAM;AACxC;AAeA,eAAsB,iBAAA,CAAkB,QAA0B,IAAA,EAA4C;AAC5G,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAGhC,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,MAAM,sBAAgC,EAAC;AACvC,EAAA,MAAM,gBAA0B,EAAC;AACjC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,QAAA,GAAW,OAAO,CAAC,CAAA,CAAA;AACzB,IAAA,MAAM,QAAA,GAAW,MAAM,CAAC,CAAA,CAAA;AACxB,IAAA,MAAA,CAAO,QAAQ,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAClC,IAAA,MAAA,CAAO,QAAQ,CAAA,GAAI,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,CAAC,CAAE,CAAA,CAAA,CAAA;AACvC,IAAA,mBAAA,CAAoB,IAAA,CAAK,CAAA,CAAA,EAAI,QAAQ,CAAA,QAAA,CAAU,CAAA;AAC/C,IAAA,aAAA,CAAc,IAAA,CAAK,CAAA,uBAAA,EAA0B,QAAQ,CAAA,SAAA,CAAW,CAAA;AAAA,EAClE;AACA,EAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAA;AACjD,EAAA,MAAM,eAAA,GAAkB,aAAA,CAAc,MAAA,KAAW,CAAA,GAAI,aAAA,CAAc,CAAC,CAAA,GAAI,CAAA,CAAA,EAAI,aAAA,CAAc,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA,CAAA;AAItG,EAAA,MAAM,QAAQ,GAAA,CAAI;AAAA,IAChB,OAAO,OAAA,CAAQ;AAAA,MACb,OAAO,CAAA,YAAA,EAAe,iBAAiB,CAAA,mBAAA,EAAsB,WAAW,SAAS,eAAe,CAAA,CAAA;AAAA,MAChG,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,IACD,OAAO,OAAA,CAAQ;AAAA,MACb,OAAO,CAAA,YAAA,EAAe,iBAAiB,CAAA,mBAAA,EAAsB,WAAW,SAAS,eAAe,CAAA,CAAA;AAAA,MAChG,YAAA,EAAc;AAAA,KACf;AAAA,GACF,CAAA;AACH;AAuBA,eAAsB,YAAA,CAAa,QAA0B,IAAA,EAAuD;AAClH,EAAA,MAAM,EAAE,OAAA,EAAS,UAAA,EAAY,SAAQ,GAAIC,8BAAA,CAAuB,MAAM,IAAI,CAAA;AAC1E,EAAA,MAAM,IAAA,GAAO,YAAY,IAAA,IAAQ,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,YAAY,OAAA,IAAW,EAAA;AAEvC,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,MAAM,SAAkC,EAAC;AAEzC,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,UAAA,CAAW,KAAK,CAAA,4BAAA,CAA8B,CAAA;AAC9C,IAAA,MAAA,CAAO,WAAW,OAAA,CAAQ,QAAA;AAAA,EAC5B,CAAA,MAAO;AAIL,IAAA,UAAA,CAAW,IAAA,CAAK,CAAA,aAAA,EAAgB,yBAAyB,CAAA,CAAA,CAAG,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,OAAA,EAAS,WAAW,KAAA,EAAO;AAC7B,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,SAAA,CAAU,cAAA,GAAiB,GAAA,GAAM,IAAA;AACpD,IAAA,UAAA,CAAW,IAAA,CAAK,CAAA,UAAA,EAAa,EAAE,CAAA,+BAAA,CAAiC,CAAA;AAChE,IAAA,MAAA,CAAO,cAAA,GAAiB,OAAA,CAAQ,SAAA,CAAU,KAAA,CAAM,OAAA,EAAQ;AAAA,EAC1D;AACA,EAAA,IAAI,OAAA,EAAS,WAAW,GAAA,EAAK;AAC3B,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,SAAA,CAAU,YAAA,GAAe,GAAA,GAAM,IAAA;AAClD,IAAA,UAAA,CAAW,IAAA,CAAK,CAAA,UAAA,EAAa,EAAE,CAAA,6BAAA,CAA+B,CAAA;AAC9D,IAAA,MAAA,CAAO,YAAA,GAAe,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAI,OAAA,EAAQ;AAAA,EACtD;AACA,EAAA,IAAI,OAAA,EAAS,SAAS,KAAA,EAAO;AAC3B,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,OAAA,CAAQ,cAAA,GAAiB,GAAA,GAAM,IAAA;AAClD,IAAA,UAAA,CAAW,IAAA,CAAK,CAAA,QAAA,EAAW,EAAE,CAAA,6BAAA,CAA+B,CAAA;AAC5D,IAAA,MAAA,CAAO,YAAA,GAAe,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,OAAA,EAAQ;AAAA,EACtD;AACA,EAAA,IAAI,OAAA,EAAS,SAAS,GAAA,EAAK;AACzB,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,OAAA,CAAQ,YAAA,GAAe,GAAA,GAAM,IAAA;AAChD,IAAA,UAAA,CAAW,IAAA,CAAK,CAAA,QAAA,EAAW,EAAE,CAAA,2BAAA,CAA6B,CAAA;AAC1D,IAAA,MAAA,CAAO,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,OAAA,EAAQ;AAAA,EAClD;AAIA,EAAA,MAAM,EAAA,GAAc;AAAA,IAClB,EAAE,GAAA,EAAK,SAAA,EAAW,OAAO,OAAA,EAAS,OAAA,EAAS,OAAO,SAAA,EAAU;AAAA,IAC5D,EAAE,GAAA,EAAK,YAAA,EAAc,OAAO,OAAA,EAAS,UAAA,EAAY,OAAO,YAAA,EAAa;AAAA,IACrE,EAAE,GAAA,EAAK,UAAA,EAAY,OAAO,OAAA,EAAS,QAAA,EAAU,OAAO,UAAA,EAAW;AAAA,IAC/D,EAAE,GAAA,EAAK,YAAA,EAAc,OAAO,OAAA,EAAS,UAAA,EAAY,OAAO,YAAA,EAAa;AAAA,IACrE,EAAE,GAAA,EAAK,iBAAA,EAAmB,OAAO,OAAA,EAAS,eAAA,EAAiB,OAAO,iBAAA,EAAkB;AAAA,IACpF,EAAE,GAAA,EAAK,uBAAA,EAAyB,OAAO,OAAA,EAAS,qBAAA,EAAuB,OAAO,uBAAA,EAAwB;AAAA,IACtG,EAAE,GAAA,EAAK,kBAAA,EAAoB,OAAO,OAAA,EAAS,gBAAA,EAAkB,OAAO,kBAAA,EAAmB;AAAA,IACvF,EAAE,GAAA,EAAK,gBAAA,EAAkB,OAAO,OAAA,EAAS,cAAA,EAAgB,OAAO,gBAAA,EAAiB;AAAA,IACjF,EAAE,GAAA,EAAK,kBAAA,EAAoB,OAAO,OAAA,EAAS,gBAAA,EAAkB,OAAO,kBAAA,EAAmB;AAAA,IACvF,EAAE,GAAA,EAAK,qBAAA,EAAuB,OAAO,OAAA,EAAS,mBAAA,EAAqB,OAAO,qBAAA,EAAsB;AAAA,IAChG,EAAE,GAAA,EAAK,gBAAA,EAAkB,OAAO,OAAA,EAAS,cAAA,EAAgB,OAAO,gBAAA,EAAiB;AAAA,IACjF,EAAE,GAAA,EAAK,cAAA,EAAgB,OAAO,OAAA,EAAS,YAAA,EAAc,OAAO,cAAA,EAAe;AAAA,IAC3E,EAAE,GAAA,EAAK,gBAAA,EAAkB,OAAO,OAAA,EAAS,cAAA,EAAgB,OAAO,gBAAA,EAAiB;AAAA,IACjF,EAAE,GAAA,EAAK,cAAA,EAAgB,OAAO,OAAA,EAAS,YAAA,EAAc,OAAO,cAAA,EAAe;AAAA,IAC3E,EAAE,GAAA,EAAK,QAAA,EAAU,OAAO,OAAA,EAAS,MAAA,EAAQ,OAAO,QAAA,EAAS;AAAA,IACzD,EAAE,GAAA,EAAK,gBAAA,EAAkB,OAAO,OAAA,EAAS,cAAA,EAAgB,OAAO,gBAAA,EAAiB;AAAA,IACjF,EAAE,GAAA,EAAK,YAAA,EAAc,OAAO,OAAA,EAAS,UAAA,EAAY,OAAO,YAAA,EAAa;AAAA,IACrE,EAAE,GAAA,EAAK,OAAA,EAAS,OAAO,OAAA,EAAS,KAAA,EAAO,OAAO,OAAA,EAAQ;AAAA,IACtD,EAAE,GAAA,EAAK,WAAA,EAAa,OAAO,OAAA,EAAS,SAAA,EAAW,OAAO,WAAA,EAAY;AAAA,IAClE,EAAE,GAAA,EAAK,UAAA,EAAY,OAAO,OAAA,EAAS,QAAA,EAAU,OAAO,UAAA,EAAW;AAAA,IAC/D,EAAE,GAAA,EAAK,WAAA,EAAa,OAAO,OAAA,EAAS,SAAA,EAAW,OAAO,WAAA,EAAY;AAAA,IAClE,EAAE,GAAA,EAAK,aAAA,EAAe,OAAO,OAAA,EAAS,WAAA,EAAa,OAAO,aAAA,EAAc;AAAA,IACxE,EAAE,GAAA,EAAK,iBAAA,EAAmB,OAAO,OAAA,EAAS,MAAA,EAAQ,OAAO,QAAA,EAAS;AAAA,IAClE,EAAE,GAAA,EAAK,aAAA,EAAe,OAAO,OAAA,EAAS,WAAA,EAAa,OAAO,aAAA;AAAc,GAC1E;AACA,EAAA,KAAA,MAAW,EAAE,GAAA,EAAK,KAAA,EAAO,KAAA,MAAW,EAAA,EAAI;AACtC,IAAA,IAAI,SAAS,IAAA,EAAM;AACnB,IAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,IAAA,EAAO,KAAK,CAAA,QAAA,CAAU,CAAA;AAC5C,IAAA,MAAA,CAAO,KAAK,CAAA,GAAI,KAAA;AAAA,EAClB;AAEA,EAAA,IAAI,OAAA,EAAS,IAAA,IAAQ,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,EAAG;AAC5C,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAC5C,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAC1B,MAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,IAAA,OAAW,EAAA,EAAI;AAClD,MAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA,CAAA;AACtB,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,WAAA,EAAc,KAAK,CAAA,SAAA,CAAW,CAAA;AAC9C,MAAA,MAAA,CAAO,KAAK,CAAA,GAAI,GAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,QAAA,IAAY,IAAA,IAAQ,OAAO,OAAA,CAAQ,aAAa,QAAA,EAAU;AACrE,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC3D,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC/B,MAAA,MAAM,QAAA,GAAW,UAAU,CAAC,CAAA,CAAA;AAC5B,MAAA,MAAM,QAAA,GAAW,UAAU,CAAC,CAAA,CAAA;AAC5B,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,gBAAA,EAAmB,QAAQ,CAAA,aAAA,EAAgB,QAAQ,CAAA,QAAA,CAAU,CAAA;AAC7E,MAAA,MAAA,CAAO,QAAQ,CAAA,GAAI,GAAA;AACnB,MAAA,MAAA,CAAO,QAAQ,CAAA,GAAI,KAAA;AACnB,MAAA,CAAA,EAAA;AAAA,IACF;AAAA,EACF;AAOA,EAAA,IAAI,SAAS,KAAA,IAAS,IAAA,IAAQ,OAAO,OAAA,CAAQ,UAAU,QAAA,EAAU;AAC/D,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxD,MAAA,IAAI,UAAU,MAAA,EAAW;AACzB,MAAA,MAAM,aAAa,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,IAAA,CAAK,UAAU,KAAK,CAAA;AAC3E,MAAA,IAAI,cAAc,IAAA,EAAM;AACxB,MAAA,MAAM,QAAA,GAAW,WAAW,CAAC,CAAA,CAAA;AAC7B,MAAA,MAAM,QAAA,GAAW,WAAW,CAAC,CAAA,CAAA;AAC7B,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,0BAAA,EAA6B,QAAQ,CAAA,aAAA,EAAgB,QAAQ,CAAA,QAAA,CAAU,CAAA;AACvF,MAAA,MAAA,CAAO,QAAQ,CAAA,GAAI,GAAA;AACnB,MAAA,MAAA,CAAO,QAAQ,CAAA,GAAI,UAAA;AACnB,MAAA,CAAA,EAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,EAAS,MAAA,KAAWtB,mBAAAA,CAAY,KAAA,EAAO;AACzC,IAAA,UAAA,CAAW,KAAK,CAAA,iBAAA,CAAmB,CAAA;AAAA,EACrC,CAAA,MAAA,IAAW,OAAA,EAAS,MAAA,KAAWA,mBAAAA,CAAY,OAAA,EAAS;AAClD,IAAA,UAAA,CAAW,KAAK,CAAA,aAAA,CAAe,CAAA;AAAA,EACjC,CAAA,MAAA,IAAW,OAAA,EAAS,MAAA,KAAWA,mBAAAA,CAAY,OAAA,EAAS;AAElD,IAAA,UAAA,CAAW,KAAK,OAAO,CAAA;AAAA,EACzB;AAEA,EAAA,MAAM,WAAA,GAAc,WAAW,MAAA,GAAS,CAAA,GAAI,SAAS,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAClF,EAAA,MAAM,SAAA,GAAY,OAAA,EAAS,KAAA,KAAU,SAAA,GAAY,SAAA,GAAY,WAAA;AAC7D,EAAA,MAAM,aAAA,GAAgB,OAAA,EAAS,SAAA,KAAc,KAAA,GAAQ,KAAA,GAAQ,MAAA;AAG7D,EAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,KAAA,CAAM;AAAA,IACrC,KAAA,EAAO;AAAA;AAAA;AAAA,aAAA,EAGI,oBAAoB;AAAA,QAAA,EACzB,WAAW;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,IAKjB,YAAA,EAAc,MAAA;AAAA,IACd,MAAA,EAAQ,aAAA;AAAA,IACR,mBAAA,EAAqB;AAAA,GACtB,CAAA;AACD,EAAA,MAAM,SAAA,GAAa,MAAM,WAAA,CAAY,IAAA,EAAK;AAC1C,EAAA,MAAM,QAAQ,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,EAAG,OAAO,CAAC,CAAA;AAE3C,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,OAAO;AAAA,MACL,YAAY,EAAE,KAAA,EAAO,GAAG,IAAA,EAAM,OAAA,EAAS,SAAS,KAAA,EAAM;AAAA,MACtD,UAAU;AAAC,KACb;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,KAAA,CAAM;AAAA,IACpC,KAAA,EAAO;AAAA;AAAA;AAAA,aAAA,EAGI,oBAAoB;AAAA,QAAA,EACzB,WAAW;AAAA;AAAA;AAAA;AAAA,eAAA,EAIJ,SAAS,IAAI,aAAa,CAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,IAIvC,YAAA,EAAc;AAAA,MACZ,GAAG,MAAA;AAAA,MACH,KAAA,EAAO,OAAA;AAAA,MACP,QAAQ,IAAA,GAAO;AAAA,KACjB;AAAA,IACA,MAAA,EAAQ,aAAA;AAAA,IACR,mBAAA,EAAqB;AAAA,GACtB,CAAA;AACD,EAAA,MAAM,IAAA,GAAQ,MAAM,UAAA,CAAW,IAAA,EAAK;AACpC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,eAAe,CAAA;AAEtC,EAAA,OAAO;AAAA,IACL,UAAA,EAAY;AAAA,MACV,KAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA,EAAA,CAAU,IAAA,GAAO,CAAA,IAAK,OAAA,GAAU;AAAA,KAClC;AAAA,IACA,QAAA,EAAUG,qBAAa,KAAK;AAAA,GAC9B;AACF;;;ACrUA,SAAS,oCAAoC,IAAA,EAGlC;AACT,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,WAAS,CAAA,IAAA,EAAO,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,KAAA,CAAM,MAAM,CAAA,CAAA,CAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AAE5F,EAAA,OACE;AAAA;AAAA,oBAAA,EAEuB,KAAK,KAAK,CAAA;AAAA;;AAAA;AAAA;;AAAA,EAM9B,SAAS;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AAehB;AAEO,IAAM,mCAAA,GAAN,cAAkDN,4BAAAA,CAAqB;AAAA,EACnE,OAAA;AAAA,EACA,UAAA;AAAA,EAET,YAAY,MAAA,EAAkC;AAC5C,IAAA,KAAA,EAAM;AACN,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,uBAAA,CAAwB,MAAM,CAAA;AACjD,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,aAAa,MAAA,CAAO,SAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAA,GAAsB;AAC1B,IAAA,MAAM,eAAA,GAAkB,MAAM,gCAAA,CAAiC,IAAA,CAAK,OAAO,CAAA;AAC3E,IAAA,IAAI,gBAAgB,cAAA,EAAgB;AAClC,MAAA,MAAM,IAAIf,iBAAAA,CAAY;AAAA,QACpB,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,oBAAA,EAAsB,eAAe,CAAA;AAAA,QAC5E,QAAQC,iBAAAA,CAAY,OAAA;AAAA,QACpB,UAAUC,mBAAAA,CAAc,IAAA;AAAA,QACxB,MAAM,mCAAA,CAAoC;AAAA,UACxC,KAAA,EAAO,YAAA;AAAA,UACP,MAAA,EAAQ,eAAA,CAAgB,MAAA,CAAO,GAAA,CAAI,CAAC,EAAE,KAAA,EAAO,MAAA,EAAO,MAAO,EAAE,KAAA,EAAO,MAAA,EAAO,CAAE;AAAA,SAC9E;AAAA,OACF,CAAA;AAAA,IACH;AAEA,IAAA,IAAI;AAEF,MAAA,KAAA,MAAW,OAAO,CAAC,GAAG,aAAA,EAAe,GAAG,UAAU,CAAA,EAAG;AACnD,QAAA,MAAM,KAAK,OAAA,CAAQ,OAAA,CAAQ,EAAE,KAAA,EAAO,KAAK,CAAA;AAAA,MAC3C;AAGA,MAAA,KAAA,MAAW,aAAa,cAAA,EAAgB;AACtC,QAAA,MAAM,KAAK,OAAA,CAAQ,OAAA,CAAQ,EAAE,KAAA,EAAO,WAAW,CAAA;AAAA,MACjD;AAIA,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,IAAA,CAAK,UAAU,CAAA;AACvD,QAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,UAAA,MAAM,KAAK,OAAA,CAAQ,OAAA,CAAQ,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,QAC5C;AAAA,MACF;AAAA,IACF,SAASJ,OAAA,EAAO;AACd,MAAA,IAAIA,mBAAiBC,iBAAAA,EAAa;AAChC,QAAA,MAAMD,OAAA;AAAA,MACR;AACA,MAAA,MAAM,eAAeA,OAAA,YAAiB,KAAA,GAAQA,OAAA,CAAM,OAAA,GAAU,OAAOA,OAAK,CAAA;AAC1E,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,YAAA,EAAc,QAAQ,CAAA;AAAA,UAC7D,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,IAAA,EAAM,gEAAgE,YAAY,CAAA;AAAA,SACpF;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAKA,IAAA,IAAI;AACF,MAAA,KAAA,MAAW,OAAO,gBAAA,EAAkB;AAClC,QAAA,MAAM,KAAK,OAAA,CAAQ,OAAA,CAAQ,EAAE,KAAA,EAAO,KAAK,CAAA;AAAA,MAC3C;AAKA,MAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,EAAE,OAAO,CAAA,oBAAA,EAAuB,mBAAmB,IAAI,CAAA;AAClF,MAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,EAAE,OAAO,CAAA,iBAAA,EAAoB,mBAAmB,IAAI,CAAA;AAC/E,MAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,EAAE,OAAO,CAAA,oBAAA,EAAuB,kBAAkB,IAAI,CAAA;AACjF,MAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,EAAE,OAAO,CAAA,iBAAA,EAAoB,kBAAkB,IAAI,CAAA;AAAA,IAChF,CAAA,CAAA,MAAQ;AAAA,IAGR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAA,GAKH;AACD,IAAA,MAAM,eAAA,GAAkB,MAAM,gCAAA,CAAiC,IAAA,CAAK,OAAO,CAAA;AAE3E,IAAA,IAAI,CAAC,gBAAgB,cAAA,EAAgB;AACnC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,eAAA,EAAiB,IAAA;AAAA,QACjB,iBAAA,EAAmB,CAAA;AAAA,QACnB,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAEA,IAAA,MAAM,mBAAA,CAAoB,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,MAAM,CAAA;AAEnD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,eAAA,EAAiB,KAAA;AAAA,MACjB,iBAAA,EAAmB,CAAA;AAAA,MACnB,OAAA,EAAS,CAAA,4CAAA,EAA+C,eAAA,CAAgB,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,KAC7G;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,IAAoB,qBAAA,GAGlB;AACA,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,aAAA;AAAA,MACX,SAAA,EAAW,CAAC,aAAa;AAAA,KAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAe,WAAW,IAAA,EAAqC;AAC7D,IAAA,IAAI;AACF,MAAA,MAAiB,UAAA,CAAW,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IAChD,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,aAAA,EAAe,QAAQ,CAAA;AAAA,UAC9D,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,CAAK,KAAK,OAAA,EAAS,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,MAAA;AAAO,SAClE;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,iBAAiB,IAAA,EAA2C;AACzE,IAAA,IAAI;AACF,MAAA,MAAiB,gBAAA,CAAiB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IACtD,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,oBAAA,EAAsB,QAAQ,CAAA;AAAA,UACrE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,KAAA,EAAO,IAAA,CAAK,QAAQ,MAAA;AAAO,SACxC;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAe,QAAQ,IAAA,EAAoD;AACzE,IAAA,IAAI;AACF,MAAA,OAAO,MAAiB,OAAA,CAAQ,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IACpD,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,UAAA,EAAY,QAAQ,CAAA;AAAA,UAC3D,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,SAAS,EAAE,OAAA,EAAS,KAAK,OAAA,EAAS,MAAA,EAAQ,KAAK,MAAA;AAAO,SACxD;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,SAAS,IAAA,EAA+C;AACrE,IAAA,IAAI;AACF,MAAA,OAAO,MAAiB,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IACrD,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,WAAA,EAAa,QAAQ,CAAA;AAAA,UAC5D,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,CAAK,SAAS,KAAA,EAAO,IAAA,CAAK,QAAQ,MAAA;AAAO,SAC/D;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,YAAY,IAAA,EAA4D;AACrF,IAAA,IAAI;AACF,MAAA,OAAO,MAAoB,WAAA,CAAY,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IAC3D,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,eAAA,EAAiB,QAAQ,CAAA;AAAA,UAChE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA;AAAQ,SACnC;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,SAAS,IAAA,EAAsD;AAC5E,IAAA,IAAI;AACF,MAAA,OAAO,MAAiB,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IACrD,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,WAAA,EAAa,QAAQ,CAAA;AAAA,UAC5D,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA;AAAQ,SACnC;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,cAAc,IAAA,EAA2D;AACtF,IAAA,IAAI;AACF,MAAA,OAAO,MAAiB,aAAA,CAAc,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IAC1D,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,iBAAA,EAAmB,QAAQ,CAAA;AAAA,UAClE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA;AAAQ,SACnC;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,WAAW,IAAA,EAAmD;AAC3E,IAAA,IAAI;AACF,MAAA,OAAO,MAAoB,UAAA,CAAW,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IAC1D,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,aAAA,EAAe,QAAQ,CAAA;AAAA,UAC9D,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,aAAa,IAAA,EAAuD;AACjF,IAAA,IAAI;AACF,MAAA,OAAO,MAAiB,YAAA,CAAa,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IACzD,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,eAAA,EAAiB,QAAQ,CAAA;AAAA,UAChE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,gBAAgB,IAAA,EAA0C;AACvE,IAAA,IAAI;AACF,MAAA,MAAc,eAAA,CAAgB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IAClD,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,mBAAA,EAAqB,QAAQ,CAAA;AAAA,UACpE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,KAAA,EAAO,IAAA,CAAK,KAAK,MAAA;AAAO,SACrC;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,SAAS,IAAA,EAA+C;AACrE,IAAA,IAAI;AACF,MAAA,OAAO,MAAc,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IAClD,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,WAAA,EAAa,QAAQ,CAAA;AAAA,UAC5D,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,mBAAmB,IAAA,EAA6C;AAC7E,IAAA,IAAI;AACF,MAAA,MAAiB,kBAAA,CAAmB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IACxD,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,sBAAA,EAAwB,QAAQ,CAAA;AAAA,UACvE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,KAAA,EAAO,IAAA,CAAK,QAAQ,MAAA;AAAO,SACxC;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,YAAY,IAAA,EAAqD;AAC9E,IAAA,IAAI;AACF,MAAA,OAAO,MAAiB,WAAA,CAAY,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IACxD,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,cAAA,EAAgB,QAAQ,CAAA;AAAA,UAC/D,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,YAAY,IAAA,EAAsC;AAC/D,IAAA,IAAI;AACF,MAAA,MAAgB,WAAA,CAAY,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IAChD,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,cAAA,EAAgB,QAAQ,CAAA;AAAA,UAC/D,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,kBAAkB,IAAA,EAA4C;AAC3E,IAAA,IAAI;AACF,MAAA,MAAgB,iBAAA,CAAkB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IACtD,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,qBAAA,EAAuB,QAAQ,CAAA;AAAA,UACtE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,KAAA,EAAO,IAAA,CAAK,OAAO,MAAA;AAAO,SACvC;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,WAAW,IAAA,EAAmD;AAC3E,IAAA,IAAI;AACF,MAAA,OAAO,MAAgB,UAAA,CAAW,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IACtD,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,aAAA,EAAe,QAAQ,CAAA;AAAA,UAC9D,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,aAAa,OAAA,EAA8C;AACxE,IAAA,IAAI;AACF,MAAA,OAAO,MAAgB,YAAA,CAAa,IAAA,CAAK,OAAA,EAAS,OAAO,CAAA;AAAA,IAC3D,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,iBAAA,EAAmB,QAAQ,CAAA;AAAA,UAClE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,OAAA;AAAQ,SACrB;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,eAAe,IAAA,EAAyC;AACrE,IAAA,IAAI;AACF,MAAA,MAAkB,cAAA,CAAe,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IACrD,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,iBAAA,EAAmB,QAAQ,CAAA;AAAA,UAClE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,oBAAoB,IAAA,EAA8C;AAC/E,IAAA,IAAI;AACF,MAAA,MAAkB,mBAAA,CAAoB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IAC1D,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,uBAAA,EAAyB,QAAQ,CAAA;AAAA,UACxE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,KAAA,EAAO,IAAA,CAAK,UAAU,MAAA;AAAO,SAC1C;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,aAAa,IAAA,EAAuD;AACjF,IAAA,IAAI;AACF,MAAA,OAAO,MAAkB,YAAA,CAAa,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IAC1D,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,eAAA,EAAiB,QAAQ,CAAA;AAAA,UAChE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAe,kBAAkB,IAAA,EAAiE;AAChG,IAAA,IAAI;AACF,MAAA,OAAO,MAAgB,iBAAA,CAAkB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IAC7D,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,qBAAA,EAAuB,QAAQ,CAAA;AAAA,UACtE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,kBAAkB,IAAA,EAAiE;AAChG,IAAA,IAAI;AACF,MAAA,OAAO,MAAgB,iBAAA,CAAkB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IAC7D,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,qBAAA,EAAuB,QAAQ,CAAA;AAAA,UACtE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,mBAAmB,IAAA,EAAmE;AACnG,IAAA,IAAI;AACF,MAAA,OAAO,MAAgB,kBAAA,CAAmB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IAC9D,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,uBAAA,EAAyB,QAAQ,CAAA;AAAA,UACxE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,oBAAoB,IAAA,EAAqE;AACtG,IAAA,IAAI;AACF,MAAA,OAAO,MAAgB,mBAAA,CAAoB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IAC/D,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,uBAAA,EAAyB,QAAQ,CAAA;AAAA,UACxE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAe,qBAAqB,IAAA,EAAuE;AACzG,IAAA,IAAI;AACF,MAAA,OAAO,MAAkB,oBAAA,CAAqB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IAClE,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,wBAAA,EAA0B,QAAQ,CAAA;AAAA,UACzE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,qBAAqB,IAAA,EAAuE;AACzG,IAAA,IAAI;AACF,MAAA,OAAO,MAAkB,oBAAA,CAAqB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IAClE,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,wBAAA,EAA0B,QAAQ,CAAA;AAAA,UACzE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,sBAAsB,IAAA,EAAyE;AAC5G,IAAA,IAAI;AACF,MAAA,OAAO,MAAkB,qBAAA,CAAsB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IACnE,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,0BAAA,EAA4B,QAAQ,CAAA;AAAA,UAC3E,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,uBAAuB,IAAA,EAA2E;AAC/G,IAAA,IAAI;AACF,MAAA,OAAO,MAAkB,sBAAA,CAAuB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IACpE,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,0BAAA,EAA4B,QAAQ,CAAA;AAAA,UAC3E,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAe,mBAAmB,IAAA,EAAmE;AACnG,IAAA,IAAI;AACF,MAAA,OAAO,MAAiB,kBAAA,CAAmB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IAC/D,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,sBAAA,EAAwB,QAAQ,CAAA;AAAA,UACvE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,mBAAmB,IAAA,EAAmE;AACnG,IAAA,IAAI;AACF,MAAA,OAAO,MAAiB,kBAAA,CAAmB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IAC/D,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,sBAAA,EAAwB,QAAQ,CAAA;AAAA,UACvE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,oBAAoB,IAAA,EAAqE;AACtG,IAAA,IAAI;AACF,MAAA,OAAO,MAAiB,mBAAA,CAAoB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IAChE,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,wBAAA,EAA0B,QAAQ,CAAA;AAAA,UACzE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,qBAAqB,IAAA,EAAuE;AACzG,IAAA,IAAI;AACF,MAAA,OAAO,MAAiB,oBAAA,CAAqB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IACjE,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,wBAAA,EAA0B,QAAQ,CAAA;AAAA,UACzE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAe,eAAe,IAAA,EAA2D;AACvF,IAAA,IAAI;AACF,MAAA,OAAO,MAAiB,cAAA,CAAe,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IAC3D,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,kBAAA,EAAoB,QAAQ,CAAA;AAAA,UACnE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,mBAAmB,IAAA,EAAmE;AACnG,IAAA,IAAI;AACF,MAAA,OAAO,MAAiB,kBAAA,CAAmB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IAC/D,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,uBAAA,EAAyB,QAAQ,CAAA;AAAA,UACxE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,qBAAqB,IAAA,EAAuE;AACzG,IAAA,IAAI;AACF,MAAA,OAAO,MAAiB,oBAAA,CAAqB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IACjE,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,yBAAA,EAA2B,QAAQ,CAAA;AAAA,UAC1E,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAe,eAAe,IAAA,EAA2D;AACvF,IAAA,IAAI;AACF,MAAA,OAAO,MAAmB,cAAA,CAAe,IAAA,CAAK,OAAa,CAAA;AAAA,IAC7D,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,kBAAA,EAAoB,QAAQ,CAAA;AAAA,UACnE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,eAAe,IAAA,EAA2D;AACvF,IAAA,IAAI;AACF,MAAA,OAAO,MAAmB,cAAA,CAAe,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IAC7D,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,kBAAA,EAAoB,QAAQ,CAAA;AAAA,UACnE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,gBAAgB,IAAA,EAA6D;AAC1F,IAAA,IAAI;AACF,MAAA,OAAO,MAAmB,eAAA,CAAgB,IAAA,CAAK,OAAa,CAAA;AAAA,IAC9D,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,mBAAA,EAAqB,QAAQ,CAAA;AAAA,UACpE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,gBAAgB,IAAA,EAA6D;AAC1F,IAAA,IAAI;AACF,MAAA,OAAO,MAAmB,eAAA,CAAgB,IAAA,CAAK,OAAa,CAAA;AAAA,IAC9D,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,kBAAA,EAAoB,QAAQ,CAAA;AAAA,UACnE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAe,QAAQ,IAAA,EAA6C;AAClE,IAAA,IAAI;AACF,MAAA,OAAO,MAAmB,OAAA,CAAQ,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IACtD,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,UAAA,EAAY,QAAQ,CAAA;AAAA,UAC3D,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAe,kBAAkB,IAAA,EAA4C;AAC3E,IAAA,IAAI;AACF,MAAA,MAAiB,iBAAA,CAAkB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IACvD,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,qBAAA,EAAuB,QAAQ,CAAA;AAAA,UACtE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,KAAA,EAAO,IAAA,CAAK,SAAS,MAAA;AAAO,SACzC;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAe,mBAAA,GAAqC;AAClD,IAAA,IAAI;AAEF,MAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,QACZ,eAAA,CAAgB,GAAA,CAAI,CAAA,KAAA,KAAS,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,EAAE,KAAA,EAAO,CAAA,yBAAA,EAA4B,KAAK,CAAA,CAAA,EAAI,CAAC;AAAA,OACnG;AAAA,IACF,SAASA,OAAA,EAAO;AACd,MAAA,IAAIA,OAAA,YAAiBC,mBAAa,MAAMD,OAAA;AACxC,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,qBAAA,EAAuB,QAAQ,CAAA;AAAA,UACtE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACF;ACx9BO,IAAM,uBAAA,GAAN,cAAsC0C,qBAAA,CAAc;AAAA,EAC/C,MAAA;AAAA,EACV,GAAA;AAAA,EACA,YAAY,MAAA,EAAgC;AAC1C,IAAA,KAAA,EAAM;AACN,IAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,EAAI,GAAI,wBAAwB,MAAM,CAAA;AACtD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAM,IAAI,YAAA,CAAa,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,IAAA,GAAsB;AAC1B,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,EAAE,SAAA,EAAWtE,uBAAe,MAAA,EAAQmC,qBAAAA,CAAcnC,qBAAa,CAAA,EAAG,CAAA;AAAA,EAC/F;AAAA,EAEA,MAAM,mBAAA,GAAqC;AACzC,IAAA,MAAM,KAAK,GAAA,CAAI,UAAA,CAAW,EAAE,SAAA,EAAWA,uBAAe,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kBAAkB,GAAA,EAAwB;AAChD,IAAA,OAAOuE,0BAAsB,GAAA,EAAK;AAAA,MAChC,iBAAA,EAAmB,IAAA;AAAA,MACnB,gBAAA,EAAkB;AAAA,KACnB,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,YAAA,CAAa,EAAE,EAAA,EAAG,EAAiD;AACvE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QACrC,KAAA,EAAO,iBAAiBvE,qBAAa,CAAA,2BAAA,CAAA;AAAA,QACrC,YAAA,EAAc,EAAE,MAAA,EAAQ,EAAA,EAAG;AAAA,QAC3B,MAAA,EAAQ,aAAA;AAAA,QACR,mBAAA,EAAqB;AAAA;AAAA,UAEnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,uBAAA,EAAyB,KAAA;AAAA,UACzB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAED,MAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,IAAA,EAAK;AACrC,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,IAAK,UAAA,CAAW,WAAW,CAAA,EAAG;AACzD,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,UAAA,CAAW,CAAC,CAAC,CAAA;AAAA,IAE7C,SAAS4B,OAAA,EAAY;AACnB,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,iBAAA,EAAmB,QAAQ,CAAA;AAAA,UAClE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,OAAA,EAAS,EAAA;AAAG,SACzB;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,KAAA,EAA2D;AACzE,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI;AACF,MAAA,WAAA,GAAc4C,4BAAA,CAAuB,MAAM,KAAK,CAAA;AAAA,IAClD,SAAS5C,OAAA,EAAO;AACd,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,YAAA,EAAc,mBAAmB,CAAA;AAAA,UACxE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,IAAA;AAAA,UACxB,OAAA,EAAS;AAAA,YACP,MAAA,EAAQ,OAAO,KAAA,CAAM,MAAA,EAAQ,EAAA,KAAO,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,EAAA,GAAK,MAAA,CAAO,KAAA,CAAM,MAAA,EAAQ,MAAM,SAAS,CAAA;AAAA,YACrG,QAAA,EAAU,MAAM,QAAA,IAAY,SAAA;AAAA,YAC5B,UAAA,EAAY,MAAM,UAAA,IAAc,SAAA;AAAA,YAChC,OAAA,EAAS,MAAM,OAAA,IAAW,EAAA;AAAA,YAC1B,MAAA,EAAQ,MAAM,MAAA,IAAU;AAAA;AAC1B,SACF;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,IAAA,MAAM,SAAA,GAAY,GAAA;AAClB,IAAA,MAAM,SAAA,GAAY,GAAA;AAElB,IAAA,IAAI;AAEF,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK6C,sBAAc,CAAA,EAAG;AAC7C,QAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,UAAA,MAAA,CAAO,GAAG,CAAA,GAAI,EAAA;AACd,UAAA;AAAA,QACF;AACA,QAAA,IAAI,GAAA,KAAQ,WAAA,IAAe,GAAA,KAAQ,WAAA,EAAa;AAC9C,UAAA,MAAA,CAAO,GAAG,CAAA,GAAI,GAAA,CAAI,WAAA,EAAY;AAC9B,UAAA;AAAA,QACF;AACA,QAAA,MAAM,KAAA,GAAQ,YAAY,GAA+B,CAAA;AACzD,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,OAAO,QAAA,GAAW,KAAA;AAAA,MACnE;AAEA,MAAA,MAAM,IAAA,CAAK,OAAO,MAAA,CAAO;AAAA,QACvB,KAAA,EAAOzE,qBAAAA;AAAA,QACP,MAAA,EAAQ,CAAC,MAAM,CAAA;AAAA,QACf,MAAA,EAAQ,aAAA;AAAA,QACR,mBAAA,EAAqB;AAAA,UACnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AACD,MAAA,OAAO,EAAE,OAAO,EAAE,GAAG,aAAa,EAAA,EAAI,SAAA,EAAW,WAAU,EAAkB;AAAA,IAC/E,SAAS4B,OAAA,EAAO;AACd,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,YAAA,EAAc,QAAQ,CAAA;AAAA,UAC7D,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,OAAA,EAAS,EAAA;AAAG,SACzB;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,iBAAA,CAAkB;AAAA,IACtB,KAAA;AAAA,IACA;AAAA,GACF,EAGgC;AAC9B,IAAA,IAAI;AAEF,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QAC1C,KAAA,EAAO,iCAAiC5B,qBAAa,CAAA,iCAAA,CAAA;AAAA,QACrD,YAAA,EAAc,EAAE,SAAA,EAAW,KAAA,EAAM;AAAA,QACjC,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,MAAM,SAAA,GAAY,MAAM,WAAA,CAAY,IAAA,EAAK;AACzC,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,IAAI,KAAA,CAAM,QAAQ,SAAS,CAAA,IAAK,UAAU,MAAA,GAAS,CAAA,IAAK,SAAA,CAAU,CAAC,CAAA,EAAG;AACpE,QAAA,MAAM,QAAA,GAAW,UAAU,CAAC,CAAA;AAC5B,QAAA,KAAA,GAAQ,MAAA,CAAO,SAAS,KAAK,CAAA;AAAA,MAC/B;AAEA,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,YAAA,EAAa,GAAI,UAAA;AAExC,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO;AAAA,UACL,UAAA,EAAY;AAAA,YACV,KAAA,EAAO,CAAA;AAAA,YACP,IAAA;AAAA,YACA,OAAA,EAAS,YAAA;AAAA,YACT,OAAA,EAAS;AAAA,WACX;AAAA,UACA,QAAQ;AAAC,SACX;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAUyC,wBAAAA,CAAiB,YAAA,EAAc,GAAG,CAAA;AAClD,MAAA,MAAM,EAAE,QAAQ,KAAA,EAAO,OAAA,EAAS,oBAAmB,GAAIC,2BAAAA,CAAoB,IAAA,EAAM,YAAA,EAAc,OAAO,CAAA;AACtG,MAAA,MAAM,UAAA,GAAa,YAAA,KAAiB,KAAA,GAAQ,KAAA,GAAQ,OAAA;AACpD,MAAA,MAAM,GAAA,GAAM,YAAA,KAAiB,KAAA,GAAQ,KAAA,GAAQ,KAAA,GAAQ,OAAA;AAGrD,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QACrC,KAAA,EAAO,iBAAiB1C,qBAAa,CAAA,2GAAA,CAAA;AAAA,QACrC,YAAA,EAAc;AAAA,UACZ,SAAA,EAAW,KAAA;AAAA,UACX,SAAA,EAAW,UAAA;AAAA,UACX,UAAA,EAAY;AAAA,SACd;AAAA,QACA,MAAA,EAAQ,aAAA;AAAA,QACR,mBAAA,EAAqB;AAAA,UACnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,uBAAA,EAAyB,KAAA;AAAA,UACzB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AACD,MAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,EAAK;AAC/B,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAA,CAAK,iBAAA,CAAkB,GAAG,CAAC,IAAI,EAAC;AACrF,MAAA,OAAO;AAAA,QACL,UAAA,EAAY;AAAA,UACV,KAAA;AAAA,UACA,IAAA;AAAA,UACA,OAAA,EAAS,kBAAA;AAAA,UACT,SAAS,GAAA,GAAM;AAAA,SACjB;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS4B,OAAA,EAAY;AACnB,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,uBAAA,EAAyB,QAAQ,CAAA;AAAA,UACxE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,KAAA;AAAM,SACnB;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,oBAAA,CAAqB;AAAA,IACzB,QAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF,EAMgC;AAC9B,IAAA,IAAI,WAAA,GAAc,CAAA,gCAAA,CAAA;AAClB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,WAAA,IAAe,CAAA,qCAAA,CAAA;AAAA,IACjB;AACA,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,WAAA,IAAe,CAAA,yCAAA,CAAA;AAAA,IACjB;AACA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,WAAA,IAAe,CAAA,iCAAA,CAAA;AAAA,IACjB;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QAC1C,KAAA,EAAO,CAAA,8BAAA,EAAiC5B,qBAAa,CAAA,OAAA,EAAU,WAAW,CAAA,CAAA;AAAA,QAC1E,YAAA,EAAc;AAAA,UACZ,YAAA,EAAc,QAAA;AAAA,UACd,YAAA,EAAc,QAAA;AAAA,UACd,cAAA,EAAgB,UAAA;AAAA,UAChB,UAAA,EAAY;AAAA,SACd;AAAA,QACA,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,MAAM,SAAA,GAAY,MAAM,WAAA,CAAY,IAAA,EAAK;AACzC,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,IAAI,KAAA,CAAM,QAAQ,SAAS,CAAA,IAAK,UAAU,MAAA,GAAS,CAAA,IAAK,SAAA,CAAU,CAAC,CAAA,EAAG;AACpE,QAAA,MAAM,QAAA,GAAW,UAAU,CAAC,CAAA;AAC5B,QAAA,KAAA,GAAQ,MAAA,CAAO,SAAS,KAAK,CAAA;AAAA,MAC/B;AAEA,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,YAAA,EAAa,GAAI,UAAA;AAExC,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO;AAAA,UACL,UAAA,EAAY;AAAA,YACV,KAAA,EAAO,CAAA;AAAA,YACP,IAAA;AAAA,YACA,OAAA,EAAS,YAAA;AAAA,YACT,OAAA,EAAS;AAAA,WACX;AAAA,UACA,QAAQ;AAAC,SACX;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAUyC,wBAAAA,CAAiB,YAAA,EAAc,GAAG,CAAA;AAClD,MAAA,MAAM,EAAE,QAAQ,KAAA,EAAO,OAAA,EAAS,oBAAmB,GAAIC,2BAAAA,CAAoB,IAAA,EAAM,YAAA,EAAc,OAAO,CAAA;AACtG,MAAA,MAAM,UAAA,GAAa,YAAA,KAAiB,KAAA,GAAQ,KAAA,GAAQ,OAAA;AACpD,MAAA,MAAM,GAAA,GAAM,YAAA,KAAiB,KAAA,GAAQ,KAAA,GAAQ,KAAA,GAAQ,OAAA;AAGrD,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QACrC,KAAA,EAAO,CAAA,cAAA,EAAiB1C,qBAAa,CAAA,OAAA,EAAU,WAAW,CAAA,0EAAA,CAAA;AAAA,QAC1D,YAAA,EAAc;AAAA,UACZ,YAAA,EAAc,QAAA;AAAA,UACd,SAAA,EAAW,UAAA;AAAA,UACX,UAAA,EAAY,KAAA;AAAA,UACZ,YAAA,EAAc,QAAA;AAAA,UACd,cAAA,EAAgB,UAAA;AAAA,UAChB,UAAA,EAAY;AAAA,SACd;AAAA,QACA,MAAA,EAAQ,aAAA;AAAA,QACR,mBAAA,EAAqB;AAAA,UACnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,uBAAA,EAAyB,KAAA;AAAA,UACzB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AACD,MAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,EAAK;AAC/B,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAA,CAAK,iBAAA,CAAkB,GAAG,CAAC,IAAI,EAAC;AACrF,MAAA,OAAO;AAAA,QACL,UAAA,EAAY;AAAA,UACV,KAAA;AAAA,UACA,IAAA;AAAA,UACA,OAAA,EAAS,kBAAA;AAAA,UACT,SAAS,GAAA,GAAM;AAAA,SACjB;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS4B,OAAA,EAAY;AACnB,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,0BAAA,EAA4B,QAAQ,CAAA;AAAA,UAC3E,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,QAAA;AAAS,SACtB;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,oBAAA,CAAqB;AAAA,IACzB,QAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF,EAIgC;AAC9B,IAAA,IAAI;AAEF,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QAC1C,KAAA,EAAO,iCAAiC5B,qBAAa,CAAA,gFAAA,CAAA;AAAA,QACrD,YAAA,EAAc,EAAE,YAAA,EAAc,QAAA,EAAU,gBAAgB,UAAA,EAAW;AAAA,QACnE,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,MAAM,SAAA,GAAY,MAAM,WAAA,CAAY,IAAA,EAAK;AACzC,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,IAAI,KAAA,CAAM,QAAQ,SAAS,CAAA,IAAK,UAAU,MAAA,GAAS,CAAA,IAAK,SAAA,CAAU,CAAC,CAAA,EAAG;AACpE,QAAA,MAAM,QAAA,GAAW,UAAU,CAAC,CAAA;AAC5B,QAAA,KAAA,GAAQ,MAAA,CAAO,SAAS,KAAK,CAAA;AAAA,MAC/B;AAEA,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,YAAA,EAAa,GAAI,UAAA;AAExC,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO;AAAA,UACL,UAAA,EAAY;AAAA,YACV,KAAA,EAAO,CAAA;AAAA,YACP,IAAA;AAAA,YACA,OAAA,EAAS,YAAA;AAAA,YACT,OAAA,EAAS;AAAA,WACX;AAAA,UACA,QAAQ;AAAC,SACX;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAUyC,wBAAAA,CAAiB,YAAA,EAAc,GAAG,CAAA;AAClD,MAAA,MAAM,EAAE,QAAQ,KAAA,EAAO,OAAA,EAAS,oBAAmB,GAAIC,2BAAAA,CAAoB,IAAA,EAAM,YAAA,EAAc,OAAO,CAAA;AACtG,MAAA,MAAM,UAAA,GAAa,YAAA,KAAiB,KAAA,GAAQ,KAAA,GAAQ,OAAA;AACpD,MAAA,MAAM,GAAA,GAAM,YAAA,KAAiB,KAAA,GAAQ,KAAA,GAAQ,KAAA,GAAQ,OAAA;AAGrD,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QACrC,KAAA,EAAO,iBAAiB1C,qBAAa,CAAA,0JAAA,CAAA;AAAA,QACrC,YAAA,EAAc;AAAA,UACZ,YAAA,EAAc,QAAA;AAAA,UACd,cAAA,EAAgB,UAAA;AAAA,UAChB,SAAA,EAAW,UAAA;AAAA,UACX,UAAA,EAAY;AAAA,SACd;AAAA,QACA,MAAA,EAAQ,aAAA;AAAA,QACR,mBAAA,EAAqB;AAAA,UACnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,uBAAA,EAAyB,KAAA;AAAA,UACzB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AACD,MAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,EAAK;AAC/B,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAA,CAAK,iBAAA,CAAkB,GAAG,CAAC,IAAI,EAAC;AACrF,MAAA,OAAO;AAAA,QACL,UAAA,EAAY;AAAA,UACV,KAAA;AAAA,UACA,IAAA;AAAA,UACA,OAAA,EAAS,kBAAA;AAAA,UACT,SAAS,GAAA,GAAM;AAAA,SACjB;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS4B,OAAA,EAAY;AACnB,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,0BAAA,EAA4B,QAAQ,CAAA;AAAA,UAC3E,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,QAAA,EAAU,UAAA;AAAW,SAClC;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,gBAAA,CAAiB;AAAA,IACrB,OAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF,EAIgC;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QAC1C,KAAA,EAAO,iCAAiC5B,qBAAa,CAAA,sEAAA,CAAA;AAAA,QACrD,YAAA,EAAc;AAAA,UACZ,WAAA,EAAa,OAAA;AAAA,UACb,UAAA,EAAY;AAAA,SACd;AAAA,QACA,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,MAAM,SAAA,GAAY,MAAM,WAAA,CAAY,IAAA,EAAK;AACzC,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,IAAI,KAAA,CAAM,QAAQ,SAAS,CAAA,IAAK,UAAU,MAAA,GAAS,CAAA,IAAK,SAAA,CAAU,CAAC,CAAA,EAAG;AACpE,QAAA,MAAM,QAAA,GAAW,UAAU,CAAC,CAAA;AAC5B,QAAA,KAAA,GAAQ,MAAA,CAAO,SAAS,KAAK,CAAA;AAAA,MAC/B;AAEA,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,YAAA,EAAa,GAAI,UAAA;AAExC,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO;AAAA,UACL,UAAA,EAAY;AAAA,YACV,KAAA,EAAO,CAAA;AAAA,YACP,IAAA;AAAA,YACA,OAAA,EAAS,YAAA;AAAA,YACT,OAAA,EAAS;AAAA,WACX;AAAA,UACA,QAAQ;AAAC,SACX;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAUyC,wBAAAA,CAAiB,YAAA,EAAc,GAAG,CAAA;AAClD,MAAA,MAAM,EAAE,QAAQ,KAAA,EAAO,OAAA,EAAS,oBAAmB,GAAIC,2BAAAA,CAAoB,IAAA,EAAM,YAAA,EAAc,OAAO,CAAA;AACtG,MAAA,MAAM,UAAA,GAAa,YAAA,KAAiB,KAAA,GAAQ,KAAA,GAAQ,OAAA;AACpD,MAAA,MAAM,GAAA,GAAM,YAAA,KAAiB,KAAA,GAAQ,KAAA,GAAQ,KAAA,GAAQ,OAAA;AAErD,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QACrC,KAAA,EAAO,iBAAiB1C,qBAAa,CAAA,gJAAA,CAAA;AAAA,QACrC,YAAA,EAAc;AAAA,UACZ,WAAA,EAAa,OAAA;AAAA,UACb,UAAA,EAAY,MAAA;AAAA,UACZ,SAAA,EAAW,UAAA;AAAA,UACX,UAAA,EAAY;AAAA,SACd;AAAA,QACA,MAAA,EAAQ,aAAA;AAAA,QACR,mBAAA,EAAqB;AAAA,UACnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,uBAAA,EAAyB,KAAA;AAAA,UACzB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAED,MAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,EAAK;AAC/B,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAA,CAAK,iBAAA,CAAkB,GAAG,CAAC,IAAI,EAAC;AAErF,MAAA,OAAO;AAAA,QACL,UAAA,EAAY;AAAA,UACV,KAAA;AAAA,UACA,IAAA;AAAA,UACA,OAAA,EAAS,kBAAA;AAAA,UACT,SAAS,GAAA,GAAM;AAAA,SACjB;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS4B,OAAA,EAAY;AACnB,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,qBAAA,EAAuB,QAAQ,CAAA;AAAA,UACtE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,OAAA,EAAS,MAAA;AAAO,SAC7B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACF;ACleO,IAAM,0BAAA,GAAN,cAAyC8C,wBAAA,CAAiB;AAAA,EACrD,MAAA;AAAA,EACV,GAAA;AAAA,EACA,YAAY,MAAA,EAAgC;AAC1C,IAAA,KAAA,EAAM;AACN,IAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,EAAI,GAAI,wBAAwB,MAAM,CAAA;AACtD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAM,IAAI,YAAA,CAAa,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,EAC7C;AAAA,EAEA,yBAAA,GAAqC;AAGnC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAA,GAAsB;AAC1B,IAAA,MAAM,MAAA,GAASvC,sBAActC,+BAAuB,CAAA;AACpD,IAAA,MAAM,KAAK,GAAA,CAAI,WAAA,CAAY,EAAE,SAAA,EAAWA,+BAAAA,EAAyB,QAAQ,CAAA;AAEzE,IAAA,MAAM,IAAA,CAAK,IAAI,UAAA,CAAW;AAAA,MACxB,SAAA,EAAWA,+BAAAA;AAAA,MACX,MAAA;AAAA,MACA,WAAA,EAAa,CAAC,YAAY;AAAA,KAC3B,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,mBAAA,GAAqC;AACzC,IAAA,MAAM,KAAK,GAAA,CAAI,UAAA,CAAW,EAAE,SAAA,EAAWA,iCAAyB,CAAA;AAAA,EAClE;AAAA,EAEA,MAAM,sBAAsB,KAAA,EAMgC;AAC1D,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,KAAA,EAIgB;AACxC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,uBAAA,CAAwB;AAAA,IAC5B,YAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF,EAOkB;AAChB,IAAA,IAAI;AACF,MAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK;AAAA,QAC1C,SAAA,EAAWA,+BAAAA;AAAA,QACX,IAAA,EAAM,EAAE,aAAA,EAAe,YAAA,EAAc,QAAQ,KAAA;AAAM,OACpD,CAAA;AAED,MAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,MAAA,MAAM,aAAa,eAAA,GACf;AAAA,QACE,GAAG,eAAA;AAAA,QACH,UAAA;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAAA,QACjC,SAAA,EAAA,CAAY,SAAA,IAAa,GAAA,EAAK,WAAA;AAAY,OAC5C,GACA;AAAA,QACE,aAAA,EAAe,YAAA;AAAA,QACf,MAAA,EAAQ,KAAA;AAAA,QACR,UAAA;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAAA,QACjC,SAAA,EAAA,CAAY,SAAA,IAAa,GAAA,EAAK,WAAA,EAAY;AAAA,QAC1C,SAAA,EAAA,CAAY,SAAA,IAAa,GAAA,EAAK,WAAA;AAAY,OAC5C;AAEJ,MAAA,MAAM,IAAA,CAAK,OAAO,MAAA,CAAO;AAAA,QACvB,KAAA,EAAOA,+BAAAA;AAAA,QACP,MAAA,EAAQ,aAAA;AAAA,QACR,MAAA,EAAQ,CAAC,UAAU,CAAA;AAAA,QACnB,mBAAA,EAAqB;AAAA;AAAA,UAEnB,sBAAA,EAAwB,aAAA;AAAA,UACxB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAAA,IACH,SAAS+B,OAAA,EAAY;AACnB,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,2BAAA,EAA6B,QAAQ,CAAA;AAAA,UAC5E,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,YAAA,EAAc,KAAA;AAAM,SACjC;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,oBAAA,CAAqB;AAAA,IACzB,YAAA;AAAA,IACA;AAAA,GACF,EAGqC;AACnC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK;AAAA,QACjC,SAAA,EAAW/B,+BAAAA;AAAA,QACX,IAAA,EAAM;AAAA,UACJ,aAAA,EAAe,YAAA;AAAA,UACf,MAAA,EAAQ;AAAA;AACV,OACD,CAAA;AAED,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAQ,MAAA,CAAe,QAAA;AAAA,IACzB,SAAS+B,OAAA,EAAY;AACnB,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,wBAAA,EAA0B,QAAQ,CAAA;AAAA,UACzE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,YAAA,EAAc,KAAA;AAAM,SACjC;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,iBAAiB,GAAA,EAAuB;AAC9C,IAAA,IAAI,iBAA4C,GAAA,CAAI,QAAA;AACpD,IAAA,IAAI,OAAO,mBAAmB,QAAA,EAAU;AACtC,MAAA,IAAI;AACF,QAAA,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAkB,CAAA;AAAA,MACpD,SAAS,CAAA,EAAG;AAEV,QAAA,IAAA,CAAK,OAAO,IAAA,CAAK,CAAA,sCAAA,EAAyC,IAAI,aAAa,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA;AAAA,MACrF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,cAAc,GAAA,CAAI,aAAA;AAAA,MAClB,OAAO,GAAA,CAAI,MAAA;AAAA,MACX,QAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AAAA,MACjC,SAAA,EAAW,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AAAA,MACjC,YAAY,GAAA,CAAI;AAAA,KAClB;AAAA,EACF;AAAA,EAEA,MAAM,gBAAA,CAAiB;AAAA,IACrB,YAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA,EAAA+C,OAAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF,GAAkC,EAAC,EAA0B;AAC3D,IAAA,IAAI;AACF,MAAA,MAAM,aAAuB,EAAC;AAC9B,MAAA,MAAM,SAA8B,EAAC;AAErC,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,UAAA,CAAW,KAAK,CAAA,0CAAA,CAA4C,CAAA;AAC5D,QAAA,MAAA,CAAO,iBAAA,GAAoB,YAAA;AAAA,MAC7B;AAEA,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,UAAA,CAAW,KAAK,CAAA,2DAAA,CAA6D,CAAA;AAC7E,QAAA,MAAA,CAAO,UAAA,GAAa,MAAA;AAAA,MACtB;AAEA,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,gBAAgB,MAAM,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU9E,iCAAyB,YAAY,CAAA;AACpF,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,UAAA,CAAW,KAAK,CAAA,oCAAA,CAAsC,CAAA;AACtD,UAAA,MAAA,CAAO,cAAA,GAAiB,UAAA;AAAA,QAC1B,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,EAAIA,+BAAuB,CAAA,0DAAA,CAA4D,CAAA;AAAA,QAC1G;AAAA,MACF;AAEA,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,UAAA,CAAW,KAAK,CAAA,0CAAA,CAA4C,CAAA;AAC5D,QAAA,MAAA,CAAO,aAAA,GAAgB,QAAA,CAAS,OAAA,EAAQ,GAAI,GAAA;AAAA,MAC9C;AAEA,MAAA,IAAI8E,OAAAA,EAAQ;AACV,QAAA,UAAA,CAAW,KAAK,CAAA,wCAAA,CAA0C,CAAA;AAC1D,QAAA,MAAA,CAAO,WAAA,GAAcA,OAAAA,CAAO,OAAA,EAAQ,GAAI,GAAA;AAAA,MAC1C;AAEA,MAAA,MAAM,WAAA,GAAc,WAAW,MAAA,GAAS,CAAA,GAAI,SAAS,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAClF,MAAA,MAAM,aAAA,GAAgB,OAAA,KAAY,MAAA,IAAa,IAAA,KAAS,MAAA;AACxD,MAAA,MAAM,oBAAoB,aAAA,GAAgBlC,wBAAAA,CAAiB,OAAA,EAAS,MAAA,CAAO,gBAAgB,CAAA,GAAI,CAAA;AAC/F,MAAA,MAAM,MAAA,GAAS,aAAA,GAAgB,IAAA,GAAO,iBAAA,GAAoB,CAAA;AAC1D,MAAA,MAAM,WAAA,GAAc,aAAA,GAAgB,CAAA,MAAA,EAAS,iBAAiB,CAAA,CAAA,GAAK,EAAA;AACnE,MAAA,MAAM,YAAA,GAAe,aAAA,GAAgB,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,GAAK,EAAA;AAE1D,MAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,UAC1C,KAAA,EAAO,CAAA,8BAAA,EAAiC5C,+BAAuB,CAAA,CAAA,EAAI,aAAA,CAAcA,+BAAuB,CAAA,CAAE,UAAA,CAAW,oBAAoB,CAAA,GAAI,OAAA,GAAU,EAAE,IAAI,WAAW,CAAA,CAAA;AAAA,UACxK,YAAA,EAAc,MAAA;AAAA,UACd,MAAA,EAAQ;AAAA,SACT,CAAA;AACD,QAAA,MAAM,SAAA,GAAY,MAAM,WAAA,CAAY,IAAA,EAAK;AACzC,QAAA,KAAA,GAAQ,MAAA,CAAQ,SAAA,CAAgD,CAAC,CAAA,EAAG,SAAS,CAAC,CAAA;AAAA,MAChF;AAGA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QACrC,KAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAA,EAQMA,+BAAuB,IAAI,aAAA,CAAcA,+BAAuB,EAAE,UAAA,CAAW,oBAAoB,CAAA,GAAI,OAAA,GAAU,EAAE;AAAA,cAAA,EACtH,WAAW;AAAA;AAAA,cAAA,EAEX,WAAW;AAAA,cAAA,EACX,YAAY;AAAA,YAAA,CAAA;AAAA,QAEpB,YAAA,EAAc,MAAA;AAAA,QACd,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,IAAA,EAAK;AACrC,MAAA,MAAM,IAAA,GAAO,UAAA;AACb,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO;AAC3B,QAAA,OAAO,IAAA,CAAK,iBAAiB,GAAG,CAAA;AAAA,MAClC,CAAC,CAAA;AAGD,MAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,IAAS,KAAK,MAAA,EAAO;AAAA,IAC7C,SAAS+B,OAAA,EAAY;AACnB,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,oBAAA,EAAsB,QAAQ,CAAA;AAAA,UACrE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,SAAS,EAAE,YAAA,EAAc,gBAAgB,EAAA,EAAI,UAAA,EAAY,cAAc,EAAA;AAAG,SAC5E;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,kBAAA,CAAmB;AAAA,IACvB,KAAA;AAAA,IACA;AAAA,GACF,EAGgC;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,aAAuB,EAAC;AAC9B,MAAA,MAAM,SAA8B,EAAC;AAErC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,UAAA,CAAW,KAAK,CAAA,2BAAA,CAA6B,CAAA;AAC7C,QAAA,MAAA,CAAO,SAAA,GAAY,KAAA;AAAA,MACrB;AAEA,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,UAAA,CAAW,KAAK,CAAA,0CAAA,CAA4C,CAAA;AAC5D,QAAA,MAAA,CAAO,iBAAA,GAAoB,YAAA;AAAA,MAC7B;AAEA,MAAA,MAAM,WAAA,GAAc,WAAW,MAAA,GAAS,CAAA,GAAI,SAAS,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAGlF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM;AAAA,QACrC,KAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAA,EAQM/B,+BAAuB,IAAI,aAAA,CAAcA,+BAAuB,EAAE,UAAA,CAAW,oBAAoB,CAAA,GAAI,OAAA,GAAU,EAAE;AAAA,cAAA,EACtH,WAAW;AAAA;AAAA,YAAA,CAAA;AAAA,QAGnB,YAAA,EAAc,MAAA;AAAA,QACd,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,IAAA,EAAK;AACrC,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,IAAK,UAAA,CAAW,WAAW,CAAA,EAAG;AACzD,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,UAAA,CAAW,CAAC,CAAC,CAAA;AAAA,IAC5C,SAAS+B,OAAA,EAAY;AACnB,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,wBAAA,EAA0B,QAAQ,CAAA;AAAA,UACzE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,SAAS,EAAE,KAAA,EAAO,SAAS,EAAA,EAAI,YAAA,EAAc,gBAAgB,EAAA;AAAG,SAClE;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,qBAAA,CAAsB,EAAE,KAAA,EAAO,cAAa,EAA2D;AAC3G,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAA8B;AAAA,QAClC,SAAA,EAAW,KAAA;AAAA,QACX,iBAAA,EAAmB;AAAA,OACrB;AAEA,MAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,QACxB,KAAA,EAAO,eAAe/B,+BAAuB,CAAA,iFAAA,CAAA;AAAA,QAC7C,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,IACH,SAAS+B,OAAA,EAAY;AACnB,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,2BAAA,EAA6B,QAAQ,CAAA;AAAA,UAC5E,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,KAAA,EAAO,YAAA;AAAa,SACjC;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACF;;;ACnOA,IAAM,cAAA,GAAiB,CAAC,MAAA,KAAwF;AAC9G,EAAA,OAAO,QAAA,IAAY,MAAA;AACrB,CAAA;AAwBO,IAAM,eAAA,GAAN,cAA8BgD,4BAAA,CAAqB;AAAA,EAC9C,EAAA;AAAA,EACA,MAA+B,EAAC;AAAA,EAE1C,MAAA;AAAA,EAEA,YAAY,MAAA,EAA0B;AACpC,IAAA,KAAA,CAAM,EAAE,IAAI,MAAA,CAAO,EAAA,EAAI,MAAM,iBAAA,EAAmB,WAAA,EAAa,MAAA,CAAO,WAAA,EAAa,CAAA;AAGjF,IAAA,IAAI,cAAA,CAAe,MAAM,CAAA,EAAG;AAE1B,MAAA,IAAA,CAAK,KAAK,MAAA,CAAO,MAAA;AAAA,IACnB,CAAA,MAAO;AAEL,MAAA,IAAI,CAAC,MAAA,CAAO,GAAA,IAAO,OAAO,MAAA,CAAO,GAAA,KAAQ,QAAA,IAAY,MAAA,CAAO,GAAA,CAAI,IAAA,EAAK,KAAM,EAAA,EAAI;AAC7E,QAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,MACzE;AAEA,MAAA,IAAI,OAAO,MAAA,CAAO,QAAA,KAAa,QAAA,EAAU;AACvC,QAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,MAC/D;AACA,MAAA,IAAI,OAAO,MAAA,CAAO,QAAA,KAAa,QAAA,EAAU;AACvC,QAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,MAC/D;AAGA,MAAA,MAAM,EAAE,EAAA,EAAI,GAAA,EAAK,aAAa,mBAAA,EAAqB,GAAG,eAAc,GAAI,MAAA;AAGxE,MAAA,IAAA,CAAK,KAAKlD,mBAAAA,CAAa;AAAA,QACrB,GAAG,aAAA;AAAA,QACH,mBAAA,EAAqB;AAAA,UACnB,GAAG,mBAAA;AAAA,UACH,sBAAA,EAAwB,aAAA;AAAA,UACxB,uBAAA,EAAyB,KAAA;AAAA;AAAA,UACzB,oBAAA,EAAsB,CAAA;AAAA,UACtB,uCAAA,EAAyC;AAAA;AAC3C,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,MAAM,MAAA,CAAO,GAAA;AAElB,IAAA,MAAM,eAAe,EAAE,MAAA,EAAQ,KAAK,EAAA,EAAI,GAAA,EAAK,KAAK,GAAA,EAAI;AACtD,IAAA,MAAM,SAAA,GAAY,IAAI,0BAAA,CAA2B,YAAY,CAAA;AAC7D,IAAA,MAAM,MAAA,GAAS,IAAI,uBAAA,CAAwB,YAAY,CAAA;AACvD,IAAA,MAAM,MAAA,GAAS,IAAI,uBAAA,CAAwB,YAAY,CAAA;AACvD,IAAA,MAAM,aAAA,GAAgB,IAAI,8BAAA,CAA+B,YAAY,CAAA;AAErE,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,SAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,aAAA;AAAA,MACA,eAAA,EAAiB,IAAI,gCAAA,CAAiC,YAAY;AAAA,KACpE;AAAA,EACF;AAAA,EAEA,MAAM,aAAA,CAAc,EAAE,SAAA,EAAU,EAA8C;AAC5E,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA,QACpB,KAAA,EAAO,kBAAkB,SAAS,CAAA,MAAA;AAAA,OACnC,CAAA;AAAA,IACH,SAASE,OAAA,EAAY;AACnB,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,gBAAA,EAAkB,QAAQ,CAAA;AAAA,UACjE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,SAAA;AAAU,SACvB;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,cAAA,CAAe,EAAE,SAAA,EAAU,EAA8C;AAC7E,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA,QACpB,KAAA,EAAO,eAAe,SAAS,CAAA,iBAAA;AAAA,OAChC,CAAA;AAAA,IACH,SAASA,OAAA,EAAY;AACnB,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,iBAAA,EAAmB,QAAQ,CAAA;AAAA,UAClE,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,WAAA;AAAA,UACxB,OAAA,EAAS,EAAE,SAAA;AAAU,SACvB;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,GAAG,KAAA,EAAM;AAAA,IACtB,SAASA,OAAA,EAAO;AACd,MAAA,MAAM,IAAIC,iBAAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAIC,4BAAAA,CAAqB,YAAA,EAAc,OAAA,EAAS,QAAQ,CAAA;AAAA,UACxD,QAAQC,iBAAAA,CAAY,OAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc;AAAA,SAC1B;AAAA,QACAJ;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACF;AA4BO,IAAM,oBAAA,GAAN,cAAmC,eAAA,CAAgB;AAAA,EACxD,YAAY,MAAA,EAA0B;AACpC,IAAA,KAAA,CAAM,MAAM,CAAA;AAIZ,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AAIZ,IAAA,MAAM,gBAAgB,IAAI,mCAAA,CAAoC,EAAE,MAAA,EAAQ,IAAA,CAAK,IAAI,CAAA;AAEjF,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,GAAG,IAAA,CAAK,MAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACF","file":"index.cjs","sourcesContent":["import type { TABLE_NAMES, TABLE_SCHEMAS, StorageColumn } from '@mastra/core/storage';\nimport {\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_SCORERS,\n TABLE_THREADS,\n TABLE_TRACES,\n TABLE_WORKFLOW_SNAPSHOT,\n safelyParseJSON,\n TABLE_SPANS,\n TABLE_AGENT_VERSIONS,\n TABLE_DATASETS,\n TABLE_DATASET_ITEMS,\n TABLE_DATASET_VERSIONS,\n TABLE_EXPERIMENTS,\n TABLE_EXPERIMENT_RESULTS,\n TABLE_PROMPT_BLOCKS,\n TABLE_PROMPT_BLOCK_VERSIONS,\n TABLE_SCORER_DEFINITIONS,\n TABLE_SCORER_DEFINITION_VERSIONS,\n TABLE_MCP_CLIENTS,\n TABLE_MCP_CLIENT_VERSIONS,\n TABLE_MCP_SERVERS,\n TABLE_MCP_SERVER_VERSIONS,\n TABLE_WORKSPACES,\n TABLE_WORKSPACE_VERSIONS,\n TABLE_SKILLS,\n TABLE_SKILL_VERSIONS,\n TABLE_SKILL_BLOBS,\n TABLE_SCHEDULES,\n TABLE_SCHEDULE_TRIGGERS,\n} from '@mastra/core/storage';\n\nexport const TABLE_ENGINES: Record<TABLE_NAMES, string> = {\n [TABLE_MESSAGES]: `MergeTree()`,\n [TABLE_WORKFLOW_SNAPSHOT]: `ReplacingMergeTree()`,\n [TABLE_TRACES]: `MergeTree()`,\n [TABLE_THREADS]: `ReplacingMergeTree()`,\n [TABLE_SCORERS]: `MergeTree()`,\n [TABLE_RESOURCES]: `ReplacingMergeTree()`,\n // ReplacingMergeTree(updatedAt) deduplicates rows with the same (traceId, spanId) sorting key,\n // keeping the row with the highest updatedAt value. Combined with ORDER BY (traceId, spanId),\n // this provides eventual uniqueness for the (traceId, spanId) composite key.\n [TABLE_SPANS]: `ReplacingMergeTree(updatedAt)`,\n mastra_agents: `ReplacingMergeTree()`,\n [TABLE_AGENT_VERSIONS]: `MergeTree()`,\n [TABLE_DATASETS]: `ReplacingMergeTree()`,\n [TABLE_DATASET_ITEMS]: `ReplacingMergeTree()`,\n [TABLE_DATASET_VERSIONS]: `MergeTree()`,\n [TABLE_EXPERIMENTS]: `ReplacingMergeTree()`,\n [TABLE_EXPERIMENT_RESULTS]: `MergeTree()`,\n [TABLE_PROMPT_BLOCKS]: `ReplacingMergeTree()`,\n [TABLE_PROMPT_BLOCK_VERSIONS]: `MergeTree()`,\n [TABLE_SCORER_DEFINITIONS]: `ReplacingMergeTree()`,\n [TABLE_SCORER_DEFINITION_VERSIONS]: `MergeTree()`,\n [TABLE_MCP_CLIENTS]: `ReplacingMergeTree()`,\n [TABLE_MCP_CLIENT_VERSIONS]: `MergeTree()`,\n [TABLE_MCP_SERVERS]: `ReplacingMergeTree()`,\n [TABLE_MCP_SERVER_VERSIONS]: `MergeTree()`,\n [TABLE_WORKSPACES]: `ReplacingMergeTree()`,\n [TABLE_WORKSPACE_VERSIONS]: `MergeTree()`,\n [TABLE_SKILLS]: `ReplacingMergeTree()`,\n [TABLE_SKILL_VERSIONS]: `MergeTree()`,\n [TABLE_SKILL_BLOBS]: `ReplacingMergeTree()`,\n mastra_background_tasks: `ReplacingMergeTree()`,\n [TABLE_SCHEDULES]: `ReplacingMergeTree()`,\n [TABLE_SCHEDULE_TRIGGERS]: `MergeTree()`,\n mastra_channel_installations: `ReplacingMergeTree()`,\n mastra_channel_config: `ReplacingMergeTree()`,\n};\n\nexport const COLUMN_TYPES: Record<StorageColumn['type'], string> = {\n text: 'String',\n timestamp: 'DateTime64(3)',\n uuid: 'String',\n jsonb: 'String',\n integer: 'Int64',\n float: 'Float64',\n bigint: 'Int64',\n boolean: 'Bool',\n};\n\nexport type IntervalUnit =\n | 'NANOSECOND'\n | 'MICROSECOND'\n | 'MILLISECOND'\n | 'SECOND'\n | 'MINUTE'\n | 'HOUR'\n | 'DAY'\n | 'WEEK'\n | 'MONTH'\n | 'QUARTER'\n | 'YEAR';\n\nexport type ClickhouseConfig = {\n url: string;\n username: string;\n password: string;\n ttl?: {\n [TableKey in TABLE_NAMES]?: {\n row?: { interval: number; unit: IntervalUnit; ttlKey?: string };\n columns?: Partial<{\n [ColumnKey in keyof (typeof TABLE_SCHEMAS)[TableKey]]: {\n interval: number;\n unit: IntervalUnit;\n ttlKey?: string;\n };\n }>;\n };\n };\n};\n\n// List of fields that should be parsed as JSON\nconst JSON_FIELDS = ['content', 'attributes', 'metadata', 'input', 'output', 'error', 'scope', 'links'];\n\n// Fields that should be null instead of empty string when empty\nconst NULLABLE_STRING_FIELDS = ['parentSpanId', 'error'];\n\nexport function transformRow<R>(row: any): R {\n if (!row) {\n return row;\n }\n\n if (row.createdAt) {\n row.createdAt = new Date(row.createdAt);\n }\n if (row.updatedAt) {\n row.updatedAt = new Date(row.updatedAt);\n }\n if (row.startedAt) {\n row.startedAt = new Date(row.startedAt);\n }\n if (row.endedAt) {\n row.endedAt = new Date(row.endedAt);\n }\n\n // Parse JSONB fields if they're JSON strings\n for (const field of JSON_FIELDS) {\n if (row[field] && typeof row[field] === 'string') {\n row[field] = safelyParseJSON(row[field]);\n }\n }\n\n // Convert empty strings to null for nullable fields\n for (const field of NULLABLE_STRING_FIELDS) {\n if (row[field] === '') {\n row[field] = null;\n }\n }\n\n return row;\n}\n\nexport function transformRows<R>(rows: any[]): R[] {\n return rows.map((row: any) => transformRow<R>(row));\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { createClient } from '@clickhouse/client';\nimport { MastraBase } from '@mastra/core/base';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n getSqlType,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_SPANS,\n TABLE_SCHEMAS,\n getDefaultValue,\n} from '@mastra/core/storage';\nimport type { StorageColumn, TABLE_NAMES } from '@mastra/core/storage';\nimport type { ClickhouseConfig } from './utils';\nimport { TABLE_ENGINES, transformRow } from './utils';\n\n/**\n * Configuration for standalone domain usage.\n * Accepts either:\n * 1. An existing ClickHouse client with optional ttl config\n * 2. Config to create a new client internally\n */\nexport type ClickhouseDomainConfig = ClickhouseDomainClientConfig | ClickhouseDomainRestConfig;\n\n/**\n * Pass an existing ClickHouse client\n */\nexport interface ClickhouseDomainClientConfig {\n client: ClickHouseClient;\n ttl?: ClickhouseConfig['ttl'];\n}\n\n/**\n * Pass config to create a new ClickHouse client internally\n */\nexport interface ClickhouseDomainRestConfig {\n url: string;\n username: string;\n password: string;\n ttl?: ClickhouseConfig['ttl'];\n}\n\n/**\n * Resolves ClickhouseDomainConfig to a ClickHouse client and ttl config.\n * Handles creating a new client if config is provided.\n */\nexport function resolveClickhouseConfig(config: ClickhouseDomainConfig): {\n client: ClickHouseClient;\n ttl?: ClickhouseConfig['ttl'];\n} {\n // Existing client\n if ('client' in config) {\n return { client: config.client, ttl: config.ttl };\n }\n\n // Config to create new client\n const client = createClient({\n url: config.url,\n username: config.username,\n password: config.password,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n return { client, ttl: config.ttl };\n}\n\nexport class ClickhouseDB extends MastraBase {\n protected ttl: ClickhouseConfig['ttl'];\n protected client: ClickHouseClient;\n\n /** Cache of actual table columns: tableName -> Promise<Set<columnName>> (stores in-flight promise to coalesce concurrent calls) */\n private tableColumnsCache = new Map<string, Promise<Set<string>>>();\n\n constructor({ client, ttl }: { client: ClickHouseClient; ttl: ClickhouseConfig['ttl'] }) {\n super({\n name: 'CLICKHOUSE_DB',\n });\n this.ttl = ttl;\n this.client = client;\n }\n\n /**\n * Gets the set of column names that actually exist in the database table.\n * Results are cached; the cache is invalidated when alterTable() adds new columns.\n */\n private async getTableColumns(tableName: TABLE_NAMES): Promise<Set<string>> {\n const cached = this.tableColumnsCache.get(tableName);\n if (cached) return cached;\n\n // Store the in-flight promise so concurrent callers (e.g. Promise.all in batchInsert) await the same query\n const promise = (async () => {\n try {\n const result = await this.client.query({\n query: `DESCRIBE TABLE ${tableName}`,\n format: 'JSONEachRow',\n });\n const rows = (await result.json()) as Array<{ name: string }>;\n const columns = new Set(rows.map(r => r.name));\n if (columns.size === 0) {\n this.tableColumnsCache.delete(tableName);\n }\n return columns;\n } catch {\n // Table may not exist yet\n this.tableColumnsCache.delete(tableName);\n return new Set<string>();\n }\n })();\n this.tableColumnsCache.set(tableName, promise);\n\n return promise;\n }\n\n /**\n * Filters a record to only include columns that exist in the actual database table.\n * Unknown columns are silently dropped to ensure forward compatibility.\n */\n private async filterRecordToKnownColumns(\n tableName: TABLE_NAMES,\n record: Record<string, any>,\n ): Promise<Record<string, any>> {\n const knownColumns = await this.getTableColumns(tableName);\n if (knownColumns.size === 0) return record;\n\n const filtered: Record<string, any> = {};\n for (const [key, value] of Object.entries(record)) {\n if (knownColumns.has(key)) {\n filtered[key] = value;\n }\n }\n return filtered;\n }\n\n async hasColumn(table: string, column: string): Promise<boolean> {\n const result = await this.client.query({\n query: `DESCRIBE TABLE ${table}`,\n format: 'JSONEachRow',\n });\n const columns = (await result.json()) as { name: string }[];\n return columns.some(c => c.name === column);\n }\n\n /**\n * Checks if a table exists in the database.\n */\n async tableExists(tableName: string): Promise<boolean> {\n try {\n const result = await this.client.query({\n query: `EXISTS TABLE ${tableName}`,\n format: 'JSONEachRow',\n });\n const rows = (await result.json()) as Array<{ result: number }>;\n return rows[0]?.result === 1;\n } catch {\n return false;\n }\n }\n\n /**\n * Gets the sorting key (ORDER BY columns) for a table.\n * Returns null if the table doesn't exist.\n */\n async getTableSortingKey(tableName: string): Promise<string | null> {\n try {\n const result = await this.client.query({\n query: `SELECT sorting_key FROM system.tables WHERE database = currentDatabase() AND name = {tableName:String}`,\n query_params: { tableName },\n format: 'JSONEachRow',\n });\n const rows = (await result.json()) as Array<{ sorting_key: string }>;\n return rows[0]?.sorting_key ?? null;\n } catch {\n return null;\n }\n }\n\n /**\n * Checks if migration is needed for the spans table.\n * Returns information about the current state.\n */\n async checkSpansMigrationStatus(tableName: string): Promise<{\n needsMigration: boolean;\n currentSortingKey: string | null;\n }> {\n // Check if table exists\n const exists = await this.tableExists(tableName);\n if (!exists) {\n return { needsMigration: false, currentSortingKey: null };\n }\n\n // Check current sorting key\n const currentSortingKey = await this.getTableSortingKey(tableName);\n if (!currentSortingKey) {\n return { needsMigration: false, currentSortingKey: null };\n }\n\n // Check if migration is needed - old key starts with createdAt\n const needsMigration = currentSortingKey.toLowerCase().startsWith('createdat');\n return { needsMigration, currentSortingKey };\n }\n\n /**\n * Checks for duplicate (traceId, spanId) combinations in the spans table.\n * Returns information about duplicates for logging/CLI purposes.\n */\n async checkForDuplicateSpans(tableName: string): Promise<{\n hasDuplicates: boolean;\n duplicateCount: number;\n }> {\n try {\n // Count duplicate (traceId, spanId) combinations\n const result = await this.client.query({\n query: `\n SELECT count() as duplicate_count\n FROM (\n SELECT traceId, spanId\n FROM ${tableName}\n GROUP BY traceId, spanId\n HAVING count() > 1\n )\n `,\n format: 'JSONEachRow',\n });\n const rows = (await result.json()) as Array<{ duplicate_count: string }>;\n const duplicateCount = parseInt(rows[0]?.duplicate_count ?? '0', 10);\n return {\n hasDuplicates: duplicateCount > 0,\n duplicateCount,\n };\n } catch (error) {\n // If table doesn't exist or other error, assume no duplicates\n this.logger?.debug?.(`Could not check for duplicates: ${error}`);\n return { hasDuplicates: false, duplicateCount: 0 };\n }\n }\n\n /**\n * Migrates the spans table from the old sorting key (createdAt, traceId, spanId)\n * to the new sorting key (traceId, spanId) for proper uniqueness enforcement.\n *\n * This migration:\n * 1. Renames the old table to a backup\n * 2. Creates a new table with the correct sorting key\n * 3. Copies all data from the backup to the new table, deduplicating by (traceId, spanId)\n * using priority-based selection:\n * - First, prefer completed spans (those with endedAt set)\n * - Then prefer the most recently updated span (highest updatedAt)\n * - Finally use creation time as tiebreaker (highest createdAt)\n * 4. Drops the backup table\n *\n * The deduplication strategy matches the PostgreSQL migration (PR #12073) to ensure\n * consistent behavior across storage backends.\n *\n * The migration is idempotent - it only runs if the old sorting key is detected.\n *\n * @returns true if migration was performed, false if not needed\n */\n async migrateSpansTableSortingKey({\n tableName,\n schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<boolean> {\n // Only applies to spans table\n if (tableName !== TABLE_SPANS) {\n return false;\n }\n\n // Check if table exists\n const exists = await this.tableExists(tableName);\n if (!exists) {\n return false;\n }\n\n // Check current sorting key\n const currentSortingKey = await this.getTableSortingKey(tableName);\n if (!currentSortingKey) {\n return false;\n }\n\n // Check if migration is needed - old key starts with createdAt\n // Old format: \"createdAt, traceId, spanId\"\n // New format: \"traceId, spanId\"\n const needsMigration = currentSortingKey.toLowerCase().startsWith('createdat');\n if (!needsMigration) {\n this.logger?.debug?.(`Spans table already has correct sorting key: ${currentSortingKey}`);\n return false;\n }\n\n this.logger?.info?.(`Migrating spans table from sorting key \"${currentSortingKey}\" to \"(traceId, spanId)\"`);\n\n const backupTableName = `${tableName}_backup_${Date.now()}`;\n const rowTtl = this.ttl?.[tableName]?.row;\n\n try {\n // Step 1: Rename old table to backup\n await this.client.command({\n query: `RENAME TABLE ${tableName} TO ${backupTableName}`,\n });\n\n // Step 2: Create new table with correct sorting key\n const columns = Object.entries(schema)\n .map(([name, def]) => {\n let sqlType = this.getSqlType(def.type);\n let isNullable = def.nullable === true;\n\n // Special case: updatedAt must be non-nullable for TABLE_SPANS because\n // ReplacingMergeTree(updatedAt) requires a non-nullable version column.\n if (tableName === TABLE_SPANS && name === 'updatedAt') {\n isNullable = false;\n }\n\n if (isNullable) {\n sqlType = `Nullable(${sqlType})`;\n }\n const constraints = [];\n if (name === 'metadata' && (def.type === 'text' || def.type === 'jsonb') && isNullable) {\n constraints.push(\"DEFAULT '{}'\");\n }\n const columnTtl = this.ttl?.[tableName]?.columns?.[name];\n return `\"${name}\" ${sqlType} ${constraints.join(' ')} ${columnTtl ? `TTL toDateTime(${columnTtl.ttlKey ?? 'createdAt'}) + INTERVAL ${columnTtl.interval} ${columnTtl.unit}` : ''}`;\n })\n .join(',\\n');\n\n const createSql = `\n CREATE TABLE ${tableName} (\n ${columns}\n )\n ENGINE = ${TABLE_ENGINES[tableName] ?? 'MergeTree()'}\n PRIMARY KEY (traceId, spanId)\n ORDER BY (traceId, spanId)\n ${rowTtl ? `TTL toDateTime(${rowTtl.ttlKey ?? 'createdAt'}) + INTERVAL ${rowTtl.interval} ${rowTtl.unit}` : ''}\n SETTINGS index_granularity = 8192\n `;\n\n await this.client.command({\n query: createSql,\n });\n\n // Step 3: Copy data from backup to new table, deduplicating by (traceId, spanId)\n // Get the list of columns that exist in both tables\n const describeResult = await this.client.query({\n query: `DESCRIBE TABLE ${backupTableName}`,\n format: 'JSONEachRow',\n });\n const backupColumns = (await describeResult.json()) as Array<{ name: string }>;\n const backupColumnNames = new Set(backupColumns.map(c => c.name));\n\n // Only copy columns that exist in both tables\n const columnsToInsert = Object.keys(schema).filter(col => backupColumnNames.has(col));\n const columnList = columnsToInsert.map(c => `\"${c}\"`).join(', ');\n\n // Build SELECT expressions, using COALESCE for updatedAt to handle NULL values\n // (updatedAt must be non-nullable for ReplacingMergeTree version column)\n const selectExpressions = columnsToInsert\n .map(c => (c === 'updatedAt' ? `COALESCE(\"updatedAt\", \"createdAt\") as \"updatedAt\"` : `\"${c}\"`))\n .join(', ');\n\n // Use LIMIT BY for deduplication with priority-based selection:\n // 1. Prefer completed spans (those with endedAt not null/empty)\n // 2. Then prefer the most recently updated (highest updatedAt)\n // 3. Then use creation time as final tiebreaker (highest createdAt)\n // This matches the PostgreSQL migration behavior from PR #12073\n await this.client.command({\n query: `INSERT INTO ${tableName} (${columnList})\n SELECT ${selectExpressions}\n FROM ${backupTableName}\n ORDER BY traceId, spanId,\n (endedAt IS NOT NULL AND endedAt != '') DESC,\n COALESCE(updatedAt, createdAt) DESC,\n createdAt DESC\n LIMIT 1 BY traceId, spanId`,\n });\n\n // Step 4: Drop backup table\n await this.client.command({\n query: `DROP TABLE ${backupTableName}`,\n });\n\n this.logger?.info?.(`Successfully migrated spans table to new sorting key`);\n return true;\n } catch (error: any) {\n // Attempt to restore from backup if migration failed partway through\n this.logger?.error?.(`Migration failed: ${error.message}`);\n\n try {\n // Check if original table exists\n const originalExists = await this.tableExists(tableName);\n const backupExists = await this.tableExists(backupTableName);\n\n if (!originalExists && backupExists) {\n // Restore from backup\n this.logger?.info?.(`Restoring spans table from backup`);\n await this.client.command({\n query: `RENAME TABLE ${backupTableName} TO ${tableName}`,\n });\n } else if (originalExists && backupExists) {\n // Both exist - drop backup (new table was created successfully)\n await this.client.command({\n query: `DROP TABLE IF EXISTS ${backupTableName}`,\n });\n }\n } catch (restoreError) {\n this.logger?.error?.(`Failed to restore from backup: ${restoreError}`);\n }\n\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'MIGRATE_SPANS_SORTING_KEY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName, currentSortingKey },\n },\n error,\n );\n }\n }\n\n protected getSqlType(type: StorageColumn['type']): string {\n switch (type) {\n case 'text':\n case 'uuid':\n case 'jsonb':\n return 'String';\n case 'timestamp':\n return 'DateTime64(3)';\n case 'integer':\n case 'bigint':\n return 'Int64';\n case 'float':\n return 'Float64';\n case 'boolean':\n return 'Bool';\n default:\n return getSqlType(type); // fallback to base implementation\n }\n }\n\n async createTable({\n tableName,\n schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n try {\n const columns = Object.entries(schema)\n .map(([name, def]) => {\n let sqlType = this.getSqlType(def.type);\n // Only treat as nullable if explicitly set to true (default is NOT nullable)\n let isNullable = def.nullable === true;\n\n // Special case: updatedAt must be non-nullable for TABLE_SPANS because\n // ReplacingMergeTree(updatedAt) requires a non-nullable version column.\n // Application code already sets updatedAt = createdAt on insert.\n if (tableName === TABLE_SPANS && name === 'updatedAt') {\n isNullable = false;\n }\n\n // Wrap nullable columns in Nullable() to properly support NULL values\n if (isNullable) {\n sqlType = `Nullable(${sqlType})`;\n }\n const constraints = [];\n // Add DEFAULT '{}' for all metadata columns to prevent empty string issues\n // Support both 'text' and 'jsonb' types for backwards compatibility\n // Apply to all tables for consistent behavior and defense-in-depth\n if (name === 'metadata' && (def.type === 'text' || def.type === 'jsonb') && isNullable) {\n constraints.push(\"DEFAULT '{}'\");\n }\n const columnTtl = this.ttl?.[tableName]?.columns?.[name];\n return `\"${name}\" ${sqlType} ${constraints.join(' ')} ${columnTtl ? `TTL toDateTime(${columnTtl.ttlKey ?? 'createdAt'}) + INTERVAL ${columnTtl.interval} ${columnTtl.unit}` : ''}`;\n })\n .join(',\\n');\n\n const rowTtl = this.ttl?.[tableName]?.row;\n let sql: string;\n\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n sql = `\n CREATE TABLE IF NOT EXISTS ${tableName} (\n ${['id String'].concat(columns)}\n )\n ENGINE = ${TABLE_ENGINES[tableName] ?? 'MergeTree()'}\n PRIMARY KEY (createdAt, run_id, workflow_name)\n ORDER BY (createdAt, run_id, workflow_name)\n ${rowTtl ? `TTL toDateTime(${rowTtl.ttlKey ?? 'createdAt'}) + INTERVAL ${rowTtl.interval} ${rowTtl.unit}` : ''}\n SETTINGS index_granularity = 8192\n `;\n } else if (tableName === TABLE_SPANS) {\n // Spans table uses (traceId, spanId) as composite unique key.\n // ORDER BY must be (traceId, spanId) for ReplacingMergeTree to properly deduplicate\n // rows with the same traceId+spanId combination. The engine uses updatedAt as the\n // version column to keep the row with the highest updatedAt during deduplication.\n sql = `\n CREATE TABLE IF NOT EXISTS ${tableName} (\n ${columns}\n )\n ENGINE = ${TABLE_ENGINES[tableName] ?? 'MergeTree()'}\n PRIMARY KEY (traceId, spanId)\n ORDER BY (traceId, spanId)\n ${rowTtl ? `TTL toDateTime(${rowTtl.ttlKey ?? 'createdAt'}) + INTERVAL ${rowTtl.interval} ${rowTtl.unit}` : ''}\n SETTINGS index_granularity = 8192\n `;\n } else {\n sql = `\n CREATE TABLE IF NOT EXISTS ${tableName} (\n ${columns}\n )\n ENGINE = ${TABLE_ENGINES[tableName] ?? 'MergeTree()'}\n PRIMARY KEY (createdAt, ${'id'})\n ORDER BY (createdAt, ${'id'})\n ${this.ttl?.[tableName]?.row ? `TTL toDateTime(createdAt) + INTERVAL ${this.ttl[tableName].row.interval} ${this.ttl[tableName].row.unit}` : ''}\n SETTINGS index_granularity = 8192\n `;\n }\n\n await this.client.query({\n query: sql,\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'CREATE_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n } finally {\n this.tableColumnsCache.delete(tableName);\n }\n }\n\n async alterTable({\n tableName,\n schema,\n ifNotExists,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {\n try {\n // 1. Get existing columns\n const describeSql = `DESCRIBE TABLE ${tableName}`;\n const result = await this.client.query({\n query: describeSql,\n });\n const rows = await result.json();\n const existingColumnNames = new Set(rows.data.map((row: any) => row.name.toLowerCase()));\n\n // 2. Add missing columns\n for (const columnName of ifNotExists) {\n if (!existingColumnNames.has(columnName.toLowerCase()) && schema[columnName]) {\n const columnDef = schema[columnName];\n let sqlType = this.getSqlType(columnDef.type);\n if (columnDef.nullable !== false) {\n sqlType = `Nullable(${sqlType})`;\n }\n const defaultValue = columnDef.nullable === false ? getDefaultValue(columnDef.type) : '';\n // Use backticks or double quotes as needed for identifiers\n const alterSql =\n `ALTER TABLE ${tableName} ADD COLUMN IF NOT EXISTS \"${columnName}\" ${sqlType} ${defaultValue}`.trim();\n\n await this.client.query({\n query: alterSql,\n });\n this.logger?.debug?.(`Added column ${columnName} to table ${tableName}`);\n }\n }\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'ALTER_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n } finally {\n // Invalidate cached columns after DDL completes so concurrent writers see the new schema\n this.tableColumnsCache.delete(tableName);\n }\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n // Stop background merges before TRUNCATE. TRUNCATE acquires an exclusive\n // write lock that blocks until in-flight merges complete. Pausing merges\n // first avoids this lock contention.\n await this.client.command({ query: `SYSTEM STOP MERGES ${tableName}` });\n await this.client.command({\n query: `TRUNCATE TABLE ${tableName}`,\n });\n await this.client.command({ query: `SYSTEM START MERGES ${tableName}` });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'CLEAR_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n await this.client.query({\n query: `DROP TABLE IF EXISTS ${tableName}`,\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'DROP_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n } finally {\n this.tableColumnsCache.delete(tableName);\n }\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n try {\n // Filter out unknown columns from user-supplied data first\n const filteredRecord = await this.filterRecordToKnownColumns(tableName, record);\n if (Object.keys(filteredRecord).length === 0) return; // No known columns after filtering - skip insert\n\n // Inject timestamps only if those columns exist in the table (they survived filtering)\n const rawCreatedAt = filteredRecord.createdAt || filteredRecord.created_at || new Date();\n const rawUpdatedAt = filteredRecord.updatedAt || new Date();\n if ('createdAt' in filteredRecord || (await this.getTableColumns(tableName)).has('createdAt')) {\n filteredRecord.createdAt = rawCreatedAt instanceof Date ? rawCreatedAt.toISOString() : rawCreatedAt;\n }\n if ('updatedAt' in filteredRecord || (await this.getTableColumns(tableName)).has('updatedAt')) {\n filteredRecord.updatedAt = rawUpdatedAt instanceof Date ? rawUpdatedAt.toISOString() : rawUpdatedAt;\n }\n\n await this.client.insert({\n table: tableName,\n values: [filteredRecord],\n format: 'JSONEachRow',\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n output_format_json_quote_64bit_integers: 0,\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n },\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'INSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async batchInsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n const processedRecords = records.map(record => ({\n ...Object.fromEntries(\n Object.entries(record).map(([key, value]) => [\n key,\n // Only convert to Date if it's a timestamp column AND value is not null/undefined\n // new Date(null) returns epoch date, not null, so we must check first\n TABLE_SCHEMAS[tableName as TABLE_NAMES]?.[key]?.type === 'timestamp' && value != null\n ? new Date(value).toISOString()\n : value,\n ]),\n ),\n }));\n\n // Filter out columns that don't exist in the actual database table\n const recordsToBeInserted = await Promise.all(\n processedRecords.map(r => this.filterRecordToKnownColumns(tableName, r)),\n );\n // Skip records that have no known columns after filtering\n const nonEmptyRecords = recordsToBeInserted.filter(r => Object.keys(r).length > 0);\n if (nonEmptyRecords.length === 0) return;\n\n try {\n await this.client.insert({\n table: tableName,\n values: nonEmptyRecords,\n format: 'JSONEachRow',\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_INSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n try {\n const engine = TABLE_ENGINES[tableName] ?? 'MergeTree()';\n const keyEntries = Object.entries(keys);\n const conditions = keyEntries\n .map(\n ([key]) =>\n `\"${key}\" = {var_${key}:${this.getSqlType(TABLE_SCHEMAS[tableName as TABLE_NAMES]?.[key]?.type ?? 'text')}}`,\n )\n .join(' AND ');\n const values = keyEntries.reduce((acc, [key, value]) => {\n return { ...acc, [`var_${key}`]: value };\n }, {});\n\n const hasUpdatedAt = TABLE_SCHEMAS[tableName as TABLE_NAMES]?.updatedAt;\n\n const selectClause = `SELECT *, toDateTime64(createdAt, 3) as createdAt${hasUpdatedAt ? ', toDateTime64(updatedAt, 3) as updatedAt' : ''}`;\n\n const result = await this.client.query({\n query: `${selectClause} FROM ${tableName} ${engine.startsWith('ReplacingMergeTree') ? 'FINAL' : ''} WHERE ${conditions} ORDER BY createdAt DESC LIMIT 1`,\n query_params: values,\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n if (!result) {\n return null;\n }\n\n const rows = await result.json();\n // If this is a workflow snapshot, parse the snapshot field\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n const snapshot = rows.data[0] as any;\n if (!snapshot) {\n return null;\n }\n if (typeof snapshot.snapshot === 'string') {\n snapshot.snapshot = JSON.parse(snapshot.snapshot);\n }\n return transformRow(snapshot);\n }\n\n const data: R = transformRow(rows.data[0]);\n return data;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LOAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport type {\n BackgroundTask,\n BackgroundTaskStatus,\n TaskFilter,\n TaskListResult,\n UpdateBackgroundTask,\n} from '@mastra/core/background-tasks';\nimport { BackgroundTasksStorage, TABLE_BACKGROUND_TASKS, TABLE_SCHEMAS } from '@mastra/core/storage';\nimport { ClickhouseDB, resolveClickhouseConfig } from '../../db';\nimport type { ClickhouseDomainConfig } from '../../db';\n\nfunction serializeJson(v: unknown): any {\n if (typeof v === 'object' && v != null) return JSON.stringify(v);\n return v ?? '';\n}\n\nfunction rowToTask(row: Record<string, any>): BackgroundTask {\n const parseJson = (val: unknown): any => {\n if (val == null || val === '') return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n };\n return {\n id: row.id,\n status: row.status as BackgroundTaskStatus,\n toolName: row.tool_name,\n toolCallId: row.tool_call_id,\n args: parseJson(row.args) ?? {},\n agentId: row.agent_id,\n threadId: row.thread_id || undefined,\n resourceId: row.resource_id || undefined,\n runId: row.run_id ?? '',\n result: parseJson(row.result),\n error: parseJson(row.error),\n retryCount: Number(row.retry_count ?? 0),\n maxRetries: Number(row.max_retries ?? 0),\n timeoutMs: Number(row.timeout_ms ?? 300_000),\n createdAt: new Date(row.createdAt),\n startedAt: row.startedAt ? new Date(row.startedAt) : undefined,\n completedAt: row.completedAt ? new Date(row.completedAt) : undefined,\n };\n}\n\nexport class BackgroundTasksStorageClickhouse extends BackgroundTasksStorage {\n protected client: ClickHouseClient;\n #db: ClickhouseDB;\n\n constructor(config: ClickhouseDomainConfig) {\n super();\n const { client, ttl } = resolveClickhouseConfig(config);\n this.client = client;\n this.#db = new ClickhouseDB({ client, ttl });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_BACKGROUND_TASKS, schema: TABLE_SCHEMAS[TABLE_BACKGROUND_TASKS] });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_BACKGROUND_TASKS });\n }\n\n async createTask(task: BackgroundTask): Promise<void> {\n await this.client.insert({\n table: TABLE_BACKGROUND_TASKS,\n values: [\n {\n id: task.id,\n tool_call_id: task.toolCallId,\n tool_name: task.toolName,\n agent_id: task.agentId,\n thread_id: task.threadId ?? '',\n resource_id: task.resourceId ?? '',\n run_id: task.runId,\n status: task.status,\n args: serializeJson(task.args),\n result: serializeJson(task.result),\n error: serializeJson(task.error),\n retry_count: task.retryCount,\n max_retries: task.maxRetries,\n timeout_ms: task.timeoutMs,\n createdAt: task.createdAt.toISOString(),\n startedAt: task.startedAt?.toISOString() ?? '1970-01-01T00:00:00.000Z',\n completedAt: task.completedAt?.toISOString() ?? '1970-01-01T00:00:00.000Z',\n },\n ],\n format: 'JSONEachRow',\n clickhouse_settings: { date_time_input_format: 'best_effort' },\n });\n }\n\n async updateTask(taskId: string, update: UpdateBackgroundTask): Promise<void> {\n const existing = await this.getTask(taskId);\n if (!existing) return;\n const merged = { ...existing };\n if ('status' in update) merged.status = update.status!;\n if ('result' in update) merged.result = update.result;\n if ('error' in update) merged.error = update.error;\n if ('retryCount' in update) merged.retryCount = update.retryCount!;\n if ('startedAt' in update) merged.startedAt = update.startedAt;\n if ('completedAt' in update) merged.completedAt = update.completedAt;\n\n // ClickHouse ReplacingMergeTree — insert replaces by primary key\n await this.createTask(merged);\n }\n\n async getTask(taskId: string): Promise<BackgroundTask | null> {\n const result = await this.client.query({\n query: `SELECT * FROM ${TABLE_BACKGROUND_TASKS} FINAL WHERE id = {var_id:String} LIMIT 1`,\n query_params: { var_id: taskId },\n format: 'JSONEachRow',\n clickhouse_settings: { date_time_input_format: 'best_effort' },\n });\n const rows = await result.json<Record<string, any>[]>();\n return rows.length > 0 ? rowToTask(rows[0]!) : null;\n }\n\n private buildFilterClause(filter: TaskFilter): { where: string; params: Record<string, any> } {\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n\n if (filter.status) {\n const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];\n conditions.push(`status IN ({var_statuses:Array(String)})`);\n params.var_statuses = statuses;\n }\n if (filter.agentId) {\n conditions.push(`agent_id = {var_agent:String}`);\n params.var_agent = filter.agentId;\n }\n if (filter.threadId) {\n conditions.push(`thread_id = {var_thread:String}`);\n params.var_thread = filter.threadId;\n }\n if (filter.runId) {\n conditions.push(`run_id = {var_run:String}`);\n params.var_run = filter.runId;\n }\n if (filter.toolName) {\n conditions.push(`tool_name = {var_tool:String}`);\n params.var_tool = filter.toolName;\n }\n\n // Push date range filtering into SQL so total count and LIMIT/OFFSET\n // agree with the in-memory Date objects `rowToTask` returns.\n const dateCol =\n filter.dateFilterBy === 'startedAt'\n ? 'startedAt'\n : filter.dateFilterBy === 'completedAt'\n ? 'completedAt'\n : 'createdAt';\n if (filter.fromDate) {\n conditions.push(`${dateCol} >= parseDateTimeBestEffort({var_from_date:String})`);\n params.var_from_date = filter.fromDate.toISOString();\n }\n if (filter.toDate) {\n conditions.push(`${dateCol} < parseDateTimeBestEffort({var_to_date:String})`);\n params.var_to_date = filter.toDate.toISOString();\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n return { where, params };\n }\n\n async listTasks(filter: TaskFilter): Promise<TaskListResult> {\n const { where, params } = this.buildFilterClause(filter);\n\n // Count total matching rows (before pagination)\n const countResult = await this.client.query({\n query: `SELECT count() as count FROM ${TABLE_BACKGROUND_TASKS} FINAL ${where}`,\n query_params: params,\n format: 'JSONEachRow',\n clickhouse_settings: { date_time_input_format: 'best_effort' },\n });\n const countRows = (await countResult.json()) as any[];\n const total = Number(countRows[0]?.count ?? 0);\n\n const orderCol =\n filter.orderBy === 'startedAt' ? 'startedAt' : filter.orderBy === 'completedAt' ? 'completedAt' : 'createdAt';\n const direction = filter.orderDirection === 'desc' ? 'DESC' : 'ASC';\n let sql = `SELECT * FROM ${TABLE_BACKGROUND_TASKS} FINAL ${where} ORDER BY ${orderCol} ${direction}`;\n if (filter.perPage != null) {\n sql += ` LIMIT {var_limit:UInt32}`;\n params.var_limit = filter.perPage;\n if (filter.page != null) {\n sql += ` OFFSET {var_offset:UInt32}`;\n params.var_offset = filter.page * filter.perPage;\n }\n }\n\n const result = await this.client.query({\n query: sql,\n query_params: params,\n format: 'JSONEachRow',\n clickhouse_settings: { date_time_input_format: 'best_effort' },\n });\n const tasks = (await result.json<Record<string, any>[]>()).map(rowToTask);\n\n return { tasks, total };\n }\n\n async deleteTask(taskId: string): Promise<void> {\n await this.client.command({\n query: `DELETE FROM ${TABLE_BACKGROUND_TASKS} WHERE id = {var_id:String}`,\n query_params: { var_id: taskId },\n });\n }\n\n async deleteTasks(filter: TaskFilter): Promise<void> {\n const { where, params } = this.buildFilterClause(filter);\n\n // Require at least one filter to avoid an unintentional table-wide delete.\n // Use `dangerouslyClearAll` for that case.\n if (!where) return;\n\n await this.client.command({\n query: `DELETE FROM ${TABLE_BACKGROUND_TASKS} ${where}`,\n query_params: params,\n });\n }\n\n async getRunningCount(): Promise<number> {\n const result = await this.client.query({\n query: `SELECT count() as count FROM ${TABLE_BACKGROUND_TASKS} FINAL WHERE status = 'running'`,\n format: 'JSONEachRow',\n });\n const rows = (await result.json()) as any[];\n return Number(rows[0]?.count ?? 0);\n }\n\n async getRunningCountByAgent(agentId: string): Promise<number> {\n const result = await this.client.query({\n query: `SELECT count() as count FROM ${TABLE_BACKGROUND_TASKS} FINAL WHERE status = 'running' AND agent_id = {var_agent:String}`,\n query_params: { var_agent: agentId },\n format: 'JSONEachRow',\n });\n const rows = (await result.json()) as any[];\n return Number(rows[0]?.count ?? 0);\n }\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { MessageList } from '@mastra/core/agent';\nimport type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { MastraMessageV1, MastraDBMessage, StorageThreadType } from '@mastra/core/memory';\nimport type {\n StorageResourceType,\n StorageListMessagesInput,\n StorageListMessagesOutput,\n StorageListThreadsInput,\n StorageListThreadsOutput,\n} from '@mastra/core/storage';\nimport {\n createStorageErrorId,\n MemoryStorage,\n normalizePerPage,\n calculatePagination,\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_THREADS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport { ClickhouseDB, resolveClickhouseConfig } from '../../db';\nimport type { ClickhouseDomainConfig } from '../../db';\nimport { transformRow, transformRows } from '../../db/utils';\n\n/**\n * Serialize metadata object to JSON string for storage in ClickHouse.\n * Ensures we always store valid JSON, defaulting to '{}' for null/undefined.\n */\nfunction serializeMetadata(metadata: Record<string, unknown> | undefined): string {\n if (!metadata || Object.keys(metadata).length === 0) {\n return '{}';\n }\n return JSON.stringify(metadata);\n}\n\n/**\n * Parse metadata JSON string from ClickHouse back to object.\n * Handles empty strings and malformed JSON gracefully.\n */\nfunction parseMetadata(metadata: unknown): Record<string, unknown> {\n if (!metadata) return {};\n if (typeof metadata === 'object') return metadata as Record<string, unknown>;\n if (typeof metadata !== 'string') return {};\n\n const trimmed = metadata.trim();\n if (trimmed === '' || trimmed === 'null') return {};\n\n try {\n return JSON.parse(trimmed);\n } catch {\n return {};\n }\n}\n\nexport class MemoryStorageClickhouse extends MemoryStorage {\n protected client: ClickHouseClient;\n #db: ClickhouseDB;\n constructor(config: ClickhouseDomainConfig) {\n super();\n const { client, ttl } = resolveClickhouseConfig(config);\n this.client = client;\n this.#db = new ClickhouseDB({ client, ttl });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_THREADS, schema: TABLE_SCHEMAS[TABLE_THREADS] });\n await this.#db.createTable({ tableName: TABLE_MESSAGES, schema: TABLE_SCHEMAS[TABLE_MESSAGES] });\n await this.#db.createTable({ tableName: TABLE_RESOURCES, schema: TABLE_SCHEMAS[TABLE_RESOURCES] });\n // Add resourceId column for backwards compatibility\n await this.#db.alterTable({\n tableName: TABLE_MESSAGES,\n schema: TABLE_SCHEMAS[TABLE_MESSAGES],\n ifNotExists: ['resourceId'],\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_MESSAGES });\n await this.#db.clearTable({ tableName: TABLE_RESOURCES });\n await this.#db.clearTable({ tableName: TABLE_THREADS });\n }\n\n async deleteMessages(messageIds: string[]): Promise<void> {\n if (!messageIds || messageIds.length === 0) return;\n\n try {\n // Get affected thread IDs before deleting\n const result = await this.client.query({\n query: `SELECT DISTINCT thread_id FROM ${TABLE_MESSAGES} WHERE id IN {messageIds:Array(String)}`,\n query_params: { messageIds },\n format: 'JSONEachRow',\n });\n const rows = (await result.json()) as Array<{ thread_id: string }>;\n const threadIds = rows.map(r => r.thread_id);\n\n // Delete messages\n await this.client.command({\n query: `DELETE FROM ${TABLE_MESSAGES} WHERE id IN {messageIds:Array(String)}`,\n query_params: { messageIds },\n });\n\n // Update thread timestamps\n if (threadIds.length > 0) {\n // Remove 'Z' suffix as ClickHouse DateTime64 expects format without timezone suffix\n const now = new Date().toISOString().replace('Z', '');\n await this.client.command({\n query: `ALTER TABLE ${TABLE_THREADS} UPDATE updatedAt = {now:DateTime64(3)} WHERE id IN {threadIds:Array(String)}`,\n query_params: { now, threadIds },\n });\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'DELETE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { count: messageIds.length },\n },\n error,\n );\n }\n }\n\n public async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messageIds.length === 0) return { messages: [] };\n\n try {\n const result = await this.client.query({\n query: `\n SELECT \n id, \n content, \n role, \n type,\n toDateTime64(createdAt, 3) as createdAt,\n thread_id AS \"threadId\",\n \"resourceId\"\n FROM \"${TABLE_MESSAGES}\"\n WHERE id IN {messageIds:Array(String)}\n ORDER BY \"createdAt\" DESC\n `,\n query_params: {\n messageIds,\n },\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = await result.json();\n const messages: any[] = transformRows(rows.data);\n\n // Parse message content\n messages.forEach(message => {\n if (typeof message.content === 'string') {\n try {\n message.content = JSON.parse(message.content);\n } catch {\n // If parsing fails, leave as string\n }\n }\n });\n\n const list = new MessageList().add(messages as MastraMessageV1[] | MastraDBMessage[], 'memory');\n return { messages: list.get.all.db() };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_MESSAGES_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { messageIds: JSON.stringify(messageIds) },\n },\n error,\n );\n }\n }\n\n public async listMessages(args: StorageListMessagesInput): Promise<StorageListMessagesOutput> {\n const { threadId, resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;\n\n // Normalize threadId to array, coerce to strings, trim, and filter out empty/non-string values\n const rawThreadIds = Array.isArray(threadId) ? threadId : [threadId];\n const threadIds = rawThreadIds\n .filter(id => id !== undefined && id !== null)\n .map(id => (typeof id === 'string' ? id : String(id)).trim())\n .filter(id => id.length > 0);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_MESSAGES', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n // Validate that we have at least one valid threadId\n if (threadIds.length === 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_MESSAGES', 'INVALID_THREAD_ID'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: Array.isArray(threadId) ? JSON.stringify(threadId) : String(threadId) },\n },\n new Error('threadId must be a non-empty string or array of non-empty strings'),\n );\n }\n\n const perPageForQuery = normalizePerPage(perPageInput, 40);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPageForQuery);\n\n try {\n // Step 1: Get paginated messages from the thread(s) first (without excluding included ones)\n // Build thread condition for single or multiple threads\n const threadCondition =\n threadIds.length === 1\n ? `thread_id = {threadId0:String}`\n : `thread_id IN (${threadIds.map((_, i) => `{threadId${i}:String}`).join(', ')})`;\n\n let dataQuery = `\n SELECT \n id,\n content,\n role,\n type,\n toDateTime64(createdAt, 3) as createdAt,\n thread_id AS \"threadId\",\n resourceId\n FROM ${TABLE_MESSAGES}\n WHERE ${threadCondition}\n `;\n const dataParams: any = {};\n threadIds.forEach((tid, i) => {\n dataParams[`threadId${i}`] = tid;\n });\n\n if (resourceId) {\n dataQuery += ` AND resourceId = {resourceId:String}`;\n dataParams.resourceId = resourceId;\n }\n\n if (filter?.dateRange?.start) {\n const startDate =\n filter.dateRange.start instanceof Date\n ? filter.dateRange.start.toISOString()\n : new Date(filter.dateRange.start).toISOString();\n const startOp = filter.dateRange.startExclusive ? '>' : '>=';\n dataQuery += ` AND createdAt ${startOp} parseDateTime64BestEffort({fromDate:String}, 3)`;\n dataParams.fromDate = startDate;\n }\n\n if (filter?.dateRange?.end) {\n const endDate =\n filter.dateRange.end instanceof Date\n ? filter.dateRange.end.toISOString()\n : new Date(filter.dateRange.end).toISOString();\n const endOp = filter.dateRange.endExclusive ? '<' : '<=';\n dataQuery += ` AND createdAt ${endOp} parseDateTime64BestEffort({toDate:String}, 3)`;\n dataParams.toDate = endDate;\n }\n\n // Build ORDER BY clause\n const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n dataQuery += ` ORDER BY \"${field}\" ${direction}`;\n\n // When perPage is 0 with no includes, there's nothing to return.\n if (perPageForQuery === 0 && (!include || include.length === 0)) {\n return { messages: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n // When perPage is 0, we only need included messages — skip data and COUNT queries\n if (perPageForQuery === 0 && include && include.length > 0) {\n const includeResult = await this._getIncludedMessages({ include });\n const list = new MessageList().add(includeResult, 'memory');\n return {\n messages: this._sortMessages(list.get.all.db(), field, direction),\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Apply pagination\n if (perPageForResponse === false) {\n // Get all messages\n } else {\n dataQuery += ` LIMIT {limit:Int64} OFFSET {offset:Int64}`;\n dataParams.limit = perPageForQuery;\n dataParams.offset = offset;\n }\n\n const result = await this.client.query({\n query: dataQuery,\n query_params: dataParams,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = await result.json();\n const paginatedMessages = transformRows<MastraDBMessage>(rows.data);\n const paginatedCount = paginatedMessages.length;\n\n // Get total count\n let countQuery = `SELECT count() as total FROM ${TABLE_MESSAGES} WHERE ${threadCondition}`;\n const countParams: any = {};\n threadIds.forEach((tid, i) => {\n countParams[`threadId${i}`] = tid;\n });\n\n if (resourceId) {\n countQuery += ` AND resourceId = {resourceId:String}`;\n countParams.resourceId = resourceId;\n }\n\n if (filter?.dateRange?.start) {\n const startDate =\n filter.dateRange.start instanceof Date\n ? filter.dateRange.start.toISOString()\n : new Date(filter.dateRange.start).toISOString();\n const startOp = filter.dateRange.startExclusive ? '>' : '>=';\n countQuery += ` AND createdAt ${startOp} parseDateTime64BestEffort({fromDate:String}, 3)`;\n countParams.fromDate = startDate;\n }\n\n if (filter?.dateRange?.end) {\n const endDate =\n filter.dateRange.end instanceof Date\n ? filter.dateRange.end.toISOString()\n : new Date(filter.dateRange.end).toISOString();\n const endOp = filter.dateRange.endExclusive ? '<' : '<=';\n countQuery += ` AND createdAt ${endOp} parseDateTime64BestEffort({toDate:String}, 3)`;\n countParams.toDate = endDate;\n }\n\n const countResult = await this.client.query({\n query: countQuery,\n query_params: countParams,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n const countData = await countResult.json();\n const total = (countData as any).data[0].total;\n\n // Only return early if there are no messages AND no includes to process\n if (total === 0 && paginatedCount === 0 && (!include || include.length === 0)) {\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Step 2: Add included messages with context (if any), excluding duplicates\n const messageIds = new Set(paginatedMessages.map((m: MastraDBMessage) => m.id));\n\n if (include && include.length > 0) {\n const includeMessages = await this._getIncludedMessages({ include });\n\n // Deduplicate: only add messages that aren't already in the paginated results\n for (const includeMsg of includeMessages) {\n if (!messageIds.has(includeMsg.id)) {\n paginatedMessages.push(includeMsg);\n messageIds.add(includeMsg.id);\n }\n }\n }\n\n // Use MessageList for proper deduplication and format conversion to V2\n const list = new MessageList().add(paginatedMessages, 'memory');\n const finalMessages = this._sortMessages(list.get.all.db(), field, direction);\n\n // Calculate hasMore based on pagination window\n // If all thread messages have been returned (through pagination or include), hasMore = false\n // Otherwise, check if there are more pages in the pagination window\n const threadIdSet = new Set(threadIds);\n const returnedThreadMessageIds = new Set(\n finalMessages.filter(m => m.threadId && threadIdSet.has(m.threadId)).map(m => m.id),\n );\n const allThreadMessagesReturned = returnedThreadMessageIds.size >= total;\n const hasMore =\n perPageForResponse === false ? false : allThreadMessagesReturned ? false : offset + paginatedCount < total;\n\n return {\n messages: finalMessages,\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n } catch (error: any) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId: Array.isArray(threadId) ? threadId.join(',') : threadId,\n resourceId: resourceId ?? '',\n },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException?.(mastraError);\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n }\n\n private _sortMessages(messages: MastraDBMessage[], field: string, direction: string): MastraDBMessage[] {\n return messages.sort((a, b) => {\n const isDateField = field === 'createdAt' || field === 'updatedAt';\n const aValue = isDateField ? new Date((a as any)[field]).getTime() : (a as any)[field];\n const bValue = isDateField ? new Date((b as any)[field]).getTime() : (b as any)[field];\n\n if (aValue === bValue) {\n return a.id.localeCompare(b.id);\n }\n\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n }\n return direction === 'ASC'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(aValue));\n });\n }\n\n private async _getIncludedMessages({\n include,\n }: {\n include: StorageListMessagesInput['include'];\n }): Promise<MastraDBMessage[]> {\n if (!include || include.length === 0) return [];\n\n // Phase 1: Batch-fetch metadata (id, thread_id, createdAt) for all target messages.\n const targetIds = include.map(inc => inc.id).filter(Boolean);\n if (targetIds.length === 0) return [];\n\n const { messages: targetDocs } = await this.listMessagesById({ messageIds: targetIds });\n const targetMap = new Map(\n targetDocs.map((msg: any) => [msg.id, { threadId: msg.threadId, createdAt: msg.createdAt }]),\n );\n\n // Phase 2: Build cursor-based subqueries using materialized constants from Phase 1.\n // Uses createdAt range + LIMIT instead of ROW_NUMBER() windowing to avoid full thread scans.\n const unionQueries: string[] = [];\n const params: Record<string, any> = {};\n let paramIdx = 1;\n\n for (const inc of include) {\n const { id, withPreviousMessages = 0, withNextMessages = 0 } = inc;\n const target = targetMap.get(id);\n if (!target) continue;\n\n // Fetch the target message itself plus previous messages.\n const threadParam = `var_thread_${paramIdx}`;\n const createdAtParam = `var_createdAt_${paramIdx}`;\n const limitParam = `var_limit_${paramIdx}`;\n unionQueries.push(`\n SELECT id, content, role, type, \"createdAt\", thread_id AS \"threadId\", \"resourceId\"\n FROM \"${TABLE_MESSAGES}\"\n WHERE thread_id = {${threadParam}:String}\n AND createdAt <= parseDateTime64BestEffort({${createdAtParam}:String}, 3)\n ORDER BY createdAt DESC, id DESC\n LIMIT {${limitParam}:Int64}\n `);\n params[threadParam] = target.threadId;\n params[createdAtParam] = target.createdAt;\n params[limitParam] = withPreviousMessages + 1;\n paramIdx++;\n\n // Fetch messages after the target (only if requested)\n if (withNextMessages > 0) {\n const threadParam2 = `var_thread_${paramIdx}`;\n const createdAtParam2 = `var_createdAt_${paramIdx}`;\n const limitParam2 = `var_limit_${paramIdx}`;\n unionQueries.push(`\n SELECT id, content, role, type, \"createdAt\", thread_id AS \"threadId\", \"resourceId\"\n FROM \"${TABLE_MESSAGES}\"\n WHERE thread_id = {${threadParam2}:String}\n AND createdAt > parseDateTime64BestEffort({${createdAtParam2}:String}, 3)\n ORDER BY createdAt ASC, id ASC\n LIMIT {${limitParam2}:Int64}\n `);\n params[threadParam2] = target.threadId;\n params[createdAtParam2] = target.createdAt;\n params[limitParam2] = withNextMessages;\n paramIdx++;\n }\n }\n\n if (unionQueries.length === 0) return [];\n\n // ClickHouse applies ORDER BY/LIMIT to individual UNION ALL members,\n // so wrap in a subquery to sort the combined result.\n let finalQuery: string;\n if (unionQueries.length === 1) {\n finalQuery = unionQueries[0]!;\n } else {\n finalQuery = `SELECT * FROM (${unionQueries.join(' UNION ALL ')}) ORDER BY \"createdAt\" ASC, id ASC`;\n }\n\n const includeResult = await this.client.query({\n query: finalQuery,\n query_params: params,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const includeRows = await includeResult.json();\n\n // Deduplicate results (messages may appear in multiple context windows)\n const seen = new Set<string>();\n return transformRows<MastraDBMessage>(includeRows.data).filter(row => {\n if (seen.has(row.id)) return false;\n seen.add(row.id);\n return true;\n });\n }\n\n async saveMessages(args: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n const { messages } = args;\n if (messages.length === 0) return { messages };\n\n for (const message of messages) {\n const resourceId = message.resourceId;\n if (!resourceId) {\n throw new Error('Resource ID is required');\n }\n\n if (!message.threadId) {\n throw new Error('Thread ID is required');\n }\n\n // Check if thread exists\n const thread = await this.getThreadById({ threadId: message.threadId });\n if (!thread) {\n throw new Error(`Thread ${message.threadId} not found`);\n }\n }\n\n const threadIdSet = new Map();\n\n await Promise.all(\n messages.map(async m => {\n const resourceId = m.resourceId;\n if (!resourceId) {\n throw new Error('Resource ID is required');\n }\n\n if (!m.threadId) {\n throw new Error('Thread ID is required');\n }\n\n // Check if thread exists\n const thread = await this.getThreadById({ threadId: m.threadId });\n if (!thread) {\n throw new Error(`Thread ${m.threadId} not found`);\n }\n\n threadIdSet.set(m.threadId, thread);\n }),\n );\n\n try {\n // Clickhouse's MergeTree engine does not support native upserts or unique constraints on (id, thread_id).\n // Note: We cannot switch to ReplacingMergeTree without a schema migration,\n // as it would require altering the table engine.\n // To ensure correct upsert behavior, we first fetch existing (id, thread_id) pairs for the incoming messages.\n const existingResult = await this.client.query({\n query: `SELECT id, thread_id FROM ${TABLE_MESSAGES} WHERE id IN ({ids:Array(String)})`,\n query_params: {\n ids: messages.map(m => m.id),\n },\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n format: 'JSONEachRow',\n });\n const existingRows: Array<{ id: string; thread_id: string }> = await existingResult.json();\n\n const existingSet = new Set(existingRows.map(row => `${row.id}::${row.thread_id}`));\n\n // Partition the batch into different operations:\n // 1. New messages (insert)\n // 2. Existing messages with same (id, threadId) (update)\n // 3. Messages with same id but different threadId (delete old + insert new)\n const toInsert = messages.filter(m => !existingSet.has(`${m.id}::${m.threadId}`));\n const toUpdate = messages.filter(m => existingSet.has(`${m.id}::${m.threadId}`));\n\n // Find messages that need to be moved (same id, different threadId)\n const toMove = messages.filter(m => {\n const existingRow = existingRows.find(row => row.id === m.id);\n return existingRow && existingRow.thread_id !== m.threadId;\n });\n\n // Delete old messages that are being moved\n const deletePromises = toMove.map(message => {\n const existingRow = existingRows.find(row => row.id === message.id);\n if (!existingRow) return Promise.resolve();\n\n return this.client.command({\n query: `DELETE FROM ${TABLE_MESSAGES} WHERE id = {var_id:String} AND thread_id = {var_old_thread_id:String}`,\n query_params: {\n var_id: message.id,\n var_old_thread_id: existingRow.thread_id,\n },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n });\n\n const updatePromises = toUpdate.map(message =>\n this.client.command({\n query: `\n ALTER TABLE ${TABLE_MESSAGES}\n UPDATE content = {var_content:String}, role = {var_role:String}, type = {var_type:String}, resourceId = {var_resourceId:String}\n WHERE id = {var_id:String} AND thread_id = {var_thread_id:String}\n `,\n query_params: {\n var_content: typeof message.content === 'string' ? message.content : JSON.stringify(message.content),\n var_role: message.role,\n var_type: message.type || 'v2',\n var_resourceId: message.resourceId,\n var_id: message.id,\n var_thread_id: message.threadId,\n },\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n }),\n );\n\n // Execute message operations and thread update in parallel for better performance\n await Promise.all([\n // Insert new messages (including moved messages)\n this.client.insert({\n table: TABLE_MESSAGES,\n format: 'JSONEachRow',\n values: toInsert.map(message => ({\n id: message.id,\n thread_id: message.threadId,\n resourceId: message.resourceId,\n content: typeof message.content === 'string' ? message.content : JSON.stringify(message.content),\n createdAt: message.createdAt.toISOString(),\n role: message.role,\n type: message.type || 'v2',\n })),\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n }),\n ...updatePromises,\n ...deletePromises,\n // Update thread's updatedAt timestamp\n this.client.insert({\n table: TABLE_THREADS,\n format: 'JSONEachRow',\n values: Array.from(threadIdSet.values()).map(thread => ({\n id: thread.id,\n resourceId: thread.resourceId,\n title: thread.title,\n metadata: serializeMetadata(thread.metadata),\n createdAt: thread.createdAt,\n updatedAt: new Date().toISOString(),\n })),\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n }),\n ]);\n\n const list = new MessageList().add(messages as MastraMessageV1[] | MastraDBMessage[], 'memory');\n\n return { messages: list.get.all.db() };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'SAVE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n try {\n const result = await this.client.query({\n query: `SELECT \n id,\n \"resourceId\",\n title,\n metadata,\n toDateTime64(createdAt, 3) as createdAt,\n toDateTime64(updatedAt, 3) as updatedAt\n FROM \"${TABLE_THREADS}\"\n WHERE id = {var_id:String}\n ORDER BY updatedAt DESC\n LIMIT 1`,\n query_params: { var_id: threadId },\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = await result.json();\n const thread = transformRow(rows.data[0]) as StorageThreadType;\n\n if (!thread) {\n return null;\n }\n\n return {\n ...thread,\n metadata: parseMetadata(thread.metadata),\n createdAt: thread.createdAt,\n updatedAt: thread.updatedAt,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_THREAD_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n error,\n );\n }\n }\n\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n try {\n // ClickHouse's ReplacingMergeTree may create duplicate rows until background merges run\n // We handle this by always querying for the newest row (ORDER BY updatedAt DESC LIMIT 1)\n await this.client.insert({\n table: TABLE_THREADS,\n values: [\n {\n ...thread,\n metadata: serializeMetadata(thread.metadata),\n createdAt: thread.createdAt.toISOString(),\n updatedAt: thread.updatedAt.toISOString(),\n },\n ],\n format: 'JSONEachRow',\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n return thread;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'SAVE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: thread.id },\n },\n error,\n );\n }\n }\n\n async updateThread({\n id,\n title,\n metadata,\n }: {\n id: string;\n title: string;\n metadata: Record<string, unknown>;\n }): Promise<StorageThreadType> {\n try {\n // First get the existing thread to merge metadata\n const existingThread = await this.getThreadById({ threadId: id });\n if (!existingThread) {\n throw new Error(`Thread ${id} not found`);\n }\n\n // Merge the existing metadata with the new metadata\n const mergedMetadata = {\n ...existingThread.metadata,\n ...metadata,\n };\n\n const updatedThread = {\n ...existingThread,\n title,\n metadata: mergedMetadata,\n updatedAt: new Date(),\n };\n\n await this.client.insert({\n table: TABLE_THREADS,\n format: 'JSONEachRow',\n values: [\n {\n id: updatedThread.id,\n resourceId: updatedThread.resourceId,\n title: updatedThread.title,\n metadata: serializeMetadata(updatedThread.metadata),\n createdAt: updatedThread.createdAt,\n updatedAt: updatedThread.updatedAt.toISOString(),\n },\n ],\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n return updatedThread;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'UPDATE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: id, title },\n },\n error,\n );\n }\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n try {\n // First delete all messages associated with this thread\n await this.client.command({\n query: `DELETE FROM \"${TABLE_MESSAGES}\" WHERE thread_id = {var_thread_id:String};`,\n query_params: { var_thread_id: threadId },\n clickhouse_settings: {\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n // Then delete the thread\n await this.client.command({\n query: `DELETE FROM \"${TABLE_THREADS}\" WHERE id = {var_id:String};`,\n query_params: { var_id: threadId },\n clickhouse_settings: {\n output_format_json_quote_64bit_integers: 0,\n },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'DELETE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n error,\n );\n }\n }\n\n public async listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput> {\n const { page = 0, perPage: perPageInput, orderBy, filter } = args;\n\n try {\n // Validate pagination input before normalization\n // This ensures page === 0 when perPageInput === false\n this.validatePaginationInput(page, perPageInput ?? 100);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_THREADS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page, ...(perPageInput !== undefined && { perPage: perPageInput }) },\n },\n error instanceof Error ? error : new Error('Invalid pagination parameters'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n\n // Validate metadata keys to prevent SQL injection\n try {\n this.validateMetadataKeys(filter?.metadata);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_THREADS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { metadataKeys: filter?.metadata ? Object.keys(filter.metadata).join(', ') : '' },\n },\n error instanceof Error ? error : new Error('Invalid metadata key'),\n );\n }\n\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const { field, direction } = this.parseOrderBy(orderBy);\n\n try {\n // Build WHERE clauses\n const whereClauses: string[] = [];\n const queryParams: Record<string, any> = {};\n\n if (filter?.resourceId) {\n whereClauses.push('resourceId = {resourceId:String}');\n queryParams.resourceId = filter.resourceId;\n }\n\n // Keys are validated above to prevent SQL injection\n if (filter?.metadata && Object.keys(filter.metadata).length > 0) {\n let metadataIndex = 0;\n for (const [key, value] of Object.entries(filter.metadata)) {\n const paramName = `metadata${metadataIndex}`;\n // Use JSONExtractRaw to compare exact JSON representation\n whereClauses.push(`JSONExtractRaw(metadata, '${key}') = {${paramName}:String}`);\n queryParams[paramName] = JSON.stringify(value);\n metadataIndex++;\n }\n }\n\n // Get total count - count AFTER ranking to ensure we count latest versions only\n const countResult = await this.client.query({\n query: `\n WITH ranked_threads AS (\n SELECT\n id,\n resourceId,\n metadata,\n ROW_NUMBER() OVER (PARTITION BY id ORDER BY updatedAt DESC) as row_num\n FROM ${TABLE_THREADS}\n )\n SELECT count(*) as total \n FROM ranked_threads \n WHERE row_num = 1 ${whereClauses.length > 0 ? `AND ${whereClauses.join(' AND ')}` : ''}\n `,\n query_params: queryParams,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n const countData = await countResult.json();\n const total = (countData as any).data[0].total;\n\n if (total === 0) {\n return {\n threads: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Get paginated threads - get newest version of each thread\n // Important: Apply WHERE filters AFTER row ranking to ensure we filter on latest versions\n const dataResult = await this.client.query({\n query: `\n WITH ranked_threads AS (\n SELECT\n id,\n resourceId,\n title,\n metadata,\n toDateTime64(createdAt, 3) as createdAt,\n toDateTime64(updatedAt, 3) as updatedAt,\n ROW_NUMBER() OVER (PARTITION BY id ORDER BY updatedAt DESC) as row_num\n FROM ${TABLE_THREADS}\n )\n SELECT\n id,\n resourceId,\n title,\n metadata,\n createdAt,\n updatedAt\n FROM ranked_threads\n WHERE row_num = 1 ${whereClauses.length > 0 ? `AND ${whereClauses.join(' AND ')}` : ''}\n ORDER BY \"${field}\" ${direction === 'DESC' ? 'DESC' : 'ASC'}\n LIMIT {perPage:Int64} OFFSET {offset:Int64}\n `,\n query_params: {\n ...queryParams,\n perPage: perPage,\n offset: offset,\n },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = await dataResult.json();\n const threads = transformRows<StorageThreadType>(rows.data).map(thread => ({\n ...thread,\n metadata: parseMetadata(thread.metadata),\n }));\n\n return {\n threads,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: offset + perPage < total,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_THREADS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n ...(filter?.resourceId && { resourceId: filter.resourceId }),\n hasMetadataFilter: !!filter?.metadata,\n page,\n },\n },\n error,\n );\n }\n }\n\n async updateMessages(args: {\n messages: (Partial<Omit<MastraDBMessage, 'createdAt'>> & {\n id: string;\n threadId?: string;\n content?: { metadata?: MastraMessageContentV2['metadata']; content?: MastraMessageContentV2['content'] };\n })[];\n }): Promise<MastraDBMessage[]> {\n const { messages } = args;\n\n if (messages.length === 0) {\n return [];\n }\n\n try {\n const messageIds = messages.map(m => m.id);\n\n // Get existing messages\n const existingResult = await this.client.query({\n query: `SELECT id, content, role, type, \"createdAt\", thread_id AS \"threadId\", \"resourceId\" FROM ${TABLE_MESSAGES} WHERE id IN (${messageIds.map((_, i) => `{id_${i}:String}`).join(',')})`,\n query_params: messageIds.reduce((acc, m, i) => ({ ...acc, [`id_${i}`]: m }), {}),\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const existingRows = await existingResult.json();\n const existingMessages = transformRows<MastraDBMessage>(existingRows.data);\n\n if (existingMessages.length === 0) {\n return [];\n }\n\n // Parse content from string to object for merging\n const parsedExistingMessages = existingMessages.map(msg => {\n if (typeof msg.content === 'string') {\n try {\n msg.content = JSON.parse(msg.content);\n } catch {\n // ignore if not valid json\n }\n }\n return msg;\n });\n\n const threadIdsToUpdate = new Set<string>();\n const updatePromises: Promise<any>[] = [];\n\n for (const existingMessage of parsedExistingMessages) {\n const updatePayload = messages.find(m => m.id === existingMessage.id);\n if (!updatePayload) continue;\n\n const { id, ...fieldsToUpdate } = updatePayload;\n if (Object.keys(fieldsToUpdate).length === 0) continue;\n\n threadIdsToUpdate.add(existingMessage.threadId!);\n if (updatePayload.threadId && updatePayload.threadId !== existingMessage.threadId) {\n threadIdsToUpdate.add(updatePayload.threadId);\n }\n\n const setClauses: string[] = [];\n const values: any = {};\n let paramIdx = 1;\n let newContent: any = null;\n\n const updatableFields = { ...fieldsToUpdate };\n\n // Special handling for content: merge in code, then update the whole field\n if (updatableFields.content) {\n const existingContent = existingMessage.content || {};\n const existingMetadata = existingContent.metadata || {};\n const updateMetadata = updatableFields.content.metadata || {};\n\n newContent = {\n ...existingContent,\n ...updatableFields.content,\n // Deep merge metadata\n metadata: {\n ...existingMetadata,\n ...updateMetadata,\n },\n };\n\n // Ensure we're updating the content field\n setClauses.push(`content = {var_content_${paramIdx}:String}`);\n values[`var_content_${paramIdx}`] = JSON.stringify(newContent);\n paramIdx++;\n delete updatableFields.content;\n }\n\n // Handle other fields\n for (const key in updatableFields) {\n if (Object.prototype.hasOwnProperty.call(updatableFields, key)) {\n const dbColumn = key === 'threadId' ? 'thread_id' : key;\n setClauses.push(`\"${dbColumn}\" = {var_${key}_${paramIdx}:String}`);\n values[`var_${key}_${paramIdx}`] = updatableFields[key as keyof typeof updatableFields];\n paramIdx++;\n }\n }\n\n if (setClauses.length > 0) {\n values[`var_id_${paramIdx}`] = id;\n\n // Use ALTER TABLE UPDATE for ClickHouse\n const updateQuery = `\n ALTER TABLE ${TABLE_MESSAGES}\n UPDATE ${setClauses.join(', ')}\n WHERE id = {var_id_${paramIdx}:String}\n `;\n\n console.info('Updating message:', id, 'with query:', updateQuery, 'values:', values);\n\n updatePromises.push(\n this.client.command({\n query: updateQuery,\n query_params: values,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n }),\n );\n }\n }\n\n // Execute all updates\n if (updatePromises.length > 0) {\n await Promise.all(updatePromises);\n }\n\n // Optimize table to apply changes immediately\n await this.client.command({\n query: `OPTIMIZE TABLE ${TABLE_MESSAGES} FINAL`,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n // Verify updates were applied and retry if needed\n for (const existingMessage of parsedExistingMessages) {\n const updatePayload = messages.find(m => m.id === existingMessage.id);\n if (!updatePayload) continue;\n\n const { id, ...fieldsToUpdate } = updatePayload;\n if (Object.keys(fieldsToUpdate).length === 0) continue;\n\n // Check if the update was actually applied\n const verifyResult = await this.client.query({\n query: `SELECT id, content, role, type, \"createdAt\", thread_id AS \"threadId\", \"resourceId\" FROM ${TABLE_MESSAGES} WHERE id = {messageId:String}`,\n query_params: { messageId: id },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const verifyRows = await verifyResult.json();\n if (verifyRows.data.length > 0) {\n const updatedMessage = transformRows<MastraDBMessage>(verifyRows.data)[0];\n\n if (updatedMessage) {\n // Check if the update was applied correctly\n let needsRetry = false;\n for (const [key, value] of Object.entries(fieldsToUpdate)) {\n if (key === 'content') {\n // For content updates, check if the content was updated\n const expectedContent = typeof value === 'string' ? value : JSON.stringify(value);\n const actualContent =\n typeof updatedMessage.content === 'string'\n ? updatedMessage.content\n : JSON.stringify(updatedMessage.content);\n if (actualContent !== expectedContent) {\n needsRetry = true;\n break;\n }\n } else if (updatedMessage[key as keyof MastraDBMessage] !== value) {\n needsRetry = true;\n break;\n }\n }\n\n if (needsRetry) {\n console.info('Update not applied correctly, retrying with DELETE + INSERT for message:', id);\n // Use DELETE + INSERT as fallback\n await this.client.command({\n query: `DELETE FROM ${TABLE_MESSAGES} WHERE id = {messageId:String}`,\n query_params: { messageId: id },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n // Reconstruct the updated content if needed\n let updatedContent = existingMessage.content || {};\n if (fieldsToUpdate.content) {\n const existingContent = existingMessage.content || {};\n const existingMetadata = existingContent.metadata || {};\n const updateMetadata = fieldsToUpdate.content.metadata || {};\n\n updatedContent = {\n ...existingContent,\n ...fieldsToUpdate.content,\n metadata: {\n ...existingMetadata,\n ...updateMetadata,\n },\n };\n }\n\n const updatedMessageData = {\n ...existingMessage,\n ...fieldsToUpdate,\n content: updatedContent,\n };\n\n await this.client.insert({\n table: TABLE_MESSAGES,\n format: 'JSONEachRow',\n values: [\n {\n id: updatedMessageData.id,\n thread_id: updatedMessageData.threadId,\n resourceId: updatedMessageData.resourceId,\n content:\n typeof updatedMessageData.content === 'string'\n ? updatedMessageData.content\n : JSON.stringify(updatedMessageData.content),\n createdAt: updatedMessageData.createdAt.toISOString(),\n role: updatedMessageData.role,\n type: updatedMessageData.type || 'v2',\n },\n ],\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n }\n }\n }\n }\n\n // Update thread timestamps with a small delay to ensure timestamp difference\n if (threadIdsToUpdate.size > 0) {\n // Add a small delay to ensure timestamp difference\n await new Promise(resolve => setTimeout(resolve, 10));\n\n const now = new Date().toISOString().replace('Z', '');\n\n // Get existing threads to preserve their data\n const threadUpdatePromises = Array.from(threadIdsToUpdate).map(async threadId => {\n // Get existing thread data - get newest version by updatedAt\n const threadResult = await this.client.query({\n query: `SELECT id, resourceId, title, metadata, createdAt FROM ${TABLE_THREADS} WHERE id = {threadId:String} ORDER BY updatedAt DESC LIMIT 1`,\n query_params: { threadId },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const threadRows = await threadResult.json();\n if (threadRows.data.length > 0) {\n const existingThread = threadRows.data[0] as any;\n\n // Delete existing thread\n await this.client.command({\n query: `DELETE FROM ${TABLE_THREADS} WHERE id = {threadId:String}`,\n query_params: { threadId },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n // Insert updated thread with new timestamp\n await this.client.insert({\n table: TABLE_THREADS,\n format: 'JSONEachRow',\n values: [\n {\n id: existingThread.id,\n resourceId: existingThread.resourceId,\n title: existingThread.title,\n metadata:\n typeof existingThread.metadata === 'string'\n ? existingThread.metadata\n : serializeMetadata(existingThread.metadata as Record<string, unknown>),\n createdAt: existingThread.createdAt,\n updatedAt: now,\n },\n ],\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n }\n });\n\n await Promise.all(threadUpdatePromises);\n }\n\n // Re-fetch to return the fully updated messages\n const updatedMessages: MastraDBMessage[] = [];\n for (const messageId of messageIds) {\n const updatedResult = await this.client.query({\n query: `SELECT id, content, role, type, \"createdAt\", thread_id AS \"threadId\", \"resourceId\" FROM ${TABLE_MESSAGES} WHERE id = {messageId:String}`,\n query_params: { messageId },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n const updatedRows = await updatedResult.json();\n if (updatedRows.data.length > 0) {\n const message = transformRows<MastraDBMessage>(updatedRows.data)[0];\n if (message) {\n updatedMessages.push(message);\n }\n }\n }\n\n // Parse content back to objects\n return updatedMessages.map(message => {\n if (typeof message.content === 'string') {\n try {\n message.content = JSON.parse(message.content);\n } catch {\n // ignore if not valid json\n }\n }\n return message;\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'UPDATE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { messageIds: messages.map(m => m.id).join(',') },\n },\n error,\n );\n }\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n try {\n const result = await this.client.query({\n query: `SELECT id, workingMemory, metadata, createdAt, updatedAt FROM ${TABLE_RESOURCES} WHERE id = {resourceId:String} ORDER BY updatedAt DESC LIMIT 1`,\n query_params: { resourceId },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = await result.json();\n if (rows.data.length === 0) {\n return null;\n }\n\n const resource = rows.data[0] as any;\n return {\n id: resource.id,\n workingMemory:\n resource.workingMemory && typeof resource.workingMemory === 'object'\n ? JSON.stringify(resource.workingMemory)\n : resource.workingMemory,\n metadata: parseMetadata(resource.metadata),\n createdAt: new Date(resource.createdAt),\n updatedAt: new Date(resource.updatedAt),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_RESOURCE_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId },\n },\n error,\n );\n }\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n try {\n await this.client.insert({\n table: TABLE_RESOURCES,\n format: 'JSONEachRow',\n values: [\n {\n id: resource.id,\n workingMemory: resource.workingMemory,\n metadata: serializeMetadata(resource.metadata),\n createdAt: resource.createdAt.toISOString(),\n updatedAt: resource.updatedAt.toISOString(),\n },\n ],\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n // Return resource with normalized metadata\n return {\n ...resource,\n metadata: resource.metadata || {},\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'SAVE_RESOURCE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId: resource.id },\n },\n error,\n );\n }\n }\n\n async updateResource({\n resourceId,\n workingMemory,\n metadata,\n }: {\n resourceId: string;\n workingMemory?: string;\n metadata?: Record<string, unknown>;\n }): Promise<StorageResourceType> {\n try {\n const existingResource = await this.getResourceById({ resourceId });\n\n if (!existingResource) {\n // Create new resource if it doesn't exist\n const newResource: StorageResourceType = {\n id: resourceId,\n workingMemory,\n metadata: metadata || {},\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n return this.saveResource({ resource: newResource });\n }\n\n const updatedResource = {\n ...existingResource,\n workingMemory: workingMemory !== undefined ? workingMemory : existingResource.workingMemory,\n metadata: {\n ...existingResource.metadata,\n ...metadata,\n },\n updatedAt: new Date(),\n };\n\n // Use ALTER TABLE UPDATE for ClickHouse\n const updateQuery = `\n ALTER TABLE ${TABLE_RESOURCES}\n UPDATE workingMemory = {workingMemory:String}, metadata = {metadata:String}, updatedAt = {updatedAt:String}\n WHERE id = {resourceId:String}\n `;\n\n await this.client.command({\n query: updateQuery,\n query_params: {\n workingMemory: updatedResource.workingMemory,\n metadata: JSON.stringify(updatedResource.metadata),\n updatedAt: updatedResource.updatedAt.toISOString().replace('Z', ''),\n resourceId,\n },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n // Optimize table to apply changes\n await this.client.command({\n query: `OPTIMIZE TABLE ${TABLE_RESOURCES} FINAL`,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n return updatedResource;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'UPDATE_RESOURCE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId },\n },\n error,\n );\n }\n }\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n listTracesArgsSchema,\n ObservabilityStorage,\n SPAN_SCHEMA,\n TABLE_SPANS,\n toTraceSpans,\n TraceStatus,\n} from '@mastra/core/storage';\nimport type {\n SpanRecord,\n ListTracesArgs,\n ListTracesResponse,\n TracingStorageStrategy,\n UpdateSpanArgs,\n BatchDeleteTracesArgs,\n BatchUpdateSpansArgs,\n BatchCreateSpansArgs,\n CreateSpanArgs,\n GetSpanArgs,\n GetSpanResponse,\n GetRootSpanArgs,\n GetRootSpanResponse,\n GetTraceArgs,\n GetTraceResponse,\n GetTraceLightResponse,\n} from '@mastra/core/storage';\nimport { ClickhouseDB, resolveClickhouseConfig } from '../../db';\nimport type { ClickhouseDomainConfig } from '../../db';\nimport { TABLE_ENGINES, transformRows } from '../../db/utils';\n\nexport class ObservabilityStorageClickhouse extends ObservabilityStorage {\n protected client: ClickHouseClient;\n #db: ClickhouseDB;\n\n constructor(config: ClickhouseDomainConfig) {\n super();\n const { client, ttl } = resolveClickhouseConfig(config);\n this.client = client;\n this.#db = new ClickhouseDB({ client, ttl });\n }\n\n async init(): Promise<void> {\n // Check if migration is needed (table exists with old sorting key)\n const migrationStatus = await this.#db.checkSpansMigrationStatus(TABLE_SPANS);\n\n if (migrationStatus.needsMigration) {\n // ClickHouse requires table recreation to change sorting key - always require manual migration\n // Unlike other databases where we can just add a unique constraint, ClickHouse's\n // ReplacingMergeTree engine requires the sorting key to be set at table creation time.\n // This means we need to: 1) Create a new table with correct sorting key, 2) Copy data,\n // 3) Drop old table, 4) Rename new table. This is a destructive operation that should\n // only be done explicitly by the user.\n\n // Check for duplicates to provide more helpful error message\n const duplicateInfo = await this.#db.checkForDuplicateSpans(TABLE_SPANS);\n const duplicateMessage = duplicateInfo.hasDuplicates\n ? `\\nFound ${duplicateInfo.duplicateCount} duplicate (traceId, spanId) combinations that will be removed.\\n`\n : '';\n\n const errorMessage =\n `\\n` +\n `===========================================================================\\n` +\n `MIGRATION REQUIRED: ClickHouse spans table needs sorting key update\\n` +\n `===========================================================================\\n` +\n `\\n` +\n `The spans table structure has changed. ClickHouse requires a table recreation\\n` +\n `to update the sorting key from (traceId) to (traceId, spanId).\\n` +\n duplicateMessage +\n `\\n` +\n `To fix this, run the manual migration command:\\n` +\n `\\n` +\n ` npx mastra migrate\\n` +\n `\\n` +\n `This command will:\\n` +\n ` 1. Create a new table with the correct sorting key\\n` +\n ` 2. Copy data from the old table (deduplicating if needed)\\n` +\n ` 3. Replace the old table with the new one\\n` +\n `\\n` +\n `WARNING: This migration involves table recreation and may take significant\\n` +\n `time for large tables. Please ensure you have a backup before proceeding.\\n` +\n `===========================================================================\\n`;\n\n throw new MastraError({\n id: createStorageErrorId('CLICKHOUSE', 'MIGRATION_REQUIRED', 'SORTING_KEY_CHANGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: errorMessage,\n });\n }\n\n // Create the table (or add missing columns if it already exists)\n await this.#db.createTable({ tableName: TABLE_SPANS, schema: SPAN_SCHEMA });\n // Add requestContext column for backwards compatibility with existing databases\n await this.#db.alterTable({\n tableName: TABLE_SPANS,\n schema: SPAN_SCHEMA,\n ifNotExists: ['requestContext'],\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_SPANS });\n }\n\n /**\n * Manually run the spans migration to deduplicate and update the sorting key.\n * This is intended to be called from the CLI when duplicates are detected.\n *\n * @returns Migration result with status and details\n */\n async migrateSpans(): Promise<{\n success: boolean;\n alreadyMigrated: boolean;\n duplicatesRemoved: number;\n message: string;\n }> {\n // Check if migration is needed\n const migrationStatus = await this.#db.checkSpansMigrationStatus(TABLE_SPANS);\n\n if (!migrationStatus.needsMigration) {\n return {\n success: true,\n alreadyMigrated: true,\n duplicatesRemoved: 0,\n message: `Migration already complete. Spans table has correct sorting key.`,\n };\n }\n\n // Check for duplicates (for reporting purposes)\n const duplicateInfo = await this.#db.checkForDuplicateSpans(TABLE_SPANS);\n\n if (duplicateInfo.hasDuplicates) {\n this.logger?.info?.(\n `Found ${duplicateInfo.duplicateCount} duplicate (traceId, spanId) combinations. Starting migration with deduplication...`,\n );\n } else {\n this.logger?.info?.(`No duplicate spans found. Starting sorting key migration...`);\n }\n\n // Run the migration (which includes deduplication)\n await this.#db.migrateSpansTableSortingKey({ tableName: TABLE_SPANS, schema: SPAN_SCHEMA });\n\n return {\n success: true,\n alreadyMigrated: false,\n duplicatesRemoved: duplicateInfo.duplicateCount,\n message: duplicateInfo.hasDuplicates\n ? `Migration complete. Removed duplicates and updated sorting key for ${TABLE_SPANS}.`\n : `Migration complete. Updated sorting key for ${TABLE_SPANS}.`,\n };\n }\n\n /**\n * Check migration status for the spans table.\n * Returns information about whether migration is needed.\n */\n async checkSpansMigrationStatus(): Promise<{\n needsMigration: boolean;\n hasDuplicates: boolean;\n duplicateCount: number;\n constraintExists: boolean;\n tableName: string;\n }> {\n const migrationStatus = await this.#db.checkSpansMigrationStatus(TABLE_SPANS);\n\n if (!migrationStatus.needsMigration) {\n return {\n needsMigration: false,\n hasDuplicates: false,\n duplicateCount: 0,\n constraintExists: true,\n tableName: TABLE_SPANS,\n };\n }\n\n const duplicateInfo = await this.#db.checkForDuplicateSpans(TABLE_SPANS);\n return {\n needsMigration: true,\n hasDuplicates: duplicateInfo.hasDuplicates,\n duplicateCount: duplicateInfo.duplicateCount,\n constraintExists: false,\n tableName: TABLE_SPANS,\n };\n }\n\n public override get tracingStrategy(): {\n preferred: TracingStorageStrategy;\n supported: TracingStorageStrategy[];\n } {\n // ClickHouse is optimized for append-only workloads, so the tracing exporter\n // should use insert-only mode (wait for trace-end events, then insert complete spans).\n // Note: updateSpan/batchUpdateSpans are still available for manual modifications.\n return {\n preferred: 'insert-only',\n supported: ['insert-only'],\n };\n }\n\n async createSpan(args: CreateSpanArgs): Promise<void> {\n const { span } = args;\n try {\n const now = Date.now();\n const record = {\n ...span,\n // Convert Date objects to millisecond timestamps for DateTime64(3)\n startedAt: span.startedAt instanceof Date ? span.startedAt.getTime() : span.startedAt,\n endedAt: span.endedAt instanceof Date ? span.endedAt.getTime() : span.endedAt,\n createdAt: now,\n updatedAt: now,\n };\n await this.#db.insert({ tableName: TABLE_SPANS, record });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'CREATE_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n spanId: span.spanId,\n traceId: span.traceId,\n spanType: span.spanType,\n spanName: span.name,\n },\n },\n error,\n );\n }\n }\n\n async getSpan(args: GetSpanArgs): Promise<GetSpanResponse | null> {\n const { traceId, spanId } = args;\n try {\n const engine = TABLE_ENGINES[TABLE_SPANS] ?? 'MergeTree()';\n const result = await this.client.query({\n query: `\n SELECT *\n FROM ${TABLE_SPANS} ${engine.startsWith('ReplacingMergeTree') ? 'FINAL' : ''}\n WHERE traceId = {traceId:String} AND spanId = {spanId:String}\n LIMIT 1\n `,\n query_params: { traceId, spanId },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = (await result.json()) as any[];\n if (!rows || rows.length === 0) {\n return null;\n }\n\n const spans = transformRows(rows) as SpanRecord[];\n const span = spans[0];\n if (!span) {\n return null;\n }\n return { span };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId, spanId },\n },\n error,\n );\n }\n }\n\n async getRootSpan(args: GetRootSpanArgs): Promise<GetRootSpanResponse | null> {\n const { traceId } = args;\n try {\n const engine = TABLE_ENGINES[TABLE_SPANS] ?? 'MergeTree()';\n const result = await this.client.query({\n query: `\n SELECT *\n FROM ${TABLE_SPANS} ${engine.startsWith('ReplacingMergeTree') ? 'FINAL' : ''}\n WHERE traceId = {traceId:String} AND (parentSpanId IS NULL OR parentSpanId = '')\n LIMIT 1\n `,\n query_params: { traceId },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = (await result.json()) as any[];\n if (!rows || rows.length === 0) {\n return null;\n }\n\n const spans = transformRows(rows) as SpanRecord[];\n const span = spans[0];\n if (!span) {\n return null;\n }\n return { span };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_ROOT_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId },\n },\n error,\n );\n }\n }\n\n async getTrace(args: GetTraceArgs): Promise<GetTraceResponse | null> {\n const { traceId } = args;\n try {\n const engine = TABLE_ENGINES[TABLE_SPANS] ?? 'MergeTree()';\n const result = await this.client.query({\n query: `\n SELECT *\n FROM ${TABLE_SPANS} ${engine.startsWith('ReplacingMergeTree') ? 'FINAL' : ''}\n WHERE traceId = {traceId:String}\n ORDER BY startedAt DESC\n `,\n query_params: { traceId },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = (await result.json()) as any[];\n if (!rows || rows.length === 0) {\n return null;\n }\n\n return {\n traceId,\n spans: transformRows(rows) as SpanRecord[],\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_TRACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId },\n },\n error,\n );\n }\n }\n\n async getTraceLight(args: GetTraceArgs): Promise<GetTraceLightResponse | null> {\n const { traceId } = args;\n try {\n const engine = TABLE_ENGINES[TABLE_SPANS] ?? 'MergeTree()';\n const result = await this.client.query({\n query: `\n SELECT traceId, spanId, parentSpanId, name,\n entityType, entityId, entityName,\n spanType, error, isEvent,\n startedAt, endedAt, createdAt, updatedAt\n FROM ${TABLE_SPANS} ${engine.startsWith('ReplacingMergeTree') ? 'FINAL' : ''}\n WHERE traceId = {traceId:String}\n ORDER BY startedAt ASC\n `,\n query_params: { traceId },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = (await result.json()) as any[];\n if (!rows || rows.length === 0) {\n return null;\n }\n\n return {\n traceId,\n spans: transformRows(rows) as GetTraceLightResponse['spans'],\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_TRACE_LIGHT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId },\n },\n error,\n );\n }\n }\n\n async updateSpan(args: UpdateSpanArgs): Promise<void> {\n const { traceId, spanId, updates } = args;\n try {\n // Load existing span\n const existing = await this.#db.load<SpanRecord>({\n tableName: TABLE_SPANS,\n keys: { spanId, traceId },\n });\n\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('CLICKHOUSE', 'UPDATE_SPAN', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { spanId, traceId },\n });\n }\n\n // Handle Date conversions to millisecond timestamps for DateTime64(3)\n const data: Record<string, any> = { ...updates };\n if (data.endedAt instanceof Date) {\n data.endedAt = data.endedAt.getTime();\n }\n if (data.startedAt instanceof Date) {\n data.startedAt = data.startedAt.getTime();\n }\n\n // Merge updates and re-insert (ClickHouse uses ReplacingMergeTree)\n const updated = {\n ...existing,\n ...data,\n updatedAt: Date.now(),\n };\n\n await this.client.insert({\n table: TABLE_SPANS,\n values: [updated],\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'UPDATE_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { spanId, traceId },\n },\n error,\n );\n }\n }\n\n async listTraces(args: ListTracesArgs): Promise<ListTracesResponse> {\n // Parse args through schema to apply defaults\n const { filters, pagination, orderBy } = listTracesArgsSchema.parse(args);\n const page = pagination?.page ?? 0;\n const perPage = pagination?.perPage ?? 10;\n\n try {\n // ClickHouse stores null strings as empty strings, so check for both\n const conditions: string[] = [`(parentSpanId IS NULL OR parentSpanId = '')`];\n const values: Record<string, any> = {};\n let paramIndex = 0;\n\n if (filters) {\n // Date range filters\n if (filters.startedAt?.start) {\n conditions.push(`startedAt >= {startedAtStart:DateTime64(3)}`);\n // Use Unix timestamp in milliseconds for DateTime64(3)\n values.startedAtStart = filters.startedAt.start.getTime();\n }\n if (filters.startedAt?.end) {\n conditions.push(`startedAt <= {startedAtEnd:DateTime64(3)}`);\n values.startedAtEnd = filters.startedAt.end.getTime();\n }\n if (filters.endedAt?.start) {\n conditions.push(`endedAt >= {endedAtStart:DateTime64(3)}`);\n values.endedAtStart = filters.endedAt.start.getTime();\n }\n if (filters.endedAt?.end) {\n conditions.push(`endedAt <= {endedAtEnd:DateTime64(3)}`);\n values.endedAtEnd = filters.endedAt.end.getTime();\n }\n\n // Span type filter\n if (filters.spanType !== undefined) {\n conditions.push(`spanType = {spanType:String}`);\n values.spanType = filters.spanType;\n }\n\n // Entity filters\n if (filters.entityType !== undefined) {\n conditions.push(`entityType = {entityType:String}`);\n values.entityType = filters.entityType;\n }\n if (filters.entityId !== undefined) {\n conditions.push(`entityId = {entityId:String}`);\n values.entityId = filters.entityId;\n }\n if (filters.entityName !== undefined) {\n conditions.push(`entityName = {entityName:String}`);\n values.entityName = filters.entityName;\n }\n\n // Identity & Tenancy filters\n if (filters.userId !== undefined) {\n conditions.push(`userId = {userId:String}`);\n values.userId = filters.userId;\n }\n if (filters.organizationId !== undefined) {\n conditions.push(`organizationId = {organizationId:String}`);\n values.organizationId = filters.organizationId;\n }\n if (filters.resourceId !== undefined) {\n conditions.push(`resourceId = {resourceId:String}`);\n values.resourceId = filters.resourceId;\n }\n\n // Correlation ID filters\n if (filters.runId !== undefined) {\n conditions.push(`runId = {runId:String}`);\n values.runId = filters.runId;\n }\n if (filters.sessionId !== undefined) {\n conditions.push(`sessionId = {sessionId:String}`);\n values.sessionId = filters.sessionId;\n }\n if (filters.threadId !== undefined) {\n conditions.push(`threadId = {threadId:String}`);\n values.threadId = filters.threadId;\n }\n if (filters.requestId !== undefined) {\n conditions.push(`requestId = {requestId:String}`);\n values.requestId = filters.requestId;\n }\n\n // Deployment context filters\n if (filters.environment !== undefined) {\n conditions.push(`environment = {environment:String}`);\n values.environment = filters.environment;\n }\n if (filters.source !== undefined) {\n conditions.push(`source = {source:String}`);\n values.source = filters.source;\n }\n if (filters.serviceName !== undefined) {\n conditions.push(`serviceName = {serviceName:String}`);\n values.serviceName = filters.serviceName;\n }\n\n // Scope filter (JSON field - use JSONExtractString for each key)\n if (filters.scope != null) {\n for (const [key, value] of Object.entries(filters.scope)) {\n // Validate key to prevent injection in JSON path\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('CLICKHOUSE', 'LIST_TRACES', 'INVALID_FILTER_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { key },\n });\n }\n const paramName = `scope_${key}_${paramIndex++}`;\n conditions.push(`JSONExtractString(scope, '${key}') = {${paramName}:String}`);\n values[paramName] = typeof value === 'string' ? value : JSON.stringify(value);\n }\n }\n\n // Metadata filter (JSON field)\n if (filters.metadata != null) {\n for (const [key, value] of Object.entries(filters.metadata)) {\n // Validate key to prevent injection in JSON path\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('CLICKHOUSE', 'LIST_TRACES', 'INVALID_FILTER_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { key },\n });\n }\n const paramName = `metadata_${key}_${paramIndex++}`;\n conditions.push(`JSONExtractString(metadata, '${key}') = {${paramName}:String}`);\n values[paramName] = typeof value === 'string' ? value : JSON.stringify(value);\n }\n }\n\n // Tags filter (all tags must be present)\n // ClickHouse stores tags as JSON array string, use JSONExtract to check\n if (filters.tags != null && filters.tags.length > 0) {\n for (const tag of filters.tags) {\n const paramName = `tag_${paramIndex++}`;\n conditions.push(`has(JSONExtract(tags, 'Array(String)'), {${paramName}:String})`);\n values[paramName] = tag;\n }\n }\n\n // Status filter (derived from error and endedAt)\n if (filters.status !== undefined) {\n switch (filters.status) {\n case TraceStatus.ERROR:\n // ClickHouse stores null as empty string for String columns\n conditions.push(`(error IS NOT NULL AND error != '')`);\n break;\n case TraceStatus.RUNNING:\n // endedAt is DateTime64 - only check for NULL (not empty string)\n // error is String - check for both NULL and empty string\n conditions.push(`endedAt IS NULL AND (error IS NULL OR error = '')`);\n break;\n case TraceStatus.SUCCESS:\n // endedAt is DateTime64 - only check for NULL (not empty string)\n // error is String - check for both NULL and empty string\n conditions.push(`endedAt IS NOT NULL AND (error IS NULL OR error = '')`);\n break;\n }\n }\n\n // hasChildError filter (requires subquery)\n if (filters.hasChildError !== undefined) {\n const engine = TABLE_ENGINES[TABLE_SPANS] ?? 'MergeTree()';\n const finalClause = engine.startsWith('ReplacingMergeTree') ? 'FINAL' : '';\n if (filters.hasChildError) {\n conditions.push(`EXISTS (\n SELECT 1 FROM ${TABLE_SPANS} ${finalClause} c\n WHERE c.traceId = ${TABLE_SPANS}.traceId AND c.error IS NOT NULL AND c.error != ''\n )`);\n } else {\n conditions.push(`NOT EXISTS (\n SELECT 1 FROM ${TABLE_SPANS} ${finalClause} c\n WHERE c.traceId = ${TABLE_SPANS}.traceId AND c.error IS NOT NULL AND c.error != ''\n )`);\n }\n }\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const engine = TABLE_ENGINES[TABLE_SPANS] ?? 'MergeTree()';\n const finalClause = engine.startsWith('ReplacingMergeTree') ? 'FINAL' : '';\n\n // Order by clause with proper NULL handling for endedAt\n // For endedAt DESC: NULLs FIRST (running spans on top when viewing newest)\n // For endedAt ASC: NULLs LAST (running spans at end when viewing oldest)\n // startedAt is never null (required field), so no special handling needed\n // Note: endedAt is DateTime64 - only check for NULL (not empty string like String columns)\n const sortField = orderBy?.field ?? 'startedAt';\n const sortDirection = orderBy?.direction ?? 'DESC';\n let orderClause: string;\n if (sortField === 'endedAt') {\n // Use CASE WHEN to handle NULLs for endedAt (DateTime64 column)\n // DESC: NULLs first (0 sorts before 1)\n // ASC: NULLs last (1 sorts after 0)\n const nullSortValue = sortDirection === 'DESC' ? 0 : 1;\n const nonNullSortValue = sortDirection === 'DESC' ? 1 : 0;\n orderClause = `ORDER BY CASE WHEN ${sortField} IS NULL THEN ${nullSortValue} ELSE ${nonNullSortValue} END, ${sortField} ${sortDirection}`;\n } else {\n orderClause = `ORDER BY ${sortField} ${sortDirection}`;\n }\n\n // Get total count\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_SPANS} ${finalClause} ${whereClause}`,\n query_params: values,\n format: 'JSONEachRow',\n });\n const countRows = (await countResult.json()) as Array<{ count: string | number }>;\n const total = Number(countRows[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n pagination: { total: 0, page, perPage, hasMore: false },\n spans: [],\n };\n }\n\n // Get paginated results\n const result = await this.client.query({\n query: `\n SELECT *\n FROM ${TABLE_SPANS} ${finalClause}\n ${whereClause}\n ${orderClause}\n LIMIT {limit:UInt32}\n OFFSET {offset:UInt32}\n `,\n query_params: { ...values, limit: perPage, offset: page * perPage },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = (await result.json()) as any[];\n // ClickHouse normalizes null to empty string, so normalize back for status computation\n const spans = (transformRows(rows) as SpanRecord[]).map(span => ({\n ...span,\n error: span.error === '' ? null : span.error,\n }));\n\n return {\n pagination: {\n total,\n page,\n perPage,\n hasMore: (page + 1) * perPage < total,\n },\n spans: toTraceSpans(spans),\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchCreateSpans(args: BatchCreateSpansArgs): Promise<void> {\n try {\n const now = Date.now();\n await this.#db.batchInsert({\n tableName: TABLE_SPANS,\n records: args.records.map(record => ({\n ...record,\n // Convert Date objects to millisecond timestamps for DateTime64(3)\n startedAt: record.startedAt instanceof Date ? record.startedAt.getTime() : record.startedAt,\n endedAt: record.endedAt instanceof Date ? record.endedAt.getTime() : record.endedAt,\n createdAt: now,\n updatedAt: now,\n })),\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_CREATE_SPANS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async batchUpdateSpans(args: BatchUpdateSpansArgs): Promise<void> {\n try {\n const now = Date.now();\n\n // Note: ClickHouse doesn't support traditional UPDATE operations with MergeTree engines.\n // Updates are performed by loading existing data, merging changes, and re-inserting.\n // This sequential processing may be slow for large batches - consider batching at the\n // application level if high-volume updates are needed.\n // For each update, load existing, merge, and re-insert\n for (const record of args.records) {\n const existing = await this.#db.load<SpanRecord>({\n tableName: TABLE_SPANS,\n keys: { spanId: record.spanId, traceId: record.traceId },\n });\n\n if (existing) {\n // Convert Date objects to millisecond timestamps for DateTime64(3)\n const updates: Record<string, any> = { ...record.updates };\n if (updates.startedAt instanceof Date) {\n updates.startedAt = updates.startedAt.getTime();\n }\n if (updates.endedAt instanceof Date) {\n updates.endedAt = updates.endedAt.getTime();\n }\n\n const updated = {\n ...existing,\n ...updates,\n updatedAt: now,\n };\n\n await this.client.insert({\n table: TABLE_SPANS,\n values: [updated],\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n }\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_UPDATE_SPANS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async batchDeleteTraces(args: BatchDeleteTracesArgs): Promise<void> {\n try {\n if (args.traceIds.length === 0) return;\n\n await this.client.command({\n query: `DELETE FROM ${TABLE_SPANS} WHERE traceId IN {traceIds:Array(String)}`,\n query_params: { traceIds: args.traceIds },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_DELETE_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","/**\n * Raw DDL for ClickHouse v-next observability tables.\n *\n * Column ordering convention:\n * 1. Identity (dedupeKey for tracing)\n * 2. IDs (trace, span, experiment)\n * 3. Entity hierarchy (entity, parent, root)\n * 4. Context (user, org, resource, run, session, thread, request, environment, executionSource, serviceName)\n * 5. Span / domain-specific scalars\n * 6. Query-relevant flexible fields (tags, labels, metadataSearch)\n * 7. Information-only JSON payloads\n *\n * Physical conventions:\n * - DateTime64(3, 'UTC') for all timestamps\n * - String for required IDs, Nullable(String) for optional IDs\n * - LowCardinality for low-cardinality dimensions\n * - Array(LowCardinality(String)) DEFAULT [] for tags\n * - Map(LowCardinality(String), String) DEFAULT {} for labels / metadataSearch\n * - Nullable(String) for JSON-encoded payloads\n * - No physical createdAt/updatedAt columns\n */\n\n// ---------------------------------------------------------------------------\n// Table names\n// ---------------------------------------------------------------------------\n\nexport const TABLE_SPAN_EVENTS = 'mastra_span_events';\nexport const TABLE_TRACE_ROOTS = 'mastra_trace_roots';\nexport const TABLE_TRACE_BRANCHES = 'mastra_trace_branches';\nexport const TABLE_METRIC_EVENTS = 'mastra_metric_events';\nexport const TABLE_LOG_EVENTS = 'mastra_log_events';\nexport const TABLE_SCORE_EVENTS = 'mastra_score_events';\nexport const TABLE_FEEDBACK_EVENTS = 'mastra_feedback_events';\nexport const TABLE_DISCOVERY_VALUES = 'mastra_discovery_values';\nexport const TABLE_DISCOVERY_PAIRS = 'mastra_discovery_pairs';\n\n// ---------------------------------------------------------------------------\n// MV names\n// ---------------------------------------------------------------------------\n\nexport const MV_TRACE_ROOTS = 'mastra_mv_trace_roots';\nexport const MV_TRACE_BRANCHES = 'mastra_mv_trace_branches';\nexport const MV_DISCOVERY_VALUES = 'mastra_mv_discovery_values';\nexport const MV_DISCOVERY_PAIRS = 'mastra_mv_discovery_pairs';\n\n/**\n * Span types that anchor a listable trace branch -- a named entity got\n * invoked. Materialized into `mastra_trace_branches` so they're listable\n * independently of where they appear in a trace tree.\n *\n * Kept as a literal SQL list (not derived from {@link BRANCH_SPAN_TYPES})\n * so the MV definition is hermetic and doesn't trigger re-creation if a\n * future enum re-order changes the value source.\n */\nexport const BRANCH_SPAN_TYPE_VALUES = [\n 'agent_run',\n 'workflow_run',\n 'processor_run',\n 'scorer_run',\n 'rag_ingestion',\n 'tool_call',\n 'mcp_tool_call',\n] as const;\n\n// ---------------------------------------------------------------------------\n// span_events — completed spans, ReplacingMergeTree (dedupeKey)\n// ---------------------------------------------------------------------------\n\nexport const SPAN_EVENTS_DDL = `\nCREATE TABLE IF NOT EXISTS ${TABLE_SPAN_EVENTS} (\n -- Identity\n dedupeKey String,\n\n -- IDs\n traceId String,\n spanId String,\n parentSpanId Nullable(String),\n experimentId Nullable(String),\n\n -- Entity\n entityType LowCardinality(Nullable(String)),\n entityId Nullable(String),\n entityName Nullable(String),\n entityVersionId Nullable(String),\n\n -- Parent entity\n parentEntityVersionId Nullable(String),\n parentEntityType LowCardinality(Nullable(String)),\n parentEntityId Nullable(String),\n parentEntityName Nullable(String),\n\n -- Root entity\n rootEntityVersionId Nullable(String),\n rootEntityType LowCardinality(Nullable(String)),\n rootEntityId Nullable(String),\n rootEntityName Nullable(String),\n\n -- Context\n userId Nullable(String),\n organizationId Nullable(String),\n resourceId Nullable(String),\n runId Nullable(String),\n sessionId Nullable(String),\n threadId Nullable(String),\n requestId Nullable(String),\n environment LowCardinality(Nullable(String)),\n executionSource LowCardinality(Nullable(String)),\n serviceName LowCardinality(Nullable(String)),\n\n -- Span scalars\n name String,\n spanType LowCardinality(String),\n isEvent Bool DEFAULT false,\n startedAt DateTime64(3, 'UTC'),\n endedAt DateTime64(3, 'UTC'),\n\n -- Query-relevant flexible fields\n tags Array(LowCardinality(String)) DEFAULT [],\n metadataSearch Map(LowCardinality(String), String) DEFAULT map(),\n\n -- Information-only JSON payloads\n attributes Nullable(String),\n scope Nullable(String),\n links Nullable(String),\n input Nullable(String),\n output Nullable(String),\n error Nullable(String),\n metadataRaw Nullable(String),\n requestContext Nullable(String)\n)\nENGINE = ReplacingMergeTree\nPARTITION BY toDate(endedAt)\nORDER BY (traceId, endedAt, spanId, dedupeKey)\n`;\n\n// ---------------------------------------------------------------------------\n// trace_roots — root spans only, populated by incremental MV\n// ---------------------------------------------------------------------------\n\nexport const TRACE_ROOTS_DDL = `\nCREATE TABLE IF NOT EXISTS ${TABLE_TRACE_ROOTS} (\n -- Identity\n dedupeKey String,\n\n -- IDs\n traceId String,\n spanId String,\n parentSpanId Nullable(String),\n experimentId Nullable(String),\n\n -- Entity\n entityType LowCardinality(Nullable(String)),\n entityId Nullable(String),\n entityName Nullable(String),\n entityVersionId Nullable(String),\n\n -- Parent entity\n parentEntityVersionId Nullable(String),\n parentEntityType LowCardinality(Nullable(String)),\n parentEntityId Nullable(String),\n parentEntityName Nullable(String),\n\n -- Root entity\n rootEntityVersionId Nullable(String),\n rootEntityType LowCardinality(Nullable(String)),\n rootEntityId Nullable(String),\n rootEntityName Nullable(String),\n\n -- Context\n userId Nullable(String),\n organizationId Nullable(String),\n resourceId Nullable(String),\n runId Nullable(String),\n sessionId Nullable(String),\n threadId Nullable(String),\n requestId Nullable(String),\n environment LowCardinality(Nullable(String)),\n executionSource LowCardinality(Nullable(String)),\n serviceName LowCardinality(Nullable(String)),\n\n -- Span scalars\n name String,\n spanType LowCardinality(String),\n isEvent Bool DEFAULT false,\n startedAt DateTime64(3, 'UTC'),\n endedAt DateTime64(3, 'UTC'),\n\n -- Query-relevant flexible fields\n tags Array(LowCardinality(String)) DEFAULT [],\n metadataSearch Map(LowCardinality(String), String) DEFAULT map(),\n\n -- Information-only JSON payloads\n attributes Nullable(String),\n scope Nullable(String),\n links Nullable(String),\n input Nullable(String),\n output Nullable(String),\n error Nullable(String),\n metadataRaw Nullable(String),\n requestContext Nullable(String)\n)\nENGINE = ReplacingMergeTree\nPARTITION BY toDate(endedAt)\nORDER BY (startedAt, traceId, dedupeKey)\n`;\n\n// ---------------------------------------------------------------------------\n// MV: span_events → trace_roots (root spans only, incremental)\n// ---------------------------------------------------------------------------\n\nexport const TRACE_ROOTS_MV_DDL = `\nCREATE MATERIALIZED VIEW IF NOT EXISTS ${MV_TRACE_ROOTS}\nTO ${TABLE_TRACE_ROOTS}\nAS\nSELECT *\nFROM ${TABLE_SPAN_EVENTS}\nWHERE parentSpanId IS NULL\n`;\n\n// ---------------------------------------------------------------------------\n// trace_branches — anchor spans of every named-entity invocation across the\n// tree, ReplacingMergeTree\n//\n// Same column shape as span_events / trace_roots (the MV does SELECT *), so a\n// row can flow trace_roots ← span_events → trace_branches without\n// column-by-column projection. Differs in ORDER BY: this table is\n// filter-by-spanType-first to support \"all branches anchored at entity X\"\n// listings independent of trace identity. Pairs with getBranch() to expand a\n// single anchor into its subtree.\n// ---------------------------------------------------------------------------\n\nexport const TRACE_BRANCHES_DDL = `\nCREATE TABLE IF NOT EXISTS ${TABLE_TRACE_BRANCHES} (\n -- Identity\n dedupeKey String,\n\n -- IDs\n traceId String,\n spanId String,\n parentSpanId Nullable(String),\n experimentId Nullable(String),\n\n -- Entity\n entityType LowCardinality(Nullable(String)),\n entityId Nullable(String),\n entityName Nullable(String),\n entityVersionId Nullable(String),\n\n -- Parent entity\n parentEntityVersionId Nullable(String),\n parentEntityType LowCardinality(Nullable(String)),\n parentEntityId Nullable(String),\n parentEntityName Nullable(String),\n\n -- Root entity\n rootEntityVersionId Nullable(String),\n rootEntityType LowCardinality(Nullable(String)),\n rootEntityId Nullable(String),\n rootEntityName Nullable(String),\n\n -- Context\n userId Nullable(String),\n organizationId Nullable(String),\n resourceId Nullable(String),\n runId Nullable(String),\n sessionId Nullable(String),\n threadId Nullable(String),\n requestId Nullable(String),\n environment LowCardinality(Nullable(String)),\n executionSource LowCardinality(Nullable(String)),\n serviceName LowCardinality(Nullable(String)),\n\n -- Span scalars\n name String,\n spanType LowCardinality(String),\n isEvent Bool DEFAULT false,\n startedAt DateTime64(3, 'UTC'),\n endedAt DateTime64(3, 'UTC'),\n\n -- Query-relevant flexible fields\n tags Array(LowCardinality(String)) DEFAULT [],\n metadataSearch Map(LowCardinality(String), String) DEFAULT map(),\n\n -- Information-only JSON payloads\n attributes Nullable(String),\n scope Nullable(String),\n links Nullable(String),\n input Nullable(String),\n output Nullable(String),\n error Nullable(String),\n metadataRaw Nullable(String),\n requestContext Nullable(String)\n)\nENGINE = ReplacingMergeTree\nPARTITION BY toDate(endedAt)\nORDER BY (spanType, startedAt, traceId, dedupeKey)\n`;\n\n// ---------------------------------------------------------------------------\n// MV: span_events → trace_branches (only branch-anchor span types, incremental)\n// ---------------------------------------------------------------------------\n\nexport const TRACE_BRANCHES_MV_DDL = `\nCREATE MATERIALIZED VIEW IF NOT EXISTS ${MV_TRACE_BRANCHES}\nTO ${TABLE_TRACE_BRANCHES}\nAS\nSELECT *\nFROM ${TABLE_SPAN_EVENTS}\nWHERE spanType IN (${BRANCH_SPAN_TYPE_VALUES.map(v => `'${v}'`).join(', ')})\n`;\n\n// ---------------------------------------------------------------------------\n// metric_events — ReplacingMergeTree with metricId dedup\n// ---------------------------------------------------------------------------\n\nexport const METRIC_EVENTS_DDL = `\nCREATE TABLE IF NOT EXISTS ${TABLE_METRIC_EVENTS} (\n -- Timestamp\n timestamp DateTime64(3, 'UTC'),\n\n -- IDs\n metricId String,\n traceId Nullable(String),\n spanId Nullable(String),\n experimentId Nullable(String),\n\n -- Entity hierarchy\n entityType LowCardinality(Nullable(String)),\n entityId Nullable(String),\n entityName Nullable(String),\n entityVersionId Nullable(String),\n parentEntityVersionId Nullable(String),\n parentEntityType LowCardinality(Nullable(String)),\n parentEntityId Nullable(String),\n parentEntityName Nullable(String),\n rootEntityVersionId Nullable(String),\n rootEntityType LowCardinality(Nullable(String)),\n rootEntityId Nullable(String),\n rootEntityName Nullable(String),\n\n -- Context\n userId Nullable(String),\n organizationId Nullable(String),\n resourceId Nullable(String),\n runId Nullable(String),\n sessionId Nullable(String),\n threadId Nullable(String),\n requestId Nullable(String),\n environment LowCardinality(Nullable(String)),\n executionSource LowCardinality(Nullable(String)),\n serviceName LowCardinality(Nullable(String)),\n\n -- Metric scalars\n name LowCardinality(String),\n value Float64,\n provider LowCardinality(Nullable(String)),\n model Nullable(String),\n estimatedCost Nullable(Float64),\n costUnit LowCardinality(Nullable(String)),\n\n -- Query-relevant flexible fields\n tags Array(LowCardinality(String)) DEFAULT [],\n labels Map(LowCardinality(String), String) DEFAULT map(),\n\n -- Information-only JSON payloads\n costMetadata Nullable(String),\n metadata Nullable(String),\n scope Nullable(String),\n\n -- Bloom-filter skip indexes for high-cardinality ID drilldowns.\n -- Equality and IN filters on these columns can skip granule chunks that\n -- definitely do not contain the value. GRANULARITY 2 = 16K-row chunks.\n -- ID columns are out-of-sort-key, so without these every drilldown scans\n -- every row in the time range.\n INDEX idx_traceId traceId TYPE bloom_filter(0.01) GRANULARITY 2,\n INDEX idx_threadId threadId TYPE bloom_filter(0.01) GRANULARITY 2,\n INDEX idx_resourceId resourceId TYPE bloom_filter(0.01) GRANULARITY 2,\n INDEX idx_userId userId TYPE bloom_filter(0.01) GRANULARITY 2,\n INDEX idx_organizationId organizationId TYPE bloom_filter(0.01) GRANULARITY 2,\n INDEX idx_experimentId experimentId TYPE bloom_filter(0.01) GRANULARITY 2,\n INDEX idx_runId runId TYPE bloom_filter(0.01) GRANULARITY 2,\n INDEX idx_sessionId sessionId TYPE bloom_filter(0.01) GRANULARITY 2,\n INDEX idx_requestId requestId TYPE bloom_filter(0.01) GRANULARITY 2\n)\nENGINE = ReplacingMergeTree\nPARTITION BY toDate(timestamp)\nORDER BY (name, timestamp, metricId)\n`;\n\n// ---------------------------------------------------------------------------\n// log_events — ReplacingMergeTree with logId dedup\n// ---------------------------------------------------------------------------\n\nexport const LOG_EVENTS_DDL = `\nCREATE TABLE IF NOT EXISTS ${TABLE_LOG_EVENTS} (\n -- Timestamp\n timestamp DateTime64(3, 'UTC'),\n\n -- IDs\n logId String,\n traceId Nullable(String),\n spanId Nullable(String),\n experimentId Nullable(String),\n\n -- Entity hierarchy\n entityType LowCardinality(Nullable(String)),\n entityId Nullable(String),\n entityName Nullable(String),\n entityVersionId Nullable(String),\n parentEntityVersionId Nullable(String),\n parentEntityType LowCardinality(Nullable(String)),\n parentEntityId Nullable(String),\n parentEntityName Nullable(String),\n rootEntityVersionId Nullable(String),\n rootEntityType LowCardinality(Nullable(String)),\n rootEntityId Nullable(String),\n rootEntityName Nullable(String),\n\n -- Context\n userId Nullable(String),\n organizationId Nullable(String),\n resourceId Nullable(String),\n runId Nullable(String),\n sessionId Nullable(String),\n threadId Nullable(String),\n requestId Nullable(String),\n environment LowCardinality(Nullable(String)),\n executionSource LowCardinality(Nullable(String)),\n serviceName LowCardinality(Nullable(String)),\n\n -- Log scalars\n level LowCardinality(String),\n message String,\n\n -- Query-relevant flexible fields\n tags Array(LowCardinality(String)) DEFAULT [],\n\n -- Information-only JSON payloads\n data Nullable(String),\n metadata Nullable(String),\n scope Nullable(String)\n)\nENGINE = ReplacingMergeTree\nPARTITION BY toDate(timestamp)\nORDER BY (timestamp, logId)\n`;\n\n// ---------------------------------------------------------------------------\n// score_events — ReplacingMergeTree with scoreId dedup\n// ---------------------------------------------------------------------------\n\nexport const SCORE_EVENTS_DDL = `\nCREATE TABLE IF NOT EXISTS ${TABLE_SCORE_EVENTS} (\n -- Timestamp\n timestamp DateTime64(3, 'UTC'),\n\n -- IDs\n scoreId String,\n traceId Nullable(String),\n spanId Nullable(String),\n experimentId Nullable(String),\n scoreTraceId Nullable(String),\n\n -- Entity hierarchy\n entityType LowCardinality(Nullable(String)),\n entityId Nullable(String),\n entityName Nullable(String),\n entityVersionId Nullable(String),\n parentEntityVersionId Nullable(String),\n parentEntityType LowCardinality(Nullable(String)),\n parentEntityId Nullable(String),\n parentEntityName Nullable(String),\n rootEntityVersionId Nullable(String),\n rootEntityType LowCardinality(Nullable(String)),\n rootEntityId Nullable(String),\n rootEntityName Nullable(String),\n\n -- Context\n userId Nullable(String),\n organizationId Nullable(String),\n resourceId Nullable(String),\n runId Nullable(String),\n sessionId Nullable(String),\n threadId Nullable(String),\n requestId Nullable(String),\n environment LowCardinality(Nullable(String)),\n executionSource LowCardinality(Nullable(String)),\n serviceName LowCardinality(Nullable(String)),\n\n -- Scorer identity\n scorerId LowCardinality(String),\n scorerVersion LowCardinality(Nullable(String)),\n scoreSource LowCardinality(Nullable(String)),\n\n -- Score value\n score Float64,\n\n -- Information-only\n reason Nullable(String),\n\n -- Query-relevant flexible fields\n tags Array(LowCardinality(String)) DEFAULT [],\n\n -- Information-only JSON payloads\n metadata Nullable(String),\n scope Nullable(String)\n)\nENGINE = ReplacingMergeTree\nPARTITION BY toDate(timestamp)\nORDER BY (traceId, timestamp, scoreId)\nSETTINGS allow_nullable_key = 1\n`;\n\n// ---------------------------------------------------------------------------\n// feedback_events — ReplacingMergeTree with feedbackId dedup\n// ---------------------------------------------------------------------------\n\nexport const FEEDBACK_EVENTS_DDL = `\nCREATE TABLE IF NOT EXISTS ${TABLE_FEEDBACK_EVENTS} (\n -- Timestamp\n timestamp DateTime64(3, 'UTC'),\n\n -- IDs\n feedbackId String,\n traceId Nullable(String),\n spanId Nullable(String),\n experimentId Nullable(String),\n\n -- Entity hierarchy\n entityType LowCardinality(Nullable(String)),\n entityId Nullable(String),\n entityName Nullable(String),\n entityVersionId Nullable(String),\n parentEntityVersionId Nullable(String),\n parentEntityType LowCardinality(Nullable(String)),\n parentEntityId Nullable(String),\n parentEntityName Nullable(String),\n rootEntityVersionId Nullable(String),\n rootEntityType LowCardinality(Nullable(String)),\n rootEntityId Nullable(String),\n rootEntityName Nullable(String),\n\n -- Context\n userId Nullable(String),\n organizationId Nullable(String),\n resourceId Nullable(String),\n runId Nullable(String),\n sessionId Nullable(String),\n threadId Nullable(String),\n requestId Nullable(String),\n environment LowCardinality(Nullable(String)),\n executionSource LowCardinality(Nullable(String)),\n serviceName LowCardinality(Nullable(String)),\n\n -- Feedback actor / linkage\n feedbackUserId Nullable(String),\n sourceId Nullable(String),\n\n -- Feedback identity\n feedbackSource LowCardinality(String),\n feedbackType LowCardinality(String),\n\n -- Feedback value (exactly one non-null per valid row)\n valueString Nullable(String),\n valueNumber Nullable(Float64),\n\n -- Information-only\n comment Nullable(String),\n\n -- Query-relevant flexible fields\n tags Array(LowCardinality(String)) DEFAULT [],\n\n -- Information-only JSON payloads\n metadata Nullable(String),\n scope Nullable(String)\n)\nENGINE = ReplacingMergeTree\nPARTITION BY toDate(timestamp)\nORDER BY (traceId, timestamp, feedbackId)\nSETTINGS allow_nullable_key = 1\n`;\n\n// ---------------------------------------------------------------------------\n// discovery_values — refreshable helper\n// ---------------------------------------------------------------------------\n\nexport const DISCOVERY_VALUES_DDL = `\nCREATE TABLE IF NOT EXISTS ${TABLE_DISCOVERY_VALUES} (\n kind LowCardinality(String),\n key1 String,\n value String\n)\nENGINE = MergeTree\nORDER BY (kind, key1, value)\n`;\n\n// ---------------------------------------------------------------------------\n// discovery_pairs — refreshable helper\n// ---------------------------------------------------------------------------\n\nexport const DISCOVERY_PAIRS_DDL = `\nCREATE TABLE IF NOT EXISTS ${TABLE_DISCOVERY_PAIRS} (\n kind LowCardinality(String),\n key1 String,\n key2 String,\n value String\n)\nENGINE = MergeTree\nORDER BY (kind, key1, key2, value)\n`;\n\n// ---------------------------------------------------------------------------\n// Refreshable MV: discovery_values — recomputes every 1 minute\n// Source: span_events, metric_events, log_events (not scores/feedback)\n// ---------------------------------------------------------------------------\n\nconst SIGNAL_TABLES = [TABLE_SPAN_EVENTS, TABLE_METRIC_EVENTS, TABLE_LOG_EVENTS] as const;\n\nfunction unionDistinctFromSignals(\n kind: string,\n key1Expr: string,\n valueExpr: string,\n extraJoin = '',\n extraWhere = '',\n tables: readonly string[] = SIGNAL_TABLES,\n): string {\n return tables\n .map(\n t =>\n `SELECT '${kind}' AS kind, ${key1Expr} AS key1, ${valueExpr} AS value FROM ${t}${extraJoin}${extraWhere ? ` WHERE ${extraWhere}` : ''}`,\n )\n .join(' UNION ALL ');\n}\n\nexport const DISCOVERY_VALUES_MV_DDL = `\nCREATE MATERIALIZED VIEW IF NOT EXISTS ${MV_DISCOVERY_VALUES}\nREFRESH EVERY 1 MINUTE\nTO ${TABLE_DISCOVERY_VALUES}\nAS\nSELECT DISTINCT kind, key1, value FROM (\n -- entityType\n ${unionDistinctFromSignals('entityType', \"''\", 'entityType', '', \"entityType IS NOT NULL AND entityType != ''\")}\n UNION ALL\n -- serviceName\n ${unionDistinctFromSignals('serviceName', \"''\", 'serviceName', '', \"serviceName IS NOT NULL AND serviceName != ''\")}\n UNION ALL\n -- environment\n ${unionDistinctFromSignals('environment', \"''\", 'environment', '', \"environment IS NOT NULL AND environment != ''\")}\n UNION ALL\n -- tag (explode tags array, key1 = entityType, drop rows without entityType)\n ${unionDistinctFromSignals('tag', 'entityType', 'tag', ' ARRAY JOIN tags AS tag', \"tag != '' AND entityType IS NOT NULL AND entityType != ''\")}\n UNION ALL\n -- metricName (metric_events only)\n ${unionDistinctFromSignals('metricName', \"''\", 'name', '', \"name != ''\", [TABLE_METRIC_EVENTS])}\n UNION ALL\n -- metricLabelKey (metric_events only, explode label keys)\n ${unionDistinctFromSignals('metricLabelKey', 'name', 'labelKey', ' ARRAY JOIN mapKeys(labels) AS labelKey', \"name != '' AND labelKey != ''\", [TABLE_METRIC_EVENTS])}\n)\n`;\n\n// ---------------------------------------------------------------------------\n// Refreshable MV: discovery_pairs — recomputes every 5 minutes\n// Source: span_events, metric_events, log_events (not scores/feedback)\n// ---------------------------------------------------------------------------\n\nexport const DISCOVERY_PAIRS_MV_DDL = `\nCREATE MATERIALIZED VIEW IF NOT EXISTS ${MV_DISCOVERY_PAIRS}\nREFRESH EVERY 5 MINUTE\nTO ${TABLE_DISCOVERY_PAIRS}\nAS\nSELECT DISTINCT kind, key1, key2, value FROM (\n -- entityTypeName (entityType → entityName pairs)\n ${SIGNAL_TABLES.map(\n t =>\n `SELECT 'entityTypeName' AS kind, entityType AS key1, '' AS key2, entityName AS value FROM ${t} WHERE entityType IS NOT NULL AND entityType != '' AND entityName IS NOT NULL AND entityName != ''`,\n ).join(' UNION ALL ')}\n UNION ALL\n -- metricLabelValue (metricName + labelKey → labelValue triples)\n SELECT 'metricLabelValue' AS kind, name AS key1, labelKey AS key2, labels[labelKey] AS value\n FROM ${TABLE_METRIC_EVENTS}\n ARRAY JOIN mapKeys(labels) AS labelKey\n WHERE name != '' AND labelKey != '' AND labels[labelKey] != ''\n)\n`;\n\n// ---------------------------------------------------------------------------\n// All DDL in creation order (tables first, then MVs)\n// ---------------------------------------------------------------------------\n\nexport const ALL_TABLE_DDL = [\n SPAN_EVENTS_DDL,\n TRACE_ROOTS_DDL,\n TRACE_BRANCHES_DDL,\n METRIC_EVENTS_DDL,\n LOG_EVENTS_DDL,\n SCORE_EVENTS_DDL,\n FEEDBACK_EVENTS_DDL,\n DISCOVERY_VALUES_DDL,\n DISCOVERY_PAIRS_DDL,\n];\n\nexport const ALL_MV_DDL = [TRACE_ROOTS_MV_DDL, TRACE_BRANCHES_MV_DDL];\n\n/** Discovery-specific refreshable MVs — created separately from core MVs. */\nexport const DISCOVERY_MV_DDL = [DISCOVERY_VALUES_MV_DDL, DISCOVERY_PAIRS_MV_DDL];\n\n/**\n * Additive migrations for existing ClickHouse databases.\n * ClickHouse's `CREATE TABLE IF NOT EXISTS` skips if the table already exists,\n * so new columns must be added explicitly via `ALTER TABLE ... ADD COLUMN IF NOT EXISTS`.\n */\nexport const ALL_MIGRATIONS = [\n // Span events\n `ALTER TABLE ${TABLE_SPAN_EVENTS} ADD COLUMN IF NOT EXISTS entityVersionId Nullable(String)`,\n `ALTER TABLE ${TABLE_SPAN_EVENTS} ADD COLUMN IF NOT EXISTS parentEntityVersionId Nullable(String)`,\n `ALTER TABLE ${TABLE_SPAN_EVENTS} ADD COLUMN IF NOT EXISTS rootEntityVersionId Nullable(String)`,\n // Trace roots\n `ALTER TABLE ${TABLE_TRACE_ROOTS} ADD COLUMN IF NOT EXISTS entityVersionId Nullable(String)`,\n `ALTER TABLE ${TABLE_TRACE_ROOTS} ADD COLUMN IF NOT EXISTS parentEntityVersionId Nullable(String)`,\n `ALTER TABLE ${TABLE_TRACE_ROOTS} ADD COLUMN IF NOT EXISTS rootEntityVersionId Nullable(String)`,\n // Metrics\n `ALTER TABLE ${TABLE_METRIC_EVENTS} ADD COLUMN IF NOT EXISTS entityVersionId Nullable(String)`,\n `ALTER TABLE ${TABLE_METRIC_EVENTS} ADD COLUMN IF NOT EXISTS parentEntityVersionId Nullable(String)`,\n `ALTER TABLE ${TABLE_METRIC_EVENTS} ADD COLUMN IF NOT EXISTS rootEntityVersionId Nullable(String)`,\n // Logs\n `ALTER TABLE ${TABLE_LOG_EVENTS} ADD COLUMN IF NOT EXISTS entityVersionId Nullable(String)`,\n `ALTER TABLE ${TABLE_LOG_EVENTS} ADD COLUMN IF NOT EXISTS parentEntityVersionId Nullable(String)`,\n `ALTER TABLE ${TABLE_LOG_EVENTS} ADD COLUMN IF NOT EXISTS rootEntityVersionId Nullable(String)`,\n // Scores\n `ALTER TABLE ${TABLE_SCORE_EVENTS} ADD COLUMN IF NOT EXISTS entityVersionId Nullable(String)`,\n `ALTER TABLE ${TABLE_SCORE_EVENTS} ADD COLUMN IF NOT EXISTS parentEntityVersionId Nullable(String)`,\n `ALTER TABLE ${TABLE_SCORE_EVENTS} ADD COLUMN IF NOT EXISTS rootEntityVersionId Nullable(String)`,\n // Feedback\n `ALTER TABLE ${TABLE_FEEDBACK_EVENTS} ADD COLUMN IF NOT EXISTS entityVersionId Nullable(String)`,\n `ALTER TABLE ${TABLE_FEEDBACK_EVENTS} ADD COLUMN IF NOT EXISTS parentEntityVersionId Nullable(String)`,\n `ALTER TABLE ${TABLE_FEEDBACK_EVENTS} ADD COLUMN IF NOT EXISTS rootEntityVersionId Nullable(String)`,\n // Metric skip indexes — additive, instant DDL. Existing parts keep no index\n // until merged or `MATERIALIZE INDEX` is run; new parts are bloom-filtered\n // immediately. With normal retention turning over the table, the index\n // converges to full coverage without an explicit backfill.\n `ALTER TABLE ${TABLE_METRIC_EVENTS} ADD INDEX IF NOT EXISTS idx_traceId traceId TYPE bloom_filter(0.01) GRANULARITY 2`,\n `ALTER TABLE ${TABLE_METRIC_EVENTS} ADD INDEX IF NOT EXISTS idx_threadId threadId TYPE bloom_filter(0.01) GRANULARITY 2`,\n `ALTER TABLE ${TABLE_METRIC_EVENTS} ADD INDEX IF NOT EXISTS idx_resourceId resourceId TYPE bloom_filter(0.01) GRANULARITY 2`,\n `ALTER TABLE ${TABLE_METRIC_EVENTS} ADD INDEX IF NOT EXISTS idx_userId userId TYPE bloom_filter(0.01) GRANULARITY 2`,\n `ALTER TABLE ${TABLE_METRIC_EVENTS} ADD INDEX IF NOT EXISTS idx_organizationId organizationId TYPE bloom_filter(0.01) GRANULARITY 2`,\n `ALTER TABLE ${TABLE_METRIC_EVENTS} ADD INDEX IF NOT EXISTS idx_experimentId experimentId TYPE bloom_filter(0.01) GRANULARITY 2`,\n `ALTER TABLE ${TABLE_METRIC_EVENTS} ADD INDEX IF NOT EXISTS idx_runId runId TYPE bloom_filter(0.01) GRANULARITY 2`,\n `ALTER TABLE ${TABLE_METRIC_EVENTS} ADD INDEX IF NOT EXISTS idx_sessionId sessionId TYPE bloom_filter(0.01) GRANULARITY 2`,\n `ALTER TABLE ${TABLE_METRIC_EVENTS} ADD INDEX IF NOT EXISTS idx_requestId requestId TYPE bloom_filter(0.01) GRANULARITY 2`,\n];\n\n/**\n * Names of the bloom-filter skip indexes added to `metric_events`. Exposed so\n * tooling (e.g. a follow-up `mastra migrate` command) can detect and optionally\n * `MATERIALIZE INDEX` them across pre-existing parts.\n */\nexport const METRIC_SKIP_INDEX_NAMES = [\n 'idx_traceId',\n 'idx_threadId',\n 'idx_resourceId',\n 'idx_userId',\n 'idx_organizationId',\n 'idx_experimentId',\n 'idx_runId',\n 'idx_sessionId',\n 'idx_requestId',\n] as const;\n\nexport const ALL_DDL = [...ALL_TABLE_DDL, ...ALL_MV_DDL, ...DISCOVERY_MV_DDL];\n\nexport const ALL_TABLE_NAMES = [\n TABLE_SPAN_EVENTS,\n TABLE_TRACE_ROOTS,\n TABLE_TRACE_BRANCHES,\n TABLE_METRIC_EVENTS,\n TABLE_LOG_EVENTS,\n TABLE_SCORE_EVENTS,\n TABLE_FEEDBACK_EVENTS,\n TABLE_DISCOVERY_VALUES,\n TABLE_DISCOVERY_PAIRS,\n];\n\n// ---------------------------------------------------------------------------\n// Retention / TTL\n// ---------------------------------------------------------------------------\n\n/**\n * Per-signal retention configuration in day increments.\n *\n * Per design doc (shared.md §Retention):\n * - TTL configurable per signal in day increments\n * - tracing retention identical across span_events and trace_roots\n * - discovery helpers do not need TTL (fully derived)\n */\nexport interface RetentionConfig {\n /** Retention for span_events and trace_roots in days. */\n tracing?: number;\n /** Retention for log_events in days. */\n logs?: number;\n /** Retention for metric_events in days. */\n metrics?: number;\n /** Retention for score_events in days. */\n scores?: number;\n /** Retention for feedback_events in days. */\n feedback?: number;\n}\n\n/** Timestamp column used for TTL per signal table. */\nconst SIGNAL_TTL_COLUMNS: Record<string, string> = {\n [TABLE_SPAN_EVENTS]: 'endedAt',\n [TABLE_TRACE_ROOTS]: 'endedAt',\n [TABLE_TRACE_BRANCHES]: 'endedAt',\n [TABLE_METRIC_EVENTS]: 'timestamp',\n [TABLE_LOG_EVENTS]: 'timestamp',\n [TABLE_SCORE_EVENTS]: 'timestamp',\n [TABLE_FEEDBACK_EVENTS]: 'timestamp',\n};\n\n/** Maps each signal key to the table(s) it controls. */\nconst SIGNAL_TO_TABLES: Record<keyof RetentionConfig, string[]> = {\n tracing: [TABLE_SPAN_EVENTS, TABLE_TRACE_ROOTS, TABLE_TRACE_BRANCHES],\n logs: [TABLE_LOG_EVENTS],\n metrics: [TABLE_METRIC_EVENTS],\n scores: [TABLE_SCORE_EVENTS],\n feedback: [TABLE_FEEDBACK_EVENTS],\n};\n\n/**\n * Generates `ALTER TABLE ... MODIFY TTL` statements for the given retention config.\n * Returns empty array if no retention is configured.\n *\n * Uses `MODIFY TTL` so re-running init is idempotent (overwrites any previous TTL).\n */\nexport function buildRetentionDDL(retention: RetentionConfig): string[] {\n const statements: string[] = [];\n\n for (const [signal, days] of Object.entries(retention)) {\n const safeDays = Math.floor(Number(days));\n if (!Number.isFinite(safeDays) || safeDays <= 0) continue;\n\n const tables = SIGNAL_TO_TABLES[signal as keyof RetentionConfig];\n if (!tables) continue;\n\n for (const table of tables) {\n const col = SIGNAL_TTL_COLUMNS[table];\n if (!col) continue;\n statements.push(`ALTER TABLE ${table} MODIFY TTL ${col} + INTERVAL ${safeDays} DAY`);\n }\n }\n\n return statements;\n}\n","/**\n * Shared utilities for ClickHouse v-next observability domain.\n *\n * - Normalization helpers for tags, labels, metadataSearch\n * - Row-to-record transformation\n * - ClickHouse query settings\n */\n\nimport type {\n SpanRecord,\n CreateSpanRecord,\n LogRecord,\n CreateLogRecord,\n MetricRecord,\n CreateMetricRecord,\n ScoreRecord,\n CreateScoreRecord,\n FeedbackRecord,\n CreateFeedbackRecord,\n} from '@mastra/core/storage';\nimport { EntityType } from '@mastra/core/storage';\n\n// ---------------------------------------------------------------------------\n// ClickHouse query settings\n// ---------------------------------------------------------------------------\n\nexport const CH_SETTINGS = {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n} as const;\n\nexport const CH_INSERT_SETTINGS = {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n} as const;\n\nconst PROMOTED_KEYS = new Set([\n 'experimentId',\n 'entityType',\n 'entityId',\n 'entityName',\n 'entityVersionId',\n 'parentEntityVersionId',\n 'rootEntityVersionId',\n 'userId',\n 'organizationId',\n 'resourceId',\n 'runId',\n 'sessionId',\n 'threadId',\n 'requestId',\n 'environment',\n 'executionSource',\n 'serviceName',\n]);\n\nfunction nullableString(value: unknown): string | null {\n return typeof value === 'string' ? (value === '' ? null : value) : value == null ? null : String(value);\n}\n\nfunction nullableEntityType(value: unknown): EntityType | null {\n const normalized = nullableString(value);\n if (!normalized) return null;\n return Object.values(EntityType).includes(normalized as EntityType) ? (normalized as EntityType) : null;\n}\n\nexport function normalizeTags(tags: unknown): string[] {\n if (!Array.isArray(tags)) return [];\n const seen = new Set<string>();\n const result: string[] = [];\n for (const t of tags) {\n if (typeof t !== 'string') continue;\n const trimmed = t.trim();\n if (trimmed === '' || seen.has(trimmed)) continue;\n seen.add(trimmed);\n result.push(trimmed);\n }\n return result;\n}\n\nexport function normalizeLabels(labels: Record<string, unknown> | null | undefined): Record<string, string> {\n if (labels == null || typeof labels !== 'object') return {};\n const result: Record<string, string> = {};\n for (const [k, v] of Object.entries(labels)) {\n if (typeof v !== 'string') continue;\n const trimmedK = k.trim();\n const trimmedV = v.trim();\n if (trimmedK === '' || trimmedV === '') continue;\n result[trimmedK] = trimmedV;\n }\n return result;\n}\n\nexport function buildMetadataSearch(metadata: Record<string, unknown> | null | undefined): Record<string, string> {\n if (metadata == null || typeof metadata !== 'object') return {};\n const result: Record<string, string> = {};\n for (const [k, v] of Object.entries(metadata)) {\n if (PROMOTED_KEYS.has(k)) continue;\n if (typeof v !== 'string') continue;\n const trimmed = v.trim();\n if (trimmed === '') continue;\n result[k] = trimmed;\n }\n return result;\n}\n\nexport function jsonEncode(value: unknown): string | null {\n if (value == null) return null;\n return JSON.stringify(value);\n}\n\nexport function parseJson(value: unknown): unknown {\n if (value == null || value === '') return null;\n if (typeof value !== 'string') return value;\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n}\n\nexport function toDateOrNull(value: unknown): Date | null {\n if (value == null || value === '') return null;\n const d = new Date(value as string | number);\n if (isNaN(d.getTime()) || d.getTime() === 0) return null;\n return d;\n}\n\nexport function toDate(value: unknown): Date {\n const d = toDateOrNull(value);\n if (d == null) throw new Error(`Invalid date: ${value}`);\n return d;\n}\n\nexport function toISOString(value: Date | number | string): string {\n if (value instanceof Date) return value.toISOString();\n if (typeof value === 'number') return new Date(value).toISOString();\n return value;\n}\n\nexport function buildDedupeKey(traceId: string, spanId: string): string {\n return `${traceId}:${spanId}`;\n}\n\nexport function rowToSpanRecord(row: Record<string, any>): SpanRecord {\n const startedAt = toDate(row.startedAt);\n const endedAt = row.isEvent ? startedAt : toDateOrNull(row.endedAt);\n const error = parseJson(row.error);\n\n return {\n traceId: row.traceId,\n spanId: row.spanId,\n parentSpanId: nullableString(row.parentSpanId),\n name: row.name,\n spanType: row.spanType,\n isEvent: Boolean(row.isEvent),\n startedAt,\n endedAt,\n entityType: nullableEntityType(row.entityType),\n entityId: nullableString(row.entityId),\n entityName: nullableString(row.entityName),\n entityVersionId: nullableString(row.entityVersionId),\n parentEntityVersionId: nullableString(row.parentEntityVersionId),\n parentEntityType: nullableEntityType(row.parentEntityType),\n parentEntityId: nullableString(row.parentEntityId),\n parentEntityName: nullableString(row.parentEntityName),\n rootEntityVersionId: nullableString(row.rootEntityVersionId),\n rootEntityType: nullableEntityType(row.rootEntityType),\n rootEntityId: nullableString(row.rootEntityId),\n rootEntityName: nullableString(row.rootEntityName),\n userId: nullableString(row.userId),\n organizationId: nullableString(row.organizationId),\n resourceId: nullableString(row.resourceId),\n runId: nullableString(row.runId),\n sessionId: nullableString(row.sessionId),\n threadId: nullableString(row.threadId),\n requestId: nullableString(row.requestId),\n environment: nullableString(row.environment),\n source: nullableString(row.executionSource),\n serviceName: nullableString(row.serviceName),\n experimentId: nullableString(row.experimentId),\n tags: normalizeTags(row.tags),\n metadata: (parseJson(row.metadataRaw) as Record<string, unknown> | null) ?? undefined,\n scope: (parseJson(row.scope) as Record<string, unknown> | null) ?? undefined,\n attributes: (parseJson(row.attributes) as Record<string, unknown> | null) ?? undefined,\n links: (parseJson(row.links) as Record<string, unknown>[] | null) ?? undefined,\n input: parseJson(row.input) ?? undefined,\n output: parseJson(row.output) ?? undefined,\n error: error ?? undefined,\n requestContext: (parseJson(row.requestContext) as Record<string, unknown> | null) ?? undefined,\n createdAt: startedAt,\n updatedAt: null,\n };\n}\n\nexport function rowsToSpanRecords(rows: Record<string, any>[]): SpanRecord[] {\n return rows.map(rowToSpanRecord);\n}\n\nexport function spanRecordToRow(span: CreateSpanRecord): Record<string, unknown> {\n const endedAt = span.isEvent ? span.startedAt : (span.endedAt ?? span.startedAt);\n const metadata = span.metadata ?? null;\n\n return {\n dedupeKey: buildDedupeKey(span.traceId, span.spanId),\n traceId: span.traceId,\n spanId: span.spanId,\n parentSpanId: span.parentSpanId ?? null,\n experimentId: span.experimentId ?? null,\n entityType: span.entityType ?? null,\n entityId: span.entityId ?? null,\n entityName: span.entityName ?? null,\n entityVersionId: span.entityVersionId ?? null,\n parentEntityVersionId: span.parentEntityVersionId ?? null,\n parentEntityType: span.parentEntityType ?? null,\n parentEntityId: span.parentEntityId ?? null,\n parentEntityName: span.parentEntityName ?? null,\n rootEntityVersionId: span.rootEntityVersionId ?? null,\n rootEntityType: span.rootEntityType ?? null,\n rootEntityId: span.rootEntityId ?? null,\n rootEntityName: span.rootEntityName ?? null,\n userId: span.userId ?? null,\n organizationId: span.organizationId ?? null,\n resourceId: span.resourceId ?? null,\n runId: span.runId ?? null,\n sessionId: span.sessionId ?? null,\n threadId: span.threadId ?? null,\n requestId: span.requestId ?? null,\n environment: span.environment ?? null,\n executionSource: span.source ?? null,\n serviceName: span.serviceName ?? null,\n name: span.name,\n spanType: span.spanType,\n isEvent: span.isEvent,\n startedAt: toISOString(span.startedAt),\n endedAt: toISOString(endedAt),\n tags: normalizeTags(span.tags),\n metadataSearch: buildMetadataSearch(metadata),\n metadataRaw: jsonEncode(metadata),\n scope: jsonEncode(span.scope),\n attributes: jsonEncode(span.attributes),\n links: jsonEncode(span.links),\n input: jsonEncode(span.input),\n output: jsonEncode(span.output),\n error: jsonEncode(span.error),\n requestContext: jsonEncode(span.requestContext),\n };\n}\n\nexport function rowToLogRecord(row: Record<string, any>): LogRecord {\n return {\n logId: row.logId,\n timestamp: toDate(row.timestamp),\n level: row.level,\n message: row.message,\n data: (parseJson(row.data) as Record<string, unknown> | null) ?? undefined,\n traceId: nullableString(row.traceId),\n spanId: nullableString(row.spanId),\n experimentId: nullableString(row.experimentId),\n entityType: nullableEntityType(row.entityType),\n entityId: nullableString(row.entityId),\n entityName: nullableString(row.entityName),\n entityVersionId: nullableString(row.entityVersionId),\n parentEntityVersionId: nullableString(row.parentEntityVersionId),\n parentEntityType: nullableEntityType(row.parentEntityType),\n parentEntityId: nullableString(row.parentEntityId),\n parentEntityName: nullableString(row.parentEntityName),\n rootEntityVersionId: nullableString(row.rootEntityVersionId),\n rootEntityType: nullableEntityType(row.rootEntityType),\n rootEntityId: nullableString(row.rootEntityId),\n rootEntityName: nullableString(row.rootEntityName),\n userId: nullableString(row.userId),\n organizationId: nullableString(row.organizationId),\n resourceId: nullableString(row.resourceId),\n runId: nullableString(row.runId),\n sessionId: nullableString(row.sessionId),\n threadId: nullableString(row.threadId),\n requestId: nullableString(row.requestId),\n environment: nullableString(row.environment),\n executionSource: nullableString(row.executionSource),\n serviceName: nullableString(row.serviceName),\n scope: (parseJson(row.scope) as Record<string, unknown> | null) ?? undefined,\n tags: normalizeTags(row.tags),\n metadata: (parseJson(row.metadata) as Record<string, unknown> | null) ?? undefined,\n };\n}\n\nexport function logRecordToRow(log: CreateLogRecord): Record<string, unknown> {\n return {\n logId: log.logId,\n timestamp: toISOString(log.timestamp),\n level: log.level,\n message: log.message,\n data: jsonEncode(log.data),\n traceId: log.traceId ?? null,\n spanId: log.spanId ?? null,\n experimentId: log.experimentId ?? null,\n entityType: log.entityType ?? null,\n entityId: log.entityId ?? null,\n entityName: log.entityName ?? null,\n entityVersionId: log.entityVersionId ?? null,\n parentEntityVersionId: log.parentEntityVersionId ?? null,\n parentEntityType: log.parentEntityType ?? null,\n parentEntityId: log.parentEntityId ?? null,\n parentEntityName: log.parentEntityName ?? null,\n rootEntityVersionId: log.rootEntityVersionId ?? null,\n rootEntityType: log.rootEntityType ?? null,\n rootEntityId: log.rootEntityId ?? null,\n rootEntityName: log.rootEntityName ?? null,\n userId: log.userId ?? null,\n organizationId: log.organizationId ?? null,\n resourceId: log.resourceId ?? null,\n runId: log.runId ?? null,\n sessionId: log.sessionId ?? null,\n threadId: log.threadId ?? null,\n requestId: log.requestId ?? null,\n environment: log.environment ?? null,\n executionSource: log.executionSource ?? log.source ?? null,\n serviceName: log.serviceName ?? null,\n tags: normalizeTags(log.tags),\n metadata: jsonEncode(log.metadata),\n scope: jsonEncode(log.scope),\n };\n}\n\nexport function rowToMetricRecord(row: Record<string, any>): MetricRecord {\n return {\n metricId: row.metricId,\n timestamp: toDate(row.timestamp),\n name: row.name,\n value: Number(row.value),\n traceId: nullableString(row.traceId),\n spanId: nullableString(row.spanId),\n experimentId: nullableString(row.experimentId),\n entityType: nullableEntityType(row.entityType),\n entityId: nullableString(row.entityId),\n entityName: nullableString(row.entityName),\n entityVersionId: nullableString(row.entityVersionId),\n parentEntityVersionId: nullableString(row.parentEntityVersionId),\n parentEntityType: nullableEntityType(row.parentEntityType),\n parentEntityId: nullableString(row.parentEntityId),\n parentEntityName: nullableString(row.parentEntityName),\n rootEntityVersionId: nullableString(row.rootEntityVersionId),\n rootEntityType: nullableEntityType(row.rootEntityType),\n rootEntityId: nullableString(row.rootEntityId),\n rootEntityName: nullableString(row.rootEntityName),\n userId: nullableString(row.userId),\n organizationId: nullableString(row.organizationId),\n resourceId: nullableString(row.resourceId),\n runId: nullableString(row.runId),\n sessionId: nullableString(row.sessionId),\n threadId: nullableString(row.threadId),\n requestId: nullableString(row.requestId),\n environment: nullableString(row.environment),\n executionSource: nullableString(row.executionSource),\n serviceName: nullableString(row.serviceName),\n scope: (parseJson(row.scope) as Record<string, unknown> | null) ?? undefined,\n provider: nullableString(row.provider),\n model: nullableString(row.model),\n estimatedCost: row.estimatedCost == null ? undefined : Number(row.estimatedCost),\n costUnit: nullableString(row.costUnit),\n costMetadata: (parseJson(row.costMetadata) as Record<string, unknown> | null) ?? undefined,\n tags: normalizeTags(row.tags),\n labels: normalizeLabels(row.labels as Record<string, unknown> | null | undefined),\n metadata: (parseJson(row.metadata) as Record<string, unknown> | null) ?? undefined,\n };\n}\n\nexport function metricRecordToRow(metric: CreateMetricRecord): Record<string, unknown> {\n return {\n metricId: metric.metricId,\n timestamp: toISOString(metric.timestamp),\n name: metric.name,\n value: metric.value,\n traceId: metric.traceId ?? null,\n spanId: metric.spanId ?? null,\n experimentId: metric.experimentId ?? null,\n entityType: metric.entityType ?? null,\n entityId: metric.entityId ?? null,\n entityName: metric.entityName ?? null,\n entityVersionId: metric.entityVersionId ?? null,\n parentEntityVersionId: metric.parentEntityVersionId ?? null,\n parentEntityType: metric.parentEntityType ?? null,\n parentEntityId: metric.parentEntityId ?? null,\n parentEntityName: metric.parentEntityName ?? null,\n rootEntityVersionId: metric.rootEntityVersionId ?? null,\n rootEntityType: metric.rootEntityType ?? null,\n rootEntityId: metric.rootEntityId ?? null,\n rootEntityName: metric.rootEntityName ?? null,\n userId: metric.userId ?? null,\n organizationId: metric.organizationId ?? null,\n resourceId: metric.resourceId ?? null,\n runId: metric.runId ?? null,\n sessionId: metric.sessionId ?? null,\n threadId: metric.threadId ?? null,\n requestId: metric.requestId ?? null,\n environment: metric.environment ?? null,\n executionSource: metric.executionSource ?? metric.source ?? null,\n serviceName: metric.serviceName ?? null,\n provider: metric.provider ?? null,\n model: metric.model ?? null,\n estimatedCost: metric.estimatedCost ?? null,\n costUnit: metric.costUnit ?? null,\n tags: normalizeTags(metric.tags),\n labels: normalizeLabels(metric.labels),\n costMetadata: jsonEncode(metric.costMetadata),\n metadata: jsonEncode(metric.metadata),\n scope: jsonEncode(metric.scope),\n };\n}\n\nexport function rowToScoreRecord(row: Record<string, any>): ScoreRecord {\n return {\n scoreId: row.scoreId,\n timestamp: toDate(row.timestamp),\n // Core score/feedback shapes still type traceId as required for now.\n traceId: nullableString(row.traceId) as ScoreRecord['traceId'],\n spanId: nullableString(row.spanId),\n experimentId: nullableString(row.experimentId),\n scoreTraceId: nullableString(row.scoreTraceId),\n entityType: nullableEntityType(row.entityType),\n entityId: nullableString(row.entityId),\n entityName: nullableString(row.entityName),\n entityVersionId: nullableString(row.entityVersionId),\n parentEntityVersionId: nullableString(row.parentEntityVersionId),\n parentEntityType: nullableEntityType(row.parentEntityType),\n parentEntityId: nullableString(row.parentEntityId),\n parentEntityName: nullableString(row.parentEntityName),\n rootEntityVersionId: nullableString(row.rootEntityVersionId),\n rootEntityType: nullableEntityType(row.rootEntityType),\n rootEntityId: nullableString(row.rootEntityId),\n rootEntityName: nullableString(row.rootEntityName),\n userId: nullableString(row.userId),\n organizationId: nullableString(row.organizationId),\n resourceId: nullableString(row.resourceId),\n runId: nullableString(row.runId),\n sessionId: nullableString(row.sessionId),\n threadId: nullableString(row.threadId),\n requestId: nullableString(row.requestId),\n environment: nullableString(row.environment),\n executionSource: nullableString(row.executionSource),\n serviceName: nullableString(row.serviceName),\n scorerId: row.scorerId,\n scorerVersion: nullableString(row.scorerVersion),\n scoreSource: nullableString(row.scoreSource),\n score: Number(row.score),\n reason: nullableString(row.reason),\n tags: normalizeTags(row.tags),\n metadata: (parseJson(row.metadata) as Record<string, unknown> | null) ?? undefined,\n scope: (parseJson(row.scope) as Record<string, unknown> | null) ?? undefined,\n };\n}\n\nexport function scoreRecordToRow(score: CreateScoreRecord): Record<string, unknown> {\n const metadata = score.metadata ?? null;\n const scoreSource = score.scoreSource ?? score.source ?? null;\n\n return {\n scoreId: score.scoreId,\n timestamp: toISOString(score.timestamp),\n traceId: score.traceId ?? null,\n spanId: score.spanId ?? null,\n experimentId: score.experimentId ?? null,\n scoreTraceId: score.scoreTraceId ?? null,\n entityType: score.entityType ?? null,\n entityId: score.entityId ?? null,\n entityName: score.entityName ?? null,\n entityVersionId: score.entityVersionId ?? null,\n parentEntityVersionId: score.parentEntityVersionId ?? null,\n parentEntityType: score.parentEntityType ?? null,\n parentEntityId: score.parentEntityId ?? null,\n parentEntityName: score.parentEntityName ?? null,\n rootEntityVersionId: score.rootEntityVersionId ?? null,\n rootEntityType: score.rootEntityType ?? null,\n rootEntityId: score.rootEntityId ?? null,\n rootEntityName: score.rootEntityName ?? null,\n userId: score.userId ?? null,\n organizationId: score.organizationId ?? null,\n resourceId: score.resourceId ?? null,\n runId: score.runId ?? null,\n sessionId: score.sessionId ?? null,\n threadId: score.threadId ?? null,\n requestId: score.requestId ?? null,\n environment: score.environment ?? null,\n executionSource: score.executionSource ?? null,\n serviceName: score.serviceName ?? null,\n scorerId: score.scorerId,\n scorerVersion: score.scorerVersion ?? null,\n scoreSource,\n score: score.score,\n reason: score.reason ?? null,\n tags: normalizeTags(score.tags),\n metadata: jsonEncode(metadata),\n scope: jsonEncode(score.scope),\n };\n}\n\nexport function rowToFeedbackRecord(row: Record<string, any>): FeedbackRecord {\n const hasNumber = row.valueNumber != null;\n const feedbackSource = nullableString(row.feedbackSource);\n const feedbackUserId = nullableString(row.feedbackUserId) ?? nullableString(row.userId);\n return {\n feedbackId: row.feedbackId,\n timestamp: toDate(row.timestamp),\n // Core score/feedback shapes still type traceId as required for now.\n traceId: nullableString(row.traceId) as FeedbackRecord['traceId'],\n spanId: nullableString(row.spanId),\n experimentId: nullableString(row.experimentId),\n entityType: nullableEntityType(row.entityType),\n entityId: nullableString(row.entityId),\n entityName: nullableString(row.entityName),\n entityVersionId: nullableString(row.entityVersionId),\n parentEntityVersionId: nullableString(row.parentEntityVersionId),\n parentEntityType: nullableEntityType(row.parentEntityType),\n parentEntityId: nullableString(row.parentEntityId),\n parentEntityName: nullableString(row.parentEntityName),\n rootEntityVersionId: nullableString(row.rootEntityVersionId),\n rootEntityType: nullableEntityType(row.rootEntityType),\n rootEntityId: nullableString(row.rootEntityId),\n rootEntityName: nullableString(row.rootEntityName),\n userId: nullableString(row.userId),\n organizationId: nullableString(row.organizationId),\n resourceId: nullableString(row.resourceId),\n runId: nullableString(row.runId),\n sessionId: nullableString(row.sessionId),\n threadId: nullableString(row.threadId),\n requestId: nullableString(row.requestId),\n environment: nullableString(row.environment),\n executionSource: nullableString(row.executionSource),\n serviceName: nullableString(row.serviceName),\n feedbackUserId,\n sourceId: nullableString(row.sourceId),\n feedbackSource,\n feedbackType: row.feedbackType,\n value: hasNumber ? Number(row.valueNumber) : (nullableString(row.valueString) ?? ''),\n comment: nullableString(row.comment),\n tags: normalizeTags(row.tags),\n metadata: (parseJson(row.metadata) as Record<string, unknown> | null) ?? undefined,\n scope: (parseJson(row.scope) as Record<string, unknown> | null) ?? undefined,\n };\n}\n\nexport function feedbackRecordToRow(feedback: CreateFeedbackRecord): Record<string, unknown> {\n const metadata = feedback.metadata ?? null;\n const feedbackSource = feedback.feedbackSource ?? feedback.source ?? '';\n const feedbackUserId = feedback.feedbackUserId ?? feedback.userId ?? null;\n\n return {\n feedbackId: feedback.feedbackId,\n timestamp: toISOString(feedback.timestamp),\n traceId: feedback.traceId ?? null,\n spanId: feedback.spanId ?? null,\n experimentId: feedback.experimentId ?? null,\n entityType: feedback.entityType ?? null,\n entityId: feedback.entityId ?? null,\n entityName: feedback.entityName ?? null,\n entityVersionId: feedback.entityVersionId ?? null,\n parentEntityVersionId: feedback.parentEntityVersionId ?? null,\n parentEntityType: feedback.parentEntityType ?? null,\n parentEntityId: feedback.parentEntityId ?? null,\n parentEntityName: feedback.parentEntityName ?? null,\n rootEntityVersionId: feedback.rootEntityVersionId ?? null,\n rootEntityType: feedback.rootEntityType ?? null,\n rootEntityId: feedback.rootEntityId ?? null,\n rootEntityName: feedback.rootEntityName ?? null,\n userId: feedbackUserId,\n organizationId: feedback.organizationId ?? null,\n resourceId: feedback.resourceId ?? null,\n runId: feedback.runId ?? null,\n sessionId: feedback.sessionId ?? null,\n threadId: feedback.threadId ?? null,\n requestId: feedback.requestId ?? null,\n environment: feedback.environment ?? null,\n executionSource: feedback.executionSource ?? null,\n serviceName: feedback.serviceName ?? null,\n feedbackUserId,\n sourceId: feedback.sourceId ?? null,\n feedbackSource,\n feedbackType: feedback.feedbackType,\n valueString: typeof feedback.value === 'string' ? feedback.value : null,\n valueNumber: typeof feedback.value === 'number' ? feedback.value : null,\n comment: feedback.comment ?? null,\n tags: normalizeTags(feedback.tags),\n metadata: jsonEncode(metadata),\n scope: jsonEncode(feedback.scope),\n };\n}\n","/**\n * General discovery methods for ClickHouse v-next observability.\n *\n * Reads from discovery_values and discovery_pairs helper tables,\n * which are populated by refreshable materialized views.\n *\n * Per design: discovery methods return empty results until the\n * helper tables have been initialized and refreshed successfully.\n * They do NOT fall back to base-table scans.\n */\n\nimport type { ClickHouseClient } from '@clickhouse/client';\nimport { EntityType } from '@mastra/core/storage';\nimport type {\n GetEntityTypesArgs,\n GetEntityTypesResponse,\n GetEntityNamesArgs,\n GetEntityNamesResponse,\n GetServiceNamesArgs,\n GetServiceNamesResponse,\n GetEnvironmentsArgs,\n GetEnvironmentsResponse,\n GetTagsArgs,\n GetTagsResponse,\n} from '@mastra/core/storage';\n\nimport { TABLE_DISCOVERY_VALUES, TABLE_DISCOVERY_PAIRS } from './ddl';\nimport { CH_SETTINGS } from './helpers';\n\nasync function queryJson<T>(\n client: ClickHouseClient,\n query: string,\n params: Record<string, unknown> = {},\n): Promise<T[]> {\n return (await (\n await client.query({\n query,\n query_params: params,\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n })\n ).json()) as T[];\n}\n\n// -- Entity discovery ---------------------------------------------------------\n\nexport async function getEntityTypes(\n client: ClickHouseClient,\n _args: GetEntityTypesArgs,\n): Promise<GetEntityTypesResponse> {\n const rows = await queryJson<{ value: string }>(\n client,\n `SELECT value FROM ${TABLE_DISCOVERY_VALUES} WHERE kind = 'entityType' ORDER BY value`,\n );\n\n const validTypes = new Set(Object.values(EntityType));\n const entityTypes: EntityType[] = [];\n for (const row of rows) {\n if (validTypes.has(row.value as EntityType)) {\n entityTypes.push(row.value as EntityType);\n }\n }\n return { entityTypes };\n}\n\nexport async function getEntityNames(\n client: ClickHouseClient,\n args: GetEntityNamesArgs,\n): Promise<GetEntityNamesResponse> {\n const conditions = [`kind = 'entityTypeName'`];\n const params: Record<string, unknown> = {};\n\n if (args.entityType) {\n conditions.push('key1 = {entityType:String}');\n params.entityType = args.entityType;\n }\n\n const rows = await queryJson<{ value: string }>(\n client,\n `SELECT value FROM ${TABLE_DISCOVERY_PAIRS} WHERE ${conditions.join(' AND ')} ORDER BY value`,\n params,\n );\n return { names: rows.map(r => r.value) };\n}\n\n// -- Service & environment discovery ------------------------------------------\n\nexport async function getServiceNames(\n client: ClickHouseClient,\n _args: GetServiceNamesArgs,\n): Promise<GetServiceNamesResponse> {\n const rows = await queryJson<{ value: string }>(\n client,\n `SELECT value FROM ${TABLE_DISCOVERY_VALUES} WHERE kind = 'serviceName' ORDER BY value`,\n );\n return { serviceNames: rows.map(r => r.value) };\n}\n\nexport async function getEnvironments(\n client: ClickHouseClient,\n _args: GetEnvironmentsArgs,\n): Promise<GetEnvironmentsResponse> {\n const rows = await queryJson<{ value: string }>(\n client,\n `SELECT value FROM ${TABLE_DISCOVERY_VALUES} WHERE kind = 'environment' ORDER BY value`,\n );\n return { environments: rows.map(r => r.value) };\n}\n\n// -- Tag discovery ------------------------------------------------------------\n\nexport async function getTags(client: ClickHouseClient, args: GetTagsArgs): Promise<GetTagsResponse> {\n const conditions = [`kind = 'tag'`];\n const params: Record<string, unknown> = {};\n\n if (args.entityType) {\n conditions.push('key1 = {entityType:String}');\n params.entityType = args.entityType;\n }\n\n const rows = await queryJson<{ value: string }>(\n client,\n `SELECT value FROM ${TABLE_DISCOVERY_VALUES} WHERE ${conditions.join(' AND ')} ORDER BY value`,\n params,\n );\n return { tags: rows.map(r => r.value) };\n}\n","/**\n * ClickHouse v-next filter builders.\n *\n * Produces { conditions: string[], params: Record<string, unknown> } tuples\n * that get AND-joined into WHERE clauses with parameterized values.\n */\n\nimport { TraceStatus } from '@mastra/core/storage';\nimport type {\n ListTracesArgs,\n ListLogsArgs,\n ListMetricsArgs,\n ListScoresArgs,\n ListFeedbackArgs,\n tracesFilterSchema,\n logsFilterSchema,\n metricsFilterSchema,\n scoresFilterSchema,\n feedbackFilterSchema,\n} from '@mastra/core/storage';\nimport type { z } from 'zod/v4';\n\ntype TracesFilter = z.infer<typeof tracesFilterSchema>;\ntype LogsFilter = z.infer<typeof logsFilterSchema>;\ntype MetricsFilter = z.infer<typeof metricsFilterSchema>;\ntype ScoresFilter = z.infer<typeof scoresFilterSchema>;\ntype FeedbackFilter = z.infer<typeof feedbackFilterSchema>;\ntype TracesOrderBy = ListTracesArgs['orderBy'];\ntype LogsOrderBy = ListLogsArgs['orderBy'];\ntype MetricsOrderBy = ListMetricsArgs['orderBy'];\ntype ScoresOrderBy = ListScoresArgs['orderBy'];\ntype FeedbackOrderBy = ListFeedbackArgs['orderBy'];\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface FilterResult {\n conditions: string[];\n params: Record<string, unknown>;\n}\n\ninterface DateRange {\n start?: Date;\n end?: Date;\n startExclusive?: boolean;\n endExclusive?: boolean;\n}\n\nfunction assertNoDeprecatedSourceFilter(\n source: string | undefined,\n replacement: string,\n signalName: 'logs' | 'metrics' | 'scores' | 'feedback',\n): void {\n if (source === undefined) return;\n throw new Error(`Deprecated \\`source\\` filter is not supported for ${signalName}; use \\`${replacement}\\` instead.`);\n}\n\n// ---------------------------------------------------------------------------\n// Date range helper\n// ---------------------------------------------------------------------------\n\nfunction addDateRange(column: string, range: DateRange | undefined, prefix: string, out: FilterResult): void {\n if (!range) return;\n if (range.start) {\n const op = range.startExclusive ? '>' : '>=';\n const param = `${prefix}Start`;\n out.conditions.push(`${column} ${op} {${param}:DateTime64(3)}`);\n out.params[param] = range.start.getTime();\n }\n if (range.end) {\n const op = range.endExclusive ? '<' : '<=';\n const param = `${prefix}End`;\n out.conditions.push(`${column} ${op} {${param}:DateTime64(3)}`);\n out.params[param] = range.end.getTime();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Simple equality helper\n// ---------------------------------------------------------------------------\n\nfunction addEq(column: string, value: unknown, paramName: string, paramType: string, out: FilterResult): void {\n if (value == null) return;\n out.conditions.push(`${column} = {${paramName}:${paramType}}`);\n out.params[paramName] = value;\n}\n\nfunction addIn(column: string, values: string[] | undefined, paramName: string, out: FilterResult): void {\n if (!values?.length) return;\n out.conditions.push(`${column} IN {${paramName}:Array(String)}`);\n out.params[paramName] = values;\n}\n\nfunction addTags(column: string, tags: unknown, out: FilterResult): void {\n if (!Array.isArray(tags) || tags.length === 0) return;\n for (let i = 0; i < tags.length; i++) {\n const tag = tags[i];\n if (typeof tag !== 'string' || tag.trim() === '') continue;\n const param = `tag_${i}`;\n out.conditions.push(`has(${column}, {${param}:String})`);\n out.params[param] = tag;\n }\n}\n\nfunction addStringMapFilters(\n column: string,\n values: Record<string, unknown> | null | undefined,\n keyPrefix: string,\n valuePrefix: string,\n out: FilterResult,\n): void {\n if (values == null || typeof values !== 'object') return;\n let i = 0;\n for (const [key, value] of Object.entries(values)) {\n if (typeof value !== 'string') continue;\n const keyParam = `${keyPrefix}_${i}`;\n const valParam = `${valuePrefix}_${i}`;\n out.conditions.push(`${column}[{${keyParam}:String}] = {${valParam}:String}`);\n out.params[keyParam] = key;\n out.params[valParam] = value;\n i++;\n }\n}\n\n/**\n * Adds shared context filter conditions (commonFilterFields) to the output.\n * Used by logs, metrics, scores, and feedback filter builders.\n */\nfunction addCommonFilterFields(\n filters: {\n timestamp?: unknown;\n traceId?: string;\n spanId?: string;\n entityType?: string;\n entityName?: string;\n entityVersionId?: string;\n parentEntityVersionId?: string;\n parentEntityType?: string;\n parentEntityName?: string;\n rootEntityVersionId?: string;\n rootEntityType?: string;\n rootEntityName?: string;\n userId?: string;\n organizationId?: string;\n experimentId?: string;\n resourceId?: string;\n runId?: string;\n sessionId?: string;\n threadId?: string;\n requestId?: string;\n serviceName?: string;\n environment?: string;\n executionSource?: string;\n tags?: string[];\n },\n tableAlias: string | undefined,\n out: FilterResult,\n): void {\n const col = (name: string) => (tableAlias ? `${tableAlias}.${name}` : name);\n\n addDateRange(col('timestamp'), filters.timestamp as DateRange | undefined, 'timestamp', out);\n addEq(col('traceId'), filters.traceId, 'traceId', 'String', out);\n addEq(col('spanId'), filters.spanId, 'spanId', 'String', out);\n addEq(col('entityType'), filters.entityType, 'entityType', 'String', out);\n addEq(col('entityName'), filters.entityName, 'entityName', 'String', out);\n addEq(col('entityVersionId'), filters.entityVersionId, 'entityVersionId', 'String', out);\n addEq(col('parentEntityVersionId'), filters.parentEntityVersionId, 'parentEntityVersionId', 'String', out);\n addEq(col('parentEntityType'), filters.parentEntityType, 'parentEntityType', 'String', out);\n addEq(col('parentEntityName'), filters.parentEntityName, 'parentEntityName', 'String', out);\n addEq(col('rootEntityVersionId'), filters.rootEntityVersionId, 'rootEntityVersionId', 'String', out);\n addEq(col('rootEntityType'), filters.rootEntityType, 'rootEntityType', 'String', out);\n addEq(col('rootEntityName'), filters.rootEntityName, 'rootEntityName', 'String', out);\n addEq(col('userId'), filters.userId, 'userId', 'String', out);\n addEq(col('organizationId'), filters.organizationId, 'organizationId', 'String', out);\n addEq(col('experimentId'), filters.experimentId, 'experimentId', 'String', out);\n addEq(col('resourceId'), filters.resourceId, 'resourceId', 'String', out);\n addEq(col('runId'), filters.runId, 'runId', 'String', out);\n addEq(col('sessionId'), filters.sessionId, 'sessionId', 'String', out);\n addEq(col('threadId'), filters.threadId, 'threadId', 'String', out);\n addEq(col('requestId'), filters.requestId, 'requestId', 'String', out);\n addEq(col('serviceName'), filters.serviceName, 'serviceName', 'String', out);\n addEq(col('environment'), filters.environment, 'environment', 'String', out);\n addEq(col('executionSource'), filters.executionSource, 'executionSource', 'String', out);\n addTags(col('tags'), filters.tags, out);\n}\n\n// ---------------------------------------------------------------------------\n// Trace filter builder (for trace_roots table)\n// ---------------------------------------------------------------------------\n\nexport function buildTraceFilterConditions(filters: TracesFilter | undefined, tableAlias?: string): FilterResult {\n const out: FilterResult = { conditions: [], params: {} };\n if (!filters) return out;\n\n const col = (name: string) => (tableAlias ? `${tableAlias}.${name}` : name);\n\n addDateRange(col('startedAt'), filters.startedAt as DateRange | undefined, 'startedAt', out);\n addDateRange(col('endedAt'), filters.endedAt as DateRange | undefined, 'endedAt', out);\n addEq(col('spanType'), filters.spanType, 'spanType', 'String', out);\n addEq(col('entityType'), filters.entityType, 'entityType', 'String', out);\n addEq(col('entityId'), filters.entityId, 'entityId', 'String', out);\n addEq(col('entityName'), filters.entityName, 'entityName', 'String', out);\n addEq(col('entityVersionId'), filters.entityVersionId, 'entityVersionId', 'String', out);\n addEq(col('parentEntityVersionId'), filters.parentEntityVersionId, 'parentEntityVersionId', 'String', out);\n addEq(col('parentEntityType'), filters.parentEntityType, 'parentEntityType', 'String', out);\n addEq(col('parentEntityId'), filters.parentEntityId, 'parentEntityId', 'String', out);\n addEq(col('parentEntityName'), filters.parentEntityName, 'parentEntityName', 'String', out);\n addEq(col('rootEntityVersionId'), filters.rootEntityVersionId, 'rootEntityVersionId', 'String', out);\n addEq(col('rootEntityType'), filters.rootEntityType, 'rootEntityType', 'String', out);\n addEq(col('rootEntityId'), filters.rootEntityId, 'rootEntityId', 'String', out);\n addEq(col('rootEntityName'), filters.rootEntityName, 'rootEntityName', 'String', out);\n addEq(col('experimentId'), filters.experimentId, 'experimentId', 'String', out);\n addEq(col('userId'), filters.userId, 'userId', 'String', out);\n addEq(col('organizationId'), filters.organizationId, 'organizationId', 'String', out);\n addEq(col('resourceId'), filters.resourceId, 'resourceId', 'String', out);\n addEq(col('runId'), filters.runId, 'runId', 'String', out);\n addEq(col('sessionId'), filters.sessionId, 'sessionId', 'String', out);\n addEq(col('threadId'), filters.threadId, 'threadId', 'String', out);\n addEq(col('requestId'), filters.requestId, 'requestId', 'String', out);\n addEq(col('environment'), filters.environment, 'environment', 'String', out);\n // Trace filters still accept `source`, but it maps to the `executionSource` DB column.\n addEq(col('executionSource'), filters.source, 'source', 'String', out);\n addEq(col('serviceName'), filters.serviceName, 'serviceName', 'String', out);\n\n addTags(col('tags'), filters.tags, out);\n addStringMapFilters(col('metadataSearch'), filters.metadata, 'meta_k', 'meta_v', out);\n\n if (filters.status === TraceStatus.ERROR) {\n out.conditions.push(`${col('error')} IS NOT NULL`);\n } else if (filters.status === TraceStatus.SUCCESS) {\n out.conditions.push(`${col('error')} IS NULL`);\n } else if (filters.status === TraceStatus.RUNNING) {\n out.conditions.push('1 = 0');\n }\n\n return out;\n}\n\nexport function buildLogsFilterConditions(filters: LogsFilter | undefined, tableAlias?: string): FilterResult {\n const out: FilterResult = { conditions: [], params: {} };\n if (!filters) return out;\n\n const col = (name: string) => (tableAlias ? `${tableAlias}.${name}` : name);\n assertNoDeprecatedSourceFilter(filters.source, 'executionSource', 'logs');\n addCommonFilterFields(filters, tableAlias, out);\n\n if (typeof filters.level === 'string') {\n addEq(col('level'), filters.level, 'level', 'String', out);\n } else if (Array.isArray(filters.level)) {\n addIn(col('level'), filters.level, 'levels', out);\n }\n\n return out;\n}\n\nexport function buildMetricsFilterConditions(filters: MetricsFilter | undefined, tableAlias?: string): FilterResult {\n const out: FilterResult = { conditions: [], params: {} };\n if (!filters) return out;\n\n const col = (name: string) => (tableAlias ? `${tableAlias}.${name}` : name);\n assertNoDeprecatedSourceFilter(filters.source, 'executionSource', 'metrics');\n addCommonFilterFields(filters, tableAlias, out);\n addIn(col('name'), filters.name, 'metricNames', out);\n addEq(col('provider'), filters.provider, 'provider', 'String', out);\n addEq(col('model'), filters.model, 'model', 'String', out);\n addEq(col('costUnit'), filters.costUnit, 'costUnit', 'String', out);\n addStringMapFilters(col('labels'), filters.labels, 'label_k', 'label_v', out);\n\n return out;\n}\n\nexport function buildScoresFilterConditions(filters: ScoresFilter | undefined, tableAlias?: string): FilterResult {\n const out: FilterResult = { conditions: [], params: {} };\n if (!filters) return out;\n assertNoDeprecatedSourceFilter(filters.source, 'scoreSource or executionSource', 'scores');\n\n const col = (name: string) => (tableAlias ? `${tableAlias}.${name}` : name);\n\n // Shared context filters (scores have dedicated executionSource column)\n addCommonFilterFields(filters, tableAlias, out);\n\n // Score-specific filters\n addEq(col('scoreSource'), filters.scoreSource, 'scoreSource', 'String', out);\n\n if (typeof filters.scorerId === 'string') {\n addEq(col('scorerId'), filters.scorerId, 'scorerId', 'String', out);\n } else if (Array.isArray(filters.scorerId)) {\n addIn(col('scorerId'), filters.scorerId, 'scorerIds', out);\n }\n\n return out;\n}\n\nexport function buildFeedbackFilterConditions(filters: FeedbackFilter | undefined, tableAlias?: string): FilterResult {\n const out: FilterResult = { conditions: [], params: {} };\n if (!filters) return out;\n assertNoDeprecatedSourceFilter(filters.source, 'feedbackSource or executionSource', 'feedback');\n\n const col = (name: string) => (tableAlias ? `${tableAlias}.${name}` : name);\n\n // Shared context filters (feedback has dedicated executionSource column)\n addCommonFilterFields(filters, tableAlias, out);\n\n // Feedback-specific filters\n const fbActor = filters.feedbackUserId ?? filters.userId;\n // feedbackUserId filter targets the dedicated feedbackUserId column\n addEq(col('feedbackUserId'), fbActor, 'feedbackUserId', 'String', out);\n\n addEq(col('feedbackSource'), filters.feedbackSource, 'feedbackSource', 'String', out);\n\n if (typeof filters.feedbackType === 'string') {\n addEq(col('feedbackType'), filters.feedbackType, 'feedbackType', 'String', out);\n } else if (Array.isArray(filters.feedbackType)) {\n addIn(col('feedbackType'), filters.feedbackType, 'feedbackTypes', out);\n }\n\n return out;\n}\n\nexport function buildTraceOrderByClause(orderBy: TracesOrderBy, tableAlias?: string): string {\n return buildOrderByClause(['startedAt', 'endedAt'] as const, orderBy, tableAlias, 'startedAt');\n}\n\nfunction buildOrderByClause<TField extends string>(\n allowedFields: readonly TField[],\n orderBy: { field?: TField; direction?: 'ASC' | 'DESC' } | undefined,\n tableAlias: string | undefined,\n defaultField: TField,\n): string {\n const field = orderBy?.field && allowedFields.includes(orderBy.field) ? orderBy.field : defaultField;\n const direction = orderBy?.direction === 'ASC' ? 'ASC' : 'DESC';\n const col = tableAlias ? `${tableAlias}.${field}` : field;\n return `${col} ${direction}`;\n}\n\nexport function buildSignalOrderByClause<TField extends string>(\n allowedFields: readonly TField[],\n orderBy:\n | LogsOrderBy\n | MetricsOrderBy\n | ScoresOrderBy\n | FeedbackOrderBy\n | { field?: TField; direction?: 'ASC' | 'DESC' }\n | undefined,\n tableAlias?: string,\n defaultField = 'timestamp' as TField,\n): string {\n return buildOrderByClause(\n allowedFields,\n orderBy as { field?: TField; direction?: 'ASC' | 'DESC' } | undefined,\n tableAlias,\n defaultField,\n );\n}\n\nexport function buildPaginationClause(pagination: { page?: number; perPage?: number } | undefined): {\n page: number;\n perPage: number;\n limit: number;\n offset: number;\n} {\n const page = Math.max(0, Number(pagination?.page ?? 0));\n const perPage = Math.max(1, Number(pagination?.perPage ?? 10));\n return {\n page,\n perPage,\n limit: perPage,\n offset: page * perPage,\n };\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { listFeedbackArgsSchema } from '@mastra/core/storage';\nimport type {\n AggregationInterval,\n AggregationType,\n BatchCreateFeedbackArgs,\n CreateFeedbackArgs,\n ListFeedbackArgs,\n ListFeedbackResponse,\n GetFeedbackAggregateArgs,\n GetFeedbackAggregateResponse,\n GetFeedbackBreakdownArgs,\n GetFeedbackBreakdownResponse,\n GetFeedbackTimeSeriesArgs,\n GetFeedbackTimeSeriesResponse,\n GetFeedbackPercentilesArgs,\n GetFeedbackPercentilesResponse,\n} from '@mastra/core/storage';\nimport { parseFieldKey } from '@mastra/core/utils';\n\nimport { TABLE_FEEDBACK_EVENTS } from './ddl';\nimport { buildFeedbackFilterConditions, buildPaginationClause, buildSignalOrderByClause } from './filters';\nimport type { FilterResult } from './filters';\nimport { CH_INSERT_SETTINGS, CH_SETTINGS, feedbackRecordToRow, rowToFeedbackRecord } from './helpers';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst FEEDBACK_TYPED_COLUMNS = new Set([\n 'timestamp',\n 'traceId',\n 'spanId',\n 'experimentId',\n 'entityType',\n 'entityId',\n 'entityName',\n 'entityVersionId',\n 'parentEntityVersionId',\n 'parentEntityType',\n 'parentEntityId',\n 'parentEntityName',\n 'rootEntityVersionId',\n 'rootEntityType',\n 'rootEntityId',\n 'rootEntityName',\n 'userId',\n 'organizationId',\n 'resourceId',\n 'runId',\n 'sessionId',\n 'threadId',\n 'requestId',\n 'environment',\n 'executionSource',\n 'serviceName',\n 'feedbackUserId',\n 'sourceId',\n 'feedbackSource',\n 'feedbackType',\n 'valueNumber',\n 'comment',\n]);\n\nconst GROUP_BY_EXCLUDED = new Set(['metadata', 'scope', 'tags']);\n\nfunction getAggregationSql(aggregation: AggregationType, measure = 'valueNumber'): string {\n switch (aggregation) {\n case 'sum':\n return `sum(${measure})`;\n case 'avg':\n return `avg(${measure})`;\n case 'min':\n return `min(${measure})`;\n case 'max':\n return `max(${measure})`;\n case 'count':\n return `toFloat64(count(${measure}))`;\n case 'last':\n return `argMax(${measure}, timestamp)`;\n default:\n return `sum(${measure})`;\n }\n}\n\nfunction getIntervalSql(interval: AggregationInterval): string {\n switch (interval) {\n case '1m':\n return 'INTERVAL 1 MINUTE';\n case '5m':\n return 'INTERVAL 5 MINUTE';\n case '15m':\n return 'INTERVAL 15 MINUTE';\n case '1h':\n return 'INTERVAL 1 HOUR';\n case '1d':\n return 'INTERVAL 1 DAY';\n default:\n return 'INTERVAL 1 HOUR';\n }\n}\n\nfunction mergeFilters(...parts: FilterResult[]): FilterResult {\n const conditions: string[] = [];\n const params: Record<string, unknown> = {};\n for (const part of parts) {\n conditions.push(...part.conditions);\n Object.assign(params, part.params);\n }\n return { conditions, params };\n}\n\nfunction toWhereClause(filter: FilterResult): string {\n return filter.conditions.length ? `WHERE ${filter.conditions.join(' AND ')}` : '';\n}\n\nfunction buildFeedbackIdentityFilter(\n args: Pick<GetFeedbackAggregateArgs, 'feedbackType' | 'feedbackSource'>,\n): FilterResult {\n const conditions: string[] = ['feedbackType = {olapFeedbackType:String}'];\n const params: Record<string, unknown> = { olapFeedbackType: args.feedbackType };\n\n if (args.feedbackSource !== undefined) {\n conditions.push('feedbackSource = {olapFeedbackSource:String}');\n params.olapFeedbackSource = args.feedbackSource;\n }\n\n // Only aggregate rows with numeric values\n conditions.push('valueNumber IS NOT NULL');\n\n return { conditions, params };\n}\n\nfunction resolveFeedbackGroupBy(groupBy: string[]): { key: string; selectSql: string; groupSql: string }[] {\n return groupBy.map((key, index) => {\n const column = parseFieldKey(key);\n if (!FEEDBACK_TYPED_COLUMNS.has(column) || GROUP_BY_EXCLUDED.has(column)) {\n throw new Error(`Invalid groupBy column(s): ${key}`);\n }\n const alias = `group_by_${index}`;\n return { key, selectSql: `${column} AS ${alias}`, groupSql: alias };\n });\n}\n\nfunction toSeriesName(values: unknown[]): string {\n return values.map(v => (v == null ? '' : String(v))).join('|');\n}\n\nasync function queryJson<T>(client: ClickHouseClient, query: string, params: Record<string, unknown>): Promise<T[]> {\n return (await (\n await client.query({\n query,\n query_params: params,\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n })\n ).json()) as T[];\n}\n\n// ============================================================================\n// Write\n// ============================================================================\n\nexport async function createFeedback(client: ClickHouseClient, args: CreateFeedbackArgs): Promise<void> {\n await batchCreateFeedback(client, { feedbacks: [args.feedback] });\n}\n\nexport async function batchCreateFeedback(client: ClickHouseClient, args: BatchCreateFeedbackArgs): Promise<void> {\n if (args.feedbacks.length === 0) return;\n\n await client.insert({\n table: TABLE_FEEDBACK_EVENTS,\n values: args.feedbacks.map(feedbackRecordToRow),\n format: 'JSONEachRow',\n clickhouse_settings: CH_INSERT_SETTINGS,\n });\n}\n\n// ============================================================================\n// List\n// ============================================================================\n\nexport async function listFeedback(client: ClickHouseClient, args: ListFeedbackArgs): Promise<ListFeedbackResponse> {\n const parsed = listFeedbackArgsSchema.parse(args);\n const filter = buildFeedbackFilterConditions(parsed.filters, 'f');\n const pagination = buildPaginationClause(parsed.pagination);\n const orderBy = buildSignalOrderByClause(['timestamp'], parsed.orderBy, 'f');\n const whereClause = filter.conditions.length ? `WHERE ${filter.conditions.join(' AND ')}` : '';\n\n const countResult = await queryJson<{ total?: number }>(\n client,\n `SELECT count() AS total FROM ${TABLE_FEEDBACK_EVENTS} AS f ${whereClause}`,\n filter.params,\n );\n\n const rows = await queryJson<Record<string, any>>(\n client,\n `SELECT * FROM ${TABLE_FEEDBACK_EVENTS} AS f ${whereClause} ORDER BY ${orderBy} LIMIT {limit:UInt32} OFFSET {offset:UInt32}`,\n { ...filter.params, limit: pagination.limit, offset: pagination.offset },\n );\n\n const total = Number(countResult[0]?.total ?? 0);\n\n return {\n pagination: {\n total,\n page: pagination.page,\n perPage: pagination.perPage,\n hasMore: (pagination.page + 1) * pagination.perPage < total,\n },\n feedback: rows.map(rowToFeedbackRecord),\n };\n}\n\n// ============================================================================\n// OLAP Queries\n// ============================================================================\n\nexport async function getFeedbackAggregate(\n client: ClickHouseClient,\n args: GetFeedbackAggregateArgs,\n): Promise<GetFeedbackAggregateResponse> {\n const aggSql = getAggregationSql(args.aggregation);\n const identity = buildFeedbackIdentityFilter(args);\n const signalFilter = buildFeedbackFilterConditions(args.filters);\n const combined = mergeFilters(identity, signalFilter);\n const whereClause = toWhereClause(combined);\n\n const sql = `SELECT ${aggSql} AS value FROM ${TABLE_FEEDBACK_EVENTS} ${whereClause}`;\n const result = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n const value = result[0]?.value == null ? null : Number(result[0]?.value);\n\n if (args.comparePeriod && args.filters?.timestamp) {\n const ts = args.filters.timestamp;\n if (ts.start && ts.end) {\n const duration = ts.end.getTime() - ts.start.getTime();\n let prevStart: Date;\n let prevEnd: Date;\n\n switch (args.comparePeriod) {\n case 'previous_period':\n prevStart = new Date(ts.start.getTime() - duration);\n prevEnd = new Date(ts.end.getTime() - duration);\n break;\n case 'previous_day':\n prevStart = new Date(ts.start.getTime() - 86400000);\n prevEnd = new Date(ts.end.getTime() - 86400000);\n break;\n case 'previous_week':\n prevStart = new Date(ts.start.getTime() - 604800000);\n prevEnd = new Date(ts.end.getTime() - 604800000);\n break;\n default:\n prevStart = new Date(ts.start.getTime() - duration);\n prevEnd = new Date(ts.end.getTime() - duration);\n }\n\n const prevFilters = {\n ...(args.filters ?? {}),\n timestamp: { start: prevStart, end: prevEnd, startExclusive: ts.startExclusive, endExclusive: ts.endExclusive },\n };\n const prevSignalFilter = buildFeedbackFilterConditions(prevFilters);\n const prevCombined = mergeFilters(identity, prevSignalFilter);\n const prevWhereClause = toWhereClause(prevCombined);\n\n const prevResult = await queryJson<Record<string, unknown>>(\n client,\n `SELECT ${aggSql} AS value FROM ${TABLE_FEEDBACK_EVENTS} ${prevWhereClause}`,\n prevCombined.params,\n );\n const previousValue = prevResult[0]?.value == null ? null : Number(prevResult[0]?.value);\n\n let changePercent: number | null = null;\n if (previousValue !== null && previousValue !== 0 && value !== null) {\n changePercent = ((value - previousValue) / Math.abs(previousValue)) * 100;\n }\n\n return { value, previousValue, changePercent };\n }\n }\n\n return { value };\n}\n\nexport async function getFeedbackBreakdown(\n client: ClickHouseClient,\n args: GetFeedbackBreakdownArgs,\n): Promise<GetFeedbackBreakdownResponse> {\n const aggSql = getAggregationSql(args.aggregation);\n const identity = buildFeedbackIdentityFilter(args);\n const signalFilter = buildFeedbackFilterConditions(args.filters);\n const combined = mergeFilters(identity, signalFilter);\n const whereClause = toWhereClause(combined);\n const resolved = resolveFeedbackGroupBy(args.groupBy);\n\n const sql = `SELECT ${resolved.map(e => e.selectSql).join(', ')}, ${aggSql} AS value FROM ${TABLE_FEEDBACK_EVENTS} ${whereClause} GROUP BY ${resolved.map(e => e.groupSql).join(', ')} ORDER BY value DESC`;\n const rows = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n\n return {\n groups: rows.map(row => ({\n dimensions: Object.fromEntries(\n resolved.map((entry, index) => {\n const v = row[`group_by_${index}`];\n return [entry.key, v == null ? null : String(v)];\n }),\n ),\n value: Number(row.value ?? 0),\n })),\n };\n}\n\nexport async function getFeedbackTimeSeries(\n client: ClickHouseClient,\n args: GetFeedbackTimeSeriesArgs,\n): Promise<GetFeedbackTimeSeriesResponse> {\n const aggSql = getAggregationSql(args.aggregation);\n const intervalSql = getIntervalSql(args.interval);\n const identity = buildFeedbackIdentityFilter(args);\n const signalFilter = buildFeedbackFilterConditions(args.filters);\n const combined = mergeFilters(identity, signalFilter);\n const whereClause = toWhereClause(combined);\n\n if (args.groupBy && args.groupBy.length > 0) {\n const resolved = resolveFeedbackGroupBy(args.groupBy);\n const sql = `\n SELECT toStartOfInterval(timestamp, ${intervalSql}) AS bucket,\n ${resolved.map(e => e.selectSql).join(', ')},\n ${aggSql} AS value\n FROM ${TABLE_FEEDBACK_EVENTS} ${whereClause}\n GROUP BY bucket, ${resolved.map(e => e.groupSql).join(', ')}\n ORDER BY bucket\n `;\n const rows = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n const seriesMap = new Map<string, { name: string; points: { timestamp: Date; value: number }[] }>();\n\n for (const row of rows) {\n const groupValues = resolved.map((_, index) => row[`group_by_${index}`]);\n const key = JSON.stringify(groupValues);\n if (!seriesMap.has(key)) {\n seriesMap.set(key, { name: toSeriesName(groupValues), points: [] });\n }\n seriesMap.get(key)!.points.push({\n timestamp: row.bucket instanceof Date ? row.bucket : new Date(String(row.bucket)),\n value: Number(row.value ?? 0),\n });\n }\n\n return { series: Array.from(seriesMap.values()) };\n }\n\n const sql = `\n SELECT toStartOfInterval(timestamp, ${intervalSql}) AS bucket,\n ${aggSql} AS value\n FROM ${TABLE_FEEDBACK_EVENTS} ${whereClause}\n GROUP BY bucket\n ORDER BY bucket\n `;\n const rows = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n\n return {\n series: [\n {\n name: args.feedbackSource ? `${args.feedbackType}|${args.feedbackSource}` : args.feedbackType,\n points: rows.map(row => ({\n timestamp: row.bucket instanceof Date ? row.bucket : new Date(String(row.bucket)),\n value: Number(row.value ?? 0),\n })),\n },\n ],\n };\n}\n\nexport async function getFeedbackPercentiles(\n client: ClickHouseClient,\n args: GetFeedbackPercentilesArgs,\n): Promise<GetFeedbackPercentilesResponse> {\n const intervalSql = getIntervalSql(args.interval);\n const identity = buildFeedbackIdentityFilter(args);\n const signalFilter = buildFeedbackFilterConditions(args.filters);\n const combined = mergeFilters(identity, signalFilter);\n const whereClause = toWhereClause(combined);\n\n if (!Array.isArray(args.percentiles) || args.percentiles.length === 0) {\n throw new Error('Percentiles must include at least one value between 0 and 1.');\n }\n\n const series = [];\n for (const p of args.percentiles) {\n if (!Number.isFinite(p) || p < 0 || p > 1) {\n throw new Error(`Percentile value must be a finite number between 0 and 1, got ${p}`);\n }\n const sql = `\n SELECT toStartOfInterval(timestamp, ${intervalSql}) AS bucket,\n quantile(${p})(valueNumber) AS pvalue\n FROM ${TABLE_FEEDBACK_EVENTS}\n ${whereClause}\n GROUP BY bucket\n ORDER BY bucket\n `;\n const rows = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n\n series.push({\n percentile: p,\n points: rows.map(row => ({\n timestamp: row.bucket instanceof Date ? row.bucket : new Date(String(row.bucket)),\n value: Number(row.pvalue ?? 0),\n })),\n });\n }\n\n return { series };\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { listLogsArgsSchema } from '@mastra/core/storage';\nimport type { BatchCreateLogsArgs, ListLogsArgs, ListLogsResponse } from '@mastra/core/storage';\n\nimport { TABLE_LOG_EVENTS } from './ddl';\nimport { buildLogsFilterConditions, buildPaginationClause, buildSignalOrderByClause } from './filters';\nimport { CH_INSERT_SETTINGS, CH_SETTINGS, logRecordToRow, rowToLogRecord } from './helpers';\n\nexport async function batchCreateLogs(client: ClickHouseClient, args: BatchCreateLogsArgs): Promise<void> {\n if (args.logs.length === 0) return;\n\n await client.insert({\n table: TABLE_LOG_EVENTS,\n values: args.logs.map(logRecordToRow),\n format: 'JSONEachRow',\n clickhouse_settings: CH_INSERT_SETTINGS,\n });\n}\n\nexport async function listLogs(client: ClickHouseClient, args: ListLogsArgs): Promise<ListLogsResponse> {\n const parsed = listLogsArgsSchema.parse(args);\n const filter = buildLogsFilterConditions(parsed.filters, 'l');\n const pagination = buildPaginationClause(parsed.pagination);\n const orderBy = buildSignalOrderByClause(['timestamp'], parsed.orderBy, 'l');\n const whereClause = filter.conditions.length ? `WHERE ${filter.conditions.join(' AND ')}` : '';\n\n const countResult = (await (\n await client.query({\n query: `SELECT count() AS total FROM ${TABLE_LOG_EVENTS} AS l ${whereClause}`,\n query_params: filter.params,\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n })\n ).json()) as Array<{ total?: number }>;\n\n const rows = (await (\n await client.query({\n query: `\n SELECT *\n FROM ${TABLE_LOG_EVENTS} AS l\n ${whereClause}\n ORDER BY ${orderBy}\n LIMIT {limit:UInt32} OFFSET {offset:UInt32}\n `,\n query_params: {\n ...filter.params,\n limit: pagination.limit,\n offset: pagination.offset,\n },\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n })\n ).json()) as Record<string, any>[];\n\n const total = Number(countResult[0]?.total ?? 0);\n\n return {\n pagination: {\n total,\n page: pagination.page,\n perPage: pagination.perPage,\n hasMore: (pagination.page + 1) * pagination.perPage < total,\n },\n logs: rows.map(rowToLogRecord),\n };\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { listMetricsArgsSchema, METRIC_DISTINCT_COLUMNS } from '@mastra/core/storage';\nimport type {\n AggregationInterval,\n AggregationType,\n BatchCreateMetricsArgs,\n ListMetricsArgs,\n ListMetricsResponse,\n GetMetricAggregateArgs,\n GetMetricAggregateResponse,\n GetMetricBreakdownArgs,\n GetMetricBreakdownResponse,\n GetMetricTimeSeriesArgs,\n GetMetricTimeSeriesResponse,\n GetMetricPercentilesArgs,\n GetMetricPercentilesResponse,\n GetMetricNamesArgs,\n GetMetricNamesResponse,\n GetMetricLabelKeysArgs,\n GetMetricLabelKeysResponse,\n GetMetricLabelValuesArgs,\n GetMetricLabelValuesResponse,\n MetricDistinctColumn,\n} from '@mastra/core/storage';\nimport { parseFieldKey } from '@mastra/core/utils';\n\nimport { TABLE_METRIC_EVENTS, TABLE_DISCOVERY_VALUES, TABLE_DISCOVERY_PAIRS } from './ddl';\nimport { buildMetricsFilterConditions, buildPaginationClause, buildSignalOrderByClause } from './filters';\nimport type { FilterResult } from './filters';\nimport { CH_INSERT_SETTINGS, CH_SETTINGS, metricRecordToRow, rowToMetricRecord } from './helpers';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Map typed columns to their ClickHouse column names. */\nconst METRIC_TYPED_COLUMNS = new Set([\n 'timestamp',\n 'name',\n 'value',\n 'traceId',\n 'spanId',\n 'entityType',\n 'entityId',\n 'entityName',\n 'entityVersionId',\n 'parentEntityVersionId',\n 'parentEntityType',\n 'parentEntityId',\n 'parentEntityName',\n 'rootEntityVersionId',\n 'rootEntityType',\n 'rootEntityId',\n 'rootEntityName',\n 'userId',\n 'organizationId',\n 'resourceId',\n 'runId',\n 'sessionId',\n 'threadId',\n 'requestId',\n 'environment',\n 'executionSource',\n 'serviceName',\n 'experimentId',\n 'provider',\n 'model',\n 'estimatedCost',\n 'costUnit',\n]);\n\n/** Columns excluded from groupBy because they are complex types. */\nconst GROUP_BY_EXCLUDED = new Set(['metadata', 'scope', 'costMetadata', 'tags']);\n\nfunction resolveDistinctColumnSql(distinctColumn: MetricDistinctColumn | undefined): string {\n if (!distinctColumn) {\n throw new Error(`count_distinct aggregation requires a 'distinctColumn' argument`);\n }\n // Defense-in-depth: the schema enum already restricts this, but the value\n // flows into raw SQL so we re-check against the system-level allowlist.\n if (!(METRIC_DISTINCT_COLUMNS as readonly string[]).includes(distinctColumn)) {\n throw new Error(`Invalid distinctColumn: ${distinctColumn}`);\n }\n return parseFieldKey(distinctColumn);\n}\n\nfunction getAggregationSql(\n aggregation: AggregationType,\n measure = 'value',\n distinctColumn?: MetricDistinctColumn,\n): string {\n switch (aggregation) {\n case 'sum':\n return `sum(${measure})`;\n case 'avg':\n return `avg(${measure})`;\n case 'min':\n return `min(${measure})`;\n case 'max':\n return `max(${measure})`;\n case 'count':\n return `toFloat64(count(${measure}))`;\n case 'count_distinct': {\n // Use ClickHouse's approximate HyperLogLog (~1-2% error) for dashboard scale.\n return `toFloat64(uniq(${resolveDistinctColumnSql(distinctColumn)}))`;\n }\n case 'last':\n return `argMax(${measure}, timestamp)`;\n default:\n return `sum(${measure})`;\n }\n}\n\nfunction getIntervalSql(interval: AggregationInterval): string {\n switch (interval) {\n case '1m':\n return 'INTERVAL 1 MINUTE';\n case '5m':\n return 'INTERVAL 5 MINUTE';\n case '15m':\n return 'INTERVAL 15 MINUTE';\n case '1h':\n return 'INTERVAL 1 HOUR';\n case '1d':\n return 'INTERVAL 1 DAY';\n default:\n return 'INTERVAL 1 HOUR';\n }\n}\n\nfunction getCostSummarySelect(prefix = ''): string {\n const ref = (col: string) => `${prefix}${col}`;\n // Use prefixed aliases to avoid ClickHouse alias-resolution conflicts\n // when source columns (estimatedCost, costUnit) also appear in WHERE.\n return `sumIf(${ref('estimatedCost')}, ${ref('estimatedCost')} IS NOT NULL) AS agg_estimatedCost, CASE WHEN countDistinctIf(${ref('costUnit')}, ${ref('costUnit')} IS NOT NULL) = 1 THEN minIf(${ref('costUnit')}, ${ref('costUnit')} IS NOT NULL) ELSE NULL END AS agg_costUnit`;\n}\n\ninterface CostSummary {\n estimatedCost: number | null;\n costUnit: string | null;\n}\n\nfunction normalizeCostSummaryRow(row: Record<string, unknown>): CostSummary {\n return {\n estimatedCost: row.agg_estimatedCost == null ? null : Number(row.agg_estimatedCost),\n costUnit: row.agg_costUnit == null || row.agg_costUnit === '' ? null : String(row.agg_costUnit),\n };\n}\n\nfunction buildMetricNameFilter(names: string[]): FilterResult {\n return {\n conditions: [`name IN {metricNames:Array(String)}`],\n params: { metricNames: names },\n };\n}\n\nfunction mergeFilters(...parts: FilterResult[]): FilterResult {\n const conditions: string[] = [];\n const params: Record<string, unknown> = {};\n for (const part of parts) {\n conditions.push(...part.conditions);\n Object.assign(params, part.params);\n }\n return { conditions, params };\n}\n\nfunction toWhereClause(filter: FilterResult): string {\n return filter.conditions.length ? `WHERE ${filter.conditions.join(' AND ')}` : '';\n}\n\ninterface ResolvedGroupBy {\n kind: 'column' | 'label';\n key: string;\n valueSql: string;\n selectSql: string;\n groupSql: string;\n resultKey: string;\n}\n\nfunction resolveGroupBy(groupBy: string[]): ResolvedGroupBy[] {\n return groupBy.map((key, index) => {\n if (METRIC_TYPED_COLUMNS.has(key)) {\n const parsed = parseFieldKey(key);\n if (GROUP_BY_EXCLUDED.has(parsed)) {\n throw new Error(`Invalid groupBy column(s): ${key}`);\n }\n return {\n kind: 'column' as const,\n key,\n valueSql: parsed,\n selectSql: `${parsed} AS ${parsed}`,\n groupSql: parsed,\n resultKey: parsed,\n };\n }\n\n // Treat as label key — access from ClickHouse Map column\n const alias = `group_by_${index}`;\n const valueSql = `labels[{label_key_${index}:String}]`;\n return {\n kind: 'label' as const,\n key,\n valueSql,\n selectSql: `${valueSql} AS ${alias}`,\n groupSql: alias,\n resultKey: alias,\n };\n });\n}\n\nfunction addGroupByLabelParams(resolved: ResolvedGroupBy[]): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n for (let i = 0; i < resolved.length; i++) {\n if (resolved[i]!.kind === 'label') {\n params[`label_key_${i}`] = resolved[i]!.key;\n }\n }\n return params;\n}\n\n/** Builds WHERE conditions that exclude rows missing a requested label key. */\nfunction buildLabelExclusionConditions(resolved: ResolvedGroupBy[]): string[] {\n return resolved.filter(e => e.kind === 'label').map(e => `${e.valueSql} != ''`);\n}\n\nfunction toSeriesDisplayValue(value: unknown): string {\n return value == null || value === '' ? '' : String(value);\n}\n\nasync function queryJson<T>(client: ClickHouseClient, query: string, params: Record<string, unknown>): Promise<T[]> {\n return (await (\n await client.query({\n query,\n query_params: params,\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n })\n ).json()) as T[];\n}\n\n// ============================================================================\n// Write\n// ============================================================================\n\nexport async function batchCreateMetrics(client: ClickHouseClient, args: BatchCreateMetricsArgs): Promise<void> {\n if (args.metrics.length === 0) return;\n\n await client.insert({\n table: TABLE_METRIC_EVENTS,\n values: args.metrics.map(metricRecordToRow),\n format: 'JSONEachRow',\n clickhouse_settings: CH_INSERT_SETTINGS,\n });\n}\n\n// ============================================================================\n// List\n// ============================================================================\n\nexport async function listMetrics(client: ClickHouseClient, args: ListMetricsArgs): Promise<ListMetricsResponse> {\n const parsed = listMetricsArgsSchema.parse(args);\n const filter = buildMetricsFilterConditions(parsed.filters, 'm');\n const pagination = buildPaginationClause(parsed.pagination);\n const orderBy = buildSignalOrderByClause(['timestamp'], parsed.orderBy, 'm');\n const whereClause = filter.conditions.length ? `WHERE ${filter.conditions.join(' AND ')}` : '';\n\n const countResult = await queryJson<{ total?: number }>(\n client,\n `SELECT count() AS total FROM ${TABLE_METRIC_EVENTS} AS m ${whereClause}`,\n filter.params,\n );\n\n const rows = await queryJson<Record<string, any>>(\n client,\n `SELECT * FROM ${TABLE_METRIC_EVENTS} AS m ${whereClause} ORDER BY ${orderBy} LIMIT {limit:UInt32} OFFSET {offset:UInt32}`,\n { ...filter.params, limit: pagination.limit, offset: pagination.offset },\n );\n\n const total = Number(countResult[0]?.total ?? 0);\n\n return {\n pagination: {\n total,\n page: pagination.page,\n perPage: pagination.perPage,\n hasMore: (pagination.page + 1) * pagination.perPage < total,\n },\n metrics: rows.map(rowToMetricRecord),\n };\n}\n\n// ============================================================================\n// OLAP Queries\n// ============================================================================\n\nexport async function getMetricAggregate(\n client: ClickHouseClient,\n args: GetMetricAggregateArgs,\n): Promise<GetMetricAggregateResponse> {\n const aggSql = getAggregationSql(args.aggregation, 'value', args.distinctColumn);\n const nameFilter = buildMetricNameFilter(args.name);\n const signalFilter = buildMetricsFilterConditions(args.filters);\n const combined = mergeFilters(nameFilter, signalFilter);\n const whereClause = toWhereClause(combined);\n\n const sql = `SELECT ${aggSql} AS value, ${getCostSummarySelect()} FROM ${TABLE_METRIC_EVENTS} ${whereClause}`;\n const result = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n const row = result[0] ?? {};\n const value = row.value == null ? null : Number(row.value);\n const costSummary = normalizeCostSummaryRow(row);\n\n // Period comparison\n if (args.comparePeriod && args.filters?.timestamp) {\n const ts = args.filters.timestamp;\n if (ts.start && ts.end) {\n const duration = ts.end.getTime() - ts.start.getTime();\n let prevStart: Date;\n let prevEnd: Date;\n\n switch (args.comparePeriod) {\n case 'previous_period':\n prevStart = new Date(ts.start.getTime() - duration);\n prevEnd = new Date(ts.end.getTime() - duration);\n break;\n case 'previous_day':\n prevStart = new Date(ts.start.getTime() - 86400000);\n prevEnd = new Date(ts.end.getTime() - 86400000);\n break;\n case 'previous_week':\n prevStart = new Date(ts.start.getTime() - 604800000);\n prevEnd = new Date(ts.end.getTime() - 604800000);\n break;\n default:\n prevStart = new Date(ts.start.getTime() - duration);\n prevEnd = new Date(ts.end.getTime() - duration);\n }\n\n const prevFilters = {\n ...(args.filters ?? {}),\n timestamp: {\n start: prevStart,\n end: prevEnd,\n startExclusive: ts.startExclusive,\n endExclusive: ts.endExclusive,\n },\n };\n const prevSignalFilter = buildMetricsFilterConditions(prevFilters);\n const prevCombined = mergeFilters(nameFilter, prevSignalFilter);\n const prevWhereClause = toWhereClause(prevCombined);\n\n const prevSql = `SELECT ${aggSql} AS value, ${getCostSummarySelect()} FROM ${TABLE_METRIC_EVENTS} ${prevWhereClause}`;\n const prevResult = await queryJson<Record<string, unknown>>(client, prevSql, prevCombined.params);\n const prevRow = prevResult[0] ?? {};\n const previousValue = prevRow.value == null ? null : Number(prevRow.value);\n const previousCostSummary = normalizeCostSummaryRow(prevRow);\n\n let changePercent: number | null = null;\n if (previousValue !== null && previousValue !== 0 && value !== null) {\n changePercent = ((value - previousValue) / Math.abs(previousValue)) * 100;\n }\n\n let costChangePercent: number | null = null;\n if (\n previousCostSummary.estimatedCost !== null &&\n previousCostSummary.estimatedCost !== 0 &&\n costSummary.estimatedCost !== null\n ) {\n costChangePercent =\n ((costSummary.estimatedCost - previousCostSummary.estimatedCost) /\n Math.abs(previousCostSummary.estimatedCost)) *\n 100;\n }\n\n return {\n value,\n estimatedCost: costSummary.estimatedCost,\n costUnit: costSummary.costUnit,\n previousValue,\n previousEstimatedCost: previousCostSummary.estimatedCost,\n changePercent,\n costChangePercent,\n };\n }\n }\n\n return { value, estimatedCost: costSummary.estimatedCost, costUnit: costSummary.costUnit };\n}\n\nexport async function getMetricBreakdown(\n client: ClickHouseClient,\n args: GetMetricBreakdownArgs,\n): Promise<GetMetricBreakdownResponse> {\n const aggSql = getAggregationSql(args.aggregation, 'value', args.distinctColumn);\n const nameFilter = buildMetricNameFilter(args.name);\n const signalFilter = buildMetricsFilterConditions(args.filters);\n const combined = mergeFilters(nameFilter, signalFilter);\n\n const resolvedGroupBy = resolveGroupBy(args.groupBy);\n const labelParams = addGroupByLabelParams(resolvedGroupBy);\n const labelExclusions = buildLabelExclusionConditions(resolvedGroupBy);\n const selectGroupBy = resolvedGroupBy.map(e => e.selectSql).join(', ');\n const groupByCols = resolvedGroupBy.map(e => e.groupSql).join(', ');\n\n // Merge label exclusion conditions so rows missing a requested label key are excluded\n const allConditions = [...combined.conditions, ...labelExclusions];\n const fullWhereClause = allConditions.length ? `WHERE ${allConditions.join(' AND ')}` : '';\n\n const orderDirection = args.orderDirection === 'ASC' ? 'ASC' : 'DESC';\n const limitClause = typeof args.limit === 'number' ? `LIMIT {breakdown_limit:UInt32}` : '';\n const extraParams: Record<string, unknown> = typeof args.limit === 'number' ? { breakdown_limit: args.limit } : {};\n\n const sql = `\n SELECT ${selectGroupBy}, ${aggSql} AS value, ${getCostSummarySelect()}\n FROM ${TABLE_METRIC_EVENTS}\n ${fullWhereClause}\n GROUP BY ${groupByCols}\n ORDER BY value ${orderDirection}\n ${limitClause}\n `;\n const rows = await queryJson<Record<string, unknown>>(client, sql, {\n ...combined.params,\n ...labelParams,\n ...extraParams,\n });\n\n const groups = rows.map(row => {\n const dimensions: Record<string, string | null> = {};\n for (const entry of resolvedGroupBy) {\n const val = row[entry.resultKey];\n dimensions[entry.key] = val == null || val === '' ? null : String(val);\n }\n const cs = normalizeCostSummaryRow(row);\n return {\n dimensions,\n value: Number(row.value ?? 0),\n estimatedCost: cs.estimatedCost,\n costUnit: cs.costUnit,\n };\n });\n\n return { groups };\n}\n\nexport async function getMetricTimeSeries(\n client: ClickHouseClient,\n args: GetMetricTimeSeriesArgs,\n): Promise<GetMetricTimeSeriesResponse> {\n const aggSql = getAggregationSql(args.aggregation, 'value', args.distinctColumn);\n const intervalSql = getIntervalSql(args.interval);\n const nameFilter = buildMetricNameFilter(args.name);\n const signalFilter = buildMetricsFilterConditions(args.filters);\n const combined = mergeFilters(nameFilter, signalFilter);\n const whereClause = toWhereClause(combined);\n\n if (args.groupBy && args.groupBy.length > 0) {\n const resolvedGroupBy = resolveGroupBy(args.groupBy);\n const labelParams = addGroupByLabelParams(resolvedGroupBy);\n const labelExclusions = buildLabelExclusionConditions(resolvedGroupBy);\n const selectGroupBy = resolvedGroupBy.map(e => e.selectSql).join(', ');\n const groupByCols = resolvedGroupBy.map(e => e.groupSql).join(', ');\n\n const allConditions = [...combined.conditions, ...labelExclusions];\n const tsWhereClause = allConditions.length ? `WHERE ${allConditions.join(' AND ')}` : '';\n\n const sql = `\n SELECT toStartOfInterval(timestamp, ${intervalSql}) AS bucket,\n ${selectGroupBy},\n ${aggSql} AS value,\n ${getCostSummarySelect()}\n FROM ${TABLE_METRIC_EVENTS}\n ${tsWhereClause}\n GROUP BY bucket, ${groupByCols}\n ORDER BY bucket\n `;\n const rows = await queryJson<Record<string, unknown>>(client, sql, { ...combined.params, ...labelParams });\n\n const seriesMap = new Map<\n string,\n {\n name: string;\n costUnits: Set<string>;\n points: { timestamp: Date; value: number; estimatedCost: number | null }[];\n }\n >();\n\n for (const row of rows) {\n const dimensionValues = resolvedGroupBy.map(entry => row[entry.resultKey]);\n const seriesKey = JSON.stringify(dimensionValues);\n const name = dimensionValues.map(toSeriesDisplayValue).join('|');\n const cs = normalizeCostSummaryRow(row);\n\n if (!seriesMap.has(seriesKey)) {\n seriesMap.set(seriesKey, { name, costUnits: new Set(), points: [] });\n }\n const entry = seriesMap.get(seriesKey)!;\n if (cs.costUnit) entry.costUnits.add(cs.costUnit);\n entry.points.push({\n timestamp: row.bucket instanceof Date ? row.bucket : new Date(String(row.bucket)),\n value: Number(row.value ?? 0),\n estimatedCost: cs.estimatedCost,\n });\n }\n\n const series = Array.from(seriesMap.values()).map(s => ({\n name: s.name,\n costUnit: s.costUnits.size === 1 ? Array.from(s.costUnits)[0]! : null,\n points: s.points,\n }));\n\n return { series };\n }\n\n // No groupBy — single series using metric name(s)\n const metricName = args.name.join('|');\n const sql = `\n SELECT toStartOfInterval(timestamp, ${intervalSql}) AS bucket,\n ${aggSql} AS value,\n ${getCostSummarySelect()}\n FROM ${TABLE_METRIC_EVENTS}\n ${whereClause}\n GROUP BY bucket\n ORDER BY bucket\n `;\n const rows = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n\n const overallCostUnits = new Set<string>();\n for (const row of rows) {\n const cs = normalizeCostSummaryRow(row);\n if (cs.costUnit) overallCostUnits.add(cs.costUnit);\n }\n\n return {\n series: [\n {\n name: metricName,\n costUnit: overallCostUnits.size === 1 ? Array.from(overallCostUnits)[0]! : null,\n points: rows.map(row => {\n const cs = normalizeCostSummaryRow(row);\n return {\n timestamp: row.bucket instanceof Date ? row.bucket : new Date(String(row.bucket)),\n value: Number(row.value ?? 0),\n estimatedCost: cs.estimatedCost,\n };\n }),\n },\n ],\n };\n}\n\nexport async function getMetricPercentiles(\n client: ClickHouseClient,\n args: GetMetricPercentilesArgs,\n): Promise<GetMetricPercentilesResponse> {\n const intervalSql = getIntervalSql(args.interval);\n const signalFilter = buildMetricsFilterConditions(args.filters);\n const nameFilter: FilterResult = {\n conditions: [`name = {percentileName:String}`],\n params: { percentileName: args.name },\n };\n const combined = mergeFilters(nameFilter, signalFilter);\n const whereClause = toWhereClause(combined);\n\n const series = [];\n for (const p of args.percentiles) {\n if (p < 0 || p > 1) {\n throw new Error(`Percentile value must be between 0 and 1, got ${p}`);\n }\n const sql = `\n SELECT toStartOfInterval(timestamp, ${intervalSql}) AS bucket,\n quantile(${p})(value) AS pvalue\n FROM ${TABLE_METRIC_EVENTS}\n ${whereClause}\n GROUP BY bucket\n ORDER BY bucket\n `;\n const rows = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n\n series.push({\n percentile: p,\n points: rows.map(row => ({\n timestamp: row.bucket instanceof Date ? row.bucket : new Date(String(row.bucket)),\n value: Number(row.pvalue ?? 0),\n })),\n });\n }\n\n return { series };\n}\n\n// ============================================================================\n// Discovery / Metadata — reads from helper tables, not source tables.\n// Per design: returns empty results until helper tables have been refreshed.\n// ============================================================================\n\nexport async function getMetricNames(\n client: ClickHouseClient,\n args: GetMetricNamesArgs,\n): Promise<GetMetricNamesResponse> {\n const conditions: string[] = [`kind = 'metricName'`];\n const params: Record<string, unknown> = {};\n\n if (args.prefix) {\n conditions.push(`value LIKE {namePrefix:String}`);\n params.namePrefix = `${args.prefix}%`;\n }\n\n const limitClause = args.limit ? `LIMIT {nameLimit:UInt32}` : '';\n if (args.limit) params.nameLimit = args.limit;\n\n const rows = await queryJson<{ value: string }>(\n client,\n `SELECT value FROM ${TABLE_DISCOVERY_VALUES} WHERE ${conditions.join(' AND ')} ORDER BY value ${limitClause}`,\n params,\n );\n\n return { names: rows.map(r => r.value) };\n}\n\nexport async function getMetricLabelKeys(\n client: ClickHouseClient,\n args: GetMetricLabelKeysArgs,\n): Promise<GetMetricLabelKeysResponse> {\n const rows = await queryJson<{ value: string }>(\n client,\n `SELECT value FROM ${TABLE_DISCOVERY_VALUES} WHERE kind = 'metricLabelKey' AND key1 = {metricName:String} ORDER BY value`,\n { metricName: args.metricName },\n );\n return { keys: rows.map(r => r.value) };\n}\n\nexport async function getMetricLabelValues(\n client: ClickHouseClient,\n args: GetMetricLabelValuesArgs,\n): Promise<GetMetricLabelValuesResponse> {\n const conditions: string[] = [`kind = 'metricLabelValue'`, `key1 = {metricName:String}`, `key2 = {labelKey:String}`];\n const params: Record<string, unknown> = {\n metricName: args.metricName,\n labelKey: args.labelKey,\n };\n\n if (args.prefix) {\n conditions.push(`value LIKE {valPrefix:String}`);\n params.valPrefix = `${args.prefix}%`;\n }\n\n const limitClause = args.limit ? `LIMIT {valLimit:UInt32}` : '';\n if (args.limit) params.valLimit = args.limit;\n\n const rows = await queryJson<{ value: string }>(\n client,\n `SELECT value FROM ${TABLE_DISCOVERY_PAIRS} WHERE ${conditions.join(' AND ')} ORDER BY value ${limitClause}`,\n params,\n );\n\n return { values: rows.map(r => r.value) };\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport { createStorageErrorId } from '@mastra/core/storage';\n\nimport {\n TABLE_METRIC_EVENTS,\n TABLE_LOG_EVENTS,\n TABLE_SCORE_EVENTS,\n TABLE_FEEDBACK_EVENTS,\n METRIC_EVENTS_DDL,\n LOG_EVENTS_DDL,\n SCORE_EVENTS_DDL,\n FEEDBACK_EVENTS_DDL,\n} from './ddl';\n\ninterface SignalMigration {\n table: string;\n createDDL: string;\n idColumn: string;\n}\n\nexport interface SignalMigrationStatusTable {\n table: string;\n engine: string;\n idColumn: string;\n}\n\nexport interface SignalMigrationStatus {\n needsMigration: boolean;\n tables: SignalMigrationStatusTable[];\n}\n\nconst SIGNAL_MIGRATIONS: SignalMigration[] = [\n { table: TABLE_METRIC_EVENTS, createDDL: METRIC_EVENTS_DDL, idColumn: 'metricId' },\n { table: TABLE_LOG_EVENTS, createDDL: LOG_EVENTS_DDL, idColumn: 'logId' },\n { table: TABLE_SCORE_EVENTS, createDDL: SCORE_EVENTS_DDL, idColumn: 'scoreId' },\n { table: TABLE_FEEDBACK_EVENTS, createDDL: FEEDBACK_EVENTS_DDL, idColumn: 'feedbackId' },\n];\n\n// ClickHouse Cloud silently rewrites `ReplacingMergeTree` to `SharedReplacingMergeTree`,\n// and self-managed replicated clusters rewrite it to `ReplicatedReplacingMergeTree`.\n// All three share dedup-on-merge semantics, so treat them as already-migrated.\nexport function isReplacingMergeTreeEngine(engine: string): boolean {\n return engine.endsWith('ReplacingMergeTree');\n}\n\nasync function getTableEngine(client: ClickHouseClient, table: string): Promise<string | null> {\n const result = await client.query({\n query: `SELECT engine FROM system.tables WHERE database = currentDatabase() AND name = {table:String}`,\n query_params: { table },\n format: 'JSONEachRow',\n });\n const rows = (await result.json()) as Array<{ engine: string }>;\n return rows[0]?.engine ?? null;\n}\n\nasync function getTableColumns(client: ClickHouseClient, table: string): Promise<string[]> {\n const result = await client.query({ query: `DESCRIBE TABLE ${table}`, format: 'JSONEachRow' });\n const rows = (await result.json()) as Array<{ name: string }>;\n return rows.map(r => r.name);\n}\n\nfunction buildTemporaryTableDDL(createDDL: string, table: string, tempTable: string): string {\n return createDDL.replace(`CREATE TABLE IF NOT EXISTS ${table}`, `CREATE TABLE ${tempTable}`);\n}\n\nasync function dropTableIfExists(client: ClickHouseClient, table: string): Promise<void> {\n if ((await getTableEngine(client, table)) !== null) {\n await client.command({ query: `DROP TABLE ${table}` });\n }\n}\n\nfunction createMigrationError(args: { table: string; idColumn: string }, error: unknown): MastraError {\n return new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'MIGRATE_SIGNAL_TABLES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: args,\n },\n error,\n );\n}\n\nexport async function checkSignalTablesMigrationStatus(client: ClickHouseClient): Promise<SignalMigrationStatus> {\n const tables: SignalMigrationStatusTable[] = [];\n\n for (const { table, idColumn } of SIGNAL_MIGRATIONS) {\n const engine = await getTableEngine(client, table);\n if (!engine || isReplacingMergeTreeEngine(engine)) {\n continue;\n }\n\n tables.push({ table, engine, idColumn });\n }\n\n return {\n needsMigration: tables.length > 0,\n tables,\n };\n}\n\n/**\n * Migrate signal tables from MergeTree to ReplacingMergeTree without dropping data.\n * Copy-and-swap: create temp → INSERT…SELECT (generating IDs) → EXCHANGE temp with live\n * → drop old data. EXCHANGE swaps the two table names atomically, so concurrent\n * writers never observe a missing table.\n */\nexport async function migrateSignalTables(client: ClickHouseClient, logger?: IMastraLogger): Promise<void> {\n for (const { table, createDDL, idColumn } of SIGNAL_MIGRATIONS) {\n const engine = await getTableEngine(client, table);\n if (!engine || isReplacingMergeTreeEngine(engine)) continue;\n\n logger?.info?.(`Migrating ${table} from ${engine} to ReplacingMergeTree with ${idColumn} column`);\n\n const temp = `${table}_migrating_${Date.now()}`;\n\n try {\n await client.command({ query: buildTemporaryTableDDL(createDDL, table, temp) });\n\n const newColumns = await getTableColumns(client, temp);\n const currentColumns = new Set(await getTableColumns(client, table));\n\n const columnList = newColumns.map(c => `\"${c}\"`).join(', ');\n const selectExprs = newColumns\n .map(c => {\n if (c === idColumn) {\n return currentColumns.has(c)\n ? `COALESCE(nullIf(\"${c}\", ''), toString(generateUUIDv4())) AS \"${c}\"`\n : `toString(generateUUIDv4()) AS \"${c}\"`;\n }\n return currentColumns.has(c) ? `\"${c}\"` : `NULL AS \"${c}\"`;\n })\n .join(', ');\n\n await client.command({\n query: `INSERT INTO ${temp} (${columnList}) SELECT ${selectExprs} FROM ${table}`,\n });\n\n await client.command({ query: `EXCHANGE TABLES ${temp} AND ${table}` });\n await client.command({ query: `DROP TABLE ${temp}` });\n\n logger?.info?.(`Successfully migrated ${table}`);\n } catch (error) {\n logger?.error?.(`Migration of ${table} failed: ${(error as Error).message}`);\n try {\n await dropTableIfExists(client, temp);\n } catch (restoreError) {\n logger?.error?.(`Failed to clean up temporary table ${temp}: ${(restoreError as Error).message}`);\n }\n throw createMigrationError({ table, idColumn }, error);\n }\n }\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { listScoresArgsSchema } from '@mastra/core/storage';\nimport type {\n AggregationInterval,\n AggregationType,\n BatchCreateScoresArgs,\n CreateScoreArgs,\n ListScoresArgs,\n ListScoresResponse,\n ScoreRecord,\n GetScoreAggregateArgs,\n GetScoreAggregateResponse,\n GetScoreBreakdownArgs,\n GetScoreBreakdownResponse,\n GetScoreTimeSeriesArgs,\n GetScoreTimeSeriesResponse,\n GetScorePercentilesArgs,\n GetScorePercentilesResponse,\n} from '@mastra/core/storage';\nimport { parseFieldKey } from '@mastra/core/utils';\n\nimport { TABLE_SCORE_EVENTS } from './ddl';\nimport { buildPaginationClause, buildScoresFilterConditions, buildSignalOrderByClause } from './filters';\nimport type { FilterResult } from './filters';\nimport { CH_INSERT_SETTINGS, CH_SETTINGS, rowToScoreRecord, scoreRecordToRow } from './helpers';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst SCORE_TYPED_COLUMNS = new Set([\n 'timestamp',\n 'traceId',\n 'spanId',\n 'experimentId',\n 'scoreTraceId',\n 'entityType',\n 'entityId',\n 'entityName',\n 'entityVersionId',\n 'parentEntityVersionId',\n 'parentEntityType',\n 'parentEntityId',\n 'parentEntityName',\n 'rootEntityVersionId',\n 'rootEntityType',\n 'rootEntityId',\n 'rootEntityName',\n 'userId',\n 'organizationId',\n 'resourceId',\n 'runId',\n 'sessionId',\n 'threadId',\n 'requestId',\n 'environment',\n 'executionSource',\n 'serviceName',\n 'scorerId',\n 'scorerVersion',\n 'scoreSource',\n 'score',\n 'reason',\n]);\n\nconst GROUP_BY_EXCLUDED = new Set(['metadata', 'scope', 'tags']);\n\nfunction getAggregationSql(aggregation: AggregationType, measure = 'score'): string {\n switch (aggregation) {\n case 'sum':\n return `sum(${measure})`;\n case 'avg':\n return `avg(${measure})`;\n case 'min':\n return `min(${measure})`;\n case 'max':\n return `max(${measure})`;\n case 'count':\n return `toFloat64(count(${measure}))`;\n case 'last':\n return `argMax(${measure}, timestamp)`;\n default:\n return `sum(${measure})`;\n }\n}\n\nfunction getIntervalSql(interval: AggregationInterval): string {\n switch (interval) {\n case '1m':\n return 'INTERVAL 1 MINUTE';\n case '5m':\n return 'INTERVAL 5 MINUTE';\n case '15m':\n return 'INTERVAL 15 MINUTE';\n case '1h':\n return 'INTERVAL 1 HOUR';\n case '1d':\n return 'INTERVAL 1 DAY';\n default:\n return 'INTERVAL 1 HOUR';\n }\n}\n\nfunction mergeFilters(...parts: FilterResult[]): FilterResult {\n const conditions: string[] = [];\n const params: Record<string, unknown> = {};\n for (const part of parts) {\n conditions.push(...part.conditions);\n Object.assign(params, part.params);\n }\n return { conditions, params };\n}\n\nfunction toWhereClause(filter: FilterResult): string {\n return filter.conditions.length ? `WHERE ${filter.conditions.join(' AND ')}` : '';\n}\n\nfunction buildScoreIdentityFilter(args: Pick<GetScoreAggregateArgs, 'scorerId' | 'scoreSource'>): FilterResult {\n const conditions: string[] = ['scorerId = {olapScorerId:String}'];\n const params: Record<string, unknown> = { olapScorerId: args.scorerId };\n\n if (args.scoreSource !== undefined) {\n conditions.push('scoreSource = {olapScoreSource:String}');\n params.olapScoreSource = args.scoreSource;\n }\n\n return { conditions, params };\n}\n\nfunction resolveScoreGroupBy(groupBy: string[]): { key: string; selectSql: string; groupSql: string }[] {\n return groupBy.map((key, index) => {\n const column = parseFieldKey(key);\n if (!SCORE_TYPED_COLUMNS.has(column) || GROUP_BY_EXCLUDED.has(column)) {\n throw new Error(`Invalid groupBy column(s): ${key}`);\n }\n const alias = `group_by_${index}`;\n return { key, selectSql: `${column} AS ${alias}`, groupSql: alias };\n });\n}\n\nfunction toSeriesName(values: unknown[]): string {\n return values.map(v => (v == null ? '' : String(v))).join('|');\n}\n\nasync function queryJson<T>(client: ClickHouseClient, query: string, params: Record<string, unknown>): Promise<T[]> {\n return (await (\n await client.query({\n query,\n query_params: params,\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n })\n ).json()) as T[];\n}\n\n// ============================================================================\n// Write\n// ============================================================================\n\nexport async function createScore(client: ClickHouseClient, args: CreateScoreArgs): Promise<void> {\n await batchCreateScores(client, { scores: [args.score] });\n}\n\nexport async function batchCreateScores(client: ClickHouseClient, args: BatchCreateScoresArgs): Promise<void> {\n if (args.scores.length === 0) return;\n\n await client.insert({\n table: TABLE_SCORE_EVENTS,\n values: args.scores.map(scoreRecordToRow),\n format: 'JSONEachRow',\n clickhouse_settings: CH_INSERT_SETTINGS,\n });\n}\n\n// ============================================================================\n// List\n// ============================================================================\n\nexport async function listScores(client: ClickHouseClient, args: ListScoresArgs): Promise<ListScoresResponse> {\n const parsed = listScoresArgsSchema.parse(args);\n const filter = buildScoresFilterConditions(parsed.filters, 's');\n const pagination = buildPaginationClause(parsed.pagination);\n const orderBy = buildSignalOrderByClause(['timestamp', 'score'], parsed.orderBy, 's');\n const whereClause = filter.conditions.length ? `WHERE ${filter.conditions.join(' AND ')}` : '';\n\n const countResult = await queryJson<{ total?: number }>(\n client,\n `SELECT count() AS total FROM ${TABLE_SCORE_EVENTS} AS s ${whereClause}`,\n filter.params,\n );\n\n const rows = await queryJson<Record<string, any>>(\n client,\n `SELECT * FROM ${TABLE_SCORE_EVENTS} AS s ${whereClause} ORDER BY ${orderBy} LIMIT {limit:UInt32} OFFSET {offset:UInt32}`,\n { ...filter.params, limit: pagination.limit, offset: pagination.offset },\n );\n\n const total = Number(countResult[0]?.total ?? 0);\n\n return {\n pagination: {\n total,\n page: pagination.page,\n perPage: pagination.perPage,\n hasMore: (pagination.page + 1) * pagination.perPage < total,\n },\n scores: rows.map(rowToScoreRecord),\n };\n}\n\nexport async function getScoreById(client: ClickHouseClient, scoreId: string): Promise<ScoreRecord | null> {\n const rows = await queryJson<Record<string, any>>(\n client,\n `SELECT * FROM ${TABLE_SCORE_EVENTS} WHERE scoreId = {scoreId:String} LIMIT 1`,\n { scoreId },\n );\n\n return rows[0] ? rowToScoreRecord(rows[0]) : null;\n}\n\n// ============================================================================\n// OLAP Queries\n// ============================================================================\n\nexport async function getScoreAggregate(\n client: ClickHouseClient,\n args: GetScoreAggregateArgs,\n): Promise<GetScoreAggregateResponse> {\n const aggSql = getAggregationSql(args.aggregation);\n const identity = buildScoreIdentityFilter(args);\n const signalFilter = buildScoresFilterConditions(args.filters);\n const combined = mergeFilters(identity, signalFilter);\n const whereClause = toWhereClause(combined);\n\n const sql = `SELECT ${aggSql} AS value FROM ${TABLE_SCORE_EVENTS} ${whereClause}`;\n const result = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n const value = result[0]?.value == null ? null : Number(result[0]?.value);\n\n if (args.comparePeriod && args.filters?.timestamp) {\n const ts = args.filters.timestamp;\n if (ts.start && ts.end) {\n const duration = ts.end.getTime() - ts.start.getTime();\n let prevStart: Date;\n let prevEnd: Date;\n\n switch (args.comparePeriod) {\n case 'previous_period':\n prevStart = new Date(ts.start.getTime() - duration);\n prevEnd = new Date(ts.end.getTime() - duration);\n break;\n case 'previous_day':\n prevStart = new Date(ts.start.getTime() - 86400000);\n prevEnd = new Date(ts.end.getTime() - 86400000);\n break;\n case 'previous_week':\n prevStart = new Date(ts.start.getTime() - 604800000);\n prevEnd = new Date(ts.end.getTime() - 604800000);\n break;\n default:\n prevStart = new Date(ts.start.getTime() - duration);\n prevEnd = new Date(ts.end.getTime() - duration);\n }\n\n const prevFilters = {\n ...(args.filters ?? {}),\n timestamp: { start: prevStart, end: prevEnd, startExclusive: ts.startExclusive, endExclusive: ts.endExclusive },\n };\n const prevSignalFilter = buildScoresFilterConditions(prevFilters);\n const prevCombined = mergeFilters(identity, prevSignalFilter);\n const prevWhereClause = toWhereClause(prevCombined);\n\n const prevResult = await queryJson<Record<string, unknown>>(\n client,\n `SELECT ${aggSql} AS value FROM ${TABLE_SCORE_EVENTS} ${prevWhereClause}`,\n prevCombined.params,\n );\n const previousValue = prevResult[0]?.value == null ? null : Number(prevResult[0]?.value);\n\n let changePercent: number | null = null;\n if (previousValue !== null && previousValue !== 0 && value !== null) {\n changePercent = ((value - previousValue) / Math.abs(previousValue)) * 100;\n }\n\n return { value, previousValue, changePercent };\n }\n }\n\n return { value };\n}\n\nexport async function getScoreBreakdown(\n client: ClickHouseClient,\n args: GetScoreBreakdownArgs,\n): Promise<GetScoreBreakdownResponse> {\n const aggSql = getAggregationSql(args.aggregation);\n const identity = buildScoreIdentityFilter(args);\n const signalFilter = buildScoresFilterConditions(args.filters);\n const combined = mergeFilters(identity, signalFilter);\n const whereClause = toWhereClause(combined);\n const resolved = resolveScoreGroupBy(args.groupBy);\n\n const sql = `SELECT ${resolved.map(e => e.selectSql).join(', ')}, ${aggSql} AS value FROM ${TABLE_SCORE_EVENTS} ${whereClause} GROUP BY ${resolved.map(e => e.groupSql).join(', ')} ORDER BY value DESC`;\n const rows = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n\n return {\n groups: rows.map(row => ({\n dimensions: Object.fromEntries(\n resolved.map((entry, index) => {\n const v = row[`group_by_${index}`];\n return [entry.key, v == null ? null : String(v)];\n }),\n ),\n value: Number(row.value ?? 0),\n })),\n };\n}\n\nexport async function getScoreTimeSeries(\n client: ClickHouseClient,\n args: GetScoreTimeSeriesArgs,\n): Promise<GetScoreTimeSeriesResponse> {\n const aggSql = getAggregationSql(args.aggregation);\n const intervalSql = getIntervalSql(args.interval);\n const identity = buildScoreIdentityFilter(args);\n const signalFilter = buildScoresFilterConditions(args.filters);\n const combined = mergeFilters(identity, signalFilter);\n const whereClause = toWhereClause(combined);\n\n if (args.groupBy && args.groupBy.length > 0) {\n const resolved = resolveScoreGroupBy(args.groupBy);\n const sql = `\n SELECT toStartOfInterval(timestamp, ${intervalSql}) AS bucket,\n ${resolved.map(e => e.selectSql).join(', ')},\n ${aggSql} AS value\n FROM ${TABLE_SCORE_EVENTS} ${whereClause}\n GROUP BY bucket, ${resolved.map(e => e.groupSql).join(', ')}\n ORDER BY bucket\n `;\n const rows = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n const seriesMap = new Map<string, { name: string; points: { timestamp: Date; value: number }[] }>();\n\n for (const row of rows) {\n const groupValues = resolved.map((_, index) => row[`group_by_${index}`]);\n const key = JSON.stringify(groupValues);\n if (!seriesMap.has(key)) {\n seriesMap.set(key, { name: toSeriesName(groupValues), points: [] });\n }\n seriesMap.get(key)!.points.push({\n timestamp: row.bucket instanceof Date ? row.bucket : new Date(String(row.bucket)),\n value: Number(row.value ?? 0),\n });\n }\n\n return { series: Array.from(seriesMap.values()) };\n }\n\n const sql = `\n SELECT toStartOfInterval(timestamp, ${intervalSql}) AS bucket,\n ${aggSql} AS value\n FROM ${TABLE_SCORE_EVENTS} ${whereClause}\n GROUP BY bucket\n ORDER BY bucket\n `;\n const rows = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n\n return {\n series: [\n {\n name: args.scoreSource ? `${args.scorerId}|${args.scoreSource}` : args.scorerId,\n points: rows.map(row => ({\n timestamp: row.bucket instanceof Date ? row.bucket : new Date(String(row.bucket)),\n value: Number(row.value ?? 0),\n })),\n },\n ],\n };\n}\n\nexport async function getScorePercentiles(\n client: ClickHouseClient,\n args: GetScorePercentilesArgs,\n): Promise<GetScorePercentilesResponse> {\n const intervalSql = getIntervalSql(args.interval);\n const identity = buildScoreIdentityFilter(args);\n const signalFilter = buildScoresFilterConditions(args.filters);\n const combined = mergeFilters(identity, signalFilter);\n const whereClause = toWhereClause(combined);\n\n if (!Array.isArray(args.percentiles) || args.percentiles.length === 0) {\n throw new Error('Percentiles must include at least one value between 0 and 1.');\n }\n\n const series = [];\n for (const p of args.percentiles) {\n if (!Number.isFinite(p) || p < 0 || p > 1) {\n throw new Error(`Percentile value must be a finite number between 0 and 1, got ${p}`);\n }\n const sql = `\n SELECT toStartOfInterval(timestamp, ${intervalSql}) AS bucket,\n quantile(${p})(score) AS pvalue\n FROM ${TABLE_SCORE_EVENTS}\n ${whereClause}\n GROUP BY bucket\n ORDER BY bucket\n `;\n const rows = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n\n series.push({\n percentile: p,\n points: rows.map(row => ({\n timestamp: row.bucket instanceof Date ? row.bucket : new Date(String(row.bucket)),\n value: Number(row.pvalue ?? 0),\n })),\n });\n }\n\n return { series };\n}\n","/**\n * Trace-roots operations for ClickHouse v-next observability.\n *\n * Owns: listTraces, getRootSpan\n * Reads from: trace_roots (populated by incremental MV from span_events)\n */\n\nimport type { ClickHouseClient } from '@clickhouse/client';\nimport { listTracesArgsSchema, toTraceSpans } from '@mastra/core/storage';\nimport type { GetRootSpanArgs, GetRootSpanResponse, ListTracesArgs, ListTracesResponse } from '@mastra/core/storage';\n\nimport { TABLE_SPAN_EVENTS, TABLE_TRACE_ROOTS } from './ddl';\nimport { buildTraceFilterConditions, buildTraceOrderByClause } from './filters';\nimport { CH_SETTINGS, rowToSpanRecord } from './helpers';\n\n// ---------------------------------------------------------------------------\n// getRootSpan\n// ---------------------------------------------------------------------------\n\n/**\n * Get the root span for a trace, reading from trace_roots as compatibility path.\n * Uses ordinary LIMIT 1 (duplicates are byte-identical per design).\n */\nexport async function getRootSpan(\n client: ClickHouseClient,\n args: GetRootSpanArgs,\n): Promise<GetRootSpanResponse | null> {\n const result = await client.query({\n query: `\n SELECT *\n FROM ${TABLE_TRACE_ROOTS}\n WHERE traceId = {traceId:String}\n LIMIT 1\n `,\n query_params: { traceId: args.traceId },\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n });\n\n const rows = (await result.json()) as Record<string, any>[];\n if (!rows || rows.length === 0) return null;\n\n return { span: rowToSpanRecord(rows[0]!) };\n}\n\n// ---------------------------------------------------------------------------\n// listTraces\n// ---------------------------------------------------------------------------\n\n/**\n * List traces with optional filtering, pagination, and ordering.\n *\n * Reads from trace_roots (root spans only).\n * Uses two-stage query for ReplacingMergeTree deduplication:\n * Inner: filter + deterministic ORDER BY + LIMIT 1 BY dedupeKey\n * Outer: final ordering + pagination\n *\n * hasChildError is handled via EXISTS subquery against span_events.\n */\nexport async function listTraces(client: ClickHouseClient, args: ListTracesArgs): Promise<ListTracesResponse> {\n // Parse args through schema to apply defaults\n const { filters, pagination, orderBy } = listTracesArgsSchema.parse(args);\n const page = pagination?.page ?? 0;\n const perPage = pagination?.perPage ?? 10;\n\n // Build filter conditions\n const { conditions, params } = buildTraceFilterConditions(filters, 'r');\n\n // hasChildError: EXISTS subquery against span_events\n if (filters?.hasChildError != null) {\n if (filters.hasChildError) {\n conditions.push(`EXISTS (\n SELECT 1 FROM ${TABLE_SPAN_EVENTS} c\n WHERE c.traceId = r.traceId\n AND c.parentSpanId IS NOT NULL\n AND c.error IS NOT NULL\n )`);\n } else {\n conditions.push(`NOT EXISTS (\n SELECT 1 FROM ${TABLE_SPAN_EVENTS} c\n WHERE c.traceId = r.traceId\n AND c.parentSpanId IS NOT NULL\n AND c.error IS NOT NULL\n )`);\n }\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n // Outer ORDER BY must not use table alias — the outer SELECT wraps an anonymous subquery\n const orderClause = buildTraceOrderByClause(orderBy);\n\n // Count query (deduplicated)\n const countResult = await client.query({\n query: `\n SELECT count() as cnt FROM (\n SELECT dedupeKey\n FROM ${TABLE_TRACE_ROOTS} r\n ${whereClause}\n ORDER BY dedupeKey\n LIMIT 1 BY dedupeKey\n )\n `,\n query_params: params,\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n });\n\n const countRows = (await countResult.json()) as Array<{ cnt: string | number }>;\n const total = Number(countRows[0]?.cnt ?? 0);\n\n if (total === 0) {\n return {\n pagination: { total: 0, page, perPage, hasMore: false },\n spans: [],\n };\n }\n\n // Data query: two-stage dedupe + pagination\n const dataResult = await client.query({\n query: `\n SELECT * FROM (\n SELECT *\n FROM ${TABLE_TRACE_ROOTS} r\n ${whereClause}\n ORDER BY dedupeKey\n LIMIT 1 BY dedupeKey\n )\n ORDER BY ${orderClause}\n LIMIT {limit:UInt32}\n OFFSET {offset:UInt32}\n `,\n query_params: {\n ...params,\n limit: perPage,\n offset: page * perPage,\n },\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n });\n\n const rows = (await dataResult.json()) as Record<string, any>[];\n const spans = rows.map(rowToSpanRecord);\n\n return {\n pagination: {\n total,\n page,\n perPage,\n hasMore: (page + 1) * perPage < total,\n },\n spans: toTraceSpans(spans),\n };\n}\n","/**\n * Tracing operations for ClickHouse v-next observability.\n *\n * Owns: batchCreateSpans, getSpan, getSpans, getTrace, getTraceLight,\n * listBranches, batchDeleteTraces, dangerouslyClearSpanEvents.\n * Delegates to trace-roots.ts: listTraces, getRootSpan.\n *\n * `listBranches` reads from the MV-fed `mastra_trace_branches` table (one row\n * per branch anchor span). It lives here -- alongside the other read paths\n * over the trace data -- since branches are conceptually a subset of traces.\n */\n\nimport type { ClickHouseClient } from '@clickhouse/client';\nimport { BRANCH_SPAN_TYPES, listBranchesArgsSchema, toTraceSpans, TraceStatus } from '@mastra/core/storage';\nimport type {\n BatchCreateSpansArgs,\n BatchDeleteTracesArgs,\n CreateSpanArgs,\n GetSpanArgs,\n GetSpanResponse,\n GetSpansArgs,\n GetSpansResponse,\n GetTraceArgs,\n GetTraceResponse,\n GetTraceLightResponse,\n LightSpanRecord,\n ListBranchesArgs,\n ListBranchesResponse,\n SpanRecord,\n} from '@mastra/core/storage';\n\nimport { TABLE_SPAN_EVENTS, TABLE_TRACE_BRANCHES, TABLE_TRACE_ROOTS } from './ddl';\nimport { CH_SETTINGS, CH_INSERT_SETTINGS, spanRecordToRow, rowToSpanRecord } from './helpers';\n\nconst BRANCH_SPAN_TYPE_SQL_LIST = BRANCH_SPAN_TYPES.map(t => `'${t}'`).join(', ');\n\n// ---------------------------------------------------------------------------\n// Write operations\n// ---------------------------------------------------------------------------\n\n/** Insert a single completed span. */\nexport async function createSpan(client: ClickHouseClient, args: CreateSpanArgs): Promise<void> {\n const row = spanRecordToRow(args.span);\n await client.insert({\n table: TABLE_SPAN_EVENTS,\n values: [row],\n format: 'JSONEachRow',\n clickhouse_settings: CH_INSERT_SETTINGS,\n });\n}\n\n/** Insert a batch of completed spans. */\nexport async function batchCreateSpans(client: ClickHouseClient, args: BatchCreateSpansArgs): Promise<void> {\n if (args.records.length === 0) return;\n\n const rows = args.records.map(spanRecordToRow);\n await client.insert({\n table: TABLE_SPAN_EVENTS,\n values: rows,\n format: 'JSONEachRow',\n clickhouse_settings: CH_INSERT_SETTINGS,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Read operations\n// ---------------------------------------------------------------------------\n\n/**\n * Batch-fetch spans by spanId within a trace. Single SELECT keyed by\n * `(traceId, spanId)`; the span_events ORDER BY `(traceId, endedAt, spanId, dedupeKey)`\n * means traceId narrowing is index-prefixed and the spanId IN(...) filter is\n * cheap to evaluate within that range.\n *\n * Returns spans in arbitrary order; caller is expected to sort. Spans not\n * found are silently omitted (callers handle the empty/partial case).\n */\nexport async function getSpans(client: ClickHouseClient, args: GetSpansArgs): Promise<GetSpansResponse> {\n if (args.spanIds.length === 0) {\n return { traceId: args.traceId, spans: [] };\n }\n\n const result = await client.query({\n query: `\n SELECT * FROM (\n SELECT *\n FROM ${TABLE_SPAN_EVENTS}\n WHERE traceId = {traceId:String}\n AND spanId IN {spanIds:Array(String)}\n ORDER BY dedupeKey, endedAt DESC\n LIMIT 1 BY dedupeKey\n )\n `,\n query_params: { traceId: args.traceId, spanIds: args.spanIds },\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n });\n\n const rows = (await result.json()) as Record<string, any>[];\n const spans: SpanRecord[] = rows.map(rowToSpanRecord);\n return { traceId: args.traceId, spans };\n}\n\n/** Get a single span by (traceId, spanId). Uses ordinary LIMIT 1. */\nexport async function getSpan(client: ClickHouseClient, args: GetSpanArgs): Promise<GetSpanResponse | null> {\n const result = await client.query({\n query: `\n SELECT *\n FROM ${TABLE_SPAN_EVENTS}\n WHERE traceId = {traceId:String} AND spanId = {spanId:String}\n LIMIT 1\n `,\n query_params: { traceId: args.traceId, spanId: args.spanId },\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n });\n\n const rows = (await result.json()) as Record<string, any>[];\n if (!rows || rows.length === 0) return null;\n\n return { span: rowToSpanRecord(rows[0]!) };\n}\n\n/**\n * Get all spans for a trace.\n *\n * Uses two-stage query for ReplacingMergeTree deduplication:\n * Inner: narrow to traceId → deterministic ORDER BY → LIMIT 1 BY dedupeKey\n * Outer: no additional ordering needed (caller sorts)\n */\nexport async function getTrace(client: ClickHouseClient, args: GetTraceArgs): Promise<GetTraceResponse | null> {\n const result = await client.query({\n query: `\n SELECT * FROM (\n SELECT *\n FROM ${TABLE_SPAN_EVENTS}\n WHERE traceId = {traceId:String}\n ORDER BY dedupeKey, endedAt DESC\n LIMIT 1 BY dedupeKey\n )\n ORDER BY startedAt ASC\n `,\n query_params: { traceId: args.traceId },\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n });\n\n const rows = (await result.json()) as Record<string, any>[];\n if (!rows || rows.length === 0) return null;\n\n const spans: SpanRecord[] = rows.map(rowToSpanRecord);\n return { traceId: args.traceId, spans };\n}\n\n/**\n * Lightweight trace fetch — only timeline-relevant columns.\n */\nexport async function getTraceLight(\n client: ClickHouseClient,\n args: GetTraceArgs,\n): Promise<GetTraceLightResponse | null> {\n const result = await client.query({\n query: `\n SELECT traceId, spanId, parentSpanId, name,\n entityType, entityId, entityName,\n spanType, error, isEvent,\n startedAt, endedAt\n FROM (\n SELECT *\n FROM ${TABLE_SPAN_EVENTS}\n WHERE traceId = {traceId:String}\n ORDER BY dedupeKey, endedAt DESC\n LIMIT 1 BY dedupeKey\n )\n ORDER BY startedAt ASC\n `,\n query_params: { traceId: args.traceId },\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n });\n\n const rows = (await result.json()) as Record<string, any>[];\n if (!rows || rows.length === 0) return null;\n\n const spans: LightSpanRecord[] = rows.map(rowToSpanRecord);\n return { traceId: args.traceId, spans };\n}\n\n// ---------------------------------------------------------------------------\n// Delete operations\n// ---------------------------------------------------------------------------\n\n/**\n * Delete traces by traceId.\n * Issues lightweight DELETE against both span_events and trace_roots.\n *\n * Targets rows by tracing identity: traceId + dedupeKey (which starts with traceId).\n * The dedupeKey condition is redundant for correctness (dedupeKey = traceId:spanId)\n * but satisfies the design-doc requirement that trace deletes reference dedupeKey\n * and helps the engine narrow within the sorted ORDER BY key.\n */\nexport async function batchDeleteTraces(client: ClickHouseClient, args: BatchDeleteTracesArgs): Promise<void> {\n if (args.traceIds.length === 0) return;\n\n // Build parameterized IN list and dedupeKey prefix conditions\n const params: Record<string, string> = {};\n const traceInPlaceholders: string[] = [];\n const dedupeOrParts: string[] = [];\n for (let i = 0; i < args.traceIds.length; i++) {\n const tidParam = `tid_${i}`;\n const dkPrefix = `dk_${i}`;\n params[tidParam] = args.traceIds[i]!;\n params[dkPrefix] = `${args.traceIds[i]!}:`;\n traceInPlaceholders.push(`{${tidParam}:String}`);\n dedupeOrParts.push(`startsWith(dedupeKey, {${dkPrefix}:String})`);\n }\n const traceInList = traceInPlaceholders.join(', ');\n const dedupeCondition = dedupeOrParts.length === 1 ? dedupeOrParts[0] : `(${dedupeOrParts.join(' OR ')})`;\n\n // Lightweight deletes (DELETE FROM) are immediately visible to subsequent reads,\n // unlike ALTER TABLE ... DELETE which schedules an async mutation.\n await Promise.all([\n client.command({\n query: `DELETE FROM ${TABLE_SPAN_EVENTS} WHERE traceId IN (${traceInList}) AND ${dedupeCondition}`,\n query_params: params,\n }),\n client.command({\n query: `DELETE FROM ${TABLE_TRACE_ROOTS} WHERE traceId IN (${traceInList}) AND ${dedupeCondition}`,\n query_params: params,\n }),\n ]);\n}\n\n/** Truncate all tracing tables (span_events + trace_roots). */\nexport async function dangerouslyClearSpanEvents(client: ClickHouseClient): Promise<void> {\n await Promise.all([\n client.command({ query: `TRUNCATE TABLE IF EXISTS ${TABLE_SPAN_EVENTS}` }),\n client.command({ query: `TRUNCATE TABLE IF EXISTS ${TABLE_TRACE_ROOTS}` }),\n ]);\n}\n\n// ---------------------------------------------------------------------------\n// listBranches — read from MV-fed mastra_trace_branches table\n// ---------------------------------------------------------------------------\n\n/**\n * List trace branches with optional filtering, pagination, and ordering.\n *\n * Reads from `mastra_trace_branches` (one row per branch anchor span). Uses\n * the same two-stage dedupe + paginate pattern as listTraces.\n *\n * Filters apply to the anchor span itself (not to a containing trace root) --\n * which is the whole point of this surface.\n */\nexport async function listBranches(client: ClickHouseClient, args: ListBranchesArgs): Promise<ListBranchesResponse> {\n const { filters, pagination, orderBy } = listBranchesArgsSchema.parse(args);\n const page = pagination?.page ?? 0;\n const perPage = pagination?.perPage ?? 10;\n\n const conditions: string[] = [];\n const params: Record<string, unknown> = {};\n\n if (filters?.spanType) {\n conditions.push(`spanType = {spanType:String}`);\n params.spanType = filters.spanType;\n } else {\n // Defense in depth: the MV WHERE clause already restricts the table to\n // these span types, but pinning the predicate at query time also prunes\n // any row that may have leaked in via direct insertion.\n conditions.push(`spanType IN (${BRANCH_SPAN_TYPE_SQL_LIST})`);\n }\n\n if (filters?.startedAt?.start) {\n const op = filters.startedAt.startExclusive ? '>' : '>=';\n conditions.push(`startedAt ${op} {startedAtStart:DateTime64(3)}`);\n params.startedAtStart = filters.startedAt.start.getTime();\n }\n if (filters?.startedAt?.end) {\n const op = filters.startedAt.endExclusive ? '<' : '<=';\n conditions.push(`startedAt ${op} {startedAtEnd:DateTime64(3)}`);\n params.startedAtEnd = filters.startedAt.end.getTime();\n }\n if (filters?.endedAt?.start) {\n const op = filters.endedAt.startExclusive ? '>' : '>=';\n conditions.push(`endedAt ${op} {endedAtStart:DateTime64(3)}`);\n params.endedAtStart = filters.endedAt.start.getTime();\n }\n if (filters?.endedAt?.end) {\n const op = filters.endedAt.endExclusive ? '<' : '<=';\n conditions.push(`endedAt ${op} {endedAtEnd:DateTime64(3)}`);\n params.endedAtEnd = filters.endedAt.end.getTime();\n }\n\n // All other filters apply to the anchor span itself.\n type EqDef = { col: string; value: unknown; param: string };\n const eq: EqDef[] = [\n { col: 'traceId', value: filters?.traceId, param: 'traceId' },\n { col: 'entityType', value: filters?.entityType, param: 'entityType' },\n { col: 'entityId', value: filters?.entityId, param: 'entityId' },\n { col: 'entityName', value: filters?.entityName, param: 'entityName' },\n { col: 'entityVersionId', value: filters?.entityVersionId, param: 'entityVersionId' },\n { col: 'parentEntityVersionId', value: filters?.parentEntityVersionId, param: 'parentEntityVersionId' },\n { col: 'parentEntityType', value: filters?.parentEntityType, param: 'parentEntityType' },\n { col: 'parentEntityId', value: filters?.parentEntityId, param: 'parentEntityId' },\n { col: 'parentEntityName', value: filters?.parentEntityName, param: 'parentEntityName' },\n { col: 'rootEntityVersionId', value: filters?.rootEntityVersionId, param: 'rootEntityVersionId' },\n { col: 'rootEntityType', value: filters?.rootEntityType, param: 'rootEntityType' },\n { col: 'rootEntityId', value: filters?.rootEntityId, param: 'rootEntityId' },\n { col: 'rootEntityName', value: filters?.rootEntityName, param: 'rootEntityName' },\n { col: 'experimentId', value: filters?.experimentId, param: 'experimentId' },\n { col: 'userId', value: filters?.userId, param: 'userId' },\n { col: 'organizationId', value: filters?.organizationId, param: 'organizationId' },\n { col: 'resourceId', value: filters?.resourceId, param: 'resourceId' },\n { col: 'runId', value: filters?.runId, param: 'runId' },\n { col: 'sessionId', value: filters?.sessionId, param: 'sessionId' },\n { col: 'threadId', value: filters?.threadId, param: 'threadId' },\n { col: 'requestId', value: filters?.requestId, param: 'requestId' },\n { col: 'environment', value: filters?.environment, param: 'environment' },\n { col: 'executionSource', value: filters?.source, param: 'source' },\n { col: 'serviceName', value: filters?.serviceName, param: 'serviceName' },\n ];\n for (const { col, value, param } of eq) {\n if (value == null) continue;\n conditions.push(`${col} = {${param}:String}`);\n params[param] = value;\n }\n\n if (filters?.tags && filters.tags.length > 0) {\n for (let i = 0; i < filters.tags.length; i++) {\n const tag = filters.tags[i];\n if (typeof tag !== 'string' || tag.trim() === '') continue;\n const param = `tag_${i}`;\n conditions.push(`has(tags, {${param}:String})`);\n params[param] = tag;\n }\n }\n\n if (filters?.metadata != null && typeof filters.metadata === 'object') {\n let i = 0;\n for (const [key, value] of Object.entries(filters.metadata)) {\n if (typeof value !== 'string') continue;\n const keyParam = `meta_k_${i}`;\n const valParam = `meta_v_${i}`;\n conditions.push(`metadataSearch[{${keyParam}:String}] = {${valParam}:String}`);\n params[keyParam] = key;\n params[valParam] = value;\n i++;\n }\n }\n\n // scope is stored as JSON-encoded text (Nullable(String)) -- match the\n // semantics used by in-memory and DuckDB backends: every key/value in the\n // filter object must equal the same key in the row's scope. JSON-encoded\n // values (objects, arrays, numbers) are matched after JSON.stringify so a\n // caller can pass either a stringified scalar or the original value.\n if (filters?.scope != null && typeof filters.scope === 'object') {\n let i = 0;\n for (const [key, value] of Object.entries(filters.scope)) {\n if (value === undefined) continue;\n const normalized = typeof value === 'string' ? value : JSON.stringify(value);\n if (normalized == null) continue;\n const keyParam = `scope_k_${i}`;\n const valParam = `scope_v_${i}`;\n conditions.push(`JSONExtractString(scope, {${keyParam}:String}) = {${valParam}:String}`);\n params[keyParam] = key;\n params[valParam] = normalized;\n i++;\n }\n }\n\n if (filters?.status === TraceStatus.ERROR) {\n conditions.push(`error IS NOT NULL`);\n } else if (filters?.status === TraceStatus.SUCCESS) {\n conditions.push(`error IS NULL`);\n } else if (filters?.status === TraceStatus.RUNNING) {\n // listBranches reads completed-span data; running spans are not surfaced.\n conditions.push('1 = 0');\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const sortField = orderBy?.field === 'endedAt' ? 'endedAt' : 'startedAt';\n const sortDirection = orderBy?.direction === 'ASC' ? 'ASC' : 'DESC';\n\n // Count (deduplicated)\n const countResult = await client.query({\n query: `\n SELECT count() as cnt FROM (\n SELECT dedupeKey\n FROM ${TABLE_TRACE_BRANCHES}\n ${whereClause}\n ORDER BY dedupeKey\n LIMIT 1 BY dedupeKey\n )\n `,\n query_params: params,\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n });\n const countRows = (await countResult.json()) as Array<{ cnt: string | number }>;\n const total = Number(countRows[0]?.cnt ?? 0);\n\n if (total === 0) {\n return {\n pagination: { total: 0, page, perPage, hasMore: false },\n branches: [],\n };\n }\n\n const dataResult = await client.query({\n query: `\n SELECT * FROM (\n SELECT *\n FROM ${TABLE_TRACE_BRANCHES}\n ${whereClause}\n ORDER BY dedupeKey\n LIMIT 1 BY dedupeKey\n )\n ORDER BY ${sortField} ${sortDirection}, dedupeKey ASC\n LIMIT {limit:UInt32}\n OFFSET {offset:UInt32}\n `,\n query_params: {\n ...params,\n limit: perPage,\n offset: page * perPage,\n },\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n });\n const rows = (await dataResult.json()) as Record<string, any>[];\n const spans = rows.map(rowToSpanRecord);\n\n return {\n pagination: {\n total,\n page,\n perPage,\n hasMore: (page + 1) * perPage < total,\n },\n branches: toTraceSpans(spans),\n };\n}\n","/**\n * ClickHouse v-next observability storage domain.\n *\n * Insert-only model: Uses ReplacingMergeTree for all signals\n * with dedupeKey for retry-idempotency.\n *\n * Domain layout follows DuckDB reference: thin class delegating to module functions.\n */\n\nimport type { ClickHouseClient } from '@clickhouse/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { createStorageErrorId, ObservabilityStorage } from '@mastra/core/storage';\nimport type {\n ObservabilityStorageStrategy,\n BatchCreateSpansArgs,\n BatchDeleteTracesArgs,\n CreateSpanArgs,\n GetRootSpanArgs,\n GetRootSpanResponse,\n GetSpanArgs,\n GetSpanResponse,\n GetSpansArgs,\n GetSpansResponse,\n GetTraceArgs,\n GetTraceResponse,\n GetTraceLightResponse,\n ListBranchesArgs,\n ListBranchesResponse,\n ListTracesArgs,\n ListTracesResponse,\n BatchCreateLogsArgs,\n ListLogsArgs,\n ListLogsResponse,\n BatchCreateMetricsArgs,\n ListMetricsArgs,\n ListMetricsResponse,\n GetMetricAggregateArgs,\n GetMetricAggregateResponse,\n GetMetricBreakdownArgs,\n GetMetricBreakdownResponse,\n GetMetricTimeSeriesArgs,\n GetMetricTimeSeriesResponse,\n GetMetricPercentilesArgs,\n GetMetricPercentilesResponse,\n GetMetricNamesArgs,\n GetMetricNamesResponse,\n GetMetricLabelKeysArgs,\n GetMetricLabelKeysResponse,\n GetMetricLabelValuesArgs,\n GetMetricLabelValuesResponse,\n CreateScoreArgs,\n BatchCreateScoresArgs,\n ListScoresArgs,\n ListScoresResponse,\n ScoreRecord,\n GetScoreAggregateArgs,\n GetScoreAggregateResponse,\n GetScoreBreakdownArgs,\n GetScoreBreakdownResponse,\n GetScoreTimeSeriesArgs,\n GetScoreTimeSeriesResponse,\n GetScorePercentilesArgs,\n GetScorePercentilesResponse,\n CreateFeedbackArgs,\n BatchCreateFeedbackArgs,\n ListFeedbackArgs,\n ListFeedbackResponse,\n GetFeedbackAggregateArgs,\n GetFeedbackAggregateResponse,\n GetFeedbackBreakdownArgs,\n GetFeedbackBreakdownResponse,\n GetFeedbackTimeSeriesArgs,\n GetFeedbackTimeSeriesResponse,\n GetFeedbackPercentilesArgs,\n GetFeedbackPercentilesResponse,\n GetEntityTypesArgs,\n GetEntityTypesResponse,\n GetEntityNamesArgs,\n GetEntityNamesResponse,\n GetServiceNamesArgs,\n GetServiceNamesResponse,\n GetEnvironmentsArgs,\n GetEnvironmentsResponse,\n GetTagsArgs,\n GetTagsResponse,\n} from '@mastra/core/storage';\n\nimport { resolveClickhouseConfig } from '../../../db';\nimport type { ClickhouseDomainConfig } from '../../../db';\n\nimport {\n ALL_TABLE_DDL,\n ALL_MV_DDL,\n ALL_MIGRATIONS,\n DISCOVERY_MV_DDL,\n ALL_TABLE_NAMES,\n MV_DISCOVERY_VALUES,\n MV_DISCOVERY_PAIRS,\n buildRetentionDDL,\n} from './ddl';\nimport type { RetentionConfig } from './ddl';\nexport type { RetentionConfig } from './ddl';\n\n/** Extended config for v-next observability, adding per-signal retention. */\nexport type VNextObservabilityConfig = ClickhouseDomainConfig & {\n retention?: RetentionConfig;\n};\nimport * as discoveryOps from './discovery';\nimport * as feedbackOps from './feedback';\nimport * as logsOps from './logs';\nimport * as metricsOps from './metrics';\nimport { checkSignalTablesMigrationStatus, migrateSignalTables } from './migration';\nimport * as scoresOps from './scores';\nimport * as traceRootsOps from './trace-roots';\nimport * as tracingOps from './tracing';\n\nfunction buildSignalMigrationRequiredMessage(args: {\n store: 'ClickHouse';\n tables: Array<{ table: string; engine: string }>;\n}): string {\n const tableList = args.tables.map(table => ` - ${table.table} (${table.engine})`).join('\\n');\n\n return (\n `\\n` +\n `===========================================================================\\n` +\n `MIGRATION REQUIRED: ${args.store} observability signal tables need signal IDs\\n` +\n `===========================================================================\\n` +\n `\\n` +\n `The following signal tables still use the legacy schema and must be migrated\\n` +\n `before observability storage can initialize:\\n` +\n `\\n` +\n `${tableList}\\n` +\n `\\n` +\n `To fix this, run the manual migration command:\\n` +\n `\\n` +\n ` npx mastra migrate\\n` +\n `\\n` +\n `This command will:\\n` +\n ` 1. Create replacement signal tables with signal-ID dedupe keys\\n` +\n ` 2. Backfill missing signal IDs for legacy rows\\n` +\n ` 3. Swap the migrated tables into place\\n` +\n `\\n` +\n `WARNING: This migration recreates the signal tables and may take significant\\n` +\n `time for large databases. Please ensure you have a backup before proceeding.\\n` +\n `===========================================================================\\n`\n );\n}\n\nexport class ObservabilityStorageClickhouseVNext extends ObservabilityStorage {\n readonly #client: ClickHouseClient;\n readonly #retention?: RetentionConfig;\n\n constructor(config: VNextObservabilityConfig) {\n super();\n const { client } = resolveClickhouseConfig(config);\n this.#client = client;\n this.#retention = config.retention;\n }\n\n // -------------------------------------------------------------------------\n // Initialization\n // -------------------------------------------------------------------------\n\n async init(): Promise<void> {\n const migrationStatus = await checkSignalTablesMigrationStatus(this.#client);\n if (migrationStatus.needsMigration) {\n throw new MastraError({\n id: createStorageErrorId('CLICKHOUSE', 'MIGRATION_REQUIRED', 'SIGNAL_TABLES'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: buildSignalMigrationRequiredMessage({\n store: 'ClickHouse',\n tables: migrationStatus.tables.map(({ table, engine }) => ({ table, engine })),\n }),\n });\n }\n\n try {\n // Core tables + incremental MVs (must succeed)\n for (const ddl of [...ALL_TABLE_DDL, ...ALL_MV_DDL]) {\n await this.#client.command({ query: ddl });\n }\n\n // Additive migrations for existing databases (add new columns)\n for (const migration of ALL_MIGRATIONS) {\n await this.#client.command({ query: migration });\n }\n\n // Apply retention TTL if configured (per design doc: per-signal, day increments).\n // Uses ALTER TABLE ... MODIFY TTL so re-running init is idempotent.\n if (this.#retention) {\n const ttlStatements = buildRetentionDDL(this.#retention);\n for (const stmt of ttlStatements) {\n await this.#client.command({ query: stmt });\n }\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n const causeMessage = error instanceof Error ? error.message : String(error);\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'VNEXT_INIT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to initialize ClickHouse v-next observability tables: ${causeMessage}`,\n },\n error,\n );\n }\n\n // Discovery refreshable MVs — bootstrap separately.\n // Per design: \"bootstrap failure should not fail the base observability adapter;\n // discovery methods should continue returning empty results until a later refresh succeeds.\"\n try {\n for (const ddl of DISCOVERY_MV_DDL) {\n await this.#client.command({ query: ddl });\n }\n // Trigger an immediate refresh so discovery data is available right away\n // instead of waiting for the first scheduled refresh cycle.\n // SYSTEM REFRESH VIEW kicks off the refresh; SYSTEM WAIT VIEW blocks\n // until it finishes (or re-throws if the refresh failed).\n await this.#client.command({ query: `SYSTEM REFRESH VIEW ${MV_DISCOVERY_VALUES}` });\n await this.#client.command({ query: `SYSTEM WAIT VIEW ${MV_DISCOVERY_VALUES}` });\n await this.#client.command({ query: `SYSTEM REFRESH VIEW ${MV_DISCOVERY_PAIRS}` });\n await this.#client.command({ query: `SYSTEM WAIT VIEW ${MV_DISCOVERY_PAIRS}` });\n } catch {\n // Discovery MVs may fail on ClickHouse versions without refreshable MV support.\n // Discovery methods will return empty results until the MVs are created and refreshed.\n }\n }\n\n /**\n * Manually migrate legacy signal tables to the signal-ID ReplacingMergeTree schema.\n * The public method name is historical; the CLI still calls `migrateSpans()`\n * for observability migrations even though this now also migrates signal tables.\n */\n async migrateSpans(): Promise<{\n success: boolean;\n alreadyMigrated: boolean;\n duplicatesRemoved: number;\n message: string;\n }> {\n const migrationStatus = await checkSignalTablesMigrationStatus(this.#client);\n\n if (!migrationStatus.needsMigration) {\n return {\n success: true,\n alreadyMigrated: true,\n duplicatesRemoved: 0,\n message: 'Migration already complete. Signal tables already use signal-ID dedupe keys.',\n };\n }\n\n await migrateSignalTables(this.#client, this.logger);\n\n return {\n success: true,\n alreadyMigrated: false,\n duplicatesRemoved: 0,\n message: `Migration complete. Migrated signal tables: ${migrationStatus.tables.map(t => t.table).join(', ')}.`,\n };\n }\n\n // -------------------------------------------------------------------------\n // Strategy\n // -------------------------------------------------------------------------\n\n public override get observabilityStrategy(): {\n preferred: ObservabilityStorageStrategy;\n supported: ObservabilityStorageStrategy[];\n } {\n return {\n preferred: 'insert-only',\n supported: ['insert-only'],\n };\n }\n\n // -------------------------------------------------------------------------\n // Tracing — writes\n // -------------------------------------------------------------------------\n\n override async createSpan(args: CreateSpanArgs): Promise<void> {\n try {\n await tracingOps.createSpan(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'CREATE_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId: args.span.traceId, spanId: args.span.spanId },\n },\n error,\n );\n }\n }\n\n override async batchCreateSpans(args: BatchCreateSpansArgs): Promise<void> {\n try {\n await tracingOps.batchCreateSpans(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_CREATE_SPANS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { count: args.records.length },\n },\n error,\n );\n }\n }\n\n // -------------------------------------------------------------------------\n // Tracing — reads\n // -------------------------------------------------------------------------\n\n override async getSpan(args: GetSpanArgs): Promise<GetSpanResponse | null> {\n try {\n return await tracingOps.getSpan(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId: args.traceId, spanId: args.spanId },\n },\n error,\n );\n }\n }\n\n override async getSpans(args: GetSpansArgs): Promise<GetSpansResponse> {\n try {\n return await tracingOps.getSpans(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_SPANS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId: args.traceId, count: args.spanIds.length },\n },\n error,\n );\n }\n }\n\n override async getRootSpan(args: GetRootSpanArgs): Promise<GetRootSpanResponse | null> {\n try {\n return await traceRootsOps.getRootSpan(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_ROOT_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId: args.traceId },\n },\n error,\n );\n }\n }\n\n override async getTrace(args: GetTraceArgs): Promise<GetTraceResponse | null> {\n try {\n return await tracingOps.getTrace(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_TRACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId: args.traceId },\n },\n error,\n );\n }\n }\n\n override async getTraceLight(args: GetTraceArgs): Promise<GetTraceLightResponse | null> {\n try {\n return await tracingOps.getTraceLight(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_TRACE_LIGHT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId: args.traceId },\n },\n error,\n );\n }\n }\n\n override async listTraces(args: ListTracesArgs): Promise<ListTracesResponse> {\n try {\n return await traceRootsOps.listTraces(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async listBranches(args: ListBranchesArgs): Promise<ListBranchesResponse> {\n try {\n return await tracingOps.listBranches(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_BRANCHES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async batchCreateLogs(args: BatchCreateLogsArgs): Promise<void> {\n try {\n await logsOps.batchCreateLogs(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_CREATE_LOGS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { count: args.logs.length },\n },\n error,\n );\n }\n }\n\n override async listLogs(args: ListLogsArgs): Promise<ListLogsResponse> {\n try {\n return await logsOps.listLogs(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_LOGS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async batchCreateMetrics(args: BatchCreateMetricsArgs): Promise<void> {\n try {\n await metricsOps.batchCreateMetrics(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_CREATE_METRICS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { count: args.metrics.length },\n },\n error,\n );\n }\n }\n\n override async listMetrics(args: ListMetricsArgs): Promise<ListMetricsResponse> {\n try {\n return await metricsOps.listMetrics(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_METRICS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async createScore(args: CreateScoreArgs): Promise<void> {\n try {\n await scoresOps.createScore(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'CREATE_SCORE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async batchCreateScores(args: BatchCreateScoresArgs): Promise<void> {\n try {\n await scoresOps.batchCreateScores(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_CREATE_SCORES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { count: args.scores.length },\n },\n error,\n );\n }\n }\n\n override async listScores(args: ListScoresArgs): Promise<ListScoresResponse> {\n try {\n return await scoresOps.listScores(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_SCORES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getScoreById(scoreId: string): Promise<ScoreRecord | null> {\n try {\n return await scoresOps.getScoreById(this.#client, scoreId);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_SCORE_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scoreId },\n },\n error,\n );\n }\n }\n\n override async createFeedback(args: CreateFeedbackArgs): Promise<void> {\n try {\n await feedbackOps.createFeedback(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'CREATE_FEEDBACK', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async batchCreateFeedback(args: BatchCreateFeedbackArgs): Promise<void> {\n try {\n await feedbackOps.batchCreateFeedback(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_CREATE_FEEDBACK', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { count: args.feedbacks.length },\n },\n error,\n );\n }\n }\n\n override async listFeedback(args: ListFeedbackArgs): Promise<ListFeedbackResponse> {\n try {\n return await feedbackOps.listFeedback(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_FEEDBACK', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // -------------------------------------------------------------------------\n // Scores — OLAP\n // -------------------------------------------------------------------------\n\n override async getScoreAggregate(args: GetScoreAggregateArgs): Promise<GetScoreAggregateResponse> {\n try {\n return await scoresOps.getScoreAggregate(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_SCORE_AGGREGATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getScoreBreakdown(args: GetScoreBreakdownArgs): Promise<GetScoreBreakdownResponse> {\n try {\n return await scoresOps.getScoreBreakdown(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_SCORE_BREAKDOWN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getScoreTimeSeries(args: GetScoreTimeSeriesArgs): Promise<GetScoreTimeSeriesResponse> {\n try {\n return await scoresOps.getScoreTimeSeries(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_SCORE_TIME_SERIES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getScorePercentiles(args: GetScorePercentilesArgs): Promise<GetScorePercentilesResponse> {\n try {\n return await scoresOps.getScorePercentiles(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_SCORE_PERCENTILES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // -------------------------------------------------------------------------\n // Feedback — OLAP\n // -------------------------------------------------------------------------\n\n override async getFeedbackAggregate(args: GetFeedbackAggregateArgs): Promise<GetFeedbackAggregateResponse> {\n try {\n return await feedbackOps.getFeedbackAggregate(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_FEEDBACK_AGGREGATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getFeedbackBreakdown(args: GetFeedbackBreakdownArgs): Promise<GetFeedbackBreakdownResponse> {\n try {\n return await feedbackOps.getFeedbackBreakdown(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_FEEDBACK_BREAKDOWN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getFeedbackTimeSeries(args: GetFeedbackTimeSeriesArgs): Promise<GetFeedbackTimeSeriesResponse> {\n try {\n return await feedbackOps.getFeedbackTimeSeries(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_FEEDBACK_TIME_SERIES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getFeedbackPercentiles(args: GetFeedbackPercentilesArgs): Promise<GetFeedbackPercentilesResponse> {\n try {\n return await feedbackOps.getFeedbackPercentiles(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_FEEDBACK_PERCENTILES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // -------------------------------------------------------------------------\n // Metrics — OLAP\n // -------------------------------------------------------------------------\n\n override async getMetricAggregate(args: GetMetricAggregateArgs): Promise<GetMetricAggregateResponse> {\n try {\n return await metricsOps.getMetricAggregate(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_METRIC_AGGREGATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getMetricBreakdown(args: GetMetricBreakdownArgs): Promise<GetMetricBreakdownResponse> {\n try {\n return await metricsOps.getMetricBreakdown(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_METRIC_BREAKDOWN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getMetricTimeSeries(args: GetMetricTimeSeriesArgs): Promise<GetMetricTimeSeriesResponse> {\n try {\n return await metricsOps.getMetricTimeSeries(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_METRIC_TIME_SERIES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getMetricPercentiles(args: GetMetricPercentilesArgs): Promise<GetMetricPercentilesResponse> {\n try {\n return await metricsOps.getMetricPercentiles(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_METRIC_PERCENTILES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // -------------------------------------------------------------------------\n // Metrics — discovery\n // -------------------------------------------------------------------------\n\n override async getMetricNames(args: GetMetricNamesArgs): Promise<GetMetricNamesResponse> {\n try {\n return await metricsOps.getMetricNames(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_METRIC_NAMES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getMetricLabelKeys(args: GetMetricLabelKeysArgs): Promise<GetMetricLabelKeysResponse> {\n try {\n return await metricsOps.getMetricLabelKeys(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_METRIC_LABEL_KEYS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getMetricLabelValues(args: GetMetricLabelValuesArgs): Promise<GetMetricLabelValuesResponse> {\n try {\n return await metricsOps.getMetricLabelValues(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_METRIC_LABEL_VALUES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // -------------------------------------------------------------------------\n // General discovery\n // -------------------------------------------------------------------------\n\n override async getEntityTypes(args: GetEntityTypesArgs): Promise<GetEntityTypesResponse> {\n try {\n return await discoveryOps.getEntityTypes(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_ENTITY_TYPES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getEntityNames(args: GetEntityNamesArgs): Promise<GetEntityNamesResponse> {\n try {\n return await discoveryOps.getEntityNames(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_ENTITY_NAMES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getServiceNames(args: GetServiceNamesArgs): Promise<GetServiceNamesResponse> {\n try {\n return await discoveryOps.getServiceNames(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_SERVICE_NAMES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getEnvironments(args: GetEnvironmentsArgs): Promise<GetEnvironmentsResponse> {\n try {\n return await discoveryOps.getEnvironments(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_ENVIRONMENTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getTags(args: GetTagsArgs): Promise<GetTagsResponse> {\n try {\n return await discoveryOps.getTags(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_TAGS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // -------------------------------------------------------------------------\n // Tracing — deletes\n // -------------------------------------------------------------------------\n\n override async batchDeleteTraces(args: BatchDeleteTracesArgs): Promise<void> {\n try {\n await tracingOps.batchDeleteTraces(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_DELETE_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { count: args.traceIds.length },\n },\n error,\n );\n }\n }\n\n // -------------------------------------------------------------------------\n // Dangerous clear all\n // -------------------------------------------------------------------------\n\n override async dangerouslyClearAll(): Promise<void> {\n try {\n // Truncate all signal tables\n await Promise.all(\n ALL_TABLE_NAMES.map(table => this.#client.command({ query: `TRUNCATE TABLE IF EXISTS ${table}` })),\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'DANGEROUS_CLEAR_ALL', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { saveScorePayloadSchema } from '@mastra/core/evals';\nimport type { ListScoresResponse, SaveScorePayload, ScoreRowData, ScoringSource } from '@mastra/core/evals';\nimport {\n createStorageErrorId,\n ScoresStorage,\n SCORERS_SCHEMA,\n TABLE_SCORERS,\n calculatePagination,\n normalizePerPage,\n transformScoreRow as coreTransformScoreRow,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type { StoragePagination } from '@mastra/core/storage';\nimport { ClickhouseDB, resolveClickhouseConfig } from '../../db';\nimport type { ClickhouseDomainConfig } from '../../db';\n\nexport class ScoresStorageClickhouse extends ScoresStorage {\n protected client: ClickHouseClient;\n #db: ClickhouseDB;\n constructor(config: ClickhouseDomainConfig) {\n super();\n const { client, ttl } = resolveClickhouseConfig(config);\n this.client = client;\n this.#db = new ClickhouseDB({ client, ttl });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_SCORERS, schema: TABLE_SCHEMAS[TABLE_SCORERS] });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_SCORERS });\n }\n\n /**\n * ClickHouse-specific score row transformation.\n * Converts timestamps to Date objects and filters out '_null_' values.\n */\n private transformScoreRow(row: any): ScoreRowData {\n return coreTransformScoreRow(row, {\n convertTimestamps: true,\n nullValuePattern: '_null_',\n });\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n try {\n const result = await this.client.query({\n query: `SELECT * FROM ${TABLE_SCORERS} WHERE id = {var_id:String}`,\n query_params: { var_id: id },\n format: 'JSONEachRow',\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const resultJson = await result.json();\n if (!Array.isArray(resultJson) || resultJson.length === 0) {\n return null;\n }\n\n return this.transformScoreRow(resultJson[0]);\n // return this.parseScoreRow(resultJson[0]);\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_SCORE_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scoreId: id },\n },\n error,\n );\n }\n }\n\n async saveScore(score: SaveScorePayload): Promise<{ score: ScoreRowData }> {\n let parsedScore: SaveScorePayload;\n try {\n parsedScore = saveScorePayloadSchema.parse(score);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'SAVE_SCORE', 'VALIDATION_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n scorer: typeof score.scorer?.id === 'string' ? score.scorer.id : String(score.scorer?.id ?? 'unknown'),\n entityId: score.entityId ?? 'unknown',\n entityType: score.entityType ?? 'unknown',\n traceId: score.traceId ?? '',\n spanId: score.spanId ?? '',\n },\n },\n error,\n );\n }\n\n const now = new Date();\n const id = crypto.randomUUID();\n const createdAt = now;\n const updatedAt = now;\n\n try {\n // Build record from schema columns, converting undefined to null for ClickHouse\n const record: Record<string, unknown> = {};\n for (const key of Object.keys(SCORERS_SCHEMA)) {\n if (key === 'id') {\n record[key] = id;\n continue;\n }\n if (key === 'createdAt' || key === 'updatedAt') {\n record[key] = now.toISOString();\n continue;\n }\n const value = parsedScore[key as keyof typeof parsedScore];\n record[key] = value === undefined || value === null ? '_null_' : value;\n }\n\n await this.client.insert({\n table: TABLE_SCORERS,\n values: [record],\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n return { score: { ...parsedScore, id, createdAt, updatedAt } as ScoreRowData };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'SAVE_SCORE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scoreId: id },\n },\n error,\n );\n }\n }\n\n async listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n try {\n // Get total count\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_SCORERS} WHERE runId = {var_runId:String}`,\n query_params: { var_runId: runId },\n format: 'JSONEachRow',\n });\n const countRows = await countResult.json();\n let total = 0;\n if (Array.isArray(countRows) && countRows.length > 0 && countRows[0]) {\n const countObj = countRows[0] as { count: string | number };\n total = Number(countObj.count);\n }\n\n const { page, perPage: perPageInput } = pagination;\n\n if (!total) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n // Get paginated results\n const result = await this.client.query({\n query: `SELECT * FROM ${TABLE_SCORERS} WHERE runId = {var_runId:String} ORDER BY createdAt DESC LIMIT {var_limit:Int64} OFFSET {var_offset:Int64}`,\n query_params: {\n var_runId: runId,\n var_limit: limitValue,\n var_offset: start,\n },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n const rows = await result.json();\n const scores = Array.isArray(rows) ? rows.map(row => this.transformScoreRow(row)) : [];\n return {\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_SCORES_BY_RUN_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId },\n },\n error,\n );\n }\n }\n\n async listScoresByScorerId({\n scorerId,\n entityId,\n entityType,\n source,\n pagination,\n }: {\n scorerId: string;\n pagination: StoragePagination;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n }): Promise<ListScoresResponse> {\n let whereClause = `scorerId = {var_scorerId:String}`;\n if (entityId) {\n whereClause += ` AND entityId = {var_entityId:String}`;\n }\n if (entityType) {\n whereClause += ` AND entityType = {var_entityType:String}`;\n }\n if (source) {\n whereClause += ` AND source = {var_source:String}`;\n }\n\n try {\n // Get total count\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_SCORERS} WHERE ${whereClause}`,\n query_params: {\n var_scorerId: scorerId,\n var_entityId: entityId,\n var_entityType: entityType,\n var_source: source,\n },\n format: 'JSONEachRow',\n });\n const countRows = await countResult.json();\n let total = 0;\n if (Array.isArray(countRows) && countRows.length > 0 && countRows[0]) {\n const countObj = countRows[0] as { count: string | number };\n total = Number(countObj.count);\n }\n\n const { page, perPage: perPageInput } = pagination;\n\n if (!total) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n // Get paginated results\n const result = await this.client.query({\n query: `SELECT * FROM ${TABLE_SCORERS} WHERE ${whereClause} ORDER BY createdAt DESC LIMIT {var_limit:Int64} OFFSET {var_offset:Int64}`,\n query_params: {\n var_scorerId: scorerId,\n var_limit: limitValue,\n var_offset: start,\n var_entityId: entityId,\n var_entityType: entityType,\n var_source: source,\n },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n const rows = await result.json();\n const scores = Array.isArray(rows) ? rows.map(row => this.transformScoreRow(row)) : [];\n return {\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_SCORES_BY_SCORER_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerId },\n },\n error,\n );\n }\n }\n\n async listScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n pagination: StoragePagination;\n entityId: string;\n entityType: string;\n }): Promise<ListScoresResponse> {\n try {\n // Get total count\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_SCORERS} WHERE entityId = {var_entityId:String} AND entityType = {var_entityType:String}`,\n query_params: { var_entityId: entityId, var_entityType: entityType },\n format: 'JSONEachRow',\n });\n const countRows = await countResult.json();\n let total = 0;\n if (Array.isArray(countRows) && countRows.length > 0 && countRows[0]) {\n const countObj = countRows[0] as { count: string | number };\n total = Number(countObj.count);\n }\n\n const { page, perPage: perPageInput } = pagination;\n\n if (!total) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n // Get paginated results\n const result = await this.client.query({\n query: `SELECT * FROM ${TABLE_SCORERS} WHERE entityId = {var_entityId:String} AND entityType = {var_entityType:String} ORDER BY createdAt DESC LIMIT {var_limit:Int64} OFFSET {var_offset:Int64}`,\n query_params: {\n var_entityId: entityId,\n var_entityType: entityType,\n var_limit: limitValue,\n var_offset: start,\n },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n const rows = await result.json();\n const scores = Array.isArray(rows) ? rows.map(row => this.transformScoreRow(row)) : [];\n return {\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_SCORES_BY_ENTITY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { entityId, entityType },\n },\n error,\n );\n }\n }\n\n async listScoresBySpan({\n traceId,\n spanId,\n pagination,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n try {\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_SCORERS} WHERE traceId = {var_traceId:String} AND spanId = {var_spanId:String}`,\n query_params: {\n var_traceId: traceId,\n var_spanId: spanId,\n },\n format: 'JSONEachRow',\n });\n const countRows = await countResult.json();\n let total = 0;\n if (Array.isArray(countRows) && countRows.length > 0 && countRows[0]) {\n const countObj = countRows[0] as { count: string | number };\n total = Number(countObj.count);\n }\n\n const { page, perPage: perPageInput } = pagination;\n\n if (!total) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n const result = await this.client.query({\n query: `SELECT * FROM ${TABLE_SCORERS} WHERE traceId = {var_traceId:String} AND spanId = {var_spanId:String} ORDER BY createdAt DESC LIMIT {var_limit:Int64} OFFSET {var_offset:Int64}`,\n query_params: {\n var_traceId: traceId,\n var_spanId: spanId,\n var_limit: limitValue,\n var_offset: start,\n },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = await result.json();\n const scores = Array.isArray(rows) ? rows.map(row => this.transformScoreRow(row)) : [];\n\n return {\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_SCORES_BY_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId, spanId },\n },\n error,\n );\n }\n }\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n normalizePerPage,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_SCHEMAS,\n WorkflowsStorage,\n} from '@mastra/core/storage';\nimport type {\n WorkflowRun,\n WorkflowRuns,\n StorageListWorkflowRunsInput,\n UpdateWorkflowStateOptions,\n} from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport { ClickhouseDB, resolveClickhouseConfig } from '../../db';\nimport type { ClickhouseDomainConfig } from '../../db';\nimport { TABLE_ENGINES } from '../../db/utils';\n\nexport class WorkflowsStorageClickhouse extends WorkflowsStorage {\n protected client: ClickHouseClient;\n #db: ClickhouseDB;\n constructor(config: ClickhouseDomainConfig) {\n super();\n const { client, ttl } = resolveClickhouseConfig(config);\n this.client = client;\n this.#db = new ClickhouseDB({ client, ttl });\n }\n\n supportsConcurrentUpdates(): boolean {\n // ClickHouse is an OLAP database using ReplacingMergeTree for deduplication\n // It doesn't support atomic read-modify-write operations needed for concurrent updates\n return false;\n }\n\n async init(): Promise<void> {\n const schema = TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT];\n await this.#db.createTable({ tableName: TABLE_WORKFLOW_SNAPSHOT, schema });\n // Add resourceId column for backwards compatibility\n await this.#db.alterTable({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n schema,\n ifNotExists: ['resourceId'],\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_WORKFLOW_SNAPSHOT });\n }\n\n async updateWorkflowResults(_args: {\n workflowName: string;\n runId: string;\n stepId: string;\n result: StepResult<any, any, any, any>;\n requestContext: Record<string, any>;\n }): Promise<Record<string, StepResult<any, any, any, any>>> {\n throw new Error(\n 'updateWorkflowResults is not implemented for ClickHouse storage. ClickHouse is an OLAP database and does not support atomic read-modify-write operations needed for concurrent workflow updates.',\n );\n }\n\n async updateWorkflowState(_args: {\n workflowName: string;\n runId: string;\n opts: UpdateWorkflowStateOptions;\n }): Promise<WorkflowRunState | undefined> {\n throw new Error(\n 'updateWorkflowState is not implemented for ClickHouse storage. ClickHouse is an OLAP database and does not support atomic read-modify-write operations needed for concurrent workflow updates.',\n );\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n createdAt,\n updatedAt,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n createdAt?: Date;\n updatedAt?: Date;\n }): Promise<void> {\n try {\n const currentSnapshot = await this.#db.load({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: { workflow_name: workflowName, run_id: runId },\n });\n\n const now = new Date();\n const persisting = currentSnapshot\n ? {\n ...currentSnapshot,\n resourceId,\n snapshot: JSON.stringify(snapshot),\n updatedAt: (updatedAt ?? now).toISOString(),\n }\n : {\n workflow_name: workflowName,\n run_id: runId,\n resourceId,\n snapshot: JSON.stringify(snapshot),\n createdAt: (createdAt ?? now).toISOString(),\n updatedAt: (updatedAt ?? now).toISOString(),\n };\n\n await this.client.insert({\n table: TABLE_WORKFLOW_SNAPSHOT,\n format: 'JSONEachRow',\n values: [persisting],\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'PERSIST_WORKFLOW_SNAPSHOT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n try {\n const result = await this.#db.load({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: {\n workflow_name: workflowName,\n run_id: runId,\n },\n });\n\n if (!result) {\n return null;\n }\n\n return (result as any).snapshot;\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LOAD_WORKFLOW_SNAPSHOT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n private parseWorkflowRun(row: any): WorkflowRun {\n let parsedSnapshot: WorkflowRunState | string = row.snapshot as string;\n if (typeof parsedSnapshot === 'string') {\n try {\n parsedSnapshot = JSON.parse(row.snapshot as string) as WorkflowRunState;\n } catch (e) {\n // If parsing fails, return the raw snapshot string\n this.logger.warn(`Failed to parse snapshot for workflow ${row.workflow_name}: ${e}`);\n }\n }\n\n return {\n workflowName: row.workflow_name,\n runId: row.run_id,\n snapshot: parsedSnapshot,\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n resourceId: row.resourceId,\n };\n }\n\n async listWorkflowRuns({\n workflowName,\n fromDate,\n toDate,\n page,\n perPage,\n resourceId,\n status,\n }: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n try {\n const conditions: string[] = [];\n const values: Record<string, any> = {};\n\n if (workflowName) {\n conditions.push(`workflow_name = {var_workflow_name:String}`);\n values.var_workflow_name = workflowName;\n }\n\n if (status) {\n conditions.push(`JSONExtractString(snapshot, 'status') = {var_status:String}`);\n values.var_status = status;\n }\n\n if (resourceId) {\n const hasResourceId = await this.#db.hasColumn(TABLE_WORKFLOW_SNAPSHOT, 'resourceId');\n if (hasResourceId) {\n conditions.push(`resourceId = {var_resourceId:String}`);\n values.var_resourceId = resourceId;\n } else {\n this.logger.warn(`[${TABLE_WORKFLOW_SNAPSHOT}] resourceId column not found. Skipping resourceId filter.`);\n }\n }\n\n if (fromDate) {\n conditions.push(`createdAt >= {var_from_date:DateTime64(3)}`);\n values.var_from_date = fromDate.getTime() / 1000; // Convert to Unix timestamp\n }\n\n if (toDate) {\n conditions.push(`createdAt <= {var_to_date:DateTime64(3)}`);\n values.var_to_date = toDate.getTime() / 1000; // Convert to Unix timestamp\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const usePagination = perPage !== undefined && page !== undefined;\n const normalizedPerPage = usePagination ? normalizePerPage(perPage, Number.MAX_SAFE_INTEGER) : 0;\n const offset = usePagination ? page * normalizedPerPage : 0;\n const limitClause = usePagination ? `LIMIT ${normalizedPerPage}` : '';\n const offsetClause = usePagination ? `OFFSET ${offset}` : '';\n\n let total = 0;\n // Only get total count when using pagination\n if (usePagination) {\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_WORKFLOW_SNAPSHOT} ${TABLE_ENGINES[TABLE_WORKFLOW_SNAPSHOT].startsWith('ReplacingMergeTree') ? 'FINAL' : ''} ${whereClause}`,\n query_params: values,\n format: 'JSONEachRow',\n });\n const countRows = await countResult.json();\n total = Number((countRows as Array<{ count: string | number }>)[0]?.count ?? 0);\n }\n\n // Get results\n const result = await this.client.query({\n query: `\n SELECT \n workflow_name,\n run_id,\n snapshot,\n toDateTime64(createdAt, 3) as createdAt,\n toDateTime64(updatedAt, 3) as updatedAt,\n resourceId\n FROM ${TABLE_WORKFLOW_SNAPSHOT} ${TABLE_ENGINES[TABLE_WORKFLOW_SNAPSHOT].startsWith('ReplacingMergeTree') ? 'FINAL' : ''}\n ${whereClause}\n ORDER BY createdAt DESC\n ${limitClause}\n ${offsetClause}\n `,\n query_params: values,\n format: 'JSONEachRow',\n });\n\n const resultJson = await result.json();\n const rows = resultJson as any[];\n const runs = rows.map(row => {\n return this.parseWorkflowRun(row);\n });\n\n // Use runs.length as total when not paginating\n return { runs, total: total || runs.length };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_WORKFLOW_RUNS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName: workflowName ?? '', resourceId: resourceId ?? '' },\n },\n error,\n );\n }\n }\n\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n try {\n const conditions: string[] = [];\n const values: Record<string, any> = {};\n\n if (runId) {\n conditions.push(`run_id = {var_runId:String}`);\n values.var_runId = runId;\n }\n\n if (workflowName) {\n conditions.push(`workflow_name = {var_workflow_name:String}`);\n values.var_workflow_name = workflowName;\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Get results\n const result = await this.client.query({\n query: `\n SELECT \n workflow_name,\n run_id,\n snapshot,\n toDateTime64(createdAt, 3) as createdAt,\n toDateTime64(updatedAt, 3) as updatedAt,\n resourceId\n FROM ${TABLE_WORKFLOW_SNAPSHOT} ${TABLE_ENGINES[TABLE_WORKFLOW_SNAPSHOT].startsWith('ReplacingMergeTree') ? 'FINAL' : ''}\n ${whereClause}\n ORDER BY createdAt DESC LIMIT 1\n `,\n query_params: values,\n format: 'JSONEachRow',\n });\n\n const resultJson = await result.json();\n if (!Array.isArray(resultJson) || resultJson.length === 0) {\n return null;\n }\n return this.parseWorkflowRun(resultJson[0]);\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_WORKFLOW_RUN_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId: runId ?? '', workflowName: workflowName ?? '' },\n },\n error,\n );\n }\n }\n\n async deleteWorkflowRunById({ runId, workflowName }: { runId: string; workflowName: string }): Promise<void> {\n try {\n const values: Record<string, any> = {\n var_runId: runId,\n var_workflow_name: workflowName,\n };\n\n await this.client.command({\n query: `DELETE FROM ${TABLE_WORKFLOW_SNAPSHOT} WHERE run_id = {var_runId:String} AND workflow_name = {var_workflow_name:String}`,\n query_params: values,\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'DELETE_WORKFLOW_RUN_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId, workflowName },\n },\n error,\n );\n }\n }\n}\n","import type { ClickHouseClient, ClickHouseClientConfigOptions } from '@clickhouse/client';\nimport { createClient } from '@clickhouse/client';\nimport { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport { createStorageErrorId, MastraCompositeStore } from '@mastra/core/storage';\nimport type { TABLE_NAMES, StorageDomains, TABLE_SCHEMAS } from '@mastra/core/storage';\nimport { BackgroundTasksStorageClickhouse } from './domains/background-tasks';\nimport { MemoryStorageClickhouse } from './domains/memory';\nimport { ObservabilityStorageClickhouse } from './domains/observability';\nimport { ObservabilityStorageClickhouseVNext } from './domains/observability/v-next';\nexport type { VNextObservabilityConfig, RetentionConfig } from './domains/observability/v-next';\nimport { ScoresStorageClickhouse } from './domains/scores';\nimport { WorkflowsStorageClickhouse } from './domains/workflows';\n\n// Export domain classes for direct use with MastraStorage composition\nexport {\n BackgroundTasksStorageClickhouse,\n MemoryStorageClickhouse,\n ObservabilityStorageClickhouse,\n ObservabilityStorageClickhouseVNext,\n ScoresStorageClickhouse,\n WorkflowsStorageClickhouse,\n};\nexport type { ClickhouseDomainConfig } from './db';\n\ntype IntervalUnit =\n | 'NANOSECOND'\n | 'MICROSECOND'\n | 'MILLISECOND'\n | 'SECOND'\n | 'MINUTE'\n | 'HOUR'\n | 'DAY'\n | 'WEEK'\n | 'MONTH'\n | 'QUARTER'\n | 'YEAR';\n\ntype ClickhouseTtlConfig = {\n [TableKey in TABLE_NAMES]?: {\n row?: { interval: number; unit: IntervalUnit; ttlKey?: string };\n columns?: Partial<{\n [ColumnKey in keyof (typeof TABLE_SCHEMAS)[TableKey]]: {\n interval: number;\n unit: IntervalUnit;\n ttlKey?: string;\n };\n }>;\n };\n};\n\n/**\n * ClickHouse credentials configuration.\n * Requires url, username, and password, plus supports all other ClickHouseClientConfigOptions.\n */\ntype ClickhouseCredentialsConfig = Omit<ClickHouseClientConfigOptions, 'url' | 'username' | 'password'> & {\n /** ClickHouse server URL (required) */\n url: string;\n /** ClickHouse username (required) */\n username: string;\n /** ClickHouse password (required) */\n password: string;\n};\n\n/**\n * ClickHouse configuration type.\n *\n * Accepts either:\n * - A pre-configured ClickHouse client: `{ id, client, ttl? }`\n * - ClickHouse credentials with optional advanced options: `{ id, url, username, password, ... }`\n *\n * All ClickHouseClientConfigOptions are supported (database, request_timeout,\n * compression, keep_alive, max_open_connections, etc.).\n *\n * @example\n * ```typescript\n * // Simple credentials config\n * const store = new ClickhouseStore({\n * id: 'my-store',\n * url: 'http://localhost:8123',\n * username: 'default',\n * password: '',\n * });\n *\n * // With advanced options\n * const store = new ClickhouseStore({\n * id: 'my-store',\n * url: 'http://localhost:8123',\n * username: 'default',\n * password: '',\n * request_timeout: 60000,\n * compression: { request: true, response: true },\n * keep_alive: { enabled: true },\n * });\n * ```\n */\nexport type ClickhouseConfig = {\n id: string;\n ttl?: ClickhouseTtlConfig;\n /**\n * When true, automatic initialization (table creation/migrations) is disabled.\n * This is useful for CI/CD pipelines where you want to:\n * 1. Run migrations explicitly during deployment (not at runtime)\n * 2. Use different credentials for schema changes vs runtime operations\n *\n * When disableInit is true:\n * - The storage will not automatically create/alter tables on first use\n * - You must call `storage.init()` explicitly in your CI/CD scripts\n *\n * @example\n * // In CI/CD script:\n * const storage = new ClickhouseStore({ ...config, disableInit: false });\n * await storage.init(); // Explicitly run migrations\n *\n * // In runtime application:\n * const storage = new ClickhouseStore({ ...config, disableInit: true });\n * // No auto-init, tables must already exist\n */\n disableInit?: boolean;\n} & (\n | {\n /**\n * Pre-configured ClickHouse client.\n * Use this when you need to configure the client before initialization,\n * e.g., to set custom connection settings or interceptors.\n *\n * @example\n * ```typescript\n * import { createClient } from '@clickhouse/client';\n *\n * const client = createClient({\n * url: 'http://localhost:8123',\n * username: 'default',\n * password: '',\n * // Custom settings\n * request_timeout: 60000,\n * });\n *\n * const store = new ClickhouseStore({ id: 'my-store', client });\n * ```\n */\n client: ClickHouseClient;\n }\n | ClickhouseCredentialsConfig\n);\n\n/**\n * Type guard for pre-configured client config\n */\nconst isClientConfig = (config: ClickhouseConfig): config is ClickhouseConfig & { client: ClickHouseClient } => {\n return 'client' in config;\n};\n\n/**\n * ClickHouse storage adapter for Mastra.\n *\n * Access domain-specific storage via `getStore()`:\n *\n * @example\n * ```typescript\n * const storage = new ClickhouseStore({ id: 'my-store', url: '...', username: '...', password: '...' });\n *\n * // Access memory domain\n * const memory = await storage.getStore('memory');\n * await memory?.saveThread({ thread });\n *\n * // Access workflows domain\n * const workflows = await storage.getStore('workflows');\n * await workflows?.persistWorkflowSnapshot({ workflowName, runId, snapshot });\n *\n * // Access observability domain\n * const observability = await storage.getStore('observability');\n * await observability?.createSpan(span);\n * ```\n */\nexport class ClickhouseStore extends MastraCompositeStore {\n protected db: ClickHouseClient;\n protected ttl: ClickhouseConfig['ttl'] = {};\n\n stores: StorageDomains;\n\n constructor(config: ClickhouseConfig) {\n super({ id: config.id, name: 'ClickhouseStore', disableInit: config.disableInit });\n\n // Handle pre-configured client vs creating new connection\n if (isClientConfig(config)) {\n // User provided a pre-configured ClickHouse client\n this.db = config.client;\n } else {\n // Validate URL before creating client\n if (!config.url || typeof config.url !== 'string' || config.url.trim() === '') {\n throw new Error('ClickhouseStore: url is required and cannot be empty.');\n }\n // Validate username and password are strings (can be empty for default user)\n if (typeof config.username !== 'string') {\n throw new Error('ClickhouseStore: username must be a string.');\n }\n if (typeof config.password !== 'string') {\n throw new Error('ClickhouseStore: password must be a string.');\n }\n\n // Extract Mastra-specific config, pass rest to ClickHouse client\n const { id, ttl, disableInit, clickhouse_settings, ...clientOptions } = config;\n\n // Create client with all provided options\n this.db = createClient({\n ...clientOptions,\n clickhouse_settings: {\n ...clickhouse_settings,\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso', // This is crucial\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n }\n\n this.ttl = config.ttl;\n\n const domainConfig = { client: this.db, ttl: this.ttl };\n const workflows = new WorkflowsStorageClickhouse(domainConfig);\n const scores = new ScoresStorageClickhouse(domainConfig);\n const memory = new MemoryStorageClickhouse(domainConfig);\n const observability = new ObservabilityStorageClickhouse(domainConfig);\n\n this.stores = {\n workflows,\n scores,\n memory,\n observability,\n backgroundTasks: new BackgroundTasksStorageClickhouse(domainConfig),\n };\n }\n\n async optimizeTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n await this.db.command({\n query: `OPTIMIZE TABLE ${tableName} FINAL`,\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'OPTIMIZE_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async materializeTtl({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n await this.db.command({\n query: `ALTER TABLE ${tableName} MATERIALIZE TTL;`,\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'MATERIALIZE_TTL', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n /**\n * Closes the ClickHouse client connection.\n *\n * This will close the ClickHouse client, including pre-configured clients.\n * The store assumes ownership of all clients and manages their lifecycle.\n */\n async close(): Promise<void> {\n try {\n await this.db.close();\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'CLOSE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n\n/**\n * ClickHouse storage adapter that uses the vNext observability domain by default.\n *\n * Equivalent to constructing a `ClickhouseStore` and overriding the `observability`\n * domain with `ObservabilityStorageClickhouseVNext` through `MastraCompositeStore`.\n * Use this in new projects to opt into the vNext observability schema without\n * needing to wire the composite manually.\n *\n * Accepts the same configuration as `ClickhouseStore`. The underlying ClickHouse\n * client is shared between every domain, including observability.\n *\n * @example\n * ```typescript\n * import { Mastra } from '@mastra/core';\n * import { ClickhouseStoreVNext } from '@mastra/clickhouse';\n *\n * export const mastra = new Mastra({\n * storage: new ClickhouseStoreVNext({\n * id: 'clickhouse-storage',\n * url: process.env.CLICKHOUSE_URL!,\n * username: process.env.CLICKHOUSE_USERNAME!,\n * password: process.env.CLICKHOUSE_PASSWORD!,\n * }),\n * });\n * ```\n */\nexport class ClickhouseStoreVNext extends ClickhouseStore {\n constructor(config: ClickhouseConfig) {\n super(config);\n\n // Identify as ClickhouseStoreVNext for callers that introspect `name`.\n // The logger created by MastraBase still reflects the parent name.\n this.name = 'ClickhouseStoreVNext';\n\n // Replace the legacy observability domain set up by ClickhouseStore with the\n // vNext implementation. Both share the same underlying client.\n const observability = new ObservabilityStorageClickhouseVNext({ client: this.db });\n\n this.stores = {\n ...this.stores,\n observability,\n };\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/storage/db/utils.ts","../src/storage/db/index.ts","../src/storage/domains/background-tasks/index.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/observability/index.ts","../src/storage/domains/observability/v-next/ddl.ts","../src/storage/domains/observability/v-next/helpers.ts","../src/storage/domains/observability/v-next/discovery.ts","../src/storage/domains/observability/v-next/filters.ts","../src/storage/domains/observability/v-next/feedback.ts","../src/storage/domains/observability/v-next/logs.ts","../src/storage/domains/observability/v-next/metrics.ts","../src/storage/domains/observability/v-next/migration.ts","../src/storage/domains/observability/v-next/scores.ts","../src/storage/domains/observability/v-next/trace-roots.ts","../src/storage/domains/observability/v-next/tracing.ts","../src/storage/domains/observability/v-next/index.ts","../src/storage/domains/scores/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/index.ts"],"names":["TABLE_MESSAGES","TABLE_WORKFLOW_SNAPSHOT","TABLE_TRACES","TABLE_THREADS","TABLE_SCORERS","TABLE_RESOURCES","TABLE_SPANS","TABLE_AGENT_VERSIONS","TABLE_DATASETS","TABLE_DATASET_ITEMS","TABLE_DATASET_VERSIONS","TABLE_EXPERIMENTS","TABLE_EXPERIMENT_RESULTS","TABLE_PROMPT_BLOCKS","TABLE_PROMPT_BLOCK_VERSIONS","TABLE_SCORER_DEFINITIONS","TABLE_SCORER_DEFINITION_VERSIONS","TABLE_MCP_CLIENTS","TABLE_MCP_CLIENT_VERSIONS","TABLE_MCP_SERVERS","TABLE_MCP_SERVER_VERSIONS","TABLE_WORKSPACES","TABLE_WORKSPACE_VERSIONS","TABLE_SKILLS","TABLE_SKILL_VERSIONS","TABLE_SKILL_BLOBS","TABLE_SCHEDULES","TABLE_SCHEDULE_TRIGGERS","safelyParseJSON","client","createClient","MastraBase","error","MastraError","createStorageErrorId","ErrorDomain","ErrorCategory","getSqlType","getDefaultValue","TABLE_SCHEMAS","parseJson","BackgroundTasksStorage","TABLE_BACKGROUND_TASKS","MemoryStorage","MessageList","normalizePerPage","calculatePagination","list","ObservabilityStorage","SPAN_SCHEMA","listTracesArgsSchema","TraceStatus","engine","finalClause","toTraceSpans","EntityType","parseFieldKey","queryJson","listFeedbackArgsSchema","sql","rows","listLogsArgsSchema","GROUP_BY_EXCLUDED","METRIC_DISTINCT_COLUMNS","getAggregationSql","getIntervalSql","mergeFilters","toWhereClause","listMetricsArgsSchema","entry","toSeriesName","listScoresArgsSchema","BRANCH_SPAN_TYPES","listBranchesArgsSchema","ScoresStorage","coreTransformScoreRow","saveScorePayloadSchema","SCORERS_SCHEMA","WorkflowsStorage","toDate","MastraCompositeStore"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { TABLE_NAMES, TABLE_SCHEMAS, StorageColumn } from '@mastra/core/storage';\nimport {\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_SCORERS,\n TABLE_THREADS,\n TABLE_TRACES,\n TABLE_WORKFLOW_SNAPSHOT,\n safelyParseJSON,\n TABLE_SPANS,\n TABLE_AGENT_VERSIONS,\n TABLE_DATASETS,\n TABLE_DATASET_ITEMS,\n TABLE_DATASET_VERSIONS,\n TABLE_EXPERIMENTS,\n TABLE_EXPERIMENT_RESULTS,\n TABLE_PROMPT_BLOCKS,\n TABLE_PROMPT_BLOCK_VERSIONS,\n TABLE_SCORER_DEFINITIONS,\n TABLE_SCORER_DEFINITION_VERSIONS,\n TABLE_MCP_CLIENTS,\n TABLE_MCP_CLIENT_VERSIONS,\n TABLE_MCP_SERVERS,\n TABLE_MCP_SERVER_VERSIONS,\n TABLE_WORKSPACES,\n TABLE_WORKSPACE_VERSIONS,\n TABLE_SKILLS,\n TABLE_SKILL_VERSIONS,\n TABLE_SKILL_BLOBS,\n TABLE_SCHEDULES,\n TABLE_SCHEDULE_TRIGGERS,\n} from '@mastra/core/storage';\n\nexport const TABLE_ENGINES: Record<TABLE_NAMES, string> = {\n [TABLE_MESSAGES]: `MergeTree()`,\n [TABLE_WORKFLOW_SNAPSHOT]: `ReplacingMergeTree()`,\n [TABLE_TRACES]: `MergeTree()`,\n [TABLE_THREADS]: `ReplacingMergeTree()`,\n [TABLE_SCORERS]: `MergeTree()`,\n [TABLE_RESOURCES]: `ReplacingMergeTree()`,\n // ReplacingMergeTree(updatedAt) deduplicates rows with the same (traceId, spanId) sorting key,\n // keeping the row with the highest updatedAt value. Combined with ORDER BY (traceId, spanId),\n // this provides eventual uniqueness for the (traceId, spanId) composite key.\n [TABLE_SPANS]: `ReplacingMergeTree(updatedAt)`,\n mastra_agents: `ReplacingMergeTree()`,\n [TABLE_AGENT_VERSIONS]: `MergeTree()`,\n [TABLE_DATASETS]: `ReplacingMergeTree()`,\n [TABLE_DATASET_ITEMS]: `ReplacingMergeTree()`,\n [TABLE_DATASET_VERSIONS]: `MergeTree()`,\n [TABLE_EXPERIMENTS]: `ReplacingMergeTree()`,\n [TABLE_EXPERIMENT_RESULTS]: `MergeTree()`,\n [TABLE_PROMPT_BLOCKS]: `ReplacingMergeTree()`,\n [TABLE_PROMPT_BLOCK_VERSIONS]: `MergeTree()`,\n [TABLE_SCORER_DEFINITIONS]: `ReplacingMergeTree()`,\n [TABLE_SCORER_DEFINITION_VERSIONS]: `MergeTree()`,\n [TABLE_MCP_CLIENTS]: `ReplacingMergeTree()`,\n [TABLE_MCP_CLIENT_VERSIONS]: `MergeTree()`,\n [TABLE_MCP_SERVERS]: `ReplacingMergeTree()`,\n [TABLE_MCP_SERVER_VERSIONS]: `MergeTree()`,\n [TABLE_WORKSPACES]: `ReplacingMergeTree()`,\n [TABLE_WORKSPACE_VERSIONS]: `MergeTree()`,\n [TABLE_SKILLS]: `ReplacingMergeTree()`,\n [TABLE_SKILL_VERSIONS]: `MergeTree()`,\n [TABLE_SKILL_BLOBS]: `ReplacingMergeTree()`,\n mastra_background_tasks: `ReplacingMergeTree()`,\n [TABLE_SCHEDULES]: `ReplacingMergeTree()`,\n [TABLE_SCHEDULE_TRIGGERS]: `MergeTree()`,\n mastra_channel_installations: `ReplacingMergeTree()`,\n mastra_channel_config: `ReplacingMergeTree()`,\n};\n\nexport const COLUMN_TYPES: Record<StorageColumn['type'], string> = {\n text: 'String',\n timestamp: 'DateTime64(3)',\n uuid: 'String',\n jsonb: 'String',\n integer: 'Int64',\n float: 'Float64',\n bigint: 'Int64',\n boolean: 'Bool',\n};\n\nexport type IntervalUnit =\n | 'NANOSECOND'\n | 'MICROSECOND'\n | 'MILLISECOND'\n | 'SECOND'\n | 'MINUTE'\n | 'HOUR'\n | 'DAY'\n | 'WEEK'\n | 'MONTH'\n | 'QUARTER'\n | 'YEAR';\n\nexport type ClickhouseConfig = {\n url: string;\n username: string;\n password: string;\n ttl?: {\n [TableKey in TABLE_NAMES]?: {\n row?: { interval: number; unit: IntervalUnit; ttlKey?: string };\n columns?: Partial<{\n [ColumnKey in keyof (typeof TABLE_SCHEMAS)[TableKey]]: {\n interval: number;\n unit: IntervalUnit;\n ttlKey?: string;\n };\n }>;\n };\n };\n};\n\n// List of fields that should be parsed as JSON\nconst JSON_FIELDS = ['content', 'attributes', 'metadata', 'input', 'output', 'error', 'scope', 'links'];\n\n// Fields that should be null instead of empty string when empty\nconst NULLABLE_STRING_FIELDS = ['parentSpanId', 'error'];\n\nexport function transformRow<R>(row: any): R {\n if (!row) {\n return row;\n }\n\n if (row.createdAt) {\n row.createdAt = new Date(row.createdAt);\n }\n if (row.updatedAt) {\n row.updatedAt = new Date(row.updatedAt);\n }\n if (row.startedAt) {\n row.startedAt = new Date(row.startedAt);\n }\n if (row.endedAt) {\n row.endedAt = new Date(row.endedAt);\n }\n\n // Parse JSONB fields if they're JSON strings\n for (const field of JSON_FIELDS) {\n if (row[field] && typeof row[field] === 'string') {\n row[field] = safelyParseJSON(row[field]);\n }\n }\n\n // Convert empty strings to null for nullable fields\n for (const field of NULLABLE_STRING_FIELDS) {\n if (row[field] === '') {\n row[field] = null;\n }\n }\n\n return row;\n}\n\nexport function transformRows<R>(rows: any[]): R[] {\n return rows.map((row: any) => transformRow<R>(row));\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { createClient } from '@clickhouse/client';\nimport { MastraBase } from '@mastra/core/base';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n getSqlType,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_SPANS,\n TABLE_SCHEMAS,\n getDefaultValue,\n} from '@mastra/core/storage';\nimport type { StorageColumn, TABLE_NAMES } from '@mastra/core/storage';\nimport type { ClickhouseConfig } from './utils';\nimport { TABLE_ENGINES, transformRow } from './utils';\n\n/**\n * Configuration for standalone domain usage.\n * Accepts either:\n * 1. An existing ClickHouse client with optional ttl config\n * 2. Config to create a new client internally\n */\nexport type ClickhouseDomainConfig = ClickhouseDomainClientConfig | ClickhouseDomainRestConfig;\n\n/**\n * Pass an existing ClickHouse client\n */\nexport interface ClickhouseDomainClientConfig {\n client: ClickHouseClient;\n ttl?: ClickhouseConfig['ttl'];\n}\n\n/**\n * Pass config to create a new ClickHouse client internally\n */\nexport interface ClickhouseDomainRestConfig {\n url: string;\n username: string;\n password: string;\n ttl?: ClickhouseConfig['ttl'];\n}\n\n/**\n * Resolves ClickhouseDomainConfig to a ClickHouse client and ttl config.\n * Handles creating a new client if config is provided.\n */\nexport function resolveClickhouseConfig(config: ClickhouseDomainConfig): {\n client: ClickHouseClient;\n ttl?: ClickhouseConfig['ttl'];\n} {\n // Existing client\n if ('client' in config) {\n return { client: config.client, ttl: config.ttl };\n }\n\n // Config to create new client\n const client = createClient({\n url: config.url,\n username: config.username,\n password: config.password,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n return { client, ttl: config.ttl };\n}\n\nexport class ClickhouseDB extends MastraBase {\n protected ttl: ClickhouseConfig['ttl'];\n protected client: ClickHouseClient;\n\n /** Cache of actual table columns: tableName -> Promise<Set<columnName>> (stores in-flight promise to coalesce concurrent calls) */\n private tableColumnsCache = new Map<string, Promise<Set<string>>>();\n\n constructor({ client, ttl }: { client: ClickHouseClient; ttl: ClickhouseConfig['ttl'] }) {\n super({\n name: 'CLICKHOUSE_DB',\n });\n this.ttl = ttl;\n this.client = client;\n }\n\n /**\n * Gets the set of column names that actually exist in the database table.\n * Results are cached; the cache is invalidated when alterTable() adds new columns.\n */\n private async getTableColumns(tableName: TABLE_NAMES): Promise<Set<string>> {\n const cached = this.tableColumnsCache.get(tableName);\n if (cached) return cached;\n\n // Store the in-flight promise so concurrent callers (e.g. Promise.all in batchInsert) await the same query\n const promise = (async () => {\n try {\n const result = await this.client.query({\n query: `DESCRIBE TABLE ${tableName}`,\n format: 'JSONEachRow',\n });\n const rows = (await result.json()) as Array<{ name: string }>;\n const columns = new Set(rows.map(r => r.name));\n if (columns.size === 0) {\n this.tableColumnsCache.delete(tableName);\n }\n return columns;\n } catch {\n // Table may not exist yet\n this.tableColumnsCache.delete(tableName);\n return new Set<string>();\n }\n })();\n this.tableColumnsCache.set(tableName, promise);\n\n return promise;\n }\n\n /**\n * Filters a record to only include columns that exist in the actual database table.\n * Unknown columns are silently dropped to ensure forward compatibility.\n */\n private async filterRecordToKnownColumns(\n tableName: TABLE_NAMES,\n record: Record<string, any>,\n ): Promise<Record<string, any>> {\n const knownColumns = await this.getTableColumns(tableName);\n if (knownColumns.size === 0) return record;\n\n const filtered: Record<string, any> = {};\n for (const [key, value] of Object.entries(record)) {\n if (knownColumns.has(key)) {\n filtered[key] = value;\n }\n }\n return filtered;\n }\n\n async hasColumn(table: string, column: string): Promise<boolean> {\n const result = await this.client.query({\n query: `DESCRIBE TABLE ${table}`,\n format: 'JSONEachRow',\n });\n const columns = (await result.json()) as { name: string }[];\n return columns.some(c => c.name === column);\n }\n\n /**\n * Checks if a table exists in the database.\n */\n async tableExists(tableName: string): Promise<boolean> {\n try {\n const result = await this.client.query({\n query: `EXISTS TABLE ${tableName}`,\n format: 'JSONEachRow',\n });\n const rows = (await result.json()) as Array<{ result: number }>;\n return rows[0]?.result === 1;\n } catch {\n return false;\n }\n }\n\n /**\n * Gets the sorting key (ORDER BY columns) for a table.\n * Returns null if the table doesn't exist.\n */\n async getTableSortingKey(tableName: string): Promise<string | null> {\n try {\n const result = await this.client.query({\n query: `SELECT sorting_key FROM system.tables WHERE database = currentDatabase() AND name = {tableName:String}`,\n query_params: { tableName },\n format: 'JSONEachRow',\n });\n const rows = (await result.json()) as Array<{ sorting_key: string }>;\n return rows[0]?.sorting_key ?? null;\n } catch {\n return null;\n }\n }\n\n /**\n * Checks if migration is needed for the spans table.\n * Returns information about the current state.\n */\n async checkSpansMigrationStatus(tableName: string): Promise<{\n needsMigration: boolean;\n currentSortingKey: string | null;\n }> {\n // Check if table exists\n const exists = await this.tableExists(tableName);\n if (!exists) {\n return { needsMigration: false, currentSortingKey: null };\n }\n\n // Check current sorting key\n const currentSortingKey = await this.getTableSortingKey(tableName);\n if (!currentSortingKey) {\n return { needsMigration: false, currentSortingKey: null };\n }\n\n // Check if migration is needed - old key starts with createdAt\n const needsMigration = currentSortingKey.toLowerCase().startsWith('createdat');\n return { needsMigration, currentSortingKey };\n }\n\n /**\n * Checks for duplicate (traceId, spanId) combinations in the spans table.\n * Returns information about duplicates for logging/CLI purposes.\n */\n async checkForDuplicateSpans(tableName: string): Promise<{\n hasDuplicates: boolean;\n duplicateCount: number;\n }> {\n try {\n // Count duplicate (traceId, spanId) combinations\n const result = await this.client.query({\n query: `\n SELECT count() as duplicate_count\n FROM (\n SELECT traceId, spanId\n FROM ${tableName}\n GROUP BY traceId, spanId\n HAVING count() > 1\n )\n `,\n format: 'JSONEachRow',\n });\n const rows = (await result.json()) as Array<{ duplicate_count: string }>;\n const duplicateCount = parseInt(rows[0]?.duplicate_count ?? '0', 10);\n return {\n hasDuplicates: duplicateCount > 0,\n duplicateCount,\n };\n } catch (error) {\n // If table doesn't exist or other error, assume no duplicates\n this.logger?.debug?.(`Could not check for duplicates: ${error}`);\n return { hasDuplicates: false, duplicateCount: 0 };\n }\n }\n\n /**\n * Migrates the spans table from the old sorting key (createdAt, traceId, spanId)\n * to the new sorting key (traceId, spanId) for proper uniqueness enforcement.\n *\n * This migration:\n * 1. Renames the old table to a backup\n * 2. Creates a new table with the correct sorting key\n * 3. Copies all data from the backup to the new table, deduplicating by (traceId, spanId)\n * using priority-based selection:\n * - First, prefer completed spans (those with endedAt set)\n * - Then prefer the most recently updated span (highest updatedAt)\n * - Finally use creation time as tiebreaker (highest createdAt)\n * 4. Drops the backup table\n *\n * The deduplication strategy matches the PostgreSQL migration (PR #12073) to ensure\n * consistent behavior across storage backends.\n *\n * The migration is idempotent - it only runs if the old sorting key is detected.\n *\n * @returns true if migration was performed, false if not needed\n */\n async migrateSpansTableSortingKey({\n tableName,\n schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<boolean> {\n // Only applies to spans table\n if (tableName !== TABLE_SPANS) {\n return false;\n }\n\n // Check if table exists\n const exists = await this.tableExists(tableName);\n if (!exists) {\n return false;\n }\n\n // Check current sorting key\n const currentSortingKey = await this.getTableSortingKey(tableName);\n if (!currentSortingKey) {\n return false;\n }\n\n // Check if migration is needed - old key starts with createdAt\n // Old format: \"createdAt, traceId, spanId\"\n // New format: \"traceId, spanId\"\n const needsMigration = currentSortingKey.toLowerCase().startsWith('createdat');\n if (!needsMigration) {\n this.logger?.debug?.(`Spans table already has correct sorting key: ${currentSortingKey}`);\n return false;\n }\n\n this.logger?.info?.(`Migrating spans table from sorting key \"${currentSortingKey}\" to \"(traceId, spanId)\"`);\n\n const backupTableName = `${tableName}_backup_${Date.now()}`;\n const rowTtl = this.ttl?.[tableName]?.row;\n\n try {\n // Step 1: Rename old table to backup\n await this.client.command({\n query: `RENAME TABLE ${tableName} TO ${backupTableName}`,\n });\n\n // Step 2: Create new table with correct sorting key\n const columns = Object.entries(schema)\n .map(([name, def]) => {\n let sqlType = this.getSqlType(def.type);\n let isNullable = def.nullable === true;\n\n // Special case: updatedAt must be non-nullable for TABLE_SPANS because\n // ReplacingMergeTree(updatedAt) requires a non-nullable version column.\n if (tableName === TABLE_SPANS && name === 'updatedAt') {\n isNullable = false;\n }\n\n if (isNullable) {\n sqlType = `Nullable(${sqlType})`;\n }\n const constraints = [];\n if (name === 'metadata' && (def.type === 'text' || def.type === 'jsonb') && isNullable) {\n constraints.push(\"DEFAULT '{}'\");\n }\n const columnTtl = this.ttl?.[tableName]?.columns?.[name];\n return `\"${name}\" ${sqlType} ${constraints.join(' ')} ${columnTtl ? `TTL toDateTime(${columnTtl.ttlKey ?? 'createdAt'}) + INTERVAL ${columnTtl.interval} ${columnTtl.unit}` : ''}`;\n })\n .join(',\\n');\n\n const createSql = `\n CREATE TABLE ${tableName} (\n ${columns}\n )\n ENGINE = ${TABLE_ENGINES[tableName] ?? 'MergeTree()'}\n PRIMARY KEY (traceId, spanId)\n ORDER BY (traceId, spanId)\n ${rowTtl ? `TTL toDateTime(${rowTtl.ttlKey ?? 'createdAt'}) + INTERVAL ${rowTtl.interval} ${rowTtl.unit}` : ''}\n SETTINGS index_granularity = 8192\n `;\n\n await this.client.command({\n query: createSql,\n });\n\n // Step 3: Copy data from backup to new table, deduplicating by (traceId, spanId)\n // Get the list of columns that exist in both tables\n const describeResult = await this.client.query({\n query: `DESCRIBE TABLE ${backupTableName}`,\n format: 'JSONEachRow',\n });\n const backupColumns = (await describeResult.json()) as Array<{ name: string }>;\n const backupColumnNames = new Set(backupColumns.map(c => c.name));\n\n // Only copy columns that exist in both tables\n const columnsToInsert = Object.keys(schema).filter(col => backupColumnNames.has(col));\n const columnList = columnsToInsert.map(c => `\"${c}\"`).join(', ');\n\n // Build SELECT expressions, using COALESCE for updatedAt to handle NULL values\n // (updatedAt must be non-nullable for ReplacingMergeTree version column)\n const selectExpressions = columnsToInsert\n .map(c => (c === 'updatedAt' ? `COALESCE(\"updatedAt\", \"createdAt\") as \"updatedAt\"` : `\"${c}\"`))\n .join(', ');\n\n // Use LIMIT BY for deduplication with priority-based selection:\n // 1. Prefer completed spans (those with endedAt not null/empty)\n // 2. Then prefer the most recently updated (highest updatedAt)\n // 3. Then use creation time as final tiebreaker (highest createdAt)\n // This matches the PostgreSQL migration behavior from PR #12073\n await this.client.command({\n query: `INSERT INTO ${tableName} (${columnList})\n SELECT ${selectExpressions}\n FROM ${backupTableName}\n ORDER BY traceId, spanId,\n (endedAt IS NOT NULL AND endedAt != '') DESC,\n COALESCE(updatedAt, createdAt) DESC,\n createdAt DESC\n LIMIT 1 BY traceId, spanId`,\n });\n\n // Step 4: Drop backup table\n await this.client.command({\n query: `DROP TABLE ${backupTableName}`,\n });\n\n this.logger?.info?.(`Successfully migrated spans table to new sorting key`);\n return true;\n } catch (error: any) {\n // Attempt to restore from backup if migration failed partway through\n this.logger?.error?.(`Migration failed: ${error.message}`);\n\n try {\n // Check if original table exists\n const originalExists = await this.tableExists(tableName);\n const backupExists = await this.tableExists(backupTableName);\n\n if (!originalExists && backupExists) {\n // Restore from backup\n this.logger?.info?.(`Restoring spans table from backup`);\n await this.client.command({\n query: `RENAME TABLE ${backupTableName} TO ${tableName}`,\n });\n } else if (originalExists && backupExists) {\n // Both exist - drop backup (new table was created successfully)\n await this.client.command({\n query: `DROP TABLE IF EXISTS ${backupTableName}`,\n });\n }\n } catch (restoreError) {\n this.logger?.error?.(`Failed to restore from backup: ${restoreError}`);\n }\n\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'MIGRATE_SPANS_SORTING_KEY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName, currentSortingKey },\n },\n error,\n );\n }\n }\n\n protected getSqlType(type: StorageColumn['type']): string {\n switch (type) {\n case 'text':\n case 'uuid':\n case 'jsonb':\n return 'String';\n case 'timestamp':\n return 'DateTime64(3)';\n case 'integer':\n case 'bigint':\n return 'Int64';\n case 'float':\n return 'Float64';\n case 'boolean':\n return 'Bool';\n default:\n return getSqlType(type); // fallback to base implementation\n }\n }\n\n async createTable({\n tableName,\n schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n try {\n const columns = Object.entries(schema)\n .map(([name, def]) => {\n let sqlType = this.getSqlType(def.type);\n // Only treat as nullable if explicitly set to true (default is NOT nullable)\n let isNullable = def.nullable === true;\n\n // Special case: updatedAt must be non-nullable for TABLE_SPANS because\n // ReplacingMergeTree(updatedAt) requires a non-nullable version column.\n // Application code already sets updatedAt = createdAt on insert.\n if (tableName === TABLE_SPANS && name === 'updatedAt') {\n isNullable = false;\n }\n\n // Wrap nullable columns in Nullable() to properly support NULL values\n if (isNullable) {\n sqlType = `Nullable(${sqlType})`;\n }\n const constraints = [];\n // Add DEFAULT '{}' for all metadata columns to prevent empty string issues\n // Support both 'text' and 'jsonb' types for backwards compatibility\n // Apply to all tables for consistent behavior and defense-in-depth\n if (name === 'metadata' && (def.type === 'text' || def.type === 'jsonb') && isNullable) {\n constraints.push(\"DEFAULT '{}'\");\n }\n const columnTtl = this.ttl?.[tableName]?.columns?.[name];\n return `\"${name}\" ${sqlType} ${constraints.join(' ')} ${columnTtl ? `TTL toDateTime(${columnTtl.ttlKey ?? 'createdAt'}) + INTERVAL ${columnTtl.interval} ${columnTtl.unit}` : ''}`;\n })\n .join(',\\n');\n\n const rowTtl = this.ttl?.[tableName]?.row;\n let sql: string;\n\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n sql = `\n CREATE TABLE IF NOT EXISTS ${tableName} (\n ${['id String'].concat(columns)}\n )\n ENGINE = ${TABLE_ENGINES[tableName] ?? 'MergeTree()'}\n PRIMARY KEY (createdAt, run_id, workflow_name)\n ORDER BY (createdAt, run_id, workflow_name)\n ${rowTtl ? `TTL toDateTime(${rowTtl.ttlKey ?? 'createdAt'}) + INTERVAL ${rowTtl.interval} ${rowTtl.unit}` : ''}\n SETTINGS index_granularity = 8192\n `;\n } else if (tableName === TABLE_SPANS) {\n // Spans table uses (traceId, spanId) as composite unique key.\n // ORDER BY must be (traceId, spanId) for ReplacingMergeTree to properly deduplicate\n // rows with the same traceId+spanId combination. The engine uses updatedAt as the\n // version column to keep the row with the highest updatedAt during deduplication.\n sql = `\n CREATE TABLE IF NOT EXISTS ${tableName} (\n ${columns}\n )\n ENGINE = ${TABLE_ENGINES[tableName] ?? 'MergeTree()'}\n PRIMARY KEY (traceId, spanId)\n ORDER BY (traceId, spanId)\n ${rowTtl ? `TTL toDateTime(${rowTtl.ttlKey ?? 'createdAt'}) + INTERVAL ${rowTtl.interval} ${rowTtl.unit}` : ''}\n SETTINGS index_granularity = 8192\n `;\n } else {\n sql = `\n CREATE TABLE IF NOT EXISTS ${tableName} (\n ${columns}\n )\n ENGINE = ${TABLE_ENGINES[tableName] ?? 'MergeTree()'}\n PRIMARY KEY (createdAt, ${'id'})\n ORDER BY (createdAt, ${'id'})\n ${this.ttl?.[tableName]?.row ? `TTL toDateTime(createdAt) + INTERVAL ${this.ttl[tableName].row.interval} ${this.ttl[tableName].row.unit}` : ''}\n SETTINGS index_granularity = 8192\n `;\n }\n\n await this.client.query({\n query: sql,\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'CREATE_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n } finally {\n this.tableColumnsCache.delete(tableName);\n }\n }\n\n async alterTable({\n tableName,\n schema,\n ifNotExists,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {\n try {\n // 1. Get existing columns\n const describeSql = `DESCRIBE TABLE ${tableName}`;\n const result = await this.client.query({\n query: describeSql,\n });\n const rows = await result.json();\n const existingColumnNames = new Set(rows.data.map((row: any) => row.name.toLowerCase()));\n\n // 2. Add missing columns\n for (const columnName of ifNotExists) {\n if (!existingColumnNames.has(columnName.toLowerCase()) && schema[columnName]) {\n const columnDef = schema[columnName];\n let sqlType = this.getSqlType(columnDef.type);\n if (columnDef.nullable !== false) {\n sqlType = `Nullable(${sqlType})`;\n }\n const defaultValue = columnDef.nullable === false ? getDefaultValue(columnDef.type) : '';\n // Use backticks or double quotes as needed for identifiers\n const alterSql =\n `ALTER TABLE ${tableName} ADD COLUMN IF NOT EXISTS \"${columnName}\" ${sqlType} ${defaultValue}`.trim();\n\n await this.client.query({\n query: alterSql,\n });\n this.logger?.debug?.(`Added column ${columnName} to table ${tableName}`);\n }\n }\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'ALTER_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n } finally {\n // Invalidate cached columns after DDL completes so concurrent writers see the new schema\n this.tableColumnsCache.delete(tableName);\n }\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n // Stop background merges before TRUNCATE. TRUNCATE acquires an exclusive\n // write lock that blocks until in-flight merges complete. Pausing merges\n // first avoids this lock contention.\n await this.client.command({ query: `SYSTEM STOP MERGES ${tableName}` });\n await this.client.command({\n query: `TRUNCATE TABLE ${tableName}`,\n });\n await this.client.command({ query: `SYSTEM START MERGES ${tableName}` });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'CLEAR_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n await this.client.query({\n query: `DROP TABLE IF EXISTS ${tableName}`,\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'DROP_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n } finally {\n this.tableColumnsCache.delete(tableName);\n }\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n try {\n // Filter out unknown columns from user-supplied data first\n const filteredRecord = await this.filterRecordToKnownColumns(tableName, record);\n if (Object.keys(filteredRecord).length === 0) return; // No known columns after filtering - skip insert\n\n // Inject timestamps only if those columns exist in the table (they survived filtering)\n const rawCreatedAt = filteredRecord.createdAt || filteredRecord.created_at || new Date();\n const rawUpdatedAt = filteredRecord.updatedAt || new Date();\n if ('createdAt' in filteredRecord || (await this.getTableColumns(tableName)).has('createdAt')) {\n filteredRecord.createdAt = rawCreatedAt instanceof Date ? rawCreatedAt.toISOString() : rawCreatedAt;\n }\n if ('updatedAt' in filteredRecord || (await this.getTableColumns(tableName)).has('updatedAt')) {\n filteredRecord.updatedAt = rawUpdatedAt instanceof Date ? rawUpdatedAt.toISOString() : rawUpdatedAt;\n }\n\n await this.client.insert({\n table: tableName,\n values: [filteredRecord],\n format: 'JSONEachRow',\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n output_format_json_quote_64bit_integers: 0,\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n },\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'INSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async batchInsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n const processedRecords = records.map(record => ({\n ...Object.fromEntries(\n Object.entries(record).map(([key, value]) => [\n key,\n // Only convert to Date if it's a timestamp column AND value is not null/undefined\n // new Date(null) returns epoch date, not null, so we must check first\n TABLE_SCHEMAS[tableName as TABLE_NAMES]?.[key]?.type === 'timestamp' && value != null\n ? new Date(value).toISOString()\n : value,\n ]),\n ),\n }));\n\n // Filter out columns that don't exist in the actual database table\n const recordsToBeInserted = await Promise.all(\n processedRecords.map(r => this.filterRecordToKnownColumns(tableName, r)),\n );\n // Skip records that have no known columns after filtering\n const nonEmptyRecords = recordsToBeInserted.filter(r => Object.keys(r).length > 0);\n if (nonEmptyRecords.length === 0) return;\n\n try {\n await this.client.insert({\n table: tableName,\n values: nonEmptyRecords,\n format: 'JSONEachRow',\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_INSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n try {\n const engine = TABLE_ENGINES[tableName] ?? 'MergeTree()';\n const keyEntries = Object.entries(keys);\n const conditions = keyEntries\n .map(\n ([key]) =>\n `\"${key}\" = {var_${key}:${this.getSqlType(TABLE_SCHEMAS[tableName as TABLE_NAMES]?.[key]?.type ?? 'text')}}`,\n )\n .join(' AND ');\n const values = keyEntries.reduce((acc, [key, value]) => {\n return { ...acc, [`var_${key}`]: value };\n }, {});\n\n const hasUpdatedAt = TABLE_SCHEMAS[tableName as TABLE_NAMES]?.updatedAt;\n\n const selectClause = `SELECT *, toDateTime64(createdAt, 3) as createdAt${hasUpdatedAt ? ', toDateTime64(updatedAt, 3) as updatedAt' : ''}`;\n\n const result = await this.client.query({\n query: `${selectClause} FROM ${tableName} ${engine.startsWith('ReplacingMergeTree') ? 'FINAL' : ''} WHERE ${conditions} ORDER BY createdAt DESC LIMIT 1`,\n query_params: values,\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n if (!result) {\n return null;\n }\n\n const rows = await result.json();\n // If this is a workflow snapshot, parse the snapshot field\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n const snapshot = rows.data[0] as any;\n if (!snapshot) {\n return null;\n }\n if (typeof snapshot.snapshot === 'string') {\n snapshot.snapshot = JSON.parse(snapshot.snapshot);\n }\n return transformRow(snapshot);\n }\n\n const data: R = transformRow(rows.data[0]);\n return data;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LOAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport type {\n BackgroundTask,\n BackgroundTaskStatus,\n TaskFilter,\n TaskListResult,\n UpdateBackgroundTask,\n} from '@mastra/core/background-tasks';\nimport { BackgroundTasksStorage, TABLE_BACKGROUND_TASKS, TABLE_SCHEMAS } from '@mastra/core/storage';\nimport { ClickhouseDB, resolveClickhouseConfig } from '../../db';\nimport type { ClickhouseDomainConfig } from '../../db';\n\nfunction serializeJson(v: unknown): any {\n if (typeof v === 'object' && v != null) return JSON.stringify(v);\n return v ?? '';\n}\n\n// ClickHouse `DateTime` columns can't be NULL, so the adapter stores\n// \"no value\" as the epoch sentinel (see `createTask` below). Reading\n// back must convert the sentinel into `undefined` — otherwise an\n// updateTask({ suspendedAt: undefined }) flows in as the sentinel and\n// reads back as `new Date(0)` instead of `undefined`, breaking\n// callers that distinguish \"never set\" from \"set to epoch\".\nfunction readNullableDate(val: unknown): Date | undefined {\n if (val == null || val === '') return undefined;\n const d = new Date(val as string | number | Date);\n if (Number.isNaN(d.getTime()) || d.getTime() === 0) return undefined;\n return d;\n}\n\nfunction rowToTask(row: Record<string, any>): BackgroundTask {\n const parseJson = (val: unknown): any => {\n if (val == null || val === '') return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n };\n return {\n id: row.id,\n status: row.status as BackgroundTaskStatus,\n toolName: row.tool_name,\n toolCallId: row.tool_call_id,\n args: parseJson(row.args) ?? {},\n agentId: row.agent_id,\n threadId: row.thread_id || undefined,\n resourceId: row.resource_id || undefined,\n runId: row.run_id ?? '',\n result: parseJson(row.result),\n error: parseJson(row.error),\n suspendPayload: parseJson(row.suspend_payload),\n retryCount: Number(row.retry_count ?? 0),\n maxRetries: Number(row.max_retries ?? 0),\n timeoutMs: Number(row.timeout_ms ?? 300_000),\n createdAt: new Date(row.createdAt),\n startedAt: readNullableDate(row.startedAt),\n suspendedAt: readNullableDate(row.suspendedAt),\n completedAt: readNullableDate(row.completedAt),\n };\n}\n\nexport class BackgroundTasksStorageClickhouse extends BackgroundTasksStorage {\n protected client: ClickHouseClient;\n #db: ClickhouseDB;\n\n constructor(config: ClickhouseDomainConfig) {\n super();\n const { client, ttl } = resolveClickhouseConfig(config);\n this.client = client;\n this.#db = new ClickhouseDB({ client, ttl });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_BACKGROUND_TASKS, schema: TABLE_SCHEMAS[TABLE_BACKGROUND_TASKS] });\n await this.#db.alterTable({\n tableName: TABLE_BACKGROUND_TASKS,\n schema: TABLE_SCHEMAS[TABLE_BACKGROUND_TASKS],\n ifNotExists: ['suspend_payload', 'suspendedAt'],\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_BACKGROUND_TASKS });\n }\n\n async createTask(task: BackgroundTask): Promise<void> {\n await this.client.insert({\n table: TABLE_BACKGROUND_TASKS,\n values: [\n {\n id: task.id,\n tool_call_id: task.toolCallId,\n tool_name: task.toolName,\n agent_id: task.agentId,\n thread_id: task.threadId ?? '',\n resource_id: task.resourceId ?? '',\n run_id: task.runId,\n status: task.status,\n args: serializeJson(task.args),\n result: serializeJson(task.result),\n error: serializeJson(task.error),\n suspend_payload: serializeJson(task.suspendPayload),\n retry_count: task.retryCount,\n max_retries: task.maxRetries,\n timeout_ms: task.timeoutMs,\n createdAt: task.createdAt.toISOString(),\n startedAt: task.startedAt?.toISOString() ?? '1970-01-01T00:00:00.000Z',\n suspendedAt: task.suspendedAt?.toISOString() ?? '1970-01-01T00:00:00.000Z',\n completedAt: task.completedAt?.toISOString() ?? '1970-01-01T00:00:00.000Z',\n },\n ],\n format: 'JSONEachRow',\n clickhouse_settings: { date_time_input_format: 'best_effort' },\n });\n }\n\n async updateTask(taskId: string, update: UpdateBackgroundTask): Promise<void> {\n const existing = await this.getTask(taskId);\n if (!existing) return;\n const merged = { ...existing };\n if ('status' in update) merged.status = update.status!;\n if ('result' in update) merged.result = update.result;\n if ('error' in update) merged.error = update.error;\n if ('suspendPayload' in update) merged.suspendPayload = update.suspendPayload;\n if ('retryCount' in update) merged.retryCount = update.retryCount!;\n if ('startedAt' in update) merged.startedAt = update.startedAt;\n if ('suspendedAt' in update) merged.suspendedAt = update.suspendedAt;\n if ('completedAt' in update) merged.completedAt = update.completedAt;\n\n // ClickHouse ReplacingMergeTree — insert replaces by primary key\n await this.createTask(merged);\n }\n\n async getTask(taskId: string): Promise<BackgroundTask | null> {\n const result = await this.client.query({\n query: `SELECT * FROM ${TABLE_BACKGROUND_TASKS} FINAL WHERE id = {var_id:String} LIMIT 1`,\n query_params: { var_id: taskId },\n format: 'JSONEachRow',\n clickhouse_settings: { date_time_input_format: 'best_effort' },\n });\n const rows = await result.json<Record<string, any>[]>();\n return rows.length > 0 ? rowToTask(rows[0]!) : null;\n }\n\n private buildFilterClause(filter: TaskFilter): { where: string; params: Record<string, any> } {\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n\n if (filter.status) {\n const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];\n conditions.push(`status IN ({var_statuses:Array(String)})`);\n params.var_statuses = statuses;\n }\n if (filter.agentId) {\n conditions.push(`agent_id = {var_agent:String}`);\n params.var_agent = filter.agentId;\n }\n if (filter.threadId) {\n conditions.push(`thread_id = {var_thread:String}`);\n params.var_thread = filter.threadId;\n }\n if (filter.runId) {\n conditions.push(`run_id = {var_run:String}`);\n params.var_run = filter.runId;\n }\n if (filter.toolName) {\n conditions.push(`tool_name = {var_tool:String}`);\n params.var_tool = filter.toolName;\n }\n if (filter.toolCallId) {\n conditions.push(`tool_call_id = {var_tool_call:String}`);\n params.var_tool_call = filter.toolCallId;\n }\n\n // Push date range filtering into SQL so total count and LIMIT/OFFSET\n // agree with the in-memory Date objects `rowToTask` returns.\n const dateCol =\n filter.dateFilterBy === 'startedAt'\n ? 'startedAt'\n : filter.dateFilterBy === 'suspendedAt'\n ? 'suspendedAt'\n : filter.dateFilterBy === 'completedAt'\n ? 'completedAt'\n : 'createdAt';\n if (filter.fromDate) {\n conditions.push(`${dateCol} >= parseDateTimeBestEffort({var_from_date:String})`);\n params.var_from_date = filter.fromDate.toISOString();\n }\n if (filter.toDate) {\n conditions.push(`${dateCol} < parseDateTimeBestEffort({var_to_date:String})`);\n params.var_to_date = filter.toDate.toISOString();\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n return { where, params };\n }\n\n async listTasks(filter: TaskFilter): Promise<TaskListResult> {\n const { where, params } = this.buildFilterClause(filter);\n\n // Count total matching rows (before pagination)\n const countResult = await this.client.query({\n query: `SELECT count() as count FROM ${TABLE_BACKGROUND_TASKS} FINAL ${where}`,\n query_params: params,\n format: 'JSONEachRow',\n clickhouse_settings: { date_time_input_format: 'best_effort' },\n });\n const countRows = (await countResult.json()) as any[];\n const total = Number(countRows[0]?.count ?? 0);\n\n const orderCol =\n filter.orderBy === 'startedAt'\n ? 'startedAt'\n : filter.orderBy === 'suspendedAt'\n ? 'suspendedAt'\n : filter.orderBy === 'completedAt'\n ? 'completedAt'\n : 'createdAt';\n const direction = filter.orderDirection === 'desc' ? 'DESC' : 'ASC';\n let sql = `SELECT * FROM ${TABLE_BACKGROUND_TASKS} FINAL ${where} ORDER BY ${orderCol} ${direction}`;\n if (filter.perPage != null) {\n sql += ` LIMIT {var_limit:UInt32}`;\n params.var_limit = filter.perPage;\n if (filter.page != null) {\n sql += ` OFFSET {var_offset:UInt32}`;\n params.var_offset = filter.page * filter.perPage;\n }\n }\n\n const result = await this.client.query({\n query: sql,\n query_params: params,\n format: 'JSONEachRow',\n clickhouse_settings: { date_time_input_format: 'best_effort' },\n });\n const tasks = (await result.json<Record<string, any>[]>()).map(rowToTask);\n\n return { tasks, total };\n }\n\n async deleteTask(taskId: string): Promise<void> {\n await this.client.command({\n query: `DELETE FROM ${TABLE_BACKGROUND_TASKS} WHERE id = {var_id:String}`,\n query_params: { var_id: taskId },\n });\n }\n\n async deleteTasks(filter: TaskFilter): Promise<void> {\n const { where, params } = this.buildFilterClause(filter);\n\n // Require at least one filter to avoid an unintentional table-wide delete.\n // Use `dangerouslyClearAll` for that case.\n if (!where) return;\n\n await this.client.command({\n query: `DELETE FROM ${TABLE_BACKGROUND_TASKS} ${where}`,\n query_params: params,\n });\n }\n\n async getRunningCount(): Promise<number> {\n const result = await this.client.query({\n query: `SELECT count() as count FROM ${TABLE_BACKGROUND_TASKS} FINAL WHERE status = 'running'`,\n format: 'JSONEachRow',\n });\n const rows = (await result.json()) as any[];\n return Number(rows[0]?.count ?? 0);\n }\n\n async getRunningCountByAgent(agentId: string): Promise<number> {\n const result = await this.client.query({\n query: `SELECT count() as count FROM ${TABLE_BACKGROUND_TASKS} FINAL WHERE status = 'running' AND agent_id = {var_agent:String}`,\n query_params: { var_agent: agentId },\n format: 'JSONEachRow',\n });\n const rows = (await result.json()) as any[];\n return Number(rows[0]?.count ?? 0);\n }\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { MessageList } from '@mastra/core/agent';\nimport type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { MastraMessageV1, MastraDBMessage, StorageThreadType } from '@mastra/core/memory';\nimport type {\n StorageResourceType,\n StorageListMessagesInput,\n StorageListMessagesOutput,\n StorageListThreadsInput,\n StorageListThreadsOutput,\n} from '@mastra/core/storage';\nimport {\n createStorageErrorId,\n MemoryStorage,\n normalizePerPage,\n calculatePagination,\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_THREADS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport { ClickhouseDB, resolveClickhouseConfig } from '../../db';\nimport type { ClickhouseDomainConfig } from '../../db';\nimport { transformRow, transformRows } from '../../db/utils';\n\n/**\n * Serialize metadata object to JSON string for storage in ClickHouse.\n * Ensures we always store valid JSON, defaulting to '{}' for null/undefined.\n */\nfunction serializeMetadata(metadata: Record<string, unknown> | undefined): string {\n if (!metadata || Object.keys(metadata).length === 0) {\n return '{}';\n }\n return JSON.stringify(metadata);\n}\n\n/**\n * Parse metadata JSON string from ClickHouse back to object.\n * Handles empty strings and malformed JSON gracefully.\n */\nfunction parseMetadata(metadata: unknown): Record<string, unknown> {\n if (!metadata) return {};\n if (typeof metadata === 'object') return metadata as Record<string, unknown>;\n if (typeof metadata !== 'string') return {};\n\n const trimmed = metadata.trim();\n if (trimmed === '' || trimmed === 'null') return {};\n\n try {\n return JSON.parse(trimmed);\n } catch {\n return {};\n }\n}\n\nexport class MemoryStorageClickhouse extends MemoryStorage {\n protected client: ClickHouseClient;\n #db: ClickhouseDB;\n constructor(config: ClickhouseDomainConfig) {\n super();\n const { client, ttl } = resolveClickhouseConfig(config);\n this.client = client;\n this.#db = new ClickhouseDB({ client, ttl });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_THREADS, schema: TABLE_SCHEMAS[TABLE_THREADS] });\n await this.#db.createTable({ tableName: TABLE_MESSAGES, schema: TABLE_SCHEMAS[TABLE_MESSAGES] });\n await this.#db.createTable({ tableName: TABLE_RESOURCES, schema: TABLE_SCHEMAS[TABLE_RESOURCES] });\n // Add resourceId column for backwards compatibility\n await this.#db.alterTable({\n tableName: TABLE_MESSAGES,\n schema: TABLE_SCHEMAS[TABLE_MESSAGES],\n ifNotExists: ['resourceId'],\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_MESSAGES });\n await this.#db.clearTable({ tableName: TABLE_RESOURCES });\n await this.#db.clearTable({ tableName: TABLE_THREADS });\n }\n\n async deleteMessages(messageIds: string[]): Promise<void> {\n if (!messageIds || messageIds.length === 0) return;\n\n try {\n // Get affected thread IDs before deleting\n const result = await this.client.query({\n query: `SELECT DISTINCT thread_id FROM ${TABLE_MESSAGES} WHERE id IN {messageIds:Array(String)}`,\n query_params: { messageIds },\n format: 'JSONEachRow',\n });\n const rows = (await result.json()) as Array<{ thread_id: string }>;\n const threadIds = rows.map(r => r.thread_id);\n\n // Delete messages\n await this.client.command({\n query: `DELETE FROM ${TABLE_MESSAGES} WHERE id IN {messageIds:Array(String)}`,\n query_params: { messageIds },\n });\n\n // Update thread timestamps\n if (threadIds.length > 0) {\n // Remove 'Z' suffix as ClickHouse DateTime64 expects format without timezone suffix\n const now = new Date().toISOString().replace('Z', '');\n await this.client.command({\n query: `ALTER TABLE ${TABLE_THREADS} UPDATE updatedAt = {now:DateTime64(3)} WHERE id IN {threadIds:Array(String)}`,\n query_params: { now, threadIds },\n });\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'DELETE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { count: messageIds.length },\n },\n error,\n );\n }\n }\n\n public async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messageIds.length === 0) return { messages: [] };\n\n try {\n const result = await this.client.query({\n query: `\n SELECT \n id, \n content, \n role, \n type,\n toDateTime64(createdAt, 3) as createdAt,\n thread_id AS \"threadId\",\n \"resourceId\"\n FROM \"${TABLE_MESSAGES}\"\n WHERE id IN {messageIds:Array(String)}\n ORDER BY \"createdAt\" DESC\n `,\n query_params: {\n messageIds,\n },\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = await result.json();\n const messages: any[] = transformRows(rows.data);\n\n // Parse message content\n messages.forEach(message => {\n if (typeof message.content === 'string') {\n try {\n message.content = JSON.parse(message.content);\n } catch {\n // If parsing fails, leave as string\n }\n }\n });\n\n const list = new MessageList().add(messages as MastraMessageV1[] | MastraDBMessage[], 'memory');\n return { messages: list.get.all.db() };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_MESSAGES_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { messageIds: JSON.stringify(messageIds) },\n },\n error,\n );\n }\n }\n\n public async listMessages(args: StorageListMessagesInput): Promise<StorageListMessagesOutput> {\n const { threadId, resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;\n\n // Normalize threadId to array, coerce to strings, trim, and filter out empty/non-string values\n const rawThreadIds = Array.isArray(threadId) ? threadId : [threadId];\n const threadIds = rawThreadIds\n .filter(id => id !== undefined && id !== null)\n .map(id => (typeof id === 'string' ? id : String(id)).trim())\n .filter(id => id.length > 0);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_MESSAGES', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n // Validate that we have at least one valid threadId\n if (threadIds.length === 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_MESSAGES', 'INVALID_THREAD_ID'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: Array.isArray(threadId) ? JSON.stringify(threadId) : String(threadId) },\n },\n new Error('threadId must be a non-empty string or array of non-empty strings'),\n );\n }\n\n const perPageForQuery = normalizePerPage(perPageInput, 40);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPageForQuery);\n\n try {\n // Step 1: Get paginated messages from the thread(s) first (without excluding included ones)\n // Build thread condition for single or multiple threads\n const threadCondition =\n threadIds.length === 1\n ? `thread_id = {threadId0:String}`\n : `thread_id IN (${threadIds.map((_, i) => `{threadId${i}:String}`).join(', ')})`;\n\n let dataQuery = `\n SELECT \n id,\n content,\n role,\n type,\n toDateTime64(createdAt, 3) as createdAt,\n thread_id AS \"threadId\",\n resourceId\n FROM ${TABLE_MESSAGES}\n WHERE ${threadCondition}\n `;\n const dataParams: any = {};\n threadIds.forEach((tid, i) => {\n dataParams[`threadId${i}`] = tid;\n });\n\n if (resourceId) {\n dataQuery += ` AND resourceId = {resourceId:String}`;\n dataParams.resourceId = resourceId;\n }\n\n if (filter?.dateRange?.start) {\n const startDate =\n filter.dateRange.start instanceof Date\n ? filter.dateRange.start.toISOString()\n : new Date(filter.dateRange.start).toISOString();\n const startOp = filter.dateRange.startExclusive ? '>' : '>=';\n dataQuery += ` AND createdAt ${startOp} parseDateTime64BestEffort({fromDate:String}, 3)`;\n dataParams.fromDate = startDate;\n }\n\n if (filter?.dateRange?.end) {\n const endDate =\n filter.dateRange.end instanceof Date\n ? filter.dateRange.end.toISOString()\n : new Date(filter.dateRange.end).toISOString();\n const endOp = filter.dateRange.endExclusive ? '<' : '<=';\n dataQuery += ` AND createdAt ${endOp} parseDateTime64BestEffort({toDate:String}, 3)`;\n dataParams.toDate = endDate;\n }\n\n // Build ORDER BY clause\n const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n dataQuery += ` ORDER BY \"${field}\" ${direction}`;\n\n // When perPage is 0 with no includes, there's nothing to return.\n if (perPageForQuery === 0 && (!include || include.length === 0)) {\n return { messages: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n // When perPage is 0, we only need included messages — skip data and COUNT queries\n if (perPageForQuery === 0 && include && include.length > 0) {\n const includeResult = await this._getIncludedMessages({ include });\n const list = new MessageList().add(includeResult, 'memory');\n return {\n messages: this._sortMessages(list.get.all.db(), field, direction),\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Apply pagination\n if (perPageForResponse === false) {\n // Get all messages\n } else {\n dataQuery += ` LIMIT {limit:Int64} OFFSET {offset:Int64}`;\n dataParams.limit = perPageForQuery;\n dataParams.offset = offset;\n }\n\n const result = await this.client.query({\n query: dataQuery,\n query_params: dataParams,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = await result.json();\n const paginatedMessages = transformRows<MastraDBMessage>(rows.data);\n const paginatedCount = paginatedMessages.length;\n\n // Get total count\n let countQuery = `SELECT count() as total FROM ${TABLE_MESSAGES} WHERE ${threadCondition}`;\n const countParams: any = {};\n threadIds.forEach((tid, i) => {\n countParams[`threadId${i}`] = tid;\n });\n\n if (resourceId) {\n countQuery += ` AND resourceId = {resourceId:String}`;\n countParams.resourceId = resourceId;\n }\n\n if (filter?.dateRange?.start) {\n const startDate =\n filter.dateRange.start instanceof Date\n ? filter.dateRange.start.toISOString()\n : new Date(filter.dateRange.start).toISOString();\n const startOp = filter.dateRange.startExclusive ? '>' : '>=';\n countQuery += ` AND createdAt ${startOp} parseDateTime64BestEffort({fromDate:String}, 3)`;\n countParams.fromDate = startDate;\n }\n\n if (filter?.dateRange?.end) {\n const endDate =\n filter.dateRange.end instanceof Date\n ? filter.dateRange.end.toISOString()\n : new Date(filter.dateRange.end).toISOString();\n const endOp = filter.dateRange.endExclusive ? '<' : '<=';\n countQuery += ` AND createdAt ${endOp} parseDateTime64BestEffort({toDate:String}, 3)`;\n countParams.toDate = endDate;\n }\n\n const countResult = await this.client.query({\n query: countQuery,\n query_params: countParams,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n const countData = await countResult.json();\n const total = (countData as any).data[0].total;\n\n // Only return early if there are no messages AND no includes to process\n if (total === 0 && paginatedCount === 0 && (!include || include.length === 0)) {\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Step 2: Add included messages with context (if any), excluding duplicates\n const messageIds = new Set(paginatedMessages.map((m: MastraDBMessage) => m.id));\n\n if (include && include.length > 0) {\n const includeMessages = await this._getIncludedMessages({ include });\n\n // Deduplicate: only add messages that aren't already in the paginated results\n for (const includeMsg of includeMessages) {\n if (!messageIds.has(includeMsg.id)) {\n paginatedMessages.push(includeMsg);\n messageIds.add(includeMsg.id);\n }\n }\n }\n\n // Use MessageList for proper deduplication and format conversion to V2\n const list = new MessageList().add(paginatedMessages, 'memory');\n const finalMessages = this._sortMessages(list.get.all.db(), field, direction);\n\n // Calculate hasMore based on pagination window\n // If all thread messages have been returned (through pagination or include), hasMore = false\n // Otherwise, check if there are more pages in the pagination window\n const threadIdSet = new Set(threadIds);\n const returnedThreadMessageIds = new Set(\n finalMessages.filter(m => m.threadId && threadIdSet.has(m.threadId)).map(m => m.id),\n );\n const allThreadMessagesReturned = returnedThreadMessageIds.size >= total;\n const hasMore =\n perPageForResponse === false ? false : allThreadMessagesReturned ? false : offset + paginatedCount < total;\n\n return {\n messages: finalMessages,\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n } catch (error: any) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId: Array.isArray(threadId) ? threadId.join(',') : threadId,\n resourceId: resourceId ?? '',\n },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException?.(mastraError);\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n }\n\n private _sortMessages(messages: MastraDBMessage[], field: string, direction: string): MastraDBMessage[] {\n return messages.sort((a, b) => {\n const isDateField = field === 'createdAt' || field === 'updatedAt';\n const aValue = isDateField ? new Date((a as any)[field]).getTime() : (a as any)[field];\n const bValue = isDateField ? new Date((b as any)[field]).getTime() : (b as any)[field];\n\n if (aValue === bValue) {\n return a.id.localeCompare(b.id);\n }\n\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n }\n return direction === 'ASC'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(aValue));\n });\n }\n\n private async _getIncludedMessages({\n include,\n }: {\n include: StorageListMessagesInput['include'];\n }): Promise<MastraDBMessage[]> {\n if (!include || include.length === 0) return [];\n\n // Phase 1: Batch-fetch metadata (id, thread_id, createdAt) for all target messages.\n const targetIds = include.map(inc => inc.id).filter(Boolean);\n if (targetIds.length === 0) return [];\n\n const { messages: targetDocs } = await this.listMessagesById({ messageIds: targetIds });\n const targetMap = new Map(\n targetDocs.map((msg: any) => [msg.id, { threadId: msg.threadId, createdAt: msg.createdAt }]),\n );\n\n // Phase 2: Build cursor-based subqueries using materialized constants from Phase 1.\n // Uses createdAt range + LIMIT instead of ROW_NUMBER() windowing to avoid full thread scans.\n const unionQueries: string[] = [];\n const params: Record<string, any> = {};\n let paramIdx = 1;\n\n for (const inc of include) {\n const { id, withPreviousMessages = 0, withNextMessages = 0 } = inc;\n const target = targetMap.get(id);\n if (!target) continue;\n\n // Fetch the target message itself plus previous messages.\n const threadParam = `var_thread_${paramIdx}`;\n const createdAtParam = `var_createdAt_${paramIdx}`;\n const limitParam = `var_limit_${paramIdx}`;\n unionQueries.push(`\n SELECT id, content, role, type, \"createdAt\", thread_id AS \"threadId\", \"resourceId\"\n FROM \"${TABLE_MESSAGES}\"\n WHERE thread_id = {${threadParam}:String}\n AND createdAt <= parseDateTime64BestEffort({${createdAtParam}:String}, 3)\n ORDER BY createdAt DESC, id DESC\n LIMIT {${limitParam}:Int64}\n `);\n params[threadParam] = target.threadId;\n params[createdAtParam] = target.createdAt;\n params[limitParam] = withPreviousMessages + 1;\n paramIdx++;\n\n // Fetch messages after the target (only if requested)\n if (withNextMessages > 0) {\n const threadParam2 = `var_thread_${paramIdx}`;\n const createdAtParam2 = `var_createdAt_${paramIdx}`;\n const limitParam2 = `var_limit_${paramIdx}`;\n unionQueries.push(`\n SELECT id, content, role, type, \"createdAt\", thread_id AS \"threadId\", \"resourceId\"\n FROM \"${TABLE_MESSAGES}\"\n WHERE thread_id = {${threadParam2}:String}\n AND createdAt > parseDateTime64BestEffort({${createdAtParam2}:String}, 3)\n ORDER BY createdAt ASC, id ASC\n LIMIT {${limitParam2}:Int64}\n `);\n params[threadParam2] = target.threadId;\n params[createdAtParam2] = target.createdAt;\n params[limitParam2] = withNextMessages;\n paramIdx++;\n }\n }\n\n if (unionQueries.length === 0) return [];\n\n // ClickHouse applies ORDER BY/LIMIT to individual UNION ALL members,\n // so wrap in a subquery to sort the combined result.\n let finalQuery: string;\n if (unionQueries.length === 1) {\n finalQuery = unionQueries[0]!;\n } else {\n finalQuery = `SELECT * FROM (${unionQueries.join(' UNION ALL ')}) ORDER BY \"createdAt\" ASC, id ASC`;\n }\n\n const includeResult = await this.client.query({\n query: finalQuery,\n query_params: params,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const includeRows = await includeResult.json();\n\n // Deduplicate results (messages may appear in multiple context windows)\n const seen = new Set<string>();\n return transformRows<MastraDBMessage>(includeRows.data).filter(row => {\n if (seen.has(row.id)) return false;\n seen.add(row.id);\n return true;\n });\n }\n\n async saveMessages(args: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n const { messages } = args;\n if (messages.length === 0) return { messages };\n\n for (const message of messages) {\n const resourceId = message.resourceId;\n if (!resourceId) {\n throw new Error('Resource ID is required');\n }\n\n if (!message.threadId) {\n throw new Error('Thread ID is required');\n }\n\n // Check if thread exists\n const thread = await this.getThreadById({ threadId: message.threadId });\n if (!thread) {\n throw new Error(`Thread ${message.threadId} not found`);\n }\n }\n\n const threadIdSet = new Map();\n\n await Promise.all(\n messages.map(async m => {\n const resourceId = m.resourceId;\n if (!resourceId) {\n throw new Error('Resource ID is required');\n }\n\n if (!m.threadId) {\n throw new Error('Thread ID is required');\n }\n\n // Check if thread exists\n const thread = await this.getThreadById({ threadId: m.threadId });\n if (!thread) {\n throw new Error(`Thread ${m.threadId} not found`);\n }\n\n threadIdSet.set(m.threadId, thread);\n }),\n );\n\n try {\n // Clickhouse's MergeTree engine does not support native upserts or unique constraints on (id, thread_id).\n // Note: We cannot switch to ReplacingMergeTree without a schema migration,\n // as it would require altering the table engine.\n // To ensure correct upsert behavior, we first fetch existing (id, thread_id) pairs for the incoming messages.\n const existingResult = await this.client.query({\n query: `SELECT id, thread_id FROM ${TABLE_MESSAGES} WHERE id IN ({ids:Array(String)})`,\n query_params: {\n ids: messages.map(m => m.id),\n },\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n format: 'JSONEachRow',\n });\n const existingRows: Array<{ id: string; thread_id: string }> = await existingResult.json();\n\n const existingSet = new Set(existingRows.map(row => `${row.id}::${row.thread_id}`));\n\n // Partition the batch into different operations:\n // 1. New messages (insert)\n // 2. Existing messages with same (id, threadId) (update)\n // 3. Messages with same id but different threadId (delete old + insert new)\n const toInsert = messages.filter(m => !existingSet.has(`${m.id}::${m.threadId}`));\n const toUpdate = messages.filter(m => existingSet.has(`${m.id}::${m.threadId}`));\n\n // Find messages that need to be moved (same id, different threadId)\n const toMove = messages.filter(m => {\n const existingRow = existingRows.find(row => row.id === m.id);\n return existingRow && existingRow.thread_id !== m.threadId;\n });\n\n // Delete old messages that are being moved\n const deletePromises = toMove.map(message => {\n const existingRow = existingRows.find(row => row.id === message.id);\n if (!existingRow) return Promise.resolve();\n\n return this.client.command({\n query: `DELETE FROM ${TABLE_MESSAGES} WHERE id = {var_id:String} AND thread_id = {var_old_thread_id:String}`,\n query_params: {\n var_id: message.id,\n var_old_thread_id: existingRow.thread_id,\n },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n });\n\n const updatePromises = toUpdate.map(message =>\n this.client.command({\n query: `\n ALTER TABLE ${TABLE_MESSAGES}\n UPDATE content = {var_content:String}, role = {var_role:String}, type = {var_type:String}, resourceId = {var_resourceId:String}\n WHERE id = {var_id:String} AND thread_id = {var_thread_id:String}\n `,\n query_params: {\n var_content: typeof message.content === 'string' ? message.content : JSON.stringify(message.content),\n var_role: message.role,\n var_type: message.type || 'v2',\n var_resourceId: message.resourceId,\n var_id: message.id,\n var_thread_id: message.threadId,\n },\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n }),\n );\n\n // Execute message operations and thread update in parallel for better performance\n await Promise.all([\n // Insert new messages (including moved messages)\n this.client.insert({\n table: TABLE_MESSAGES,\n format: 'JSONEachRow',\n values: toInsert.map(message => ({\n id: message.id,\n thread_id: message.threadId,\n resourceId: message.resourceId,\n content: typeof message.content === 'string' ? message.content : JSON.stringify(message.content),\n createdAt: message.createdAt.toISOString(),\n role: message.role,\n type: message.type || 'v2',\n })),\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n }),\n ...updatePromises,\n ...deletePromises,\n // Update thread's updatedAt timestamp\n this.client.insert({\n table: TABLE_THREADS,\n format: 'JSONEachRow',\n values: Array.from(threadIdSet.values()).map(thread => ({\n id: thread.id,\n resourceId: thread.resourceId,\n title: thread.title,\n metadata: serializeMetadata(thread.metadata),\n createdAt: thread.createdAt,\n updatedAt: new Date().toISOString(),\n })),\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n }),\n ]);\n\n const list = new MessageList().add(messages as MastraMessageV1[] | MastraDBMessage[], 'memory');\n\n return { messages: list.get.all.db() };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'SAVE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getThreadById({\n threadId,\n resourceId,\n }: {\n threadId: string;\n resourceId?: string;\n }): Promise<StorageThreadType | null> {\n try {\n const result = await this.client.query({\n query: `SELECT \n id,\n \"resourceId\",\n title,\n metadata,\n toDateTime64(createdAt, 3) as createdAt,\n toDateTime64(updatedAt, 3) as updatedAt\n FROM \"${TABLE_THREADS}\"\n WHERE id = {var_id:String}\n ORDER BY updatedAt DESC\n LIMIT 1`,\n query_params: { var_id: threadId },\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = await result.json();\n const thread = transformRow(rows.data[0]) as StorageThreadType;\n\n if (!thread || (resourceId !== undefined && thread.resourceId !== resourceId)) {\n return null;\n }\n\n return {\n ...thread,\n metadata: parseMetadata(thread.metadata),\n createdAt: thread.createdAt,\n updatedAt: thread.updatedAt,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_THREAD_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n error,\n );\n }\n }\n\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n try {\n // ClickHouse's ReplacingMergeTree may create duplicate rows until background merges run\n // We handle this by always querying for the newest row (ORDER BY updatedAt DESC LIMIT 1)\n await this.client.insert({\n table: TABLE_THREADS,\n values: [\n {\n ...thread,\n metadata: serializeMetadata(thread.metadata),\n createdAt: thread.createdAt.toISOString(),\n updatedAt: thread.updatedAt.toISOString(),\n },\n ],\n format: 'JSONEachRow',\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n return thread;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'SAVE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: thread.id },\n },\n error,\n );\n }\n }\n\n async updateThread({\n id,\n title,\n metadata,\n }: {\n id: string;\n title: string;\n metadata: Record<string, unknown>;\n }): Promise<StorageThreadType> {\n try {\n // First get the existing thread to merge metadata\n const existingThread = await this.getThreadById({ threadId: id });\n if (!existingThread) {\n throw new Error(`Thread ${id} not found`);\n }\n\n // Merge the existing metadata with the new metadata\n const mergedMetadata = {\n ...existingThread.metadata,\n ...metadata,\n };\n\n const updatedThread = {\n ...existingThread,\n title,\n metadata: mergedMetadata,\n updatedAt: new Date(),\n };\n\n await this.client.insert({\n table: TABLE_THREADS,\n format: 'JSONEachRow',\n values: [\n {\n id: updatedThread.id,\n resourceId: updatedThread.resourceId,\n title: updatedThread.title,\n metadata: serializeMetadata(updatedThread.metadata),\n createdAt: updatedThread.createdAt,\n updatedAt: updatedThread.updatedAt.toISOString(),\n },\n ],\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n return updatedThread;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'UPDATE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: id, title },\n },\n error,\n );\n }\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n try {\n // First delete all messages associated with this thread\n await this.client.command({\n query: `DELETE FROM \"${TABLE_MESSAGES}\" WHERE thread_id = {var_thread_id:String};`,\n query_params: { var_thread_id: threadId },\n clickhouse_settings: {\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n // Then delete the thread\n await this.client.command({\n query: `DELETE FROM \"${TABLE_THREADS}\" WHERE id = {var_id:String};`,\n query_params: { var_id: threadId },\n clickhouse_settings: {\n output_format_json_quote_64bit_integers: 0,\n },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'DELETE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n error,\n );\n }\n }\n\n public async listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput> {\n const { page = 0, perPage: perPageInput, orderBy, filter } = args;\n\n try {\n // Validate pagination input before normalization\n // This ensures page === 0 when perPageInput === false\n this.validatePaginationInput(page, perPageInput ?? 100);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_THREADS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page, ...(perPageInput !== undefined && { perPage: perPageInput }) },\n },\n error instanceof Error ? error : new Error('Invalid pagination parameters'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n\n // Validate metadata keys to prevent SQL injection\n try {\n this.validateMetadataKeys(filter?.metadata);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_THREADS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { metadataKeys: filter?.metadata ? Object.keys(filter.metadata).join(', ') : '' },\n },\n error instanceof Error ? error : new Error('Invalid metadata key'),\n );\n }\n\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const { field, direction } = this.parseOrderBy(orderBy);\n\n try {\n // Build WHERE clauses\n const whereClauses: string[] = [];\n const queryParams: Record<string, any> = {};\n\n if (filter?.resourceId) {\n whereClauses.push('resourceId = {resourceId:String}');\n queryParams.resourceId = filter.resourceId;\n }\n\n // Keys are validated above to prevent SQL injection\n if (filter?.metadata && Object.keys(filter.metadata).length > 0) {\n let metadataIndex = 0;\n for (const [key, value] of Object.entries(filter.metadata)) {\n const paramName = `metadata${metadataIndex}`;\n // Use JSONExtractRaw to compare exact JSON representation\n whereClauses.push(`JSONExtractRaw(metadata, '${key}') = {${paramName}:String}`);\n queryParams[paramName] = JSON.stringify(value);\n metadataIndex++;\n }\n }\n\n // Get total count - count AFTER ranking to ensure we count latest versions only\n const countResult = await this.client.query({\n query: `\n WITH ranked_threads AS (\n SELECT\n id,\n resourceId,\n metadata,\n ROW_NUMBER() OVER (PARTITION BY id ORDER BY updatedAt DESC) as row_num\n FROM ${TABLE_THREADS}\n )\n SELECT count(*) as total \n FROM ranked_threads \n WHERE row_num = 1 ${whereClauses.length > 0 ? `AND ${whereClauses.join(' AND ')}` : ''}\n `,\n query_params: queryParams,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n const countData = await countResult.json();\n const total = (countData as any).data[0].total;\n\n if (total === 0) {\n return {\n threads: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Get paginated threads - get newest version of each thread\n // Important: Apply WHERE filters AFTER row ranking to ensure we filter on latest versions\n const dataResult = await this.client.query({\n query: `\n WITH ranked_threads AS (\n SELECT\n id,\n resourceId,\n title,\n metadata,\n toDateTime64(createdAt, 3) as createdAt,\n toDateTime64(updatedAt, 3) as updatedAt,\n ROW_NUMBER() OVER (PARTITION BY id ORDER BY updatedAt DESC) as row_num\n FROM ${TABLE_THREADS}\n )\n SELECT\n id,\n resourceId,\n title,\n metadata,\n createdAt,\n updatedAt\n FROM ranked_threads\n WHERE row_num = 1 ${whereClauses.length > 0 ? `AND ${whereClauses.join(' AND ')}` : ''}\n ORDER BY \"${field}\" ${direction === 'DESC' ? 'DESC' : 'ASC'}\n LIMIT {perPage:Int64} OFFSET {offset:Int64}\n `,\n query_params: {\n ...queryParams,\n perPage: perPage,\n offset: offset,\n },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = await dataResult.json();\n const threads = transformRows<StorageThreadType>(rows.data).map(thread => ({\n ...thread,\n metadata: parseMetadata(thread.metadata),\n }));\n\n return {\n threads,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: offset + perPage < total,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_THREADS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n ...(filter?.resourceId && { resourceId: filter.resourceId }),\n hasMetadataFilter: !!filter?.metadata,\n page,\n },\n },\n error,\n );\n }\n }\n\n async updateMessages(args: {\n messages: (Partial<Omit<MastraDBMessage, 'createdAt'>> & {\n id: string;\n threadId?: string;\n content?: { metadata?: MastraMessageContentV2['metadata']; content?: MastraMessageContentV2['content'] };\n })[];\n }): Promise<MastraDBMessage[]> {\n const { messages } = args;\n\n if (messages.length === 0) {\n return [];\n }\n\n try {\n const messageIds = messages.map(m => m.id);\n\n // Get existing messages\n const existingResult = await this.client.query({\n query: `SELECT id, content, role, type, \"createdAt\", thread_id AS \"threadId\", \"resourceId\" FROM ${TABLE_MESSAGES} WHERE id IN (${messageIds.map((_, i) => `{id_${i}:String}`).join(',')})`,\n query_params: messageIds.reduce((acc, m, i) => ({ ...acc, [`id_${i}`]: m }), {}),\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const existingRows = await existingResult.json();\n const existingMessages = transformRows<MastraDBMessage>(existingRows.data);\n\n if (existingMessages.length === 0) {\n return [];\n }\n\n // Parse content from string to object for merging\n const parsedExistingMessages = existingMessages.map(msg => {\n if (typeof msg.content === 'string') {\n try {\n msg.content = JSON.parse(msg.content);\n } catch {\n // ignore if not valid json\n }\n }\n return msg;\n });\n\n const threadIdsToUpdate = new Set<string>();\n const updatePromises: Promise<any>[] = [];\n\n for (const existingMessage of parsedExistingMessages) {\n const updatePayload = messages.find(m => m.id === existingMessage.id);\n if (!updatePayload) continue;\n\n const { id, ...fieldsToUpdate } = updatePayload;\n if (Object.keys(fieldsToUpdate).length === 0) continue;\n\n threadIdsToUpdate.add(existingMessage.threadId!);\n if (updatePayload.threadId && updatePayload.threadId !== existingMessage.threadId) {\n threadIdsToUpdate.add(updatePayload.threadId);\n }\n\n const setClauses: string[] = [];\n const values: any = {};\n let paramIdx = 1;\n let newContent: any = null;\n\n const updatableFields = { ...fieldsToUpdate };\n\n // Special handling for content: merge in code, then update the whole field\n if (updatableFields.content) {\n const existingContent = existingMessage.content || {};\n const existingMetadata = existingContent.metadata || {};\n const updateMetadata = updatableFields.content.metadata || {};\n\n newContent = {\n ...existingContent,\n ...updatableFields.content,\n // Deep merge metadata\n metadata: {\n ...existingMetadata,\n ...updateMetadata,\n },\n };\n\n // Ensure we're updating the content field\n setClauses.push(`content = {var_content_${paramIdx}:String}`);\n values[`var_content_${paramIdx}`] = JSON.stringify(newContent);\n paramIdx++;\n delete updatableFields.content;\n }\n\n // Handle other fields\n for (const key in updatableFields) {\n if (Object.prototype.hasOwnProperty.call(updatableFields, key)) {\n const dbColumn = key === 'threadId' ? 'thread_id' : key;\n setClauses.push(`\"${dbColumn}\" = {var_${key}_${paramIdx}:String}`);\n values[`var_${key}_${paramIdx}`] = updatableFields[key as keyof typeof updatableFields];\n paramIdx++;\n }\n }\n\n if (setClauses.length > 0) {\n values[`var_id_${paramIdx}`] = id;\n\n // Use ALTER TABLE UPDATE for ClickHouse\n const updateQuery = `\n ALTER TABLE ${TABLE_MESSAGES}\n UPDATE ${setClauses.join(', ')}\n WHERE id = {var_id_${paramIdx}:String}\n `;\n\n console.info('Updating message:', id, 'with query:', updateQuery, 'values:', values);\n\n updatePromises.push(\n this.client.command({\n query: updateQuery,\n query_params: values,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n }),\n );\n }\n }\n\n // Execute all updates\n if (updatePromises.length > 0) {\n await Promise.all(updatePromises);\n }\n\n // Optimize table to apply changes immediately\n await this.client.command({\n query: `OPTIMIZE TABLE ${TABLE_MESSAGES} FINAL`,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n // Verify updates were applied and retry if needed\n for (const existingMessage of parsedExistingMessages) {\n const updatePayload = messages.find(m => m.id === existingMessage.id);\n if (!updatePayload) continue;\n\n const { id, ...fieldsToUpdate } = updatePayload;\n if (Object.keys(fieldsToUpdate).length === 0) continue;\n\n // Check if the update was actually applied\n const verifyResult = await this.client.query({\n query: `SELECT id, content, role, type, \"createdAt\", thread_id AS \"threadId\", \"resourceId\" FROM ${TABLE_MESSAGES} WHERE id = {messageId:String}`,\n query_params: { messageId: id },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const verifyRows = await verifyResult.json();\n if (verifyRows.data.length > 0) {\n const updatedMessage = transformRows<MastraDBMessage>(verifyRows.data)[0];\n\n if (updatedMessage) {\n // Check if the update was applied correctly\n let needsRetry = false;\n for (const [key, value] of Object.entries(fieldsToUpdate)) {\n if (key === 'content') {\n // For content updates, check if the content was updated\n const expectedContent = typeof value === 'string' ? value : JSON.stringify(value);\n const actualContent =\n typeof updatedMessage.content === 'string'\n ? updatedMessage.content\n : JSON.stringify(updatedMessage.content);\n if (actualContent !== expectedContent) {\n needsRetry = true;\n break;\n }\n } else if (updatedMessage[key as keyof MastraDBMessage] !== value) {\n needsRetry = true;\n break;\n }\n }\n\n if (needsRetry) {\n console.info('Update not applied correctly, retrying with DELETE + INSERT for message:', id);\n // Use DELETE + INSERT as fallback\n await this.client.command({\n query: `DELETE FROM ${TABLE_MESSAGES} WHERE id = {messageId:String}`,\n query_params: { messageId: id },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n // Reconstruct the updated content if needed\n let updatedContent = existingMessage.content || {};\n if (fieldsToUpdate.content) {\n const existingContent = existingMessage.content || {};\n const existingMetadata = existingContent.metadata || {};\n const updateMetadata = fieldsToUpdate.content.metadata || {};\n\n updatedContent = {\n ...existingContent,\n ...fieldsToUpdate.content,\n metadata: {\n ...existingMetadata,\n ...updateMetadata,\n },\n };\n }\n\n const updatedMessageData = {\n ...existingMessage,\n ...fieldsToUpdate,\n content: updatedContent,\n };\n\n await this.client.insert({\n table: TABLE_MESSAGES,\n format: 'JSONEachRow',\n values: [\n {\n id: updatedMessageData.id,\n thread_id: updatedMessageData.threadId,\n resourceId: updatedMessageData.resourceId,\n content:\n typeof updatedMessageData.content === 'string'\n ? updatedMessageData.content\n : JSON.stringify(updatedMessageData.content),\n createdAt: updatedMessageData.createdAt.toISOString(),\n role: updatedMessageData.role,\n type: updatedMessageData.type || 'v2',\n },\n ],\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n }\n }\n }\n }\n\n // Update thread timestamps with a small delay to ensure timestamp difference\n if (threadIdsToUpdate.size > 0) {\n // Add a small delay to ensure timestamp difference\n await new Promise(resolve => setTimeout(resolve, 10));\n\n const now = new Date().toISOString().replace('Z', '');\n\n // Get existing threads to preserve their data\n const threadUpdatePromises = Array.from(threadIdsToUpdate).map(async threadId => {\n // Get existing thread data - get newest version by updatedAt\n const threadResult = await this.client.query({\n query: `SELECT id, resourceId, title, metadata, createdAt FROM ${TABLE_THREADS} WHERE id = {threadId:String} ORDER BY updatedAt DESC LIMIT 1`,\n query_params: { threadId },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const threadRows = await threadResult.json();\n if (threadRows.data.length > 0) {\n const existingThread = threadRows.data[0] as any;\n\n // Delete existing thread\n await this.client.command({\n query: `DELETE FROM ${TABLE_THREADS} WHERE id = {threadId:String}`,\n query_params: { threadId },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n // Insert updated thread with new timestamp\n await this.client.insert({\n table: TABLE_THREADS,\n format: 'JSONEachRow',\n values: [\n {\n id: existingThread.id,\n resourceId: existingThread.resourceId,\n title: existingThread.title,\n metadata:\n typeof existingThread.metadata === 'string'\n ? existingThread.metadata\n : serializeMetadata(existingThread.metadata as Record<string, unknown>),\n createdAt: existingThread.createdAt,\n updatedAt: now,\n },\n ],\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n }\n });\n\n await Promise.all(threadUpdatePromises);\n }\n\n // Re-fetch to return the fully updated messages\n const updatedMessages: MastraDBMessage[] = [];\n for (const messageId of messageIds) {\n const updatedResult = await this.client.query({\n query: `SELECT id, content, role, type, \"createdAt\", thread_id AS \"threadId\", \"resourceId\" FROM ${TABLE_MESSAGES} WHERE id = {messageId:String}`,\n query_params: { messageId },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n const updatedRows = await updatedResult.json();\n if (updatedRows.data.length > 0) {\n const message = transformRows<MastraDBMessage>(updatedRows.data)[0];\n if (message) {\n updatedMessages.push(message);\n }\n }\n }\n\n // Parse content back to objects\n return updatedMessages.map(message => {\n if (typeof message.content === 'string') {\n try {\n message.content = JSON.parse(message.content);\n } catch {\n // ignore if not valid json\n }\n }\n return message;\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'UPDATE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { messageIds: messages.map(m => m.id).join(',') },\n },\n error,\n );\n }\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n try {\n const result = await this.client.query({\n query: `SELECT id, workingMemory, metadata, createdAt, updatedAt FROM ${TABLE_RESOURCES} WHERE id = {resourceId:String} ORDER BY updatedAt DESC LIMIT 1`,\n query_params: { resourceId },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = await result.json();\n if (rows.data.length === 0) {\n return null;\n }\n\n const resource = rows.data[0] as any;\n return {\n id: resource.id,\n workingMemory:\n resource.workingMemory && typeof resource.workingMemory === 'object'\n ? JSON.stringify(resource.workingMemory)\n : resource.workingMemory,\n metadata: parseMetadata(resource.metadata),\n createdAt: new Date(resource.createdAt),\n updatedAt: new Date(resource.updatedAt),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_RESOURCE_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId },\n },\n error,\n );\n }\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n try {\n await this.client.insert({\n table: TABLE_RESOURCES,\n format: 'JSONEachRow',\n values: [\n {\n id: resource.id,\n workingMemory: resource.workingMemory,\n metadata: serializeMetadata(resource.metadata),\n createdAt: resource.createdAt.toISOString(),\n updatedAt: resource.updatedAt.toISOString(),\n },\n ],\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n // Return resource with normalized metadata\n return {\n ...resource,\n metadata: resource.metadata || {},\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'SAVE_RESOURCE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId: resource.id },\n },\n error,\n );\n }\n }\n\n async updateResource({\n resourceId,\n workingMemory,\n metadata,\n }: {\n resourceId: string;\n workingMemory?: string;\n metadata?: Record<string, unknown>;\n }): Promise<StorageResourceType> {\n try {\n const existingResource = await this.getResourceById({ resourceId });\n\n if (!existingResource) {\n // Create new resource if it doesn't exist\n const newResource: StorageResourceType = {\n id: resourceId,\n workingMemory,\n metadata: metadata || {},\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n return this.saveResource({ resource: newResource });\n }\n\n const updatedResource = {\n ...existingResource,\n workingMemory: workingMemory !== undefined ? workingMemory : existingResource.workingMemory,\n metadata: {\n ...existingResource.metadata,\n ...metadata,\n },\n updatedAt: new Date(),\n };\n\n // Use ALTER TABLE UPDATE for ClickHouse\n const updateQuery = `\n ALTER TABLE ${TABLE_RESOURCES}\n UPDATE workingMemory = {workingMemory:String}, metadata = {metadata:String}, updatedAt = {updatedAt:String}\n WHERE id = {resourceId:String}\n `;\n\n await this.client.command({\n query: updateQuery,\n query_params: {\n workingMemory: updatedResource.workingMemory,\n metadata: JSON.stringify(updatedResource.metadata),\n updatedAt: updatedResource.updatedAt.toISOString().replace('Z', ''),\n resourceId,\n },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n // Optimize table to apply changes\n await this.client.command({\n query: `OPTIMIZE TABLE ${TABLE_RESOURCES} FINAL`,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n return updatedResource;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'UPDATE_RESOURCE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId },\n },\n error,\n );\n }\n }\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n listTracesArgsSchema,\n ObservabilityStorage,\n SPAN_SCHEMA,\n TABLE_SPANS,\n toTraceSpans,\n TraceStatus,\n} from '@mastra/core/storage';\nimport type {\n SpanRecord,\n ListTracesArgs,\n ListTracesResponse,\n TracingStorageStrategy,\n UpdateSpanArgs,\n BatchDeleteTracesArgs,\n BatchUpdateSpansArgs,\n BatchCreateSpansArgs,\n CreateSpanArgs,\n GetSpanArgs,\n GetSpanResponse,\n GetRootSpanArgs,\n GetRootSpanResponse,\n GetTraceArgs,\n GetTraceResponse,\n GetTraceLightResponse,\n} from '@mastra/core/storage';\nimport { ClickhouseDB, resolveClickhouseConfig } from '../../db';\nimport type { ClickhouseDomainConfig } from '../../db';\nimport { TABLE_ENGINES, transformRows } from '../../db/utils';\n\nexport class ObservabilityStorageClickhouse extends ObservabilityStorage {\n protected client: ClickHouseClient;\n #db: ClickhouseDB;\n\n constructor(config: ClickhouseDomainConfig) {\n super();\n const { client, ttl } = resolveClickhouseConfig(config);\n this.client = client;\n this.#db = new ClickhouseDB({ client, ttl });\n }\n\n async init(): Promise<void> {\n // Check if migration is needed (table exists with old sorting key)\n const migrationStatus = await this.#db.checkSpansMigrationStatus(TABLE_SPANS);\n\n if (migrationStatus.needsMigration) {\n // ClickHouse requires table recreation to change sorting key - always require manual migration\n // Unlike other databases where we can just add a unique constraint, ClickHouse's\n // ReplacingMergeTree engine requires the sorting key to be set at table creation time.\n // This means we need to: 1) Create a new table with correct sorting key, 2) Copy data,\n // 3) Drop old table, 4) Rename new table. This is a destructive operation that should\n // only be done explicitly by the user.\n\n // Check for duplicates to provide more helpful error message\n const duplicateInfo = await this.#db.checkForDuplicateSpans(TABLE_SPANS);\n const duplicateMessage = duplicateInfo.hasDuplicates\n ? `\\nFound ${duplicateInfo.duplicateCount} duplicate (traceId, spanId) combinations that will be removed.\\n`\n : '';\n\n const errorMessage =\n `\\n` +\n `===========================================================================\\n` +\n `MIGRATION REQUIRED: ClickHouse spans table needs sorting key update\\n` +\n `===========================================================================\\n` +\n `\\n` +\n `The spans table structure has changed. ClickHouse requires a table recreation\\n` +\n `to update the sorting key from (traceId) to (traceId, spanId).\\n` +\n duplicateMessage +\n `\\n` +\n `To fix this, run the manual migration command:\\n` +\n `\\n` +\n ` npx mastra migrate\\n` +\n `\\n` +\n `This command will:\\n` +\n ` 1. Create a new table with the correct sorting key\\n` +\n ` 2. Copy data from the old table (deduplicating if needed)\\n` +\n ` 3. Replace the old table with the new one\\n` +\n `\\n` +\n `WARNING: This migration involves table recreation and may take significant\\n` +\n `time for large tables. Please ensure you have a backup before proceeding.\\n` +\n `===========================================================================\\n`;\n\n throw new MastraError({\n id: createStorageErrorId('CLICKHOUSE', 'MIGRATION_REQUIRED', 'SORTING_KEY_CHANGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: errorMessage,\n });\n }\n\n // Create the table (or add missing columns if it already exists)\n await this.#db.createTable({ tableName: TABLE_SPANS, schema: SPAN_SCHEMA });\n // Add requestContext column for backwards compatibility with existing databases\n await this.#db.alterTable({\n tableName: TABLE_SPANS,\n schema: SPAN_SCHEMA,\n ifNotExists: ['requestContext'],\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_SPANS });\n }\n\n /**\n * Manually run the spans migration to deduplicate and update the sorting key.\n * This is intended to be called from the CLI when duplicates are detected.\n *\n * @returns Migration result with status and details\n */\n async migrateSpans(): Promise<{\n success: boolean;\n alreadyMigrated: boolean;\n duplicatesRemoved: number;\n message: string;\n }> {\n // Check if migration is needed\n const migrationStatus = await this.#db.checkSpansMigrationStatus(TABLE_SPANS);\n\n if (!migrationStatus.needsMigration) {\n return {\n success: true,\n alreadyMigrated: true,\n duplicatesRemoved: 0,\n message: `Migration already complete. Spans table has correct sorting key.`,\n };\n }\n\n // Check for duplicates (for reporting purposes)\n const duplicateInfo = await this.#db.checkForDuplicateSpans(TABLE_SPANS);\n\n if (duplicateInfo.hasDuplicates) {\n this.logger?.info?.(\n `Found ${duplicateInfo.duplicateCount} duplicate (traceId, spanId) combinations. Starting migration with deduplication...`,\n );\n } else {\n this.logger?.info?.(`No duplicate spans found. Starting sorting key migration...`);\n }\n\n // Run the migration (which includes deduplication)\n await this.#db.migrateSpansTableSortingKey({ tableName: TABLE_SPANS, schema: SPAN_SCHEMA });\n\n return {\n success: true,\n alreadyMigrated: false,\n duplicatesRemoved: duplicateInfo.duplicateCount,\n message: duplicateInfo.hasDuplicates\n ? `Migration complete. Removed duplicates and updated sorting key for ${TABLE_SPANS}.`\n : `Migration complete. Updated sorting key for ${TABLE_SPANS}.`,\n };\n }\n\n /**\n * Check migration status for the spans table.\n * Returns information about whether migration is needed.\n */\n async checkSpansMigrationStatus(): Promise<{\n needsMigration: boolean;\n hasDuplicates: boolean;\n duplicateCount: number;\n constraintExists: boolean;\n tableName: string;\n }> {\n const migrationStatus = await this.#db.checkSpansMigrationStatus(TABLE_SPANS);\n\n if (!migrationStatus.needsMigration) {\n return {\n needsMigration: false,\n hasDuplicates: false,\n duplicateCount: 0,\n constraintExists: true,\n tableName: TABLE_SPANS,\n };\n }\n\n const duplicateInfo = await this.#db.checkForDuplicateSpans(TABLE_SPANS);\n return {\n needsMigration: true,\n hasDuplicates: duplicateInfo.hasDuplicates,\n duplicateCount: duplicateInfo.duplicateCount,\n constraintExists: false,\n tableName: TABLE_SPANS,\n };\n }\n\n public override get tracingStrategy(): {\n preferred: TracingStorageStrategy;\n supported: TracingStorageStrategy[];\n } {\n // ClickHouse is optimized for append-only workloads, so the tracing exporter\n // should use insert-only mode (wait for trace-end events, then insert complete spans).\n // Note: updateSpan/batchUpdateSpans are still available for manual modifications.\n return {\n preferred: 'insert-only',\n supported: ['insert-only'],\n };\n }\n\n async createSpan(args: CreateSpanArgs): Promise<void> {\n const { span } = args;\n try {\n const now = Date.now();\n const record = {\n ...span,\n // Convert Date objects to millisecond timestamps for DateTime64(3)\n startedAt: span.startedAt instanceof Date ? span.startedAt.getTime() : span.startedAt,\n endedAt: span.endedAt instanceof Date ? span.endedAt.getTime() : span.endedAt,\n createdAt: now,\n updatedAt: now,\n };\n await this.#db.insert({ tableName: TABLE_SPANS, record });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'CREATE_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n spanId: span.spanId,\n traceId: span.traceId,\n spanType: span.spanType,\n spanName: span.name,\n },\n },\n error,\n );\n }\n }\n\n async getSpan(args: GetSpanArgs): Promise<GetSpanResponse | null> {\n const { traceId, spanId } = args;\n try {\n const engine = TABLE_ENGINES[TABLE_SPANS] ?? 'MergeTree()';\n const result = await this.client.query({\n query: `\n SELECT *\n FROM ${TABLE_SPANS} ${engine.startsWith('ReplacingMergeTree') ? 'FINAL' : ''}\n WHERE traceId = {traceId:String} AND spanId = {spanId:String}\n LIMIT 1\n `,\n query_params: { traceId, spanId },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = (await result.json()) as any[];\n if (!rows || rows.length === 0) {\n return null;\n }\n\n const spans = transformRows(rows) as SpanRecord[];\n const span = spans[0];\n if (!span) {\n return null;\n }\n return { span };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId, spanId },\n },\n error,\n );\n }\n }\n\n async getRootSpan(args: GetRootSpanArgs): Promise<GetRootSpanResponse | null> {\n const { traceId } = args;\n try {\n const engine = TABLE_ENGINES[TABLE_SPANS] ?? 'MergeTree()';\n const result = await this.client.query({\n query: `\n SELECT *\n FROM ${TABLE_SPANS} ${engine.startsWith('ReplacingMergeTree') ? 'FINAL' : ''}\n WHERE traceId = {traceId:String} AND (parentSpanId IS NULL OR parentSpanId = '')\n LIMIT 1\n `,\n query_params: { traceId },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = (await result.json()) as any[];\n if (!rows || rows.length === 0) {\n return null;\n }\n\n const spans = transformRows(rows) as SpanRecord[];\n const span = spans[0];\n if (!span) {\n return null;\n }\n return { span };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_ROOT_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId },\n },\n error,\n );\n }\n }\n\n async getTrace(args: GetTraceArgs): Promise<GetTraceResponse | null> {\n const { traceId } = args;\n try {\n const engine = TABLE_ENGINES[TABLE_SPANS] ?? 'MergeTree()';\n const result = await this.client.query({\n query: `\n SELECT *\n FROM ${TABLE_SPANS} ${engine.startsWith('ReplacingMergeTree') ? 'FINAL' : ''}\n WHERE traceId = {traceId:String}\n ORDER BY startedAt DESC\n `,\n query_params: { traceId },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = (await result.json()) as any[];\n if (!rows || rows.length === 0) {\n return null;\n }\n\n return {\n traceId,\n spans: transformRows(rows) as SpanRecord[],\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_TRACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId },\n },\n error,\n );\n }\n }\n\n async getTraceLight(args: GetTraceArgs): Promise<GetTraceLightResponse | null> {\n const { traceId } = args;\n try {\n const engine = TABLE_ENGINES[TABLE_SPANS] ?? 'MergeTree()';\n const result = await this.client.query({\n query: `\n SELECT traceId, spanId, parentSpanId, name,\n entityType, entityId, entityName,\n spanType, error, isEvent,\n startedAt, endedAt, createdAt, updatedAt\n FROM ${TABLE_SPANS} ${engine.startsWith('ReplacingMergeTree') ? 'FINAL' : ''}\n WHERE traceId = {traceId:String}\n ORDER BY startedAt ASC\n `,\n query_params: { traceId },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = (await result.json()) as any[];\n if (!rows || rows.length === 0) {\n return null;\n }\n\n return {\n traceId,\n spans: transformRows(rows) as GetTraceLightResponse['spans'],\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_TRACE_LIGHT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId },\n },\n error,\n );\n }\n }\n\n async updateSpan(args: UpdateSpanArgs): Promise<void> {\n const { traceId, spanId, updates } = args;\n try {\n // Load existing span\n const existing = await this.#db.load<SpanRecord>({\n tableName: TABLE_SPANS,\n keys: { spanId, traceId },\n });\n\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('CLICKHOUSE', 'UPDATE_SPAN', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { spanId, traceId },\n });\n }\n\n // Handle Date conversions to millisecond timestamps for DateTime64(3)\n const data: Record<string, any> = { ...updates };\n if (data.endedAt instanceof Date) {\n data.endedAt = data.endedAt.getTime();\n }\n if (data.startedAt instanceof Date) {\n data.startedAt = data.startedAt.getTime();\n }\n\n // Merge updates and re-insert (ClickHouse uses ReplacingMergeTree)\n const updated = {\n ...existing,\n ...data,\n updatedAt: Date.now(),\n };\n\n await this.client.insert({\n table: TABLE_SPANS,\n values: [updated],\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'UPDATE_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { spanId, traceId },\n },\n error,\n );\n }\n }\n\n async listTraces(args: ListTracesArgs): Promise<ListTracesResponse> {\n // Parse args through schema to apply defaults\n const { filters, pagination, orderBy } = listTracesArgsSchema.parse(args);\n const page = pagination?.page ?? 0;\n const perPage = pagination?.perPage ?? 10;\n\n try {\n // ClickHouse stores null strings as empty strings, so check for both\n const conditions: string[] = [`(parentSpanId IS NULL OR parentSpanId = '')`];\n const values: Record<string, any> = {};\n let paramIndex = 0;\n\n if (filters) {\n // Date range filters\n if (filters.startedAt?.start) {\n conditions.push(`startedAt >= {startedAtStart:DateTime64(3)}`);\n // Use Unix timestamp in milliseconds for DateTime64(3)\n values.startedAtStart = filters.startedAt.start.getTime();\n }\n if (filters.startedAt?.end) {\n conditions.push(`startedAt <= {startedAtEnd:DateTime64(3)}`);\n values.startedAtEnd = filters.startedAt.end.getTime();\n }\n if (filters.endedAt?.start) {\n conditions.push(`endedAt >= {endedAtStart:DateTime64(3)}`);\n values.endedAtStart = filters.endedAt.start.getTime();\n }\n if (filters.endedAt?.end) {\n conditions.push(`endedAt <= {endedAtEnd:DateTime64(3)}`);\n values.endedAtEnd = filters.endedAt.end.getTime();\n }\n\n // Span type filter\n if (filters.spanType !== undefined) {\n conditions.push(`spanType = {spanType:String}`);\n values.spanType = filters.spanType;\n }\n\n // Entity filters\n if (filters.entityType !== undefined) {\n conditions.push(`entityType = {entityType:String}`);\n values.entityType = filters.entityType;\n }\n if (filters.entityId !== undefined) {\n conditions.push(`entityId = {entityId:String}`);\n values.entityId = filters.entityId;\n }\n if (filters.entityName !== undefined) {\n conditions.push(`entityName = {entityName:String}`);\n values.entityName = filters.entityName;\n }\n\n // Identity & Tenancy filters\n if (filters.userId !== undefined) {\n conditions.push(`userId = {userId:String}`);\n values.userId = filters.userId;\n }\n if (filters.organizationId !== undefined) {\n conditions.push(`organizationId = {organizationId:String}`);\n values.organizationId = filters.organizationId;\n }\n if (filters.resourceId !== undefined) {\n conditions.push(`resourceId = {resourceId:String}`);\n values.resourceId = filters.resourceId;\n }\n\n // Correlation ID filters\n if (filters.runId !== undefined) {\n conditions.push(`runId = {runId:String}`);\n values.runId = filters.runId;\n }\n if (filters.sessionId !== undefined) {\n conditions.push(`sessionId = {sessionId:String}`);\n values.sessionId = filters.sessionId;\n }\n if (filters.threadId !== undefined) {\n conditions.push(`threadId = {threadId:String}`);\n values.threadId = filters.threadId;\n }\n if (filters.requestId !== undefined) {\n conditions.push(`requestId = {requestId:String}`);\n values.requestId = filters.requestId;\n }\n\n // Deployment context filters\n if (filters.environment !== undefined) {\n conditions.push(`environment = {environment:String}`);\n values.environment = filters.environment;\n }\n if (filters.source !== undefined) {\n conditions.push(`source = {source:String}`);\n values.source = filters.source;\n }\n if (filters.serviceName !== undefined) {\n conditions.push(`serviceName = {serviceName:String}`);\n values.serviceName = filters.serviceName;\n }\n\n // Scope filter (JSON field - use JSONExtractString for each key)\n if (filters.scope != null) {\n for (const [key, value] of Object.entries(filters.scope)) {\n // Validate key to prevent injection in JSON path\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('CLICKHOUSE', 'LIST_TRACES', 'INVALID_FILTER_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { key },\n });\n }\n const paramName = `scope_${key}_${paramIndex++}`;\n conditions.push(`JSONExtractString(scope, '${key}') = {${paramName}:String}`);\n values[paramName] = typeof value === 'string' ? value : JSON.stringify(value);\n }\n }\n\n // Metadata filter (JSON field)\n if (filters.metadata != null) {\n for (const [key, value] of Object.entries(filters.metadata)) {\n // Validate key to prevent injection in JSON path\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('CLICKHOUSE', 'LIST_TRACES', 'INVALID_FILTER_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { key },\n });\n }\n const paramName = `metadata_${key}_${paramIndex++}`;\n conditions.push(`JSONExtractString(metadata, '${key}') = {${paramName}:String}`);\n values[paramName] = typeof value === 'string' ? value : JSON.stringify(value);\n }\n }\n\n // Tags filter (all tags must be present)\n // ClickHouse stores tags as JSON array string, use JSONExtract to check\n if (filters.tags != null && filters.tags.length > 0) {\n for (const tag of filters.tags) {\n const paramName = `tag_${paramIndex++}`;\n conditions.push(`has(JSONExtract(tags, 'Array(String)'), {${paramName}:String})`);\n values[paramName] = tag;\n }\n }\n\n // Status filter (derived from error and endedAt)\n if (filters.status !== undefined) {\n switch (filters.status) {\n case TraceStatus.ERROR:\n // ClickHouse stores null as empty string for String columns\n conditions.push(`(error IS NOT NULL AND error != '')`);\n break;\n case TraceStatus.RUNNING:\n // endedAt is DateTime64 - only check for NULL (not empty string)\n // error is String - check for both NULL and empty string\n conditions.push(`endedAt IS NULL AND (error IS NULL OR error = '')`);\n break;\n case TraceStatus.SUCCESS:\n // endedAt is DateTime64 - only check for NULL (not empty string)\n // error is String - check for both NULL and empty string\n conditions.push(`endedAt IS NOT NULL AND (error IS NULL OR error = '')`);\n break;\n }\n }\n\n // hasChildError filter (requires subquery)\n if (filters.hasChildError !== undefined) {\n const engine = TABLE_ENGINES[TABLE_SPANS] ?? 'MergeTree()';\n const finalClause = engine.startsWith('ReplacingMergeTree') ? 'FINAL' : '';\n if (filters.hasChildError) {\n conditions.push(`EXISTS (\n SELECT 1 FROM ${TABLE_SPANS} ${finalClause} c\n WHERE c.traceId = ${TABLE_SPANS}.traceId AND c.error IS NOT NULL AND c.error != ''\n )`);\n } else {\n conditions.push(`NOT EXISTS (\n SELECT 1 FROM ${TABLE_SPANS} ${finalClause} c\n WHERE c.traceId = ${TABLE_SPANS}.traceId AND c.error IS NOT NULL AND c.error != ''\n )`);\n }\n }\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const engine = TABLE_ENGINES[TABLE_SPANS] ?? 'MergeTree()';\n const finalClause = engine.startsWith('ReplacingMergeTree') ? 'FINAL' : '';\n\n // Order by clause with proper NULL handling for endedAt\n // For endedAt DESC: NULLs FIRST (running spans on top when viewing newest)\n // For endedAt ASC: NULLs LAST (running spans at end when viewing oldest)\n // startedAt is never null (required field), so no special handling needed\n // Note: endedAt is DateTime64 - only check for NULL (not empty string like String columns)\n const sortField = orderBy?.field ?? 'startedAt';\n const sortDirection = orderBy?.direction ?? 'DESC';\n let orderClause: string;\n if (sortField === 'endedAt') {\n // Use CASE WHEN to handle NULLs for endedAt (DateTime64 column)\n // DESC: NULLs first (0 sorts before 1)\n // ASC: NULLs last (1 sorts after 0)\n const nullSortValue = sortDirection === 'DESC' ? 0 : 1;\n const nonNullSortValue = sortDirection === 'DESC' ? 1 : 0;\n orderClause = `ORDER BY CASE WHEN ${sortField} IS NULL THEN ${nullSortValue} ELSE ${nonNullSortValue} END, ${sortField} ${sortDirection}`;\n } else {\n orderClause = `ORDER BY ${sortField} ${sortDirection}`;\n }\n\n // Get total count\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_SPANS} ${finalClause} ${whereClause}`,\n query_params: values,\n format: 'JSONEachRow',\n });\n const countRows = (await countResult.json()) as Array<{ count: string | number }>;\n const total = Number(countRows[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n pagination: { total: 0, page, perPage, hasMore: false },\n spans: [],\n };\n }\n\n // Get paginated results\n const result = await this.client.query({\n query: `\n SELECT *\n FROM ${TABLE_SPANS} ${finalClause}\n ${whereClause}\n ${orderClause}\n LIMIT {limit:UInt32}\n OFFSET {offset:UInt32}\n `,\n query_params: { ...values, limit: perPage, offset: page * perPage },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = (await result.json()) as any[];\n // ClickHouse normalizes null to empty string, so normalize back for status computation\n const spans = (transformRows(rows) as SpanRecord[]).map(span => ({\n ...span,\n error: span.error === '' ? null : span.error,\n }));\n\n return {\n pagination: {\n total,\n page,\n perPage,\n hasMore: (page + 1) * perPage < total,\n },\n spans: toTraceSpans(spans),\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchCreateSpans(args: BatchCreateSpansArgs): Promise<void> {\n try {\n const now = Date.now();\n await this.#db.batchInsert({\n tableName: TABLE_SPANS,\n records: args.records.map(record => ({\n ...record,\n // Convert Date objects to millisecond timestamps for DateTime64(3)\n startedAt: record.startedAt instanceof Date ? record.startedAt.getTime() : record.startedAt,\n endedAt: record.endedAt instanceof Date ? record.endedAt.getTime() : record.endedAt,\n createdAt: now,\n updatedAt: now,\n })),\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_CREATE_SPANS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async batchUpdateSpans(args: BatchUpdateSpansArgs): Promise<void> {\n try {\n const now = Date.now();\n\n // Note: ClickHouse doesn't support traditional UPDATE operations with MergeTree engines.\n // Updates are performed by loading existing data, merging changes, and re-inserting.\n // This sequential processing may be slow for large batches - consider batching at the\n // application level if high-volume updates are needed.\n // For each update, load existing, merge, and re-insert\n for (const record of args.records) {\n const existing = await this.#db.load<SpanRecord>({\n tableName: TABLE_SPANS,\n keys: { spanId: record.spanId, traceId: record.traceId },\n });\n\n if (existing) {\n // Convert Date objects to millisecond timestamps for DateTime64(3)\n const updates: Record<string, any> = { ...record.updates };\n if (updates.startedAt instanceof Date) {\n updates.startedAt = updates.startedAt.getTime();\n }\n if (updates.endedAt instanceof Date) {\n updates.endedAt = updates.endedAt.getTime();\n }\n\n const updated = {\n ...existing,\n ...updates,\n updatedAt: now,\n };\n\n await this.client.insert({\n table: TABLE_SPANS,\n values: [updated],\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n }\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_UPDATE_SPANS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async batchDeleteTraces(args: BatchDeleteTracesArgs): Promise<void> {\n try {\n if (args.traceIds.length === 0) return;\n\n await this.client.command({\n query: `DELETE FROM ${TABLE_SPANS} WHERE traceId IN {traceIds:Array(String)}`,\n query_params: { traceIds: args.traceIds },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_DELETE_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","/**\n * Raw DDL for ClickHouse v-next observability tables.\n *\n * Column ordering convention:\n * 1. Identity (dedupeKey for tracing)\n * 2. IDs (trace, span, experiment)\n * 3. Entity hierarchy (entity, parent, root)\n * 4. Context (user, org, resource, run, session, thread, request, environment, executionSource, serviceName)\n * 5. Span / domain-specific scalars\n * 6. Query-relevant flexible fields (tags, labels, metadataSearch)\n * 7. Information-only JSON payloads\n *\n * Physical conventions:\n * - DateTime64(3, 'UTC') for all timestamps\n * - String for required IDs, Nullable(String) for optional IDs\n * - LowCardinality for low-cardinality dimensions\n * - Array(LowCardinality(String)) DEFAULT [] for tags\n * - Map(LowCardinality(String), String) DEFAULT {} for labels / metadataSearch\n * - Nullable(String) for JSON-encoded payloads\n * - No physical createdAt/updatedAt columns\n */\n\n// ---------------------------------------------------------------------------\n// Table names\n// ---------------------------------------------------------------------------\n\nexport const TABLE_SPAN_EVENTS = 'mastra_span_events';\nexport const TABLE_TRACE_ROOTS = 'mastra_trace_roots';\nexport const TABLE_TRACE_BRANCHES = 'mastra_trace_branches';\nexport const TABLE_METRIC_EVENTS = 'mastra_metric_events';\nexport const TABLE_LOG_EVENTS = 'mastra_log_events';\nexport const TABLE_SCORE_EVENTS = 'mastra_score_events';\nexport const TABLE_FEEDBACK_EVENTS = 'mastra_feedback_events';\nexport const TABLE_DISCOVERY_VALUES = 'mastra_discovery_values';\nexport const TABLE_DISCOVERY_PAIRS = 'mastra_discovery_pairs';\n\n// ---------------------------------------------------------------------------\n// MV names\n// ---------------------------------------------------------------------------\n\nexport const MV_TRACE_ROOTS = 'mastra_mv_trace_roots';\nexport const MV_TRACE_BRANCHES = 'mastra_mv_trace_branches';\nexport const MV_DISCOVERY_VALUES = 'mastra_mv_discovery_values';\nexport const MV_DISCOVERY_PAIRS = 'mastra_mv_discovery_pairs';\n\n/**\n * Span types that anchor a listable trace branch -- a named entity got\n * invoked. Materialized into `mastra_trace_branches` so they're listable\n * independently of where they appear in a trace tree.\n *\n * Kept as a literal SQL list (not derived from {@link BRANCH_SPAN_TYPES})\n * so the MV definition is hermetic and doesn't trigger re-creation if a\n * future enum re-order changes the value source.\n */\nexport const BRANCH_SPAN_TYPE_VALUES = [\n 'agent_run',\n 'workflow_run',\n 'processor_run',\n 'scorer_run',\n 'rag_ingestion',\n 'tool_call',\n 'mcp_tool_call',\n] as const;\n\n// ---------------------------------------------------------------------------\n// span_events — completed spans, ReplacingMergeTree (dedupeKey)\n// ---------------------------------------------------------------------------\n\nexport const SPAN_EVENTS_DDL = `\nCREATE TABLE IF NOT EXISTS ${TABLE_SPAN_EVENTS} (\n -- Identity\n dedupeKey String,\n\n -- IDs\n traceId String,\n spanId String,\n parentSpanId Nullable(String),\n experimentId Nullable(String),\n\n -- Entity\n entityType LowCardinality(Nullable(String)),\n entityId Nullable(String),\n entityName Nullable(String),\n entityVersionId Nullable(String),\n\n -- Parent entity\n parentEntityVersionId Nullable(String),\n parentEntityType LowCardinality(Nullable(String)),\n parentEntityId Nullable(String),\n parentEntityName Nullable(String),\n\n -- Root entity\n rootEntityVersionId Nullable(String),\n rootEntityType LowCardinality(Nullable(String)),\n rootEntityId Nullable(String),\n rootEntityName Nullable(String),\n\n -- Context\n userId Nullable(String),\n organizationId Nullable(String),\n resourceId Nullable(String),\n runId Nullable(String),\n sessionId Nullable(String),\n threadId Nullable(String),\n requestId Nullable(String),\n environment LowCardinality(Nullable(String)),\n executionSource LowCardinality(Nullable(String)),\n serviceName LowCardinality(Nullable(String)),\n\n -- Span scalars\n name String,\n spanType LowCardinality(String),\n isEvent Bool DEFAULT false,\n startedAt DateTime64(3, 'UTC'),\n endedAt DateTime64(3, 'UTC'),\n\n -- Query-relevant flexible fields\n tags Array(LowCardinality(String)) DEFAULT [],\n metadataSearch Map(LowCardinality(String), String) DEFAULT map(),\n\n -- Information-only JSON payloads\n attributes Nullable(String),\n scope Nullable(String),\n links Nullable(String),\n input Nullable(String),\n output Nullable(String),\n error Nullable(String),\n metadataRaw Nullable(String),\n requestContext Nullable(String)\n)\nENGINE = ReplacingMergeTree\nPARTITION BY toDate(endedAt)\nORDER BY (traceId, endedAt, spanId, dedupeKey)\n`;\n\n// ---------------------------------------------------------------------------\n// trace_roots — root spans only, populated by incremental MV\n// ---------------------------------------------------------------------------\n\nexport const TRACE_ROOTS_DDL = `\nCREATE TABLE IF NOT EXISTS ${TABLE_TRACE_ROOTS} (\n -- Identity\n dedupeKey String,\n\n -- IDs\n traceId String,\n spanId String,\n parentSpanId Nullable(String),\n experimentId Nullable(String),\n\n -- Entity\n entityType LowCardinality(Nullable(String)),\n entityId Nullable(String),\n entityName Nullable(String),\n entityVersionId Nullable(String),\n\n -- Parent entity\n parentEntityVersionId Nullable(String),\n parentEntityType LowCardinality(Nullable(String)),\n parentEntityId Nullable(String),\n parentEntityName Nullable(String),\n\n -- Root entity\n rootEntityVersionId Nullable(String),\n rootEntityType LowCardinality(Nullable(String)),\n rootEntityId Nullable(String),\n rootEntityName Nullable(String),\n\n -- Context\n userId Nullable(String),\n organizationId Nullable(String),\n resourceId Nullable(String),\n runId Nullable(String),\n sessionId Nullable(String),\n threadId Nullable(String),\n requestId Nullable(String),\n environment LowCardinality(Nullable(String)),\n executionSource LowCardinality(Nullable(String)),\n serviceName LowCardinality(Nullable(String)),\n\n -- Span scalars\n name String,\n spanType LowCardinality(String),\n isEvent Bool DEFAULT false,\n startedAt DateTime64(3, 'UTC'),\n endedAt DateTime64(3, 'UTC'),\n\n -- Query-relevant flexible fields\n tags Array(LowCardinality(String)) DEFAULT [],\n metadataSearch Map(LowCardinality(String), String) DEFAULT map(),\n\n -- Information-only JSON payloads\n attributes Nullable(String),\n scope Nullable(String),\n links Nullable(String),\n input Nullable(String),\n output Nullable(String),\n error Nullable(String),\n metadataRaw Nullable(String),\n requestContext Nullable(String)\n)\nENGINE = ReplacingMergeTree\nPARTITION BY toDate(endedAt)\nORDER BY (startedAt, traceId, dedupeKey)\n`;\n\n// ---------------------------------------------------------------------------\n// MV: span_events → trace_roots (root spans only, incremental)\n// ---------------------------------------------------------------------------\n\nexport const TRACE_ROOTS_MV_DDL = `\nCREATE MATERIALIZED VIEW IF NOT EXISTS ${MV_TRACE_ROOTS}\nTO ${TABLE_TRACE_ROOTS}\nAS\nSELECT *\nFROM ${TABLE_SPAN_EVENTS}\nWHERE parentSpanId IS NULL\n`;\n\n// ---------------------------------------------------------------------------\n// trace_branches — anchor spans of every named-entity invocation across the\n// tree, ReplacingMergeTree\n//\n// Same column shape as span_events / trace_roots (the MV does SELECT *), so a\n// row can flow trace_roots ← span_events → trace_branches without\n// column-by-column projection. Differs in ORDER BY: this table is\n// filter-by-spanType-first to support \"all branches anchored at entity X\"\n// listings independent of trace identity. Pairs with getBranch() to expand a\n// single anchor into its subtree.\n// ---------------------------------------------------------------------------\n\nexport const TRACE_BRANCHES_DDL = `\nCREATE TABLE IF NOT EXISTS ${TABLE_TRACE_BRANCHES} (\n -- Identity\n dedupeKey String,\n\n -- IDs\n traceId String,\n spanId String,\n parentSpanId Nullable(String),\n experimentId Nullable(String),\n\n -- Entity\n entityType LowCardinality(Nullable(String)),\n entityId Nullable(String),\n entityName Nullable(String),\n entityVersionId Nullable(String),\n\n -- Parent entity\n parentEntityVersionId Nullable(String),\n parentEntityType LowCardinality(Nullable(String)),\n parentEntityId Nullable(String),\n parentEntityName Nullable(String),\n\n -- Root entity\n rootEntityVersionId Nullable(String),\n rootEntityType LowCardinality(Nullable(String)),\n rootEntityId Nullable(String),\n rootEntityName Nullable(String),\n\n -- Context\n userId Nullable(String),\n organizationId Nullable(String),\n resourceId Nullable(String),\n runId Nullable(String),\n sessionId Nullable(String),\n threadId Nullable(String),\n requestId Nullable(String),\n environment LowCardinality(Nullable(String)),\n executionSource LowCardinality(Nullable(String)),\n serviceName LowCardinality(Nullable(String)),\n\n -- Span scalars\n name String,\n spanType LowCardinality(String),\n isEvent Bool DEFAULT false,\n startedAt DateTime64(3, 'UTC'),\n endedAt DateTime64(3, 'UTC'),\n\n -- Query-relevant flexible fields\n tags Array(LowCardinality(String)) DEFAULT [],\n metadataSearch Map(LowCardinality(String), String) DEFAULT map(),\n\n -- Information-only JSON payloads\n attributes Nullable(String),\n scope Nullable(String),\n links Nullable(String),\n input Nullable(String),\n output Nullable(String),\n error Nullable(String),\n metadataRaw Nullable(String),\n requestContext Nullable(String)\n)\nENGINE = ReplacingMergeTree\nPARTITION BY toDate(endedAt)\nORDER BY (spanType, startedAt, traceId, dedupeKey)\n`;\n\n// ---------------------------------------------------------------------------\n// MV: span_events → trace_branches (only branch-anchor span types, incremental)\n// ---------------------------------------------------------------------------\n\nexport const TRACE_BRANCHES_MV_DDL = `\nCREATE MATERIALIZED VIEW IF NOT EXISTS ${MV_TRACE_BRANCHES}\nTO ${TABLE_TRACE_BRANCHES}\nAS\nSELECT *\nFROM ${TABLE_SPAN_EVENTS}\nWHERE spanType IN (${BRANCH_SPAN_TYPE_VALUES.map(v => `'${v}'`).join(', ')})\n`;\n\n// ---------------------------------------------------------------------------\n// metric_events — ReplacingMergeTree with metricId dedup\n// ---------------------------------------------------------------------------\n\nexport const METRIC_EVENTS_DDL = `\nCREATE TABLE IF NOT EXISTS ${TABLE_METRIC_EVENTS} (\n -- Timestamp\n timestamp DateTime64(3, 'UTC'),\n\n -- IDs\n metricId String,\n traceId Nullable(String),\n spanId Nullable(String),\n experimentId Nullable(String),\n\n -- Entity hierarchy\n entityType LowCardinality(Nullable(String)),\n entityId Nullable(String),\n entityName Nullable(String),\n entityVersionId Nullable(String),\n parentEntityVersionId Nullable(String),\n parentEntityType LowCardinality(Nullable(String)),\n parentEntityId Nullable(String),\n parentEntityName Nullable(String),\n rootEntityVersionId Nullable(String),\n rootEntityType LowCardinality(Nullable(String)),\n rootEntityId Nullable(String),\n rootEntityName Nullable(String),\n\n -- Context\n userId Nullable(String),\n organizationId Nullable(String),\n resourceId Nullable(String),\n runId Nullable(String),\n sessionId Nullable(String),\n threadId Nullable(String),\n requestId Nullable(String),\n environment LowCardinality(Nullable(String)),\n executionSource LowCardinality(Nullable(String)),\n serviceName LowCardinality(Nullable(String)),\n\n -- Metric scalars\n name LowCardinality(String),\n value Float64,\n provider LowCardinality(Nullable(String)),\n model Nullable(String),\n estimatedCost Nullable(Float64),\n costUnit LowCardinality(Nullable(String)),\n\n -- Query-relevant flexible fields\n tags Array(LowCardinality(String)) DEFAULT [],\n labels Map(LowCardinality(String), String) DEFAULT map(),\n\n -- Information-only JSON payloads\n costMetadata Nullable(String),\n metadata Nullable(String),\n scope Nullable(String),\n\n -- Bloom-filter skip indexes for high-cardinality ID drilldowns.\n -- Equality and IN filters on these columns can skip granule chunks that\n -- definitely do not contain the value. GRANULARITY 2 = 16K-row chunks.\n -- ID columns are out-of-sort-key, so without these every drilldown scans\n -- every row in the time range.\n INDEX idx_traceId traceId TYPE bloom_filter(0.01) GRANULARITY 2,\n INDEX idx_threadId threadId TYPE bloom_filter(0.01) GRANULARITY 2,\n INDEX idx_resourceId resourceId TYPE bloom_filter(0.01) GRANULARITY 2,\n INDEX idx_userId userId TYPE bloom_filter(0.01) GRANULARITY 2,\n INDEX idx_organizationId organizationId TYPE bloom_filter(0.01) GRANULARITY 2,\n INDEX idx_experimentId experimentId TYPE bloom_filter(0.01) GRANULARITY 2,\n INDEX idx_runId runId TYPE bloom_filter(0.01) GRANULARITY 2,\n INDEX idx_sessionId sessionId TYPE bloom_filter(0.01) GRANULARITY 2,\n INDEX idx_requestId requestId TYPE bloom_filter(0.01) GRANULARITY 2\n)\nENGINE = ReplacingMergeTree\nPARTITION BY toDate(timestamp)\nORDER BY (name, timestamp, metricId)\n`;\n\n// ---------------------------------------------------------------------------\n// log_events — ReplacingMergeTree with logId dedup\n// ---------------------------------------------------------------------------\n\nexport const LOG_EVENTS_DDL = `\nCREATE TABLE IF NOT EXISTS ${TABLE_LOG_EVENTS} (\n -- Timestamp\n timestamp DateTime64(3, 'UTC'),\n\n -- IDs\n logId String,\n traceId Nullable(String),\n spanId Nullable(String),\n experimentId Nullable(String),\n\n -- Entity hierarchy\n entityType LowCardinality(Nullable(String)),\n entityId Nullable(String),\n entityName Nullable(String),\n entityVersionId Nullable(String),\n parentEntityVersionId Nullable(String),\n parentEntityType LowCardinality(Nullable(String)),\n parentEntityId Nullable(String),\n parentEntityName Nullable(String),\n rootEntityVersionId Nullable(String),\n rootEntityType LowCardinality(Nullable(String)),\n rootEntityId Nullable(String),\n rootEntityName Nullable(String),\n\n -- Context\n userId Nullable(String),\n organizationId Nullable(String),\n resourceId Nullable(String),\n runId Nullable(String),\n sessionId Nullable(String),\n threadId Nullable(String),\n requestId Nullable(String),\n environment LowCardinality(Nullable(String)),\n executionSource LowCardinality(Nullable(String)),\n serviceName LowCardinality(Nullable(String)),\n\n -- Log scalars\n level LowCardinality(String),\n message String,\n\n -- Query-relevant flexible fields\n tags Array(LowCardinality(String)) DEFAULT [],\n\n -- Information-only JSON payloads\n data Nullable(String),\n metadata Nullable(String),\n scope Nullable(String)\n)\nENGINE = ReplacingMergeTree\nPARTITION BY toDate(timestamp)\nORDER BY (timestamp, logId)\n`;\n\n// ---------------------------------------------------------------------------\n// score_events — ReplacingMergeTree with scoreId dedup\n// ---------------------------------------------------------------------------\n\nexport const SCORE_EVENTS_DDL = `\nCREATE TABLE IF NOT EXISTS ${TABLE_SCORE_EVENTS} (\n -- Timestamp\n timestamp DateTime64(3, 'UTC'),\n\n -- IDs\n scoreId String,\n traceId Nullable(String),\n spanId Nullable(String),\n experimentId Nullable(String),\n scoreTraceId Nullable(String),\n\n -- Entity hierarchy\n entityType LowCardinality(Nullable(String)),\n entityId Nullable(String),\n entityName Nullable(String),\n entityVersionId Nullable(String),\n parentEntityVersionId Nullable(String),\n parentEntityType LowCardinality(Nullable(String)),\n parentEntityId Nullable(String),\n parentEntityName Nullable(String),\n rootEntityVersionId Nullable(String),\n rootEntityType LowCardinality(Nullable(String)),\n rootEntityId Nullable(String),\n rootEntityName Nullable(String),\n\n -- Context\n userId Nullable(String),\n organizationId Nullable(String),\n resourceId Nullable(String),\n runId Nullable(String),\n sessionId Nullable(String),\n threadId Nullable(String),\n requestId Nullable(String),\n environment LowCardinality(Nullable(String)),\n executionSource LowCardinality(Nullable(String)),\n serviceName LowCardinality(Nullable(String)),\n\n -- Scorer identity\n scorerId LowCardinality(String),\n scorerVersion LowCardinality(Nullable(String)),\n scoreSource LowCardinality(Nullable(String)),\n\n -- Score value\n score Float64,\n\n -- Information-only\n reason Nullable(String),\n\n -- Query-relevant flexible fields\n tags Array(LowCardinality(String)) DEFAULT [],\n\n -- Information-only JSON payloads\n metadata Nullable(String),\n scope Nullable(String)\n)\nENGINE = ReplacingMergeTree\nPARTITION BY toDate(timestamp)\nORDER BY (traceId, timestamp, scoreId)\nSETTINGS allow_nullable_key = 1\n`;\n\n// ---------------------------------------------------------------------------\n// feedback_events — ReplacingMergeTree with feedbackId dedup\n// ---------------------------------------------------------------------------\n\nexport const FEEDBACK_EVENTS_DDL = `\nCREATE TABLE IF NOT EXISTS ${TABLE_FEEDBACK_EVENTS} (\n -- Timestamp\n timestamp DateTime64(3, 'UTC'),\n\n -- IDs\n feedbackId String,\n traceId Nullable(String),\n spanId Nullable(String),\n experimentId Nullable(String),\n\n -- Entity hierarchy\n entityType LowCardinality(Nullable(String)),\n entityId Nullable(String),\n entityName Nullable(String),\n entityVersionId Nullable(String),\n parentEntityVersionId Nullable(String),\n parentEntityType LowCardinality(Nullable(String)),\n parentEntityId Nullable(String),\n parentEntityName Nullable(String),\n rootEntityVersionId Nullable(String),\n rootEntityType LowCardinality(Nullable(String)),\n rootEntityId Nullable(String),\n rootEntityName Nullable(String),\n\n -- Context\n userId Nullable(String),\n organizationId Nullable(String),\n resourceId Nullable(String),\n runId Nullable(String),\n sessionId Nullable(String),\n threadId Nullable(String),\n requestId Nullable(String),\n environment LowCardinality(Nullable(String)),\n executionSource LowCardinality(Nullable(String)),\n serviceName LowCardinality(Nullable(String)),\n\n -- Feedback actor / linkage\n feedbackUserId Nullable(String),\n sourceId Nullable(String),\n\n -- Feedback identity\n feedbackSource LowCardinality(String),\n feedbackType LowCardinality(String),\n\n -- Feedback value (exactly one non-null per valid row)\n valueString Nullable(String),\n valueNumber Nullable(Float64),\n\n -- Information-only\n comment Nullable(String),\n\n -- Query-relevant flexible fields\n tags Array(LowCardinality(String)) DEFAULT [],\n\n -- Information-only JSON payloads\n metadata Nullable(String),\n scope Nullable(String)\n)\nENGINE = ReplacingMergeTree\nPARTITION BY toDate(timestamp)\nORDER BY (traceId, timestamp, feedbackId)\nSETTINGS allow_nullable_key = 1\n`;\n\n// ---------------------------------------------------------------------------\n// discovery_values — refreshable helper\n// ---------------------------------------------------------------------------\n\nexport const DISCOVERY_VALUES_DDL = `\nCREATE TABLE IF NOT EXISTS ${TABLE_DISCOVERY_VALUES} (\n kind LowCardinality(String),\n key1 String,\n value String\n)\nENGINE = MergeTree\nORDER BY (kind, key1, value)\n`;\n\n// ---------------------------------------------------------------------------\n// discovery_pairs — refreshable helper\n// ---------------------------------------------------------------------------\n\nexport const DISCOVERY_PAIRS_DDL = `\nCREATE TABLE IF NOT EXISTS ${TABLE_DISCOVERY_PAIRS} (\n kind LowCardinality(String),\n key1 String,\n key2 String,\n value String\n)\nENGINE = MergeTree\nORDER BY (kind, key1, key2, value)\n`;\n\n// ---------------------------------------------------------------------------\n// Refreshable MV: discovery_values — recomputes every 1 minute\n// Source: span_events, metric_events, log_events (not scores/feedback)\n// ---------------------------------------------------------------------------\n\nconst SIGNAL_TABLES = [TABLE_SPAN_EVENTS, TABLE_METRIC_EVENTS, TABLE_LOG_EVENTS] as const;\n\nfunction unionDistinctFromSignals(\n kind: string,\n key1Expr: string,\n valueExpr: string,\n extraJoin = '',\n extraWhere = '',\n tables: readonly string[] = SIGNAL_TABLES,\n): string {\n return tables\n .map(\n t =>\n `SELECT '${kind}' AS kind, ${key1Expr} AS key1, ${valueExpr} AS value FROM ${t}${extraJoin}${extraWhere ? ` WHERE ${extraWhere}` : ''}`,\n )\n .join(' UNION ALL ');\n}\n\nexport const DISCOVERY_VALUES_MV_DDL = `\nCREATE MATERIALIZED VIEW IF NOT EXISTS ${MV_DISCOVERY_VALUES}\nREFRESH EVERY 1 MINUTE\nTO ${TABLE_DISCOVERY_VALUES}\nAS\nSELECT DISTINCT kind, key1, value FROM (\n -- entityType\n ${unionDistinctFromSignals('entityType', \"''\", 'entityType', '', \"entityType IS NOT NULL AND entityType != ''\")}\n UNION ALL\n -- serviceName\n ${unionDistinctFromSignals('serviceName', \"''\", 'serviceName', '', \"serviceName IS NOT NULL AND serviceName != ''\")}\n UNION ALL\n -- environment\n ${unionDistinctFromSignals('environment', \"''\", 'environment', '', \"environment IS NOT NULL AND environment != ''\")}\n UNION ALL\n -- tag (explode tags array, key1 = entityType, drop rows without entityType)\n ${unionDistinctFromSignals('tag', 'entityType', 'tag', ' ARRAY JOIN tags AS tag', \"tag != '' AND entityType IS NOT NULL AND entityType != ''\")}\n UNION ALL\n -- metricName (metric_events only)\n ${unionDistinctFromSignals('metricName', \"''\", 'name', '', \"name != ''\", [TABLE_METRIC_EVENTS])}\n UNION ALL\n -- metricLabelKey (metric_events only, explode label keys)\n ${unionDistinctFromSignals('metricLabelKey', 'name', 'labelKey', ' ARRAY JOIN mapKeys(labels) AS labelKey', \"name != '' AND labelKey != ''\", [TABLE_METRIC_EVENTS])}\n)\n`;\n\n// ---------------------------------------------------------------------------\n// Refreshable MV: discovery_pairs — recomputes every 5 minutes\n// Source: span_events, metric_events, log_events (not scores/feedback)\n// ---------------------------------------------------------------------------\n\nexport const DISCOVERY_PAIRS_MV_DDL = `\nCREATE MATERIALIZED VIEW IF NOT EXISTS ${MV_DISCOVERY_PAIRS}\nREFRESH EVERY 5 MINUTE\nTO ${TABLE_DISCOVERY_PAIRS}\nAS\nSELECT DISTINCT kind, key1, key2, value FROM (\n -- entityTypeName (entityType → entityName pairs)\n ${SIGNAL_TABLES.map(\n t =>\n `SELECT 'entityTypeName' AS kind, entityType AS key1, '' AS key2, entityName AS value FROM ${t} WHERE entityType IS NOT NULL AND entityType != '' AND entityName IS NOT NULL AND entityName != ''`,\n ).join(' UNION ALL ')}\n UNION ALL\n -- metricLabelValue (metricName + labelKey → labelValue triples)\n SELECT 'metricLabelValue' AS kind, name AS key1, labelKey AS key2, labels[labelKey] AS value\n FROM ${TABLE_METRIC_EVENTS}\n ARRAY JOIN mapKeys(labels) AS labelKey\n WHERE name != '' AND labelKey != '' AND labels[labelKey] != ''\n)\n`;\n\n// ---------------------------------------------------------------------------\n// All DDL in creation order (tables first, then MVs)\n// ---------------------------------------------------------------------------\n\nexport const ALL_TABLE_DDL = [\n SPAN_EVENTS_DDL,\n TRACE_ROOTS_DDL,\n TRACE_BRANCHES_DDL,\n METRIC_EVENTS_DDL,\n LOG_EVENTS_DDL,\n SCORE_EVENTS_DDL,\n FEEDBACK_EVENTS_DDL,\n DISCOVERY_VALUES_DDL,\n DISCOVERY_PAIRS_DDL,\n];\n\nexport const ALL_MV_DDL = [TRACE_ROOTS_MV_DDL, TRACE_BRANCHES_MV_DDL];\n\n/** Discovery-specific refreshable MVs — created separately from core MVs. */\nexport const DISCOVERY_MV_DDL = [DISCOVERY_VALUES_MV_DDL, DISCOVERY_PAIRS_MV_DDL];\n\n/**\n * Additive migrations for existing ClickHouse databases.\n * ClickHouse's `CREATE TABLE IF NOT EXISTS` skips if the table already exists,\n * so new columns must be added explicitly via `ALTER TABLE ... ADD COLUMN IF NOT EXISTS`.\n */\nexport const ALL_MIGRATIONS = [\n // Span events\n `ALTER TABLE ${TABLE_SPAN_EVENTS} ADD COLUMN IF NOT EXISTS entityVersionId Nullable(String)`,\n `ALTER TABLE ${TABLE_SPAN_EVENTS} ADD COLUMN IF NOT EXISTS parentEntityVersionId Nullable(String)`,\n `ALTER TABLE ${TABLE_SPAN_EVENTS} ADD COLUMN IF NOT EXISTS rootEntityVersionId Nullable(String)`,\n // Trace roots\n `ALTER TABLE ${TABLE_TRACE_ROOTS} ADD COLUMN IF NOT EXISTS entityVersionId Nullable(String)`,\n `ALTER TABLE ${TABLE_TRACE_ROOTS} ADD COLUMN IF NOT EXISTS parentEntityVersionId Nullable(String)`,\n `ALTER TABLE ${TABLE_TRACE_ROOTS} ADD COLUMN IF NOT EXISTS rootEntityVersionId Nullable(String)`,\n // Metrics\n `ALTER TABLE ${TABLE_METRIC_EVENTS} ADD COLUMN IF NOT EXISTS entityVersionId Nullable(String)`,\n `ALTER TABLE ${TABLE_METRIC_EVENTS} ADD COLUMN IF NOT EXISTS parentEntityVersionId Nullable(String)`,\n `ALTER TABLE ${TABLE_METRIC_EVENTS} ADD COLUMN IF NOT EXISTS rootEntityVersionId Nullable(String)`,\n // Logs\n `ALTER TABLE ${TABLE_LOG_EVENTS} ADD COLUMN IF NOT EXISTS entityVersionId Nullable(String)`,\n `ALTER TABLE ${TABLE_LOG_EVENTS} ADD COLUMN IF NOT EXISTS parentEntityVersionId Nullable(String)`,\n `ALTER TABLE ${TABLE_LOG_EVENTS} ADD COLUMN IF NOT EXISTS rootEntityVersionId Nullable(String)`,\n // Scores\n `ALTER TABLE ${TABLE_SCORE_EVENTS} ADD COLUMN IF NOT EXISTS entityVersionId Nullable(String)`,\n `ALTER TABLE ${TABLE_SCORE_EVENTS} ADD COLUMN IF NOT EXISTS parentEntityVersionId Nullable(String)`,\n `ALTER TABLE ${TABLE_SCORE_EVENTS} ADD COLUMN IF NOT EXISTS rootEntityVersionId Nullable(String)`,\n // Feedback\n `ALTER TABLE ${TABLE_FEEDBACK_EVENTS} ADD COLUMN IF NOT EXISTS entityVersionId Nullable(String)`,\n `ALTER TABLE ${TABLE_FEEDBACK_EVENTS} ADD COLUMN IF NOT EXISTS parentEntityVersionId Nullable(String)`,\n `ALTER TABLE ${TABLE_FEEDBACK_EVENTS} ADD COLUMN IF NOT EXISTS rootEntityVersionId Nullable(String)`,\n // Metric skip indexes — additive, instant DDL. Existing parts keep no index\n // until merged or `MATERIALIZE INDEX` is run; new parts are bloom-filtered\n // immediately. With normal retention turning over the table, the index\n // converges to full coverage without an explicit backfill.\n `ALTER TABLE ${TABLE_METRIC_EVENTS} ADD INDEX IF NOT EXISTS idx_traceId traceId TYPE bloom_filter(0.01) GRANULARITY 2`,\n `ALTER TABLE ${TABLE_METRIC_EVENTS} ADD INDEX IF NOT EXISTS idx_threadId threadId TYPE bloom_filter(0.01) GRANULARITY 2`,\n `ALTER TABLE ${TABLE_METRIC_EVENTS} ADD INDEX IF NOT EXISTS idx_resourceId resourceId TYPE bloom_filter(0.01) GRANULARITY 2`,\n `ALTER TABLE ${TABLE_METRIC_EVENTS} ADD INDEX IF NOT EXISTS idx_userId userId TYPE bloom_filter(0.01) GRANULARITY 2`,\n `ALTER TABLE ${TABLE_METRIC_EVENTS} ADD INDEX IF NOT EXISTS idx_organizationId organizationId TYPE bloom_filter(0.01) GRANULARITY 2`,\n `ALTER TABLE ${TABLE_METRIC_EVENTS} ADD INDEX IF NOT EXISTS idx_experimentId experimentId TYPE bloom_filter(0.01) GRANULARITY 2`,\n `ALTER TABLE ${TABLE_METRIC_EVENTS} ADD INDEX IF NOT EXISTS idx_runId runId TYPE bloom_filter(0.01) GRANULARITY 2`,\n `ALTER TABLE ${TABLE_METRIC_EVENTS} ADD INDEX IF NOT EXISTS idx_sessionId sessionId TYPE bloom_filter(0.01) GRANULARITY 2`,\n `ALTER TABLE ${TABLE_METRIC_EVENTS} ADD INDEX IF NOT EXISTS idx_requestId requestId TYPE bloom_filter(0.01) GRANULARITY 2`,\n];\n\n/**\n * Names of the bloom-filter skip indexes added to `metric_events`. Exposed so\n * tooling (e.g. a follow-up `mastra migrate` command) can detect and optionally\n * `MATERIALIZE INDEX` them across pre-existing parts.\n */\nexport const METRIC_SKIP_INDEX_NAMES = [\n 'idx_traceId',\n 'idx_threadId',\n 'idx_resourceId',\n 'idx_userId',\n 'idx_organizationId',\n 'idx_experimentId',\n 'idx_runId',\n 'idx_sessionId',\n 'idx_requestId',\n] as const;\n\nexport const ALL_DDL = [...ALL_TABLE_DDL, ...ALL_MV_DDL, ...DISCOVERY_MV_DDL];\n\nexport const ALL_TABLE_NAMES = [\n TABLE_SPAN_EVENTS,\n TABLE_TRACE_ROOTS,\n TABLE_TRACE_BRANCHES,\n TABLE_METRIC_EVENTS,\n TABLE_LOG_EVENTS,\n TABLE_SCORE_EVENTS,\n TABLE_FEEDBACK_EVENTS,\n TABLE_DISCOVERY_VALUES,\n TABLE_DISCOVERY_PAIRS,\n];\n\n// ---------------------------------------------------------------------------\n// Retention / TTL\n// ---------------------------------------------------------------------------\n\n/**\n * Per-signal retention configuration in day increments.\n *\n * Per design doc (shared.md §Retention):\n * - TTL configurable per signal in day increments\n * - tracing retention identical across span_events and trace_roots\n * - discovery helpers do not need TTL (fully derived)\n */\nexport interface RetentionConfig {\n /** Retention for span_events and trace_roots in days. */\n tracing?: number;\n /** Retention for log_events in days. */\n logs?: number;\n /** Retention for metric_events in days. */\n metrics?: number;\n /** Retention for score_events in days. */\n scores?: number;\n /** Retention for feedback_events in days. */\n feedback?: number;\n}\n\n/** Timestamp column used for TTL per signal table. */\nconst SIGNAL_TTL_COLUMNS: Record<string, string> = {\n [TABLE_SPAN_EVENTS]: 'endedAt',\n [TABLE_TRACE_ROOTS]: 'endedAt',\n [TABLE_TRACE_BRANCHES]: 'endedAt',\n [TABLE_METRIC_EVENTS]: 'timestamp',\n [TABLE_LOG_EVENTS]: 'timestamp',\n [TABLE_SCORE_EVENTS]: 'timestamp',\n [TABLE_FEEDBACK_EVENTS]: 'timestamp',\n};\n\n/** Maps each signal key to the table(s) it controls. */\nconst SIGNAL_TO_TABLES: Record<keyof RetentionConfig, string[]> = {\n tracing: [TABLE_SPAN_EVENTS, TABLE_TRACE_ROOTS, TABLE_TRACE_BRANCHES],\n logs: [TABLE_LOG_EVENTS],\n metrics: [TABLE_METRIC_EVENTS],\n scores: [TABLE_SCORE_EVENTS],\n feedback: [TABLE_FEEDBACK_EVENTS],\n};\n\n/**\n * Generates `ALTER TABLE ... MODIFY TTL` statements for the given retention config.\n * Returns empty array if no retention is configured.\n *\n * Uses `MODIFY TTL` so re-running init is idempotent (overwrites any previous TTL).\n */\nexport function buildRetentionDDL(retention: RetentionConfig): string[] {\n const statements: string[] = [];\n\n for (const [signal, days] of Object.entries(retention)) {\n const safeDays = Math.floor(Number(days));\n if (!Number.isFinite(safeDays) || safeDays <= 0) continue;\n\n const tables = SIGNAL_TO_TABLES[signal as keyof RetentionConfig];\n if (!tables) continue;\n\n for (const table of tables) {\n const col = SIGNAL_TTL_COLUMNS[table];\n if (!col) continue;\n statements.push(`ALTER TABLE ${table} MODIFY TTL ${col} + INTERVAL ${safeDays} DAY`);\n }\n }\n\n return statements;\n}\n","/**\n * Shared utilities for ClickHouse v-next observability domain.\n *\n * - Normalization helpers for tags, labels, metadataSearch\n * - Row-to-record transformation\n * - ClickHouse query settings\n */\n\nimport type {\n SpanRecord,\n CreateSpanRecord,\n LogRecord,\n CreateLogRecord,\n MetricRecord,\n CreateMetricRecord,\n ScoreRecord,\n CreateScoreRecord,\n FeedbackRecord,\n CreateFeedbackRecord,\n} from '@mastra/core/storage';\nimport { EntityType } from '@mastra/core/storage';\n\n// ---------------------------------------------------------------------------\n// ClickHouse query settings\n// ---------------------------------------------------------------------------\n\nexport const CH_SETTINGS = {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n} as const;\n\nexport const CH_INSERT_SETTINGS = {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n} as const;\n\nconst PROMOTED_KEYS = new Set([\n 'experimentId',\n 'entityType',\n 'entityId',\n 'entityName',\n 'entityVersionId',\n 'parentEntityVersionId',\n 'rootEntityVersionId',\n 'userId',\n 'organizationId',\n 'resourceId',\n 'runId',\n 'sessionId',\n 'threadId',\n 'requestId',\n 'environment',\n 'executionSource',\n 'serviceName',\n]);\n\nfunction nullableString(value: unknown): string | null {\n return typeof value === 'string' ? (value === '' ? null : value) : value == null ? null : String(value);\n}\n\nfunction nullableEntityType(value: unknown): EntityType | null {\n const normalized = nullableString(value);\n if (!normalized) return null;\n return Object.values(EntityType).includes(normalized as EntityType) ? (normalized as EntityType) : null;\n}\n\nexport function normalizeTags(tags: unknown): string[] {\n if (!Array.isArray(tags)) return [];\n const seen = new Set<string>();\n const result: string[] = [];\n for (const t of tags) {\n if (typeof t !== 'string') continue;\n const trimmed = t.trim();\n if (trimmed === '' || seen.has(trimmed)) continue;\n seen.add(trimmed);\n result.push(trimmed);\n }\n return result;\n}\n\nexport function normalizeLabels(labels: Record<string, unknown> | null | undefined): Record<string, string> {\n if (labels == null || typeof labels !== 'object') return {};\n const result: Record<string, string> = {};\n for (const [k, v] of Object.entries(labels)) {\n if (typeof v !== 'string') continue;\n const trimmedK = k.trim();\n const trimmedV = v.trim();\n if (trimmedK === '' || trimmedV === '') continue;\n result[trimmedK] = trimmedV;\n }\n return result;\n}\n\nexport function buildMetadataSearch(metadata: Record<string, unknown> | null | undefined): Record<string, string> {\n if (metadata == null || typeof metadata !== 'object') return {};\n const result: Record<string, string> = {};\n for (const [k, v] of Object.entries(metadata)) {\n if (PROMOTED_KEYS.has(k)) continue;\n if (typeof v !== 'string') continue;\n const trimmed = v.trim();\n if (trimmed === '') continue;\n result[k] = trimmed;\n }\n return result;\n}\n\nexport function jsonEncode(value: unknown): string | null {\n if (value == null) return null;\n return JSON.stringify(value);\n}\n\nexport function parseJson(value: unknown): unknown {\n if (value == null || value === '') return null;\n if (typeof value !== 'string') return value;\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n}\n\nexport function toDateOrNull(value: unknown): Date | null {\n if (value == null || value === '') return null;\n const d = new Date(value as string | number);\n if (isNaN(d.getTime()) || d.getTime() === 0) return null;\n return d;\n}\n\nexport function toDate(value: unknown): Date {\n const d = toDateOrNull(value);\n if (d == null) throw new Error(`Invalid date: ${value}`);\n return d;\n}\n\nexport function toISOString(value: Date | number | string): string {\n if (value instanceof Date) return value.toISOString();\n if (typeof value === 'number') return new Date(value).toISOString();\n return value;\n}\n\nexport function buildDedupeKey(traceId: string, spanId: string): string {\n return `${traceId}:${spanId}`;\n}\n\nexport function rowToSpanRecord(row: Record<string, any>): SpanRecord {\n const startedAt = toDate(row.startedAt);\n const endedAt = row.isEvent ? startedAt : toDateOrNull(row.endedAt);\n const error = parseJson(row.error);\n\n return {\n traceId: row.traceId,\n spanId: row.spanId,\n parentSpanId: nullableString(row.parentSpanId),\n name: row.name,\n spanType: row.spanType,\n isEvent: Boolean(row.isEvent),\n startedAt,\n endedAt,\n entityType: nullableEntityType(row.entityType),\n entityId: nullableString(row.entityId),\n entityName: nullableString(row.entityName),\n entityVersionId: nullableString(row.entityVersionId),\n parentEntityVersionId: nullableString(row.parentEntityVersionId),\n parentEntityType: nullableEntityType(row.parentEntityType),\n parentEntityId: nullableString(row.parentEntityId),\n parentEntityName: nullableString(row.parentEntityName),\n rootEntityVersionId: nullableString(row.rootEntityVersionId),\n rootEntityType: nullableEntityType(row.rootEntityType),\n rootEntityId: nullableString(row.rootEntityId),\n rootEntityName: nullableString(row.rootEntityName),\n userId: nullableString(row.userId),\n organizationId: nullableString(row.organizationId),\n resourceId: nullableString(row.resourceId),\n runId: nullableString(row.runId),\n sessionId: nullableString(row.sessionId),\n threadId: nullableString(row.threadId),\n requestId: nullableString(row.requestId),\n environment: nullableString(row.environment),\n source: nullableString(row.executionSource),\n serviceName: nullableString(row.serviceName),\n experimentId: nullableString(row.experimentId),\n tags: normalizeTags(row.tags),\n metadata: (parseJson(row.metadataRaw) as Record<string, unknown> | null) ?? undefined,\n scope: (parseJson(row.scope) as Record<string, unknown> | null) ?? undefined,\n attributes: (parseJson(row.attributes) as Record<string, unknown> | null) ?? undefined,\n links: (parseJson(row.links) as Record<string, unknown>[] | null) ?? undefined,\n input: parseJson(row.input) ?? undefined,\n output: parseJson(row.output) ?? undefined,\n error: error ?? undefined,\n requestContext: (parseJson(row.requestContext) as Record<string, unknown> | null) ?? undefined,\n createdAt: startedAt,\n updatedAt: null,\n };\n}\n\nexport function rowsToSpanRecords(rows: Record<string, any>[]): SpanRecord[] {\n return rows.map(rowToSpanRecord);\n}\n\nexport function spanRecordToRow(span: CreateSpanRecord): Record<string, unknown> {\n const endedAt = span.isEvent ? span.startedAt : (span.endedAt ?? span.startedAt);\n const metadata = span.metadata ?? null;\n\n return {\n dedupeKey: buildDedupeKey(span.traceId, span.spanId),\n traceId: span.traceId,\n spanId: span.spanId,\n parentSpanId: span.parentSpanId ?? null,\n experimentId: span.experimentId ?? null,\n entityType: span.entityType ?? null,\n entityId: span.entityId ?? null,\n entityName: span.entityName ?? null,\n entityVersionId: span.entityVersionId ?? null,\n parentEntityVersionId: span.parentEntityVersionId ?? null,\n parentEntityType: span.parentEntityType ?? null,\n parentEntityId: span.parentEntityId ?? null,\n parentEntityName: span.parentEntityName ?? null,\n rootEntityVersionId: span.rootEntityVersionId ?? null,\n rootEntityType: span.rootEntityType ?? null,\n rootEntityId: span.rootEntityId ?? null,\n rootEntityName: span.rootEntityName ?? null,\n userId: span.userId ?? null,\n organizationId: span.organizationId ?? null,\n resourceId: span.resourceId ?? null,\n runId: span.runId ?? null,\n sessionId: span.sessionId ?? null,\n threadId: span.threadId ?? null,\n requestId: span.requestId ?? null,\n environment: span.environment ?? null,\n executionSource: span.source ?? null,\n serviceName: span.serviceName ?? null,\n name: span.name,\n spanType: span.spanType,\n isEvent: span.isEvent,\n startedAt: toISOString(span.startedAt),\n endedAt: toISOString(endedAt),\n tags: normalizeTags(span.tags),\n metadataSearch: buildMetadataSearch(metadata),\n metadataRaw: jsonEncode(metadata),\n scope: jsonEncode(span.scope),\n attributes: jsonEncode(span.attributes),\n links: jsonEncode(span.links),\n input: jsonEncode(span.input),\n output: jsonEncode(span.output),\n error: jsonEncode(span.error),\n requestContext: jsonEncode(span.requestContext),\n };\n}\n\nexport function rowToLogRecord(row: Record<string, any>): LogRecord {\n return {\n logId: row.logId,\n timestamp: toDate(row.timestamp),\n level: row.level,\n message: row.message,\n data: (parseJson(row.data) as Record<string, unknown> | null) ?? undefined,\n traceId: nullableString(row.traceId),\n spanId: nullableString(row.spanId),\n experimentId: nullableString(row.experimentId),\n entityType: nullableEntityType(row.entityType),\n entityId: nullableString(row.entityId),\n entityName: nullableString(row.entityName),\n entityVersionId: nullableString(row.entityVersionId),\n parentEntityVersionId: nullableString(row.parentEntityVersionId),\n parentEntityType: nullableEntityType(row.parentEntityType),\n parentEntityId: nullableString(row.parentEntityId),\n parentEntityName: nullableString(row.parentEntityName),\n rootEntityVersionId: nullableString(row.rootEntityVersionId),\n rootEntityType: nullableEntityType(row.rootEntityType),\n rootEntityId: nullableString(row.rootEntityId),\n rootEntityName: nullableString(row.rootEntityName),\n userId: nullableString(row.userId),\n organizationId: nullableString(row.organizationId),\n resourceId: nullableString(row.resourceId),\n runId: nullableString(row.runId),\n sessionId: nullableString(row.sessionId),\n threadId: nullableString(row.threadId),\n requestId: nullableString(row.requestId),\n environment: nullableString(row.environment),\n executionSource: nullableString(row.executionSource),\n serviceName: nullableString(row.serviceName),\n scope: (parseJson(row.scope) as Record<string, unknown> | null) ?? undefined,\n tags: normalizeTags(row.tags),\n metadata: (parseJson(row.metadata) as Record<string, unknown> | null) ?? undefined,\n };\n}\n\nexport function logRecordToRow(log: CreateLogRecord): Record<string, unknown> {\n return {\n logId: log.logId,\n timestamp: toISOString(log.timestamp),\n level: log.level,\n message: log.message,\n data: jsonEncode(log.data),\n traceId: log.traceId ?? null,\n spanId: log.spanId ?? null,\n experimentId: log.experimentId ?? null,\n entityType: log.entityType ?? null,\n entityId: log.entityId ?? null,\n entityName: log.entityName ?? null,\n entityVersionId: log.entityVersionId ?? null,\n parentEntityVersionId: log.parentEntityVersionId ?? null,\n parentEntityType: log.parentEntityType ?? null,\n parentEntityId: log.parentEntityId ?? null,\n parentEntityName: log.parentEntityName ?? null,\n rootEntityVersionId: log.rootEntityVersionId ?? null,\n rootEntityType: log.rootEntityType ?? null,\n rootEntityId: log.rootEntityId ?? null,\n rootEntityName: log.rootEntityName ?? null,\n userId: log.userId ?? null,\n organizationId: log.organizationId ?? null,\n resourceId: log.resourceId ?? null,\n runId: log.runId ?? null,\n sessionId: log.sessionId ?? null,\n threadId: log.threadId ?? null,\n requestId: log.requestId ?? null,\n environment: log.environment ?? null,\n executionSource: log.executionSource ?? log.source ?? null,\n serviceName: log.serviceName ?? null,\n tags: normalizeTags(log.tags),\n metadata: jsonEncode(log.metadata),\n scope: jsonEncode(log.scope),\n };\n}\n\nexport function rowToMetricRecord(row: Record<string, any>): MetricRecord {\n return {\n metricId: row.metricId,\n timestamp: toDate(row.timestamp),\n name: row.name,\n value: Number(row.value),\n traceId: nullableString(row.traceId),\n spanId: nullableString(row.spanId),\n experimentId: nullableString(row.experimentId),\n entityType: nullableEntityType(row.entityType),\n entityId: nullableString(row.entityId),\n entityName: nullableString(row.entityName),\n entityVersionId: nullableString(row.entityVersionId),\n parentEntityVersionId: nullableString(row.parentEntityVersionId),\n parentEntityType: nullableEntityType(row.parentEntityType),\n parentEntityId: nullableString(row.parentEntityId),\n parentEntityName: nullableString(row.parentEntityName),\n rootEntityVersionId: nullableString(row.rootEntityVersionId),\n rootEntityType: nullableEntityType(row.rootEntityType),\n rootEntityId: nullableString(row.rootEntityId),\n rootEntityName: nullableString(row.rootEntityName),\n userId: nullableString(row.userId),\n organizationId: nullableString(row.organizationId),\n resourceId: nullableString(row.resourceId),\n runId: nullableString(row.runId),\n sessionId: nullableString(row.sessionId),\n threadId: nullableString(row.threadId),\n requestId: nullableString(row.requestId),\n environment: nullableString(row.environment),\n executionSource: nullableString(row.executionSource),\n serviceName: nullableString(row.serviceName),\n scope: (parseJson(row.scope) as Record<string, unknown> | null) ?? undefined,\n provider: nullableString(row.provider),\n model: nullableString(row.model),\n estimatedCost: row.estimatedCost == null ? undefined : Number(row.estimatedCost),\n costUnit: nullableString(row.costUnit),\n costMetadata: (parseJson(row.costMetadata) as Record<string, unknown> | null) ?? undefined,\n tags: normalizeTags(row.tags),\n labels: normalizeLabels(row.labels as Record<string, unknown> | null | undefined),\n metadata: (parseJson(row.metadata) as Record<string, unknown> | null) ?? undefined,\n };\n}\n\nexport function metricRecordToRow(metric: CreateMetricRecord): Record<string, unknown> {\n return {\n metricId: metric.metricId,\n timestamp: toISOString(metric.timestamp),\n name: metric.name,\n value: metric.value,\n traceId: metric.traceId ?? null,\n spanId: metric.spanId ?? null,\n experimentId: metric.experimentId ?? null,\n entityType: metric.entityType ?? null,\n entityId: metric.entityId ?? null,\n entityName: metric.entityName ?? null,\n entityVersionId: metric.entityVersionId ?? null,\n parentEntityVersionId: metric.parentEntityVersionId ?? null,\n parentEntityType: metric.parentEntityType ?? null,\n parentEntityId: metric.parentEntityId ?? null,\n parentEntityName: metric.parentEntityName ?? null,\n rootEntityVersionId: metric.rootEntityVersionId ?? null,\n rootEntityType: metric.rootEntityType ?? null,\n rootEntityId: metric.rootEntityId ?? null,\n rootEntityName: metric.rootEntityName ?? null,\n userId: metric.userId ?? null,\n organizationId: metric.organizationId ?? null,\n resourceId: metric.resourceId ?? null,\n runId: metric.runId ?? null,\n sessionId: metric.sessionId ?? null,\n threadId: metric.threadId ?? null,\n requestId: metric.requestId ?? null,\n environment: metric.environment ?? null,\n executionSource: metric.executionSource ?? metric.source ?? null,\n serviceName: metric.serviceName ?? null,\n provider: metric.provider ?? null,\n model: metric.model ?? null,\n estimatedCost: metric.estimatedCost ?? null,\n costUnit: metric.costUnit ?? null,\n tags: normalizeTags(metric.tags),\n labels: normalizeLabels(metric.labels),\n costMetadata: jsonEncode(metric.costMetadata),\n metadata: jsonEncode(metric.metadata),\n scope: jsonEncode(metric.scope),\n };\n}\n\nexport function rowToScoreRecord(row: Record<string, any>): ScoreRecord {\n return {\n scoreId: row.scoreId,\n timestamp: toDate(row.timestamp),\n // Core score/feedback shapes still type traceId as required for now.\n traceId: nullableString(row.traceId) as ScoreRecord['traceId'],\n spanId: nullableString(row.spanId),\n experimentId: nullableString(row.experimentId),\n scoreTraceId: nullableString(row.scoreTraceId),\n entityType: nullableEntityType(row.entityType),\n entityId: nullableString(row.entityId),\n entityName: nullableString(row.entityName),\n entityVersionId: nullableString(row.entityVersionId),\n parentEntityVersionId: nullableString(row.parentEntityVersionId),\n parentEntityType: nullableEntityType(row.parentEntityType),\n parentEntityId: nullableString(row.parentEntityId),\n parentEntityName: nullableString(row.parentEntityName),\n rootEntityVersionId: nullableString(row.rootEntityVersionId),\n rootEntityType: nullableEntityType(row.rootEntityType),\n rootEntityId: nullableString(row.rootEntityId),\n rootEntityName: nullableString(row.rootEntityName),\n userId: nullableString(row.userId),\n organizationId: nullableString(row.organizationId),\n resourceId: nullableString(row.resourceId),\n runId: nullableString(row.runId),\n sessionId: nullableString(row.sessionId),\n threadId: nullableString(row.threadId),\n requestId: nullableString(row.requestId),\n environment: nullableString(row.environment),\n executionSource: nullableString(row.executionSource),\n serviceName: nullableString(row.serviceName),\n scorerId: row.scorerId,\n scorerVersion: nullableString(row.scorerVersion),\n scoreSource: nullableString(row.scoreSource),\n score: Number(row.score),\n reason: nullableString(row.reason),\n tags: normalizeTags(row.tags),\n metadata: (parseJson(row.metadata) as Record<string, unknown> | null) ?? undefined,\n scope: (parseJson(row.scope) as Record<string, unknown> | null) ?? undefined,\n };\n}\n\nexport function scoreRecordToRow(score: CreateScoreRecord): Record<string, unknown> {\n const metadata = score.metadata ?? null;\n const scoreSource = score.scoreSource ?? score.source ?? null;\n\n return {\n scoreId: score.scoreId,\n timestamp: toISOString(score.timestamp),\n traceId: score.traceId ?? null,\n spanId: score.spanId ?? null,\n experimentId: score.experimentId ?? null,\n scoreTraceId: score.scoreTraceId ?? null,\n entityType: score.entityType ?? null,\n entityId: score.entityId ?? null,\n entityName: score.entityName ?? null,\n entityVersionId: score.entityVersionId ?? null,\n parentEntityVersionId: score.parentEntityVersionId ?? null,\n parentEntityType: score.parentEntityType ?? null,\n parentEntityId: score.parentEntityId ?? null,\n parentEntityName: score.parentEntityName ?? null,\n rootEntityVersionId: score.rootEntityVersionId ?? null,\n rootEntityType: score.rootEntityType ?? null,\n rootEntityId: score.rootEntityId ?? null,\n rootEntityName: score.rootEntityName ?? null,\n userId: score.userId ?? null,\n organizationId: score.organizationId ?? null,\n resourceId: score.resourceId ?? null,\n runId: score.runId ?? null,\n sessionId: score.sessionId ?? null,\n threadId: score.threadId ?? null,\n requestId: score.requestId ?? null,\n environment: score.environment ?? null,\n executionSource: score.executionSource ?? null,\n serviceName: score.serviceName ?? null,\n scorerId: score.scorerId,\n scorerVersion: score.scorerVersion ?? null,\n scoreSource,\n score: score.score,\n reason: score.reason ?? null,\n tags: normalizeTags(score.tags),\n metadata: jsonEncode(metadata),\n scope: jsonEncode(score.scope),\n };\n}\n\nexport function rowToFeedbackRecord(row: Record<string, any>): FeedbackRecord {\n const hasNumber = row.valueNumber != null;\n const feedbackSource = nullableString(row.feedbackSource);\n const feedbackUserId = nullableString(row.feedbackUserId) ?? nullableString(row.userId);\n return {\n feedbackId: row.feedbackId,\n timestamp: toDate(row.timestamp),\n // Core score/feedback shapes still type traceId as required for now.\n traceId: nullableString(row.traceId) as FeedbackRecord['traceId'],\n spanId: nullableString(row.spanId),\n experimentId: nullableString(row.experimentId),\n entityType: nullableEntityType(row.entityType),\n entityId: nullableString(row.entityId),\n entityName: nullableString(row.entityName),\n entityVersionId: nullableString(row.entityVersionId),\n parentEntityVersionId: nullableString(row.parentEntityVersionId),\n parentEntityType: nullableEntityType(row.parentEntityType),\n parentEntityId: nullableString(row.parentEntityId),\n parentEntityName: nullableString(row.parentEntityName),\n rootEntityVersionId: nullableString(row.rootEntityVersionId),\n rootEntityType: nullableEntityType(row.rootEntityType),\n rootEntityId: nullableString(row.rootEntityId),\n rootEntityName: nullableString(row.rootEntityName),\n userId: nullableString(row.userId),\n organizationId: nullableString(row.organizationId),\n resourceId: nullableString(row.resourceId),\n runId: nullableString(row.runId),\n sessionId: nullableString(row.sessionId),\n threadId: nullableString(row.threadId),\n requestId: nullableString(row.requestId),\n environment: nullableString(row.environment),\n executionSource: nullableString(row.executionSource),\n serviceName: nullableString(row.serviceName),\n feedbackUserId,\n sourceId: nullableString(row.sourceId),\n feedbackSource,\n feedbackType: row.feedbackType,\n value: hasNumber ? Number(row.valueNumber) : (nullableString(row.valueString) ?? ''),\n comment: nullableString(row.comment),\n tags: normalizeTags(row.tags),\n metadata: (parseJson(row.metadata) as Record<string, unknown> | null) ?? undefined,\n scope: (parseJson(row.scope) as Record<string, unknown> | null) ?? undefined,\n };\n}\n\nexport function feedbackRecordToRow(feedback: CreateFeedbackRecord): Record<string, unknown> {\n const metadata = feedback.metadata ?? null;\n const feedbackSource = feedback.feedbackSource ?? feedback.source ?? '';\n const feedbackUserId = feedback.feedbackUserId ?? feedback.userId ?? null;\n\n return {\n feedbackId: feedback.feedbackId,\n timestamp: toISOString(feedback.timestamp),\n traceId: feedback.traceId ?? null,\n spanId: feedback.spanId ?? null,\n experimentId: feedback.experimentId ?? null,\n entityType: feedback.entityType ?? null,\n entityId: feedback.entityId ?? null,\n entityName: feedback.entityName ?? null,\n entityVersionId: feedback.entityVersionId ?? null,\n parentEntityVersionId: feedback.parentEntityVersionId ?? null,\n parentEntityType: feedback.parentEntityType ?? null,\n parentEntityId: feedback.parentEntityId ?? null,\n parentEntityName: feedback.parentEntityName ?? null,\n rootEntityVersionId: feedback.rootEntityVersionId ?? null,\n rootEntityType: feedback.rootEntityType ?? null,\n rootEntityId: feedback.rootEntityId ?? null,\n rootEntityName: feedback.rootEntityName ?? null,\n userId: feedbackUserId,\n organizationId: feedback.organizationId ?? null,\n resourceId: feedback.resourceId ?? null,\n runId: feedback.runId ?? null,\n sessionId: feedback.sessionId ?? null,\n threadId: feedback.threadId ?? null,\n requestId: feedback.requestId ?? null,\n environment: feedback.environment ?? null,\n executionSource: feedback.executionSource ?? null,\n serviceName: feedback.serviceName ?? null,\n feedbackUserId,\n sourceId: feedback.sourceId ?? null,\n feedbackSource,\n feedbackType: feedback.feedbackType,\n valueString: typeof feedback.value === 'string' ? feedback.value : null,\n valueNumber: typeof feedback.value === 'number' ? feedback.value : null,\n comment: feedback.comment ?? null,\n tags: normalizeTags(feedback.tags),\n metadata: jsonEncode(metadata),\n scope: jsonEncode(feedback.scope),\n };\n}\n","/**\n * General discovery methods for ClickHouse v-next observability.\n *\n * Reads from discovery_values and discovery_pairs helper tables,\n * which are populated by refreshable materialized views.\n *\n * Per design: discovery methods return empty results until the\n * helper tables have been initialized and refreshed successfully.\n * They do NOT fall back to base-table scans.\n */\n\nimport type { ClickHouseClient } from '@clickhouse/client';\nimport { EntityType } from '@mastra/core/storage';\nimport type {\n GetEntityTypesArgs,\n GetEntityTypesResponse,\n GetEntityNamesArgs,\n GetEntityNamesResponse,\n GetServiceNamesArgs,\n GetServiceNamesResponse,\n GetEnvironmentsArgs,\n GetEnvironmentsResponse,\n GetTagsArgs,\n GetTagsResponse,\n} from '@mastra/core/storage';\n\nimport { TABLE_DISCOVERY_VALUES, TABLE_DISCOVERY_PAIRS } from './ddl';\nimport { CH_SETTINGS } from './helpers';\n\nasync function queryJson<T>(\n client: ClickHouseClient,\n query: string,\n params: Record<string, unknown> = {},\n): Promise<T[]> {\n return (await (\n await client.query({\n query,\n query_params: params,\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n })\n ).json()) as T[];\n}\n\n// -- Entity discovery ---------------------------------------------------------\n\nexport async function getEntityTypes(\n client: ClickHouseClient,\n _args: GetEntityTypesArgs,\n): Promise<GetEntityTypesResponse> {\n const rows = await queryJson<{ value: string }>(\n client,\n `SELECT value FROM ${TABLE_DISCOVERY_VALUES} WHERE kind = 'entityType' ORDER BY value`,\n );\n\n const validTypes = new Set(Object.values(EntityType));\n const entityTypes: EntityType[] = [];\n for (const row of rows) {\n if (validTypes.has(row.value as EntityType)) {\n entityTypes.push(row.value as EntityType);\n }\n }\n return { entityTypes };\n}\n\nexport async function getEntityNames(\n client: ClickHouseClient,\n args: GetEntityNamesArgs,\n): Promise<GetEntityNamesResponse> {\n const conditions = [`kind = 'entityTypeName'`];\n const params: Record<string, unknown> = {};\n\n if (args.entityType) {\n conditions.push('key1 = {entityType:String}');\n params.entityType = args.entityType;\n }\n\n const rows = await queryJson<{ value: string }>(\n client,\n `SELECT value FROM ${TABLE_DISCOVERY_PAIRS} WHERE ${conditions.join(' AND ')} ORDER BY value`,\n params,\n );\n return { names: rows.map(r => r.value) };\n}\n\n// -- Service & environment discovery ------------------------------------------\n\nexport async function getServiceNames(\n client: ClickHouseClient,\n _args: GetServiceNamesArgs,\n): Promise<GetServiceNamesResponse> {\n const rows = await queryJson<{ value: string }>(\n client,\n `SELECT value FROM ${TABLE_DISCOVERY_VALUES} WHERE kind = 'serviceName' ORDER BY value`,\n );\n return { serviceNames: rows.map(r => r.value) };\n}\n\nexport async function getEnvironments(\n client: ClickHouseClient,\n _args: GetEnvironmentsArgs,\n): Promise<GetEnvironmentsResponse> {\n const rows = await queryJson<{ value: string }>(\n client,\n `SELECT value FROM ${TABLE_DISCOVERY_VALUES} WHERE kind = 'environment' ORDER BY value`,\n );\n return { environments: rows.map(r => r.value) };\n}\n\n// -- Tag discovery ------------------------------------------------------------\n\nexport async function getTags(client: ClickHouseClient, args: GetTagsArgs): Promise<GetTagsResponse> {\n const conditions = [`kind = 'tag'`];\n const params: Record<string, unknown> = {};\n\n if (args.entityType) {\n conditions.push('key1 = {entityType:String}');\n params.entityType = args.entityType;\n }\n\n const rows = await queryJson<{ value: string }>(\n client,\n `SELECT value FROM ${TABLE_DISCOVERY_VALUES} WHERE ${conditions.join(' AND ')} ORDER BY value`,\n params,\n );\n return { tags: rows.map(r => r.value) };\n}\n","/**\n * ClickHouse v-next filter builders.\n *\n * Produces { conditions: string[], params: Record<string, unknown> } tuples\n * that get AND-joined into WHERE clauses with parameterized values.\n */\n\nimport { TraceStatus } from '@mastra/core/storage';\nimport type {\n ListTracesArgs,\n ListLogsArgs,\n ListMetricsArgs,\n ListScoresArgs,\n ListFeedbackArgs,\n tracesFilterSchema,\n logsFilterSchema,\n metricsFilterSchema,\n scoresFilterSchema,\n feedbackFilterSchema,\n} from '@mastra/core/storage';\nimport type { z } from 'zod/v4';\n\ntype TracesFilter = z.infer<typeof tracesFilterSchema>;\ntype LogsFilter = z.infer<typeof logsFilterSchema>;\ntype MetricsFilter = z.infer<typeof metricsFilterSchema>;\ntype ScoresFilter = z.infer<typeof scoresFilterSchema>;\ntype FeedbackFilter = z.infer<typeof feedbackFilterSchema>;\ntype TracesOrderBy = ListTracesArgs['orderBy'];\ntype LogsOrderBy = ListLogsArgs['orderBy'];\ntype MetricsOrderBy = ListMetricsArgs['orderBy'];\ntype ScoresOrderBy = ListScoresArgs['orderBy'];\ntype FeedbackOrderBy = ListFeedbackArgs['orderBy'];\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface FilterResult {\n conditions: string[];\n params: Record<string, unknown>;\n}\n\ninterface DateRange {\n start?: Date;\n end?: Date;\n startExclusive?: boolean;\n endExclusive?: boolean;\n}\n\nfunction assertNoDeprecatedSourceFilter(\n source: string | undefined,\n replacement: string,\n signalName: 'logs' | 'metrics' | 'scores' | 'feedback',\n): void {\n if (source === undefined) return;\n throw new Error(`Deprecated \\`source\\` filter is not supported for ${signalName}; use \\`${replacement}\\` instead.`);\n}\n\n// ---------------------------------------------------------------------------\n// Date range helper\n// ---------------------------------------------------------------------------\n\nfunction addDateRange(column: string, range: DateRange | undefined, prefix: string, out: FilterResult): void {\n if (!range) return;\n if (range.start) {\n const op = range.startExclusive ? '>' : '>=';\n const param = `${prefix}Start`;\n out.conditions.push(`${column} ${op} {${param}:DateTime64(3)}`);\n out.params[param] = range.start.getTime();\n }\n if (range.end) {\n const op = range.endExclusive ? '<' : '<=';\n const param = `${prefix}End`;\n out.conditions.push(`${column} ${op} {${param}:DateTime64(3)}`);\n out.params[param] = range.end.getTime();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Simple equality helper\n// ---------------------------------------------------------------------------\n\nfunction addEq(column: string, value: unknown, paramName: string, paramType: string, out: FilterResult): void {\n if (value == null) return;\n out.conditions.push(`${column} = {${paramName}:${paramType}}`);\n out.params[paramName] = value;\n}\n\nfunction addIn(column: string, values: string[] | undefined, paramName: string, out: FilterResult): void {\n if (!values?.length) return;\n out.conditions.push(`${column} IN {${paramName}:Array(String)}`);\n out.params[paramName] = values;\n}\n\nfunction addTags(column: string, tags: unknown, out: FilterResult): void {\n if (!Array.isArray(tags) || tags.length === 0) return;\n for (let i = 0; i < tags.length; i++) {\n const tag = tags[i];\n if (typeof tag !== 'string' || tag.trim() === '') continue;\n const param = `tag_${i}`;\n out.conditions.push(`has(${column}, {${param}:String})`);\n out.params[param] = tag;\n }\n}\n\nfunction addStringMapFilters(\n column: string,\n values: Record<string, unknown> | null | undefined,\n keyPrefix: string,\n valuePrefix: string,\n out: FilterResult,\n): void {\n if (values == null || typeof values !== 'object') return;\n let i = 0;\n for (const [key, value] of Object.entries(values)) {\n if (typeof value !== 'string') continue;\n const keyParam = `${keyPrefix}_${i}`;\n const valParam = `${valuePrefix}_${i}`;\n out.conditions.push(`${column}[{${keyParam}:String}] = {${valParam}:String}`);\n out.params[keyParam] = key;\n out.params[valParam] = value;\n i++;\n }\n}\n\n/**\n * Adds shared context filter conditions (commonFilterFields) to the output.\n * Used by logs, metrics, scores, and feedback filter builders.\n */\nfunction addCommonFilterFields(\n filters: {\n timestamp?: unknown;\n traceId?: string;\n spanId?: string;\n entityType?: string;\n entityName?: string;\n entityVersionId?: string;\n parentEntityVersionId?: string;\n parentEntityType?: string;\n parentEntityName?: string;\n rootEntityVersionId?: string;\n rootEntityType?: string;\n rootEntityName?: string;\n userId?: string;\n organizationId?: string;\n experimentId?: string;\n resourceId?: string;\n runId?: string;\n sessionId?: string;\n threadId?: string;\n requestId?: string;\n serviceName?: string;\n environment?: string;\n executionSource?: string;\n tags?: string[];\n },\n tableAlias: string | undefined,\n out: FilterResult,\n): void {\n const col = (name: string) => (tableAlias ? `${tableAlias}.${name}` : name);\n\n addDateRange(col('timestamp'), filters.timestamp as DateRange | undefined, 'timestamp', out);\n addEq(col('traceId'), filters.traceId, 'traceId', 'String', out);\n addEq(col('spanId'), filters.spanId, 'spanId', 'String', out);\n addEq(col('entityType'), filters.entityType, 'entityType', 'String', out);\n addEq(col('entityName'), filters.entityName, 'entityName', 'String', out);\n addEq(col('entityVersionId'), filters.entityVersionId, 'entityVersionId', 'String', out);\n addEq(col('parentEntityVersionId'), filters.parentEntityVersionId, 'parentEntityVersionId', 'String', out);\n addEq(col('parentEntityType'), filters.parentEntityType, 'parentEntityType', 'String', out);\n addEq(col('parentEntityName'), filters.parentEntityName, 'parentEntityName', 'String', out);\n addEq(col('rootEntityVersionId'), filters.rootEntityVersionId, 'rootEntityVersionId', 'String', out);\n addEq(col('rootEntityType'), filters.rootEntityType, 'rootEntityType', 'String', out);\n addEq(col('rootEntityName'), filters.rootEntityName, 'rootEntityName', 'String', out);\n addEq(col('userId'), filters.userId, 'userId', 'String', out);\n addEq(col('organizationId'), filters.organizationId, 'organizationId', 'String', out);\n addEq(col('experimentId'), filters.experimentId, 'experimentId', 'String', out);\n addEq(col('resourceId'), filters.resourceId, 'resourceId', 'String', out);\n addEq(col('runId'), filters.runId, 'runId', 'String', out);\n addEq(col('sessionId'), filters.sessionId, 'sessionId', 'String', out);\n addEq(col('threadId'), filters.threadId, 'threadId', 'String', out);\n addEq(col('requestId'), filters.requestId, 'requestId', 'String', out);\n addEq(col('serviceName'), filters.serviceName, 'serviceName', 'String', out);\n addEq(col('environment'), filters.environment, 'environment', 'String', out);\n addEq(col('executionSource'), filters.executionSource, 'executionSource', 'String', out);\n addTags(col('tags'), filters.tags, out);\n}\n\n// ---------------------------------------------------------------------------\n// Trace filter builder (for trace_roots table)\n// ---------------------------------------------------------------------------\n\nexport function buildTraceFilterConditions(filters: TracesFilter | undefined, tableAlias?: string): FilterResult {\n const out: FilterResult = { conditions: [], params: {} };\n if (!filters) return out;\n\n const col = (name: string) => (tableAlias ? `${tableAlias}.${name}` : name);\n\n addDateRange(col('startedAt'), filters.startedAt as DateRange | undefined, 'startedAt', out);\n addDateRange(col('endedAt'), filters.endedAt as DateRange | undefined, 'endedAt', out);\n addEq(col('spanType'), filters.spanType, 'spanType', 'String', out);\n addEq(col('entityType'), filters.entityType, 'entityType', 'String', out);\n addEq(col('entityId'), filters.entityId, 'entityId', 'String', out);\n addEq(col('entityName'), filters.entityName, 'entityName', 'String', out);\n addEq(col('entityVersionId'), filters.entityVersionId, 'entityVersionId', 'String', out);\n addEq(col('parentEntityVersionId'), filters.parentEntityVersionId, 'parentEntityVersionId', 'String', out);\n addEq(col('parentEntityType'), filters.parentEntityType, 'parentEntityType', 'String', out);\n addEq(col('parentEntityId'), filters.parentEntityId, 'parentEntityId', 'String', out);\n addEq(col('parentEntityName'), filters.parentEntityName, 'parentEntityName', 'String', out);\n addEq(col('rootEntityVersionId'), filters.rootEntityVersionId, 'rootEntityVersionId', 'String', out);\n addEq(col('rootEntityType'), filters.rootEntityType, 'rootEntityType', 'String', out);\n addEq(col('rootEntityId'), filters.rootEntityId, 'rootEntityId', 'String', out);\n addEq(col('rootEntityName'), filters.rootEntityName, 'rootEntityName', 'String', out);\n addEq(col('experimentId'), filters.experimentId, 'experimentId', 'String', out);\n addEq(col('userId'), filters.userId, 'userId', 'String', out);\n addEq(col('organizationId'), filters.organizationId, 'organizationId', 'String', out);\n addEq(col('resourceId'), filters.resourceId, 'resourceId', 'String', out);\n addEq(col('runId'), filters.runId, 'runId', 'String', out);\n addEq(col('sessionId'), filters.sessionId, 'sessionId', 'String', out);\n addEq(col('threadId'), filters.threadId, 'threadId', 'String', out);\n addEq(col('requestId'), filters.requestId, 'requestId', 'String', out);\n addEq(col('environment'), filters.environment, 'environment', 'String', out);\n // Trace filters still accept `source`, but it maps to the `executionSource` DB column.\n addEq(col('executionSource'), filters.source, 'source', 'String', out);\n addEq(col('serviceName'), filters.serviceName, 'serviceName', 'String', out);\n\n addTags(col('tags'), filters.tags, out);\n addStringMapFilters(col('metadataSearch'), filters.metadata, 'meta_k', 'meta_v', out);\n\n if (filters.status === TraceStatus.ERROR) {\n out.conditions.push(`${col('error')} IS NOT NULL`);\n } else if (filters.status === TraceStatus.SUCCESS) {\n out.conditions.push(`${col('error')} IS NULL`);\n } else if (filters.status === TraceStatus.RUNNING) {\n out.conditions.push('1 = 0');\n }\n\n return out;\n}\n\nexport function buildLogsFilterConditions(filters: LogsFilter | undefined, tableAlias?: string): FilterResult {\n const out: FilterResult = { conditions: [], params: {} };\n if (!filters) return out;\n\n const col = (name: string) => (tableAlias ? `${tableAlias}.${name}` : name);\n assertNoDeprecatedSourceFilter(filters.source, 'executionSource', 'logs');\n addCommonFilterFields(filters, tableAlias, out);\n\n if (typeof filters.level === 'string') {\n addEq(col('level'), filters.level, 'level', 'String', out);\n } else if (Array.isArray(filters.level)) {\n addIn(col('level'), filters.level, 'levels', out);\n }\n\n return out;\n}\n\nexport function buildMetricsFilterConditions(filters: MetricsFilter | undefined, tableAlias?: string): FilterResult {\n const out: FilterResult = { conditions: [], params: {} };\n if (!filters) return out;\n\n const col = (name: string) => (tableAlias ? `${tableAlias}.${name}` : name);\n assertNoDeprecatedSourceFilter(filters.source, 'executionSource', 'metrics');\n addCommonFilterFields(filters, tableAlias, out);\n addIn(col('name'), filters.name, 'metricNames', out);\n addEq(col('provider'), filters.provider, 'provider', 'String', out);\n addEq(col('model'), filters.model, 'model', 'String', out);\n addEq(col('costUnit'), filters.costUnit, 'costUnit', 'String', out);\n addStringMapFilters(col('labels'), filters.labels, 'label_k', 'label_v', out);\n\n return out;\n}\n\nexport function buildScoresFilterConditions(filters: ScoresFilter | undefined, tableAlias?: string): FilterResult {\n const out: FilterResult = { conditions: [], params: {} };\n if (!filters) return out;\n assertNoDeprecatedSourceFilter(filters.source, 'scoreSource or executionSource', 'scores');\n\n const col = (name: string) => (tableAlias ? `${tableAlias}.${name}` : name);\n\n // Shared context filters (scores have dedicated executionSource column)\n addCommonFilterFields(filters, tableAlias, out);\n\n // Score-specific filters\n addEq(col('scoreSource'), filters.scoreSource, 'scoreSource', 'String', out);\n\n if (typeof filters.scorerId === 'string') {\n addEq(col('scorerId'), filters.scorerId, 'scorerId', 'String', out);\n } else if (Array.isArray(filters.scorerId)) {\n addIn(col('scorerId'), filters.scorerId, 'scorerIds', out);\n }\n\n return out;\n}\n\nexport function buildFeedbackFilterConditions(filters: FeedbackFilter | undefined, tableAlias?: string): FilterResult {\n const out: FilterResult = { conditions: [], params: {} };\n if (!filters) return out;\n assertNoDeprecatedSourceFilter(filters.source, 'feedbackSource or executionSource', 'feedback');\n\n const col = (name: string) => (tableAlias ? `${tableAlias}.${name}` : name);\n\n // Shared context filters (feedback has dedicated executionSource column)\n addCommonFilterFields(filters, tableAlias, out);\n\n // Feedback-specific filters\n const fbActor = filters.feedbackUserId ?? filters.userId;\n // feedbackUserId filter targets the dedicated feedbackUserId column\n addEq(col('feedbackUserId'), fbActor, 'feedbackUserId', 'String', out);\n\n addEq(col('feedbackSource'), filters.feedbackSource, 'feedbackSource', 'String', out);\n\n if (typeof filters.feedbackType === 'string') {\n addEq(col('feedbackType'), filters.feedbackType, 'feedbackType', 'String', out);\n } else if (Array.isArray(filters.feedbackType)) {\n addIn(col('feedbackType'), filters.feedbackType, 'feedbackTypes', out);\n }\n\n return out;\n}\n\nexport function buildTraceOrderByClause(orderBy: TracesOrderBy, tableAlias?: string): string {\n return buildOrderByClause(['startedAt', 'endedAt'] as const, orderBy, tableAlias, 'startedAt');\n}\n\nfunction buildOrderByClause<TField extends string>(\n allowedFields: readonly TField[],\n orderBy: { field?: TField; direction?: 'ASC' | 'DESC' } | undefined,\n tableAlias: string | undefined,\n defaultField: TField,\n): string {\n const field = orderBy?.field && allowedFields.includes(orderBy.field) ? orderBy.field : defaultField;\n const direction = orderBy?.direction === 'ASC' ? 'ASC' : 'DESC';\n const col = tableAlias ? `${tableAlias}.${field}` : field;\n return `${col} ${direction}`;\n}\n\nexport function buildSignalOrderByClause<TField extends string>(\n allowedFields: readonly TField[],\n orderBy:\n | LogsOrderBy\n | MetricsOrderBy\n | ScoresOrderBy\n | FeedbackOrderBy\n | { field?: TField; direction?: 'ASC' | 'DESC' }\n | undefined,\n tableAlias?: string,\n defaultField = 'timestamp' as TField,\n): string {\n return buildOrderByClause(\n allowedFields,\n orderBy as { field?: TField; direction?: 'ASC' | 'DESC' } | undefined,\n tableAlias,\n defaultField,\n );\n}\n\nexport function buildPaginationClause(pagination: { page?: number; perPage?: number } | undefined): {\n page: number;\n perPage: number;\n limit: number;\n offset: number;\n} {\n const page = Math.max(0, Number(pagination?.page ?? 0));\n const perPage = Math.max(1, Number(pagination?.perPage ?? 10));\n return {\n page,\n perPage,\n limit: perPage,\n offset: page * perPage,\n };\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { listFeedbackArgsSchema } from '@mastra/core/storage';\nimport type {\n AggregationInterval,\n AggregationType,\n BatchCreateFeedbackArgs,\n CreateFeedbackArgs,\n ListFeedbackArgs,\n ListFeedbackResponse,\n GetFeedbackAggregateArgs,\n GetFeedbackAggregateResponse,\n GetFeedbackBreakdownArgs,\n GetFeedbackBreakdownResponse,\n GetFeedbackTimeSeriesArgs,\n GetFeedbackTimeSeriesResponse,\n GetFeedbackPercentilesArgs,\n GetFeedbackPercentilesResponse,\n} from '@mastra/core/storage';\nimport { parseFieldKey } from '@mastra/core/utils';\n\nimport { TABLE_FEEDBACK_EVENTS } from './ddl';\nimport { buildFeedbackFilterConditions, buildPaginationClause, buildSignalOrderByClause } from './filters';\nimport type { FilterResult } from './filters';\nimport { CH_INSERT_SETTINGS, CH_SETTINGS, feedbackRecordToRow, rowToFeedbackRecord } from './helpers';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst FEEDBACK_TYPED_COLUMNS = new Set([\n 'timestamp',\n 'traceId',\n 'spanId',\n 'experimentId',\n 'entityType',\n 'entityId',\n 'entityName',\n 'entityVersionId',\n 'parentEntityVersionId',\n 'parentEntityType',\n 'parentEntityId',\n 'parentEntityName',\n 'rootEntityVersionId',\n 'rootEntityType',\n 'rootEntityId',\n 'rootEntityName',\n 'userId',\n 'organizationId',\n 'resourceId',\n 'runId',\n 'sessionId',\n 'threadId',\n 'requestId',\n 'environment',\n 'executionSource',\n 'serviceName',\n 'feedbackUserId',\n 'sourceId',\n 'feedbackSource',\n 'feedbackType',\n 'valueNumber',\n 'comment',\n]);\n\nconst GROUP_BY_EXCLUDED = new Set(['metadata', 'scope', 'tags']);\n\nfunction getAggregationSql(aggregation: AggregationType, measure = 'valueNumber'): string {\n switch (aggregation) {\n case 'sum':\n return `sum(${measure})`;\n case 'avg':\n return `avg(${measure})`;\n case 'min':\n return `min(${measure})`;\n case 'max':\n return `max(${measure})`;\n case 'count':\n return `toFloat64(count(${measure}))`;\n case 'last':\n return `argMax(${measure}, timestamp)`;\n default:\n return `sum(${measure})`;\n }\n}\n\nfunction getIntervalSql(interval: AggregationInterval): string {\n switch (interval) {\n case '1m':\n return 'INTERVAL 1 MINUTE';\n case '5m':\n return 'INTERVAL 5 MINUTE';\n case '15m':\n return 'INTERVAL 15 MINUTE';\n case '1h':\n return 'INTERVAL 1 HOUR';\n case '1d':\n return 'INTERVAL 1 DAY';\n default:\n return 'INTERVAL 1 HOUR';\n }\n}\n\nfunction mergeFilters(...parts: FilterResult[]): FilterResult {\n const conditions: string[] = [];\n const params: Record<string, unknown> = {};\n for (const part of parts) {\n conditions.push(...part.conditions);\n Object.assign(params, part.params);\n }\n return { conditions, params };\n}\n\nfunction toWhereClause(filter: FilterResult): string {\n return filter.conditions.length ? `WHERE ${filter.conditions.join(' AND ')}` : '';\n}\n\nfunction buildFeedbackIdentityFilter(\n args: Pick<GetFeedbackAggregateArgs, 'feedbackType' | 'feedbackSource'>,\n): FilterResult {\n const conditions: string[] = ['feedbackType = {olapFeedbackType:String}'];\n const params: Record<string, unknown> = { olapFeedbackType: args.feedbackType };\n\n if (args.feedbackSource !== undefined) {\n conditions.push('feedbackSource = {olapFeedbackSource:String}');\n params.olapFeedbackSource = args.feedbackSource;\n }\n\n // Only aggregate rows with numeric values\n conditions.push('valueNumber IS NOT NULL');\n\n return { conditions, params };\n}\n\nfunction resolveFeedbackGroupBy(groupBy: string[]): { key: string; selectSql: string; groupSql: string }[] {\n return groupBy.map((key, index) => {\n const column = parseFieldKey(key);\n if (!FEEDBACK_TYPED_COLUMNS.has(column) || GROUP_BY_EXCLUDED.has(column)) {\n throw new Error(`Invalid groupBy column(s): ${key}`);\n }\n const alias = `group_by_${index}`;\n return { key, selectSql: `${column} AS ${alias}`, groupSql: alias };\n });\n}\n\nfunction toSeriesName(values: unknown[]): string {\n return values.map(v => (v == null ? '' : String(v))).join('|');\n}\n\nasync function queryJson<T>(client: ClickHouseClient, query: string, params: Record<string, unknown>): Promise<T[]> {\n return (await (\n await client.query({\n query,\n query_params: params,\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n })\n ).json()) as T[];\n}\n\n// ============================================================================\n// Write\n// ============================================================================\n\nexport async function createFeedback(client: ClickHouseClient, args: CreateFeedbackArgs): Promise<void> {\n await batchCreateFeedback(client, { feedbacks: [args.feedback] });\n}\n\nexport async function batchCreateFeedback(client: ClickHouseClient, args: BatchCreateFeedbackArgs): Promise<void> {\n if (args.feedbacks.length === 0) return;\n\n await client.insert({\n table: TABLE_FEEDBACK_EVENTS,\n values: args.feedbacks.map(feedbackRecordToRow),\n format: 'JSONEachRow',\n clickhouse_settings: CH_INSERT_SETTINGS,\n });\n}\n\n// ============================================================================\n// List\n// ============================================================================\n\nexport async function listFeedback(client: ClickHouseClient, args: ListFeedbackArgs): Promise<ListFeedbackResponse> {\n const parsed = listFeedbackArgsSchema.parse(args);\n const filter = buildFeedbackFilterConditions(parsed.filters, 'f');\n const pagination = buildPaginationClause(parsed.pagination);\n const orderBy = buildSignalOrderByClause(['timestamp'], parsed.orderBy, 'f');\n const whereClause = filter.conditions.length ? `WHERE ${filter.conditions.join(' AND ')}` : '';\n\n const countResult = await queryJson<{ total?: number }>(\n client,\n `SELECT count() AS total FROM ${TABLE_FEEDBACK_EVENTS} AS f ${whereClause}`,\n filter.params,\n );\n\n const rows = await queryJson<Record<string, any>>(\n client,\n `SELECT * FROM ${TABLE_FEEDBACK_EVENTS} AS f ${whereClause} ORDER BY ${orderBy} LIMIT {limit:UInt32} OFFSET {offset:UInt32}`,\n { ...filter.params, limit: pagination.limit, offset: pagination.offset },\n );\n\n const total = Number(countResult[0]?.total ?? 0);\n\n return {\n pagination: {\n total,\n page: pagination.page,\n perPage: pagination.perPage,\n hasMore: (pagination.page + 1) * pagination.perPage < total,\n },\n feedback: rows.map(rowToFeedbackRecord),\n };\n}\n\n// ============================================================================\n// OLAP Queries\n// ============================================================================\n\nexport async function getFeedbackAggregate(\n client: ClickHouseClient,\n args: GetFeedbackAggregateArgs,\n): Promise<GetFeedbackAggregateResponse> {\n const aggSql = getAggregationSql(args.aggregation);\n const identity = buildFeedbackIdentityFilter(args);\n const signalFilter = buildFeedbackFilterConditions(args.filters);\n const combined = mergeFilters(identity, signalFilter);\n const whereClause = toWhereClause(combined);\n\n const sql = `SELECT ${aggSql} AS value FROM ${TABLE_FEEDBACK_EVENTS} ${whereClause}`;\n const result = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n const value = result[0]?.value == null ? null : Number(result[0]?.value);\n\n if (args.comparePeriod && args.filters?.timestamp) {\n const ts = args.filters.timestamp;\n if (ts.start && ts.end) {\n const duration = ts.end.getTime() - ts.start.getTime();\n let prevStart: Date;\n let prevEnd: Date;\n\n switch (args.comparePeriod) {\n case 'previous_period':\n prevStart = new Date(ts.start.getTime() - duration);\n prevEnd = new Date(ts.end.getTime() - duration);\n break;\n case 'previous_day':\n prevStart = new Date(ts.start.getTime() - 86400000);\n prevEnd = new Date(ts.end.getTime() - 86400000);\n break;\n case 'previous_week':\n prevStart = new Date(ts.start.getTime() - 604800000);\n prevEnd = new Date(ts.end.getTime() - 604800000);\n break;\n default:\n prevStart = new Date(ts.start.getTime() - duration);\n prevEnd = new Date(ts.end.getTime() - duration);\n }\n\n const prevFilters = {\n ...(args.filters ?? {}),\n timestamp: { start: prevStart, end: prevEnd, startExclusive: ts.startExclusive, endExclusive: ts.endExclusive },\n };\n const prevSignalFilter = buildFeedbackFilterConditions(prevFilters);\n const prevCombined = mergeFilters(identity, prevSignalFilter);\n const prevWhereClause = toWhereClause(prevCombined);\n\n const prevResult = await queryJson<Record<string, unknown>>(\n client,\n `SELECT ${aggSql} AS value FROM ${TABLE_FEEDBACK_EVENTS} ${prevWhereClause}`,\n prevCombined.params,\n );\n const previousValue = prevResult[0]?.value == null ? null : Number(prevResult[0]?.value);\n\n let changePercent: number | null = null;\n if (previousValue !== null && previousValue !== 0 && value !== null) {\n changePercent = ((value - previousValue) / Math.abs(previousValue)) * 100;\n }\n\n return { value, previousValue, changePercent };\n }\n }\n\n return { value };\n}\n\nexport async function getFeedbackBreakdown(\n client: ClickHouseClient,\n args: GetFeedbackBreakdownArgs,\n): Promise<GetFeedbackBreakdownResponse> {\n const aggSql = getAggregationSql(args.aggregation);\n const identity = buildFeedbackIdentityFilter(args);\n const signalFilter = buildFeedbackFilterConditions(args.filters);\n const combined = mergeFilters(identity, signalFilter);\n const whereClause = toWhereClause(combined);\n const resolved = resolveFeedbackGroupBy(args.groupBy);\n\n const sql = `SELECT ${resolved.map(e => e.selectSql).join(', ')}, ${aggSql} AS value FROM ${TABLE_FEEDBACK_EVENTS} ${whereClause} GROUP BY ${resolved.map(e => e.groupSql).join(', ')} ORDER BY value DESC`;\n const rows = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n\n return {\n groups: rows.map(row => ({\n dimensions: Object.fromEntries(\n resolved.map((entry, index) => {\n const v = row[`group_by_${index}`];\n return [entry.key, v == null ? null : String(v)];\n }),\n ),\n value: Number(row.value ?? 0),\n })),\n };\n}\n\nexport async function getFeedbackTimeSeries(\n client: ClickHouseClient,\n args: GetFeedbackTimeSeriesArgs,\n): Promise<GetFeedbackTimeSeriesResponse> {\n const aggSql = getAggregationSql(args.aggregation);\n const intervalSql = getIntervalSql(args.interval);\n const identity = buildFeedbackIdentityFilter(args);\n const signalFilter = buildFeedbackFilterConditions(args.filters);\n const combined = mergeFilters(identity, signalFilter);\n const whereClause = toWhereClause(combined);\n\n if (args.groupBy && args.groupBy.length > 0) {\n const resolved = resolveFeedbackGroupBy(args.groupBy);\n const sql = `\n SELECT toStartOfInterval(timestamp, ${intervalSql}) AS bucket,\n ${resolved.map(e => e.selectSql).join(', ')},\n ${aggSql} AS value\n FROM ${TABLE_FEEDBACK_EVENTS} ${whereClause}\n GROUP BY bucket, ${resolved.map(e => e.groupSql).join(', ')}\n ORDER BY bucket\n `;\n const rows = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n const seriesMap = new Map<string, { name: string; points: { timestamp: Date; value: number }[] }>();\n\n for (const row of rows) {\n const groupValues = resolved.map((_, index) => row[`group_by_${index}`]);\n const key = JSON.stringify(groupValues);\n if (!seriesMap.has(key)) {\n seriesMap.set(key, { name: toSeriesName(groupValues), points: [] });\n }\n seriesMap.get(key)!.points.push({\n timestamp: row.bucket instanceof Date ? row.bucket : new Date(String(row.bucket)),\n value: Number(row.value ?? 0),\n });\n }\n\n return { series: Array.from(seriesMap.values()) };\n }\n\n const sql = `\n SELECT toStartOfInterval(timestamp, ${intervalSql}) AS bucket,\n ${aggSql} AS value\n FROM ${TABLE_FEEDBACK_EVENTS} ${whereClause}\n GROUP BY bucket\n ORDER BY bucket\n `;\n const rows = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n\n return {\n series: [\n {\n name: args.feedbackSource ? `${args.feedbackType}|${args.feedbackSource}` : args.feedbackType,\n points: rows.map(row => ({\n timestamp: row.bucket instanceof Date ? row.bucket : new Date(String(row.bucket)),\n value: Number(row.value ?? 0),\n })),\n },\n ],\n };\n}\n\nexport async function getFeedbackPercentiles(\n client: ClickHouseClient,\n args: GetFeedbackPercentilesArgs,\n): Promise<GetFeedbackPercentilesResponse> {\n const intervalSql = getIntervalSql(args.interval);\n const identity = buildFeedbackIdentityFilter(args);\n const signalFilter = buildFeedbackFilterConditions(args.filters);\n const combined = mergeFilters(identity, signalFilter);\n const whereClause = toWhereClause(combined);\n\n if (!Array.isArray(args.percentiles) || args.percentiles.length === 0) {\n throw new Error('Percentiles must include at least one value between 0 and 1.');\n }\n\n const series = [];\n for (const p of args.percentiles) {\n if (!Number.isFinite(p) || p < 0 || p > 1) {\n throw new Error(`Percentile value must be a finite number between 0 and 1, got ${p}`);\n }\n const sql = `\n SELECT toStartOfInterval(timestamp, ${intervalSql}) AS bucket,\n quantile(${p})(valueNumber) AS pvalue\n FROM ${TABLE_FEEDBACK_EVENTS}\n ${whereClause}\n GROUP BY bucket\n ORDER BY bucket\n `;\n const rows = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n\n series.push({\n percentile: p,\n points: rows.map(row => ({\n timestamp: row.bucket instanceof Date ? row.bucket : new Date(String(row.bucket)),\n value: Number(row.pvalue ?? 0),\n })),\n });\n }\n\n return { series };\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { listLogsArgsSchema } from '@mastra/core/storage';\nimport type { BatchCreateLogsArgs, ListLogsArgs, ListLogsResponse } from '@mastra/core/storage';\n\nimport { TABLE_LOG_EVENTS } from './ddl';\nimport { buildLogsFilterConditions, buildPaginationClause, buildSignalOrderByClause } from './filters';\nimport { CH_INSERT_SETTINGS, CH_SETTINGS, logRecordToRow, rowToLogRecord } from './helpers';\n\nexport async function batchCreateLogs(client: ClickHouseClient, args: BatchCreateLogsArgs): Promise<void> {\n if (args.logs.length === 0) return;\n\n await client.insert({\n table: TABLE_LOG_EVENTS,\n values: args.logs.map(logRecordToRow),\n format: 'JSONEachRow',\n clickhouse_settings: CH_INSERT_SETTINGS,\n });\n}\n\nexport async function listLogs(client: ClickHouseClient, args: ListLogsArgs): Promise<ListLogsResponse> {\n const parsed = listLogsArgsSchema.parse(args);\n const filter = buildLogsFilterConditions(parsed.filters, 'l');\n const pagination = buildPaginationClause(parsed.pagination);\n const orderBy = buildSignalOrderByClause(['timestamp'], parsed.orderBy, 'l');\n const whereClause = filter.conditions.length ? `WHERE ${filter.conditions.join(' AND ')}` : '';\n\n const countResult = (await (\n await client.query({\n query: `SELECT count() AS total FROM ${TABLE_LOG_EVENTS} AS l ${whereClause}`,\n query_params: filter.params,\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n })\n ).json()) as Array<{ total?: number }>;\n\n const rows = (await (\n await client.query({\n query: `\n SELECT *\n FROM ${TABLE_LOG_EVENTS} AS l\n ${whereClause}\n ORDER BY ${orderBy}\n LIMIT {limit:UInt32} OFFSET {offset:UInt32}\n `,\n query_params: {\n ...filter.params,\n limit: pagination.limit,\n offset: pagination.offset,\n },\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n })\n ).json()) as Record<string, any>[];\n\n const total = Number(countResult[0]?.total ?? 0);\n\n return {\n pagination: {\n total,\n page: pagination.page,\n perPage: pagination.perPage,\n hasMore: (pagination.page + 1) * pagination.perPage < total,\n },\n logs: rows.map(rowToLogRecord),\n };\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { listMetricsArgsSchema, METRIC_DISTINCT_COLUMNS } from '@mastra/core/storage';\nimport type {\n AggregationInterval,\n AggregationType,\n BatchCreateMetricsArgs,\n ListMetricsArgs,\n ListMetricsResponse,\n GetMetricAggregateArgs,\n GetMetricAggregateResponse,\n GetMetricBreakdownArgs,\n GetMetricBreakdownResponse,\n GetMetricTimeSeriesArgs,\n GetMetricTimeSeriesResponse,\n GetMetricPercentilesArgs,\n GetMetricPercentilesResponse,\n GetMetricNamesArgs,\n GetMetricNamesResponse,\n GetMetricLabelKeysArgs,\n GetMetricLabelKeysResponse,\n GetMetricLabelValuesArgs,\n GetMetricLabelValuesResponse,\n MetricDistinctColumn,\n} from '@mastra/core/storage';\nimport { parseFieldKey } from '@mastra/core/utils';\n\nimport { TABLE_METRIC_EVENTS, TABLE_DISCOVERY_VALUES, TABLE_DISCOVERY_PAIRS } from './ddl';\nimport { buildMetricsFilterConditions, buildPaginationClause, buildSignalOrderByClause } from './filters';\nimport type { FilterResult } from './filters';\nimport { CH_INSERT_SETTINGS, CH_SETTINGS, metricRecordToRow, rowToMetricRecord } from './helpers';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Map typed columns to their ClickHouse column names. */\nconst METRIC_TYPED_COLUMNS = new Set([\n 'timestamp',\n 'name',\n 'value',\n 'traceId',\n 'spanId',\n 'entityType',\n 'entityId',\n 'entityName',\n 'entityVersionId',\n 'parentEntityVersionId',\n 'parentEntityType',\n 'parentEntityId',\n 'parentEntityName',\n 'rootEntityVersionId',\n 'rootEntityType',\n 'rootEntityId',\n 'rootEntityName',\n 'userId',\n 'organizationId',\n 'resourceId',\n 'runId',\n 'sessionId',\n 'threadId',\n 'requestId',\n 'environment',\n 'executionSource',\n 'serviceName',\n 'experimentId',\n 'provider',\n 'model',\n 'estimatedCost',\n 'costUnit',\n]);\n\n/** Columns excluded from groupBy because they are complex types. */\nconst GROUP_BY_EXCLUDED = new Set(['metadata', 'scope', 'costMetadata', 'tags']);\n\nfunction resolveDistinctColumnSql(distinctColumn: MetricDistinctColumn | undefined): string {\n if (!distinctColumn) {\n throw new Error(`count_distinct aggregation requires a 'distinctColumn' argument`);\n }\n // Defense-in-depth: the schema enum already restricts this, but the value\n // flows into raw SQL so we re-check against the system-level allowlist.\n if (!(METRIC_DISTINCT_COLUMNS as readonly string[]).includes(distinctColumn)) {\n throw new Error(`Invalid distinctColumn: ${distinctColumn}`);\n }\n return parseFieldKey(distinctColumn);\n}\n\nfunction getAggregationSql(\n aggregation: AggregationType,\n measure = 'value',\n distinctColumn?: MetricDistinctColumn,\n): string {\n switch (aggregation) {\n case 'sum':\n return `sum(${measure})`;\n case 'avg':\n return `avg(${measure})`;\n case 'min':\n return `min(${measure})`;\n case 'max':\n return `max(${measure})`;\n case 'count':\n return `toFloat64(count(${measure}))`;\n case 'count_distinct': {\n // Use ClickHouse's approximate HyperLogLog (~1-2% error) for dashboard scale.\n return `toFloat64(uniq(${resolveDistinctColumnSql(distinctColumn)}))`;\n }\n case 'last':\n return `argMax(${measure}, timestamp)`;\n default:\n return `sum(${measure})`;\n }\n}\n\nfunction getIntervalSql(interval: AggregationInterval): string {\n switch (interval) {\n case '1m':\n return 'INTERVAL 1 MINUTE';\n case '5m':\n return 'INTERVAL 5 MINUTE';\n case '15m':\n return 'INTERVAL 15 MINUTE';\n case '1h':\n return 'INTERVAL 1 HOUR';\n case '1d':\n return 'INTERVAL 1 DAY';\n default:\n return 'INTERVAL 1 HOUR';\n }\n}\n\nfunction getCostSummarySelect(prefix = ''): string {\n const ref = (col: string) => `${prefix}${col}`;\n // Use prefixed aliases to avoid ClickHouse alias-resolution conflicts\n // when source columns (estimatedCost, costUnit) also appear in WHERE.\n return `sumIf(${ref('estimatedCost')}, ${ref('estimatedCost')} IS NOT NULL) AS agg_estimatedCost, CASE WHEN countDistinctIf(${ref('costUnit')}, ${ref('costUnit')} IS NOT NULL) = 1 THEN minIf(${ref('costUnit')}, ${ref('costUnit')} IS NOT NULL) ELSE NULL END AS agg_costUnit`;\n}\n\ninterface CostSummary {\n estimatedCost: number | null;\n costUnit: string | null;\n}\n\nfunction normalizeCostSummaryRow(row: Record<string, unknown>): CostSummary {\n return {\n estimatedCost: row.agg_estimatedCost == null ? null : Number(row.agg_estimatedCost),\n costUnit: row.agg_costUnit == null || row.agg_costUnit === '' ? null : String(row.agg_costUnit),\n };\n}\n\nfunction buildMetricNameFilter(names: string[]): FilterResult {\n return {\n conditions: [`name IN {metricNames:Array(String)}`],\n params: { metricNames: names },\n };\n}\n\nfunction mergeFilters(...parts: FilterResult[]): FilterResult {\n const conditions: string[] = [];\n const params: Record<string, unknown> = {};\n for (const part of parts) {\n conditions.push(...part.conditions);\n Object.assign(params, part.params);\n }\n return { conditions, params };\n}\n\nfunction toWhereClause(filter: FilterResult): string {\n return filter.conditions.length ? `WHERE ${filter.conditions.join(' AND ')}` : '';\n}\n\ninterface ResolvedGroupBy {\n kind: 'column' | 'label';\n key: string;\n valueSql: string;\n selectSql: string;\n groupSql: string;\n resultKey: string;\n}\n\nfunction resolveGroupBy(groupBy: string[]): ResolvedGroupBy[] {\n return groupBy.map((key, index) => {\n if (METRIC_TYPED_COLUMNS.has(key)) {\n const parsed = parseFieldKey(key);\n if (GROUP_BY_EXCLUDED.has(parsed)) {\n throw new Error(`Invalid groupBy column(s): ${key}`);\n }\n return {\n kind: 'column' as const,\n key,\n valueSql: parsed,\n selectSql: `${parsed} AS ${parsed}`,\n groupSql: parsed,\n resultKey: parsed,\n };\n }\n\n // Treat as label key — access from ClickHouse Map column\n const alias = `group_by_${index}`;\n const valueSql = `labels[{label_key_${index}:String}]`;\n return {\n kind: 'label' as const,\n key,\n valueSql,\n selectSql: `${valueSql} AS ${alias}`,\n groupSql: alias,\n resultKey: alias,\n };\n });\n}\n\nfunction addGroupByLabelParams(resolved: ResolvedGroupBy[]): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n for (let i = 0; i < resolved.length; i++) {\n if (resolved[i]!.kind === 'label') {\n params[`label_key_${i}`] = resolved[i]!.key;\n }\n }\n return params;\n}\n\n/** Builds WHERE conditions that exclude rows missing a requested label key. */\nfunction buildLabelExclusionConditions(resolved: ResolvedGroupBy[]): string[] {\n return resolved.filter(e => e.kind === 'label').map(e => `${e.valueSql} != ''`);\n}\n\nfunction toSeriesDisplayValue(value: unknown): string {\n return value == null || value === '' ? '' : String(value);\n}\n\nasync function queryJson<T>(client: ClickHouseClient, query: string, params: Record<string, unknown>): Promise<T[]> {\n return (await (\n await client.query({\n query,\n query_params: params,\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n })\n ).json()) as T[];\n}\n\n// ============================================================================\n// Write\n// ============================================================================\n\nexport async function batchCreateMetrics(client: ClickHouseClient, args: BatchCreateMetricsArgs): Promise<void> {\n if (args.metrics.length === 0) return;\n\n await client.insert({\n table: TABLE_METRIC_EVENTS,\n values: args.metrics.map(metricRecordToRow),\n format: 'JSONEachRow',\n clickhouse_settings: CH_INSERT_SETTINGS,\n });\n}\n\n// ============================================================================\n// List\n// ============================================================================\n\nexport async function listMetrics(client: ClickHouseClient, args: ListMetricsArgs): Promise<ListMetricsResponse> {\n const parsed = listMetricsArgsSchema.parse(args);\n const filter = buildMetricsFilterConditions(parsed.filters, 'm');\n const pagination = buildPaginationClause(parsed.pagination);\n const orderBy = buildSignalOrderByClause(['timestamp'], parsed.orderBy, 'm');\n const whereClause = filter.conditions.length ? `WHERE ${filter.conditions.join(' AND ')}` : '';\n\n const countResult = await queryJson<{ total?: number }>(\n client,\n `SELECT count() AS total FROM ${TABLE_METRIC_EVENTS} AS m ${whereClause}`,\n filter.params,\n );\n\n const rows = await queryJson<Record<string, any>>(\n client,\n `SELECT * FROM ${TABLE_METRIC_EVENTS} AS m ${whereClause} ORDER BY ${orderBy} LIMIT {limit:UInt32} OFFSET {offset:UInt32}`,\n { ...filter.params, limit: pagination.limit, offset: pagination.offset },\n );\n\n const total = Number(countResult[0]?.total ?? 0);\n\n return {\n pagination: {\n total,\n page: pagination.page,\n perPage: pagination.perPage,\n hasMore: (pagination.page + 1) * pagination.perPage < total,\n },\n metrics: rows.map(rowToMetricRecord),\n };\n}\n\n// ============================================================================\n// OLAP Queries\n// ============================================================================\n\nexport async function getMetricAggregate(\n client: ClickHouseClient,\n args: GetMetricAggregateArgs,\n): Promise<GetMetricAggregateResponse> {\n const aggSql = getAggregationSql(args.aggregation, 'value', args.distinctColumn);\n const nameFilter = buildMetricNameFilter(args.name);\n const signalFilter = buildMetricsFilterConditions(args.filters);\n const combined = mergeFilters(nameFilter, signalFilter);\n const whereClause = toWhereClause(combined);\n\n const sql = `SELECT ${aggSql} AS value, ${getCostSummarySelect()} FROM ${TABLE_METRIC_EVENTS} ${whereClause}`;\n const result = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n const row = result[0] ?? {};\n const value = row.value == null ? null : Number(row.value);\n const costSummary = normalizeCostSummaryRow(row);\n\n // Period comparison\n if (args.comparePeriod && args.filters?.timestamp) {\n const ts = args.filters.timestamp;\n if (ts.start && ts.end) {\n const duration = ts.end.getTime() - ts.start.getTime();\n let prevStart: Date;\n let prevEnd: Date;\n\n switch (args.comparePeriod) {\n case 'previous_period':\n prevStart = new Date(ts.start.getTime() - duration);\n prevEnd = new Date(ts.end.getTime() - duration);\n break;\n case 'previous_day':\n prevStart = new Date(ts.start.getTime() - 86400000);\n prevEnd = new Date(ts.end.getTime() - 86400000);\n break;\n case 'previous_week':\n prevStart = new Date(ts.start.getTime() - 604800000);\n prevEnd = new Date(ts.end.getTime() - 604800000);\n break;\n default:\n prevStart = new Date(ts.start.getTime() - duration);\n prevEnd = new Date(ts.end.getTime() - duration);\n }\n\n const prevFilters = {\n ...(args.filters ?? {}),\n timestamp: {\n start: prevStart,\n end: prevEnd,\n startExclusive: ts.startExclusive,\n endExclusive: ts.endExclusive,\n },\n };\n const prevSignalFilter = buildMetricsFilterConditions(prevFilters);\n const prevCombined = mergeFilters(nameFilter, prevSignalFilter);\n const prevWhereClause = toWhereClause(prevCombined);\n\n const prevSql = `SELECT ${aggSql} AS value, ${getCostSummarySelect()} FROM ${TABLE_METRIC_EVENTS} ${prevWhereClause}`;\n const prevResult = await queryJson<Record<string, unknown>>(client, prevSql, prevCombined.params);\n const prevRow = prevResult[0] ?? {};\n const previousValue = prevRow.value == null ? null : Number(prevRow.value);\n const previousCostSummary = normalizeCostSummaryRow(prevRow);\n\n let changePercent: number | null = null;\n if (previousValue !== null && previousValue !== 0 && value !== null) {\n changePercent = ((value - previousValue) / Math.abs(previousValue)) * 100;\n }\n\n let costChangePercent: number | null = null;\n if (\n previousCostSummary.estimatedCost !== null &&\n previousCostSummary.estimatedCost !== 0 &&\n costSummary.estimatedCost !== null\n ) {\n costChangePercent =\n ((costSummary.estimatedCost - previousCostSummary.estimatedCost) /\n Math.abs(previousCostSummary.estimatedCost)) *\n 100;\n }\n\n return {\n value,\n estimatedCost: costSummary.estimatedCost,\n costUnit: costSummary.costUnit,\n previousValue,\n previousEstimatedCost: previousCostSummary.estimatedCost,\n changePercent,\n costChangePercent,\n };\n }\n }\n\n return { value, estimatedCost: costSummary.estimatedCost, costUnit: costSummary.costUnit };\n}\n\nexport async function getMetricBreakdown(\n client: ClickHouseClient,\n args: GetMetricBreakdownArgs,\n): Promise<GetMetricBreakdownResponse> {\n const aggSql = getAggregationSql(args.aggregation, 'value', args.distinctColumn);\n const nameFilter = buildMetricNameFilter(args.name);\n const signalFilter = buildMetricsFilterConditions(args.filters);\n const combined = mergeFilters(nameFilter, signalFilter);\n\n const resolvedGroupBy = resolveGroupBy(args.groupBy);\n const labelParams = addGroupByLabelParams(resolvedGroupBy);\n const labelExclusions = buildLabelExclusionConditions(resolvedGroupBy);\n const selectGroupBy = resolvedGroupBy.map(e => e.selectSql).join(', ');\n const groupByCols = resolvedGroupBy.map(e => e.groupSql).join(', ');\n\n // Merge label exclusion conditions so rows missing a requested label key are excluded\n const allConditions = [...combined.conditions, ...labelExclusions];\n const fullWhereClause = allConditions.length ? `WHERE ${allConditions.join(' AND ')}` : '';\n\n const orderDirection = args.orderDirection === 'ASC' ? 'ASC' : 'DESC';\n const limitClause = typeof args.limit === 'number' ? `LIMIT {breakdown_limit:UInt32}` : '';\n const extraParams: Record<string, unknown> = typeof args.limit === 'number' ? { breakdown_limit: args.limit } : {};\n\n const sql = `\n SELECT ${selectGroupBy}, ${aggSql} AS value, ${getCostSummarySelect()}\n FROM ${TABLE_METRIC_EVENTS}\n ${fullWhereClause}\n GROUP BY ${groupByCols}\n ORDER BY value ${orderDirection}\n ${limitClause}\n `;\n const rows = await queryJson<Record<string, unknown>>(client, sql, {\n ...combined.params,\n ...labelParams,\n ...extraParams,\n });\n\n const groups = rows.map(row => {\n const dimensions: Record<string, string | null> = {};\n for (const entry of resolvedGroupBy) {\n const val = row[entry.resultKey];\n dimensions[entry.key] = val == null || val === '' ? null : String(val);\n }\n const cs = normalizeCostSummaryRow(row);\n return {\n dimensions,\n value: Number(row.value ?? 0),\n estimatedCost: cs.estimatedCost,\n costUnit: cs.costUnit,\n };\n });\n\n return { groups };\n}\n\nexport async function getMetricTimeSeries(\n client: ClickHouseClient,\n args: GetMetricTimeSeriesArgs,\n): Promise<GetMetricTimeSeriesResponse> {\n const aggSql = getAggregationSql(args.aggregation, 'value', args.distinctColumn);\n const intervalSql = getIntervalSql(args.interval);\n const nameFilter = buildMetricNameFilter(args.name);\n const signalFilter = buildMetricsFilterConditions(args.filters);\n const combined = mergeFilters(nameFilter, signalFilter);\n const whereClause = toWhereClause(combined);\n\n if (args.groupBy && args.groupBy.length > 0) {\n const resolvedGroupBy = resolveGroupBy(args.groupBy);\n const labelParams = addGroupByLabelParams(resolvedGroupBy);\n const labelExclusions = buildLabelExclusionConditions(resolvedGroupBy);\n const selectGroupBy = resolvedGroupBy.map(e => e.selectSql).join(', ');\n const groupByCols = resolvedGroupBy.map(e => e.groupSql).join(', ');\n\n const allConditions = [...combined.conditions, ...labelExclusions];\n const tsWhereClause = allConditions.length ? `WHERE ${allConditions.join(' AND ')}` : '';\n\n const sql = `\n SELECT toStartOfInterval(timestamp, ${intervalSql}) AS bucket,\n ${selectGroupBy},\n ${aggSql} AS value,\n ${getCostSummarySelect()}\n FROM ${TABLE_METRIC_EVENTS}\n ${tsWhereClause}\n GROUP BY bucket, ${groupByCols}\n ORDER BY bucket\n `;\n const rows = await queryJson<Record<string, unknown>>(client, sql, { ...combined.params, ...labelParams });\n\n const seriesMap = new Map<\n string,\n {\n name: string;\n costUnits: Set<string>;\n points: { timestamp: Date; value: number; estimatedCost: number | null }[];\n }\n >();\n\n for (const row of rows) {\n const dimensionValues = resolvedGroupBy.map(entry => row[entry.resultKey]);\n const seriesKey = JSON.stringify(dimensionValues);\n const name = dimensionValues.map(toSeriesDisplayValue).join('|');\n const cs = normalizeCostSummaryRow(row);\n\n if (!seriesMap.has(seriesKey)) {\n seriesMap.set(seriesKey, { name, costUnits: new Set(), points: [] });\n }\n const entry = seriesMap.get(seriesKey)!;\n if (cs.costUnit) entry.costUnits.add(cs.costUnit);\n entry.points.push({\n timestamp: row.bucket instanceof Date ? row.bucket : new Date(String(row.bucket)),\n value: Number(row.value ?? 0),\n estimatedCost: cs.estimatedCost,\n });\n }\n\n const series = Array.from(seriesMap.values()).map(s => ({\n name: s.name,\n costUnit: s.costUnits.size === 1 ? Array.from(s.costUnits)[0]! : null,\n points: s.points,\n }));\n\n return { series };\n }\n\n // No groupBy — single series using metric name(s)\n const metricName = args.name.join('|');\n const sql = `\n SELECT toStartOfInterval(timestamp, ${intervalSql}) AS bucket,\n ${aggSql} AS value,\n ${getCostSummarySelect()}\n FROM ${TABLE_METRIC_EVENTS}\n ${whereClause}\n GROUP BY bucket\n ORDER BY bucket\n `;\n const rows = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n\n const overallCostUnits = new Set<string>();\n for (const row of rows) {\n const cs = normalizeCostSummaryRow(row);\n if (cs.costUnit) overallCostUnits.add(cs.costUnit);\n }\n\n return {\n series: [\n {\n name: metricName,\n costUnit: overallCostUnits.size === 1 ? Array.from(overallCostUnits)[0]! : null,\n points: rows.map(row => {\n const cs = normalizeCostSummaryRow(row);\n return {\n timestamp: row.bucket instanceof Date ? row.bucket : new Date(String(row.bucket)),\n value: Number(row.value ?? 0),\n estimatedCost: cs.estimatedCost,\n };\n }),\n },\n ],\n };\n}\n\nexport async function getMetricPercentiles(\n client: ClickHouseClient,\n args: GetMetricPercentilesArgs,\n): Promise<GetMetricPercentilesResponse> {\n const intervalSql = getIntervalSql(args.interval);\n const signalFilter = buildMetricsFilterConditions(args.filters);\n const nameFilter: FilterResult = {\n conditions: [`name = {percentileName:String}`],\n params: { percentileName: args.name },\n };\n const combined = mergeFilters(nameFilter, signalFilter);\n const whereClause = toWhereClause(combined);\n\n const series = [];\n for (const p of args.percentiles) {\n if (p < 0 || p > 1) {\n throw new Error(`Percentile value must be between 0 and 1, got ${p}`);\n }\n const sql = `\n SELECT toStartOfInterval(timestamp, ${intervalSql}) AS bucket,\n quantile(${p})(value) AS pvalue\n FROM ${TABLE_METRIC_EVENTS}\n ${whereClause}\n GROUP BY bucket\n ORDER BY bucket\n `;\n const rows = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n\n series.push({\n percentile: p,\n points: rows.map(row => ({\n timestamp: row.bucket instanceof Date ? row.bucket : new Date(String(row.bucket)),\n value: Number(row.pvalue ?? 0),\n })),\n });\n }\n\n return { series };\n}\n\n// ============================================================================\n// Discovery / Metadata — reads from helper tables, not source tables.\n// Per design: returns empty results until helper tables have been refreshed.\n// ============================================================================\n\nexport async function getMetricNames(\n client: ClickHouseClient,\n args: GetMetricNamesArgs,\n): Promise<GetMetricNamesResponse> {\n const conditions: string[] = [`kind = 'metricName'`];\n const params: Record<string, unknown> = {};\n\n if (args.prefix) {\n conditions.push(`value LIKE {namePrefix:String}`);\n params.namePrefix = `${args.prefix}%`;\n }\n\n const limitClause = args.limit ? `LIMIT {nameLimit:UInt32}` : '';\n if (args.limit) params.nameLimit = args.limit;\n\n const rows = await queryJson<{ value: string }>(\n client,\n `SELECT value FROM ${TABLE_DISCOVERY_VALUES} WHERE ${conditions.join(' AND ')} ORDER BY value ${limitClause}`,\n params,\n );\n\n return { names: rows.map(r => r.value) };\n}\n\nexport async function getMetricLabelKeys(\n client: ClickHouseClient,\n args: GetMetricLabelKeysArgs,\n): Promise<GetMetricLabelKeysResponse> {\n const rows = await queryJson<{ value: string }>(\n client,\n `SELECT value FROM ${TABLE_DISCOVERY_VALUES} WHERE kind = 'metricLabelKey' AND key1 = {metricName:String} ORDER BY value`,\n { metricName: args.metricName },\n );\n return { keys: rows.map(r => r.value) };\n}\n\nexport async function getMetricLabelValues(\n client: ClickHouseClient,\n args: GetMetricLabelValuesArgs,\n): Promise<GetMetricLabelValuesResponse> {\n const conditions: string[] = [`kind = 'metricLabelValue'`, `key1 = {metricName:String}`, `key2 = {labelKey:String}`];\n const params: Record<string, unknown> = {\n metricName: args.metricName,\n labelKey: args.labelKey,\n };\n\n if (args.prefix) {\n conditions.push(`value LIKE {valPrefix:String}`);\n params.valPrefix = `${args.prefix}%`;\n }\n\n const limitClause = args.limit ? `LIMIT {valLimit:UInt32}` : '';\n if (args.limit) params.valLimit = args.limit;\n\n const rows = await queryJson<{ value: string }>(\n client,\n `SELECT value FROM ${TABLE_DISCOVERY_PAIRS} WHERE ${conditions.join(' AND ')} ORDER BY value ${limitClause}`,\n params,\n );\n\n return { values: rows.map(r => r.value) };\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport { createStorageErrorId } from '@mastra/core/storage';\n\nimport {\n TABLE_METRIC_EVENTS,\n TABLE_LOG_EVENTS,\n TABLE_SCORE_EVENTS,\n TABLE_FEEDBACK_EVENTS,\n METRIC_EVENTS_DDL,\n LOG_EVENTS_DDL,\n SCORE_EVENTS_DDL,\n FEEDBACK_EVENTS_DDL,\n} from './ddl';\n\ninterface SignalMigration {\n table: string;\n createDDL: string;\n idColumn: string;\n}\n\nexport interface SignalMigrationStatusTable {\n table: string;\n engine: string;\n idColumn: string;\n}\n\nexport interface SignalMigrationStatus {\n needsMigration: boolean;\n tables: SignalMigrationStatusTable[];\n}\n\nconst SIGNAL_MIGRATIONS: SignalMigration[] = [\n { table: TABLE_METRIC_EVENTS, createDDL: METRIC_EVENTS_DDL, idColumn: 'metricId' },\n { table: TABLE_LOG_EVENTS, createDDL: LOG_EVENTS_DDL, idColumn: 'logId' },\n { table: TABLE_SCORE_EVENTS, createDDL: SCORE_EVENTS_DDL, idColumn: 'scoreId' },\n { table: TABLE_FEEDBACK_EVENTS, createDDL: FEEDBACK_EVENTS_DDL, idColumn: 'feedbackId' },\n];\n\n// ClickHouse Cloud silently rewrites `ReplacingMergeTree` to `SharedReplacingMergeTree`,\n// and self-managed replicated clusters rewrite it to `ReplicatedReplacingMergeTree`.\n// All three share dedup-on-merge semantics, so treat them as already-migrated.\nexport function isReplacingMergeTreeEngine(engine: string): boolean {\n return engine.endsWith('ReplacingMergeTree');\n}\n\nasync function getTableEngine(client: ClickHouseClient, table: string): Promise<string | null> {\n const result = await client.query({\n query: `SELECT engine FROM system.tables WHERE database = currentDatabase() AND name = {table:String}`,\n query_params: { table },\n format: 'JSONEachRow',\n });\n const rows = (await result.json()) as Array<{ engine: string }>;\n return rows[0]?.engine ?? null;\n}\n\nasync function getTableColumns(client: ClickHouseClient, table: string): Promise<string[]> {\n const result = await client.query({ query: `DESCRIBE TABLE ${table}`, format: 'JSONEachRow' });\n const rows = (await result.json()) as Array<{ name: string }>;\n return rows.map(r => r.name);\n}\n\nfunction buildTemporaryTableDDL(createDDL: string, table: string, tempTable: string): string {\n return createDDL.replace(`CREATE TABLE IF NOT EXISTS ${table}`, `CREATE TABLE ${tempTable}`);\n}\n\nasync function dropTableIfExists(client: ClickHouseClient, table: string): Promise<void> {\n if ((await getTableEngine(client, table)) !== null) {\n await client.command({ query: `DROP TABLE ${table}` });\n }\n}\n\nfunction createMigrationError(args: { table: string; idColumn: string }, error: unknown): MastraError {\n return new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'MIGRATE_SIGNAL_TABLES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: args,\n },\n error,\n );\n}\n\nexport async function checkSignalTablesMigrationStatus(client: ClickHouseClient): Promise<SignalMigrationStatus> {\n const tables: SignalMigrationStatusTable[] = [];\n\n for (const { table, idColumn } of SIGNAL_MIGRATIONS) {\n const engine = await getTableEngine(client, table);\n if (!engine || isReplacingMergeTreeEngine(engine)) {\n continue;\n }\n\n tables.push({ table, engine, idColumn });\n }\n\n return {\n needsMigration: tables.length > 0,\n tables,\n };\n}\n\n/**\n * Migrate signal tables from MergeTree to ReplacingMergeTree without dropping data.\n * Copy-and-swap: create temp → INSERT…SELECT (generating IDs) → EXCHANGE temp with live\n * → drop old data. EXCHANGE swaps the two table names atomically, so concurrent\n * writers never observe a missing table.\n */\nexport async function migrateSignalTables(client: ClickHouseClient, logger?: IMastraLogger): Promise<void> {\n for (const { table, createDDL, idColumn } of SIGNAL_MIGRATIONS) {\n const engine = await getTableEngine(client, table);\n if (!engine || isReplacingMergeTreeEngine(engine)) continue;\n\n logger?.info?.(`Migrating ${table} from ${engine} to ReplacingMergeTree with ${idColumn} column`);\n\n const temp = `${table}_migrating_${Date.now()}`;\n\n try {\n await client.command({ query: buildTemporaryTableDDL(createDDL, table, temp) });\n\n const newColumns = await getTableColumns(client, temp);\n const currentColumns = new Set(await getTableColumns(client, table));\n\n const columnList = newColumns.map(c => `\"${c}\"`).join(', ');\n const selectExprs = newColumns\n .map(c => {\n if (c === idColumn) {\n return currentColumns.has(c)\n ? `COALESCE(nullIf(\"${c}\", ''), toString(generateUUIDv4())) AS \"${c}\"`\n : `toString(generateUUIDv4()) AS \"${c}\"`;\n }\n return currentColumns.has(c) ? `\"${c}\"` : `NULL AS \"${c}\"`;\n })\n .join(', ');\n\n await client.command({\n query: `INSERT INTO ${temp} (${columnList}) SELECT ${selectExprs} FROM ${table}`,\n });\n\n await client.command({ query: `EXCHANGE TABLES ${temp} AND ${table}` });\n await client.command({ query: `DROP TABLE ${temp}` });\n\n logger?.info?.(`Successfully migrated ${table}`);\n } catch (error) {\n logger?.error?.(`Migration of ${table} failed: ${(error as Error).message}`);\n try {\n await dropTableIfExists(client, temp);\n } catch (restoreError) {\n logger?.error?.(`Failed to clean up temporary table ${temp}: ${(restoreError as Error).message}`);\n }\n throw createMigrationError({ table, idColumn }, error);\n }\n }\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { listScoresArgsSchema } from '@mastra/core/storage';\nimport type {\n AggregationInterval,\n AggregationType,\n BatchCreateScoresArgs,\n CreateScoreArgs,\n ListScoresArgs,\n ListScoresResponse,\n ScoreRecord,\n GetScoreAggregateArgs,\n GetScoreAggregateResponse,\n GetScoreBreakdownArgs,\n GetScoreBreakdownResponse,\n GetScoreTimeSeriesArgs,\n GetScoreTimeSeriesResponse,\n GetScorePercentilesArgs,\n GetScorePercentilesResponse,\n} from '@mastra/core/storage';\nimport { parseFieldKey } from '@mastra/core/utils';\n\nimport { TABLE_SCORE_EVENTS } from './ddl';\nimport { buildPaginationClause, buildScoresFilterConditions, buildSignalOrderByClause } from './filters';\nimport type { FilterResult } from './filters';\nimport { CH_INSERT_SETTINGS, CH_SETTINGS, rowToScoreRecord, scoreRecordToRow } from './helpers';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst SCORE_TYPED_COLUMNS = new Set([\n 'timestamp',\n 'traceId',\n 'spanId',\n 'experimentId',\n 'scoreTraceId',\n 'entityType',\n 'entityId',\n 'entityName',\n 'entityVersionId',\n 'parentEntityVersionId',\n 'parentEntityType',\n 'parentEntityId',\n 'parentEntityName',\n 'rootEntityVersionId',\n 'rootEntityType',\n 'rootEntityId',\n 'rootEntityName',\n 'userId',\n 'organizationId',\n 'resourceId',\n 'runId',\n 'sessionId',\n 'threadId',\n 'requestId',\n 'environment',\n 'executionSource',\n 'serviceName',\n 'scorerId',\n 'scorerVersion',\n 'scoreSource',\n 'score',\n 'reason',\n]);\n\nconst GROUP_BY_EXCLUDED = new Set(['metadata', 'scope', 'tags']);\n\nfunction getAggregationSql(aggregation: AggregationType, measure = 'score'): string {\n switch (aggregation) {\n case 'sum':\n return `sum(${measure})`;\n case 'avg':\n return `avg(${measure})`;\n case 'min':\n return `min(${measure})`;\n case 'max':\n return `max(${measure})`;\n case 'count':\n return `toFloat64(count(${measure}))`;\n case 'last':\n return `argMax(${measure}, timestamp)`;\n default:\n return `sum(${measure})`;\n }\n}\n\nfunction getIntervalSql(interval: AggregationInterval): string {\n switch (interval) {\n case '1m':\n return 'INTERVAL 1 MINUTE';\n case '5m':\n return 'INTERVAL 5 MINUTE';\n case '15m':\n return 'INTERVAL 15 MINUTE';\n case '1h':\n return 'INTERVAL 1 HOUR';\n case '1d':\n return 'INTERVAL 1 DAY';\n default:\n return 'INTERVAL 1 HOUR';\n }\n}\n\nfunction mergeFilters(...parts: FilterResult[]): FilterResult {\n const conditions: string[] = [];\n const params: Record<string, unknown> = {};\n for (const part of parts) {\n conditions.push(...part.conditions);\n Object.assign(params, part.params);\n }\n return { conditions, params };\n}\n\nfunction toWhereClause(filter: FilterResult): string {\n return filter.conditions.length ? `WHERE ${filter.conditions.join(' AND ')}` : '';\n}\n\nfunction buildScoreIdentityFilter(args: Pick<GetScoreAggregateArgs, 'scorerId' | 'scoreSource'>): FilterResult {\n const conditions: string[] = ['scorerId = {olapScorerId:String}'];\n const params: Record<string, unknown> = { olapScorerId: args.scorerId };\n\n if (args.scoreSource !== undefined) {\n conditions.push('scoreSource = {olapScoreSource:String}');\n params.olapScoreSource = args.scoreSource;\n }\n\n return { conditions, params };\n}\n\nfunction resolveScoreGroupBy(groupBy: string[]): { key: string; selectSql: string; groupSql: string }[] {\n return groupBy.map((key, index) => {\n const column = parseFieldKey(key);\n if (!SCORE_TYPED_COLUMNS.has(column) || GROUP_BY_EXCLUDED.has(column)) {\n throw new Error(`Invalid groupBy column(s): ${key}`);\n }\n const alias = `group_by_${index}`;\n return { key, selectSql: `${column} AS ${alias}`, groupSql: alias };\n });\n}\n\nfunction toSeriesName(values: unknown[]): string {\n return values.map(v => (v == null ? '' : String(v))).join('|');\n}\n\nasync function queryJson<T>(client: ClickHouseClient, query: string, params: Record<string, unknown>): Promise<T[]> {\n return (await (\n await client.query({\n query,\n query_params: params,\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n })\n ).json()) as T[];\n}\n\n// ============================================================================\n// Write\n// ============================================================================\n\nexport async function createScore(client: ClickHouseClient, args: CreateScoreArgs): Promise<void> {\n await batchCreateScores(client, { scores: [args.score] });\n}\n\nexport async function batchCreateScores(client: ClickHouseClient, args: BatchCreateScoresArgs): Promise<void> {\n if (args.scores.length === 0) return;\n\n await client.insert({\n table: TABLE_SCORE_EVENTS,\n values: args.scores.map(scoreRecordToRow),\n format: 'JSONEachRow',\n clickhouse_settings: CH_INSERT_SETTINGS,\n });\n}\n\n// ============================================================================\n// List\n// ============================================================================\n\nexport async function listScores(client: ClickHouseClient, args: ListScoresArgs): Promise<ListScoresResponse> {\n const parsed = listScoresArgsSchema.parse(args);\n const filter = buildScoresFilterConditions(parsed.filters, 's');\n const pagination = buildPaginationClause(parsed.pagination);\n const orderBy = buildSignalOrderByClause(['timestamp', 'score'], parsed.orderBy, 's');\n const whereClause = filter.conditions.length ? `WHERE ${filter.conditions.join(' AND ')}` : '';\n\n const countResult = await queryJson<{ total?: number }>(\n client,\n `SELECT count() AS total FROM ${TABLE_SCORE_EVENTS} AS s ${whereClause}`,\n filter.params,\n );\n\n const rows = await queryJson<Record<string, any>>(\n client,\n `SELECT * FROM ${TABLE_SCORE_EVENTS} AS s ${whereClause} ORDER BY ${orderBy} LIMIT {limit:UInt32} OFFSET {offset:UInt32}`,\n { ...filter.params, limit: pagination.limit, offset: pagination.offset },\n );\n\n const total = Number(countResult[0]?.total ?? 0);\n\n return {\n pagination: {\n total,\n page: pagination.page,\n perPage: pagination.perPage,\n hasMore: (pagination.page + 1) * pagination.perPage < total,\n },\n scores: rows.map(rowToScoreRecord),\n };\n}\n\nexport async function getScoreById(client: ClickHouseClient, scoreId: string): Promise<ScoreRecord | null> {\n const rows = await queryJson<Record<string, any>>(\n client,\n `SELECT * FROM ${TABLE_SCORE_EVENTS} WHERE scoreId = {scoreId:String} LIMIT 1`,\n { scoreId },\n );\n\n return rows[0] ? rowToScoreRecord(rows[0]) : null;\n}\n\n// ============================================================================\n// OLAP Queries\n// ============================================================================\n\nexport async function getScoreAggregate(\n client: ClickHouseClient,\n args: GetScoreAggregateArgs,\n): Promise<GetScoreAggregateResponse> {\n const aggSql = getAggregationSql(args.aggregation);\n const identity = buildScoreIdentityFilter(args);\n const signalFilter = buildScoresFilterConditions(args.filters);\n const combined = mergeFilters(identity, signalFilter);\n const whereClause = toWhereClause(combined);\n\n const sql = `SELECT ${aggSql} AS value FROM ${TABLE_SCORE_EVENTS} ${whereClause}`;\n const result = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n const value = result[0]?.value == null ? null : Number(result[0]?.value);\n\n if (args.comparePeriod && args.filters?.timestamp) {\n const ts = args.filters.timestamp;\n if (ts.start && ts.end) {\n const duration = ts.end.getTime() - ts.start.getTime();\n let prevStart: Date;\n let prevEnd: Date;\n\n switch (args.comparePeriod) {\n case 'previous_period':\n prevStart = new Date(ts.start.getTime() - duration);\n prevEnd = new Date(ts.end.getTime() - duration);\n break;\n case 'previous_day':\n prevStart = new Date(ts.start.getTime() - 86400000);\n prevEnd = new Date(ts.end.getTime() - 86400000);\n break;\n case 'previous_week':\n prevStart = new Date(ts.start.getTime() - 604800000);\n prevEnd = new Date(ts.end.getTime() - 604800000);\n break;\n default:\n prevStart = new Date(ts.start.getTime() - duration);\n prevEnd = new Date(ts.end.getTime() - duration);\n }\n\n const prevFilters = {\n ...(args.filters ?? {}),\n timestamp: { start: prevStart, end: prevEnd, startExclusive: ts.startExclusive, endExclusive: ts.endExclusive },\n };\n const prevSignalFilter = buildScoresFilterConditions(prevFilters);\n const prevCombined = mergeFilters(identity, prevSignalFilter);\n const prevWhereClause = toWhereClause(prevCombined);\n\n const prevResult = await queryJson<Record<string, unknown>>(\n client,\n `SELECT ${aggSql} AS value FROM ${TABLE_SCORE_EVENTS} ${prevWhereClause}`,\n prevCombined.params,\n );\n const previousValue = prevResult[0]?.value == null ? null : Number(prevResult[0]?.value);\n\n let changePercent: number | null = null;\n if (previousValue !== null && previousValue !== 0 && value !== null) {\n changePercent = ((value - previousValue) / Math.abs(previousValue)) * 100;\n }\n\n return { value, previousValue, changePercent };\n }\n }\n\n return { value };\n}\n\nexport async function getScoreBreakdown(\n client: ClickHouseClient,\n args: GetScoreBreakdownArgs,\n): Promise<GetScoreBreakdownResponse> {\n const aggSql = getAggregationSql(args.aggregation);\n const identity = buildScoreIdentityFilter(args);\n const signalFilter = buildScoresFilterConditions(args.filters);\n const combined = mergeFilters(identity, signalFilter);\n const whereClause = toWhereClause(combined);\n const resolved = resolveScoreGroupBy(args.groupBy);\n\n const sql = `SELECT ${resolved.map(e => e.selectSql).join(', ')}, ${aggSql} AS value FROM ${TABLE_SCORE_EVENTS} ${whereClause} GROUP BY ${resolved.map(e => e.groupSql).join(', ')} ORDER BY value DESC`;\n const rows = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n\n return {\n groups: rows.map(row => ({\n dimensions: Object.fromEntries(\n resolved.map((entry, index) => {\n const v = row[`group_by_${index}`];\n return [entry.key, v == null ? null : String(v)];\n }),\n ),\n value: Number(row.value ?? 0),\n })),\n };\n}\n\nexport async function getScoreTimeSeries(\n client: ClickHouseClient,\n args: GetScoreTimeSeriesArgs,\n): Promise<GetScoreTimeSeriesResponse> {\n const aggSql = getAggregationSql(args.aggregation);\n const intervalSql = getIntervalSql(args.interval);\n const identity = buildScoreIdentityFilter(args);\n const signalFilter = buildScoresFilterConditions(args.filters);\n const combined = mergeFilters(identity, signalFilter);\n const whereClause = toWhereClause(combined);\n\n if (args.groupBy && args.groupBy.length > 0) {\n const resolved = resolveScoreGroupBy(args.groupBy);\n const sql = `\n SELECT toStartOfInterval(timestamp, ${intervalSql}) AS bucket,\n ${resolved.map(e => e.selectSql).join(', ')},\n ${aggSql} AS value\n FROM ${TABLE_SCORE_EVENTS} ${whereClause}\n GROUP BY bucket, ${resolved.map(e => e.groupSql).join(', ')}\n ORDER BY bucket\n `;\n const rows = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n const seriesMap = new Map<string, { name: string; points: { timestamp: Date; value: number }[] }>();\n\n for (const row of rows) {\n const groupValues = resolved.map((_, index) => row[`group_by_${index}`]);\n const key = JSON.stringify(groupValues);\n if (!seriesMap.has(key)) {\n seriesMap.set(key, { name: toSeriesName(groupValues), points: [] });\n }\n seriesMap.get(key)!.points.push({\n timestamp: row.bucket instanceof Date ? row.bucket : new Date(String(row.bucket)),\n value: Number(row.value ?? 0),\n });\n }\n\n return { series: Array.from(seriesMap.values()) };\n }\n\n const sql = `\n SELECT toStartOfInterval(timestamp, ${intervalSql}) AS bucket,\n ${aggSql} AS value\n FROM ${TABLE_SCORE_EVENTS} ${whereClause}\n GROUP BY bucket\n ORDER BY bucket\n `;\n const rows = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n\n return {\n series: [\n {\n name: args.scoreSource ? `${args.scorerId}|${args.scoreSource}` : args.scorerId,\n points: rows.map(row => ({\n timestamp: row.bucket instanceof Date ? row.bucket : new Date(String(row.bucket)),\n value: Number(row.value ?? 0),\n })),\n },\n ],\n };\n}\n\nexport async function getScorePercentiles(\n client: ClickHouseClient,\n args: GetScorePercentilesArgs,\n): Promise<GetScorePercentilesResponse> {\n const intervalSql = getIntervalSql(args.interval);\n const identity = buildScoreIdentityFilter(args);\n const signalFilter = buildScoresFilterConditions(args.filters);\n const combined = mergeFilters(identity, signalFilter);\n const whereClause = toWhereClause(combined);\n\n if (!Array.isArray(args.percentiles) || args.percentiles.length === 0) {\n throw new Error('Percentiles must include at least one value between 0 and 1.');\n }\n\n const series = [];\n for (const p of args.percentiles) {\n if (!Number.isFinite(p) || p < 0 || p > 1) {\n throw new Error(`Percentile value must be a finite number between 0 and 1, got ${p}`);\n }\n const sql = `\n SELECT toStartOfInterval(timestamp, ${intervalSql}) AS bucket,\n quantile(${p})(score) AS pvalue\n FROM ${TABLE_SCORE_EVENTS}\n ${whereClause}\n GROUP BY bucket\n ORDER BY bucket\n `;\n const rows = await queryJson<Record<string, unknown>>(client, sql, combined.params);\n\n series.push({\n percentile: p,\n points: rows.map(row => ({\n timestamp: row.bucket instanceof Date ? row.bucket : new Date(String(row.bucket)),\n value: Number(row.pvalue ?? 0),\n })),\n });\n }\n\n return { series };\n}\n","/**\n * Trace-roots operations for ClickHouse v-next observability.\n *\n * Owns: listTraces, getRootSpan\n * Reads from: trace_roots (populated by incremental MV from span_events)\n */\n\nimport type { ClickHouseClient } from '@clickhouse/client';\nimport { listTracesArgsSchema, toTraceSpans } from '@mastra/core/storage';\nimport type { GetRootSpanArgs, GetRootSpanResponse, ListTracesArgs, ListTracesResponse } from '@mastra/core/storage';\n\nimport { TABLE_SPAN_EVENTS, TABLE_TRACE_ROOTS } from './ddl';\nimport { buildTraceFilterConditions, buildTraceOrderByClause } from './filters';\nimport { CH_SETTINGS, rowToSpanRecord } from './helpers';\n\n// ---------------------------------------------------------------------------\n// getRootSpan\n// ---------------------------------------------------------------------------\n\n/**\n * Get the root span for a trace, reading from trace_roots as compatibility path.\n * Uses ordinary LIMIT 1 (duplicates are byte-identical per design).\n */\nexport async function getRootSpan(\n client: ClickHouseClient,\n args: GetRootSpanArgs,\n): Promise<GetRootSpanResponse | null> {\n const result = await client.query({\n query: `\n SELECT *\n FROM ${TABLE_TRACE_ROOTS}\n WHERE traceId = {traceId:String}\n LIMIT 1\n `,\n query_params: { traceId: args.traceId },\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n });\n\n const rows = (await result.json()) as Record<string, any>[];\n if (!rows || rows.length === 0) return null;\n\n return { span: rowToSpanRecord(rows[0]!) };\n}\n\n// ---------------------------------------------------------------------------\n// listTraces\n// ---------------------------------------------------------------------------\n\n/**\n * List traces with optional filtering, pagination, and ordering.\n *\n * Reads from trace_roots (root spans only).\n * Uses two-stage query for ReplacingMergeTree deduplication:\n * Inner: filter + deterministic ORDER BY + LIMIT 1 BY dedupeKey\n * Outer: final ordering + pagination\n *\n * hasChildError is handled via EXISTS subquery against span_events.\n */\nexport async function listTraces(client: ClickHouseClient, args: ListTracesArgs): Promise<ListTracesResponse> {\n // Parse args through schema to apply defaults\n const { filters, pagination, orderBy } = listTracesArgsSchema.parse(args);\n const page = pagination?.page ?? 0;\n const perPage = pagination?.perPage ?? 10;\n\n // Build filter conditions\n const { conditions, params } = buildTraceFilterConditions(filters, 'r');\n\n // hasChildError: EXISTS subquery against span_events\n if (filters?.hasChildError != null) {\n if (filters.hasChildError) {\n conditions.push(`EXISTS (\n SELECT 1 FROM ${TABLE_SPAN_EVENTS} c\n WHERE c.traceId = r.traceId\n AND c.parentSpanId IS NOT NULL\n AND c.error IS NOT NULL\n )`);\n } else {\n conditions.push(`NOT EXISTS (\n SELECT 1 FROM ${TABLE_SPAN_EVENTS} c\n WHERE c.traceId = r.traceId\n AND c.parentSpanId IS NOT NULL\n AND c.error IS NOT NULL\n )`);\n }\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n // Outer ORDER BY must not use table alias — the outer SELECT wraps an anonymous subquery\n const orderClause = buildTraceOrderByClause(orderBy);\n\n // Count query (deduplicated)\n const countResult = await client.query({\n query: `\n SELECT count() as cnt FROM (\n SELECT dedupeKey\n FROM ${TABLE_TRACE_ROOTS} r\n ${whereClause}\n ORDER BY dedupeKey\n LIMIT 1 BY dedupeKey\n )\n `,\n query_params: params,\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n });\n\n const countRows = (await countResult.json()) as Array<{ cnt: string | number }>;\n const total = Number(countRows[0]?.cnt ?? 0);\n\n if (total === 0) {\n return {\n pagination: { total: 0, page, perPage, hasMore: false },\n spans: [],\n };\n }\n\n // Data query: two-stage dedupe + pagination\n const dataResult = await client.query({\n query: `\n SELECT * FROM (\n SELECT *\n FROM ${TABLE_TRACE_ROOTS} r\n ${whereClause}\n ORDER BY dedupeKey\n LIMIT 1 BY dedupeKey\n )\n ORDER BY ${orderClause}\n LIMIT {limit:UInt32}\n OFFSET {offset:UInt32}\n `,\n query_params: {\n ...params,\n limit: perPage,\n offset: page * perPage,\n },\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n });\n\n const rows = (await dataResult.json()) as Record<string, any>[];\n const spans = rows.map(rowToSpanRecord);\n\n return {\n pagination: {\n total,\n page,\n perPage,\n hasMore: (page + 1) * perPage < total,\n },\n spans: toTraceSpans(spans),\n };\n}\n","/**\n * Tracing operations for ClickHouse v-next observability.\n *\n * Owns: batchCreateSpans, getSpan, getSpans, getTrace, getTraceLight,\n * listBranches, batchDeleteTraces, dangerouslyClearSpanEvents.\n * Delegates to trace-roots.ts: listTraces, getRootSpan.\n *\n * `listBranches` reads from the MV-fed `mastra_trace_branches` table (one row\n * per branch anchor span). It lives here -- alongside the other read paths\n * over the trace data -- since branches are conceptually a subset of traces.\n */\n\nimport type { ClickHouseClient } from '@clickhouse/client';\nimport { BRANCH_SPAN_TYPES, listBranchesArgsSchema, toTraceSpans, TraceStatus } from '@mastra/core/storage';\nimport type {\n BatchCreateSpansArgs,\n BatchDeleteTracesArgs,\n CreateSpanArgs,\n GetSpanArgs,\n GetSpanResponse,\n GetSpansArgs,\n GetSpansResponse,\n GetTraceArgs,\n GetTraceResponse,\n GetTraceLightResponse,\n LightSpanRecord,\n ListBranchesArgs,\n ListBranchesResponse,\n SpanRecord,\n} from '@mastra/core/storage';\n\nimport { TABLE_SPAN_EVENTS, TABLE_TRACE_BRANCHES, TABLE_TRACE_ROOTS } from './ddl';\nimport { CH_SETTINGS, CH_INSERT_SETTINGS, spanRecordToRow, rowToSpanRecord } from './helpers';\n\nconst BRANCH_SPAN_TYPE_SQL_LIST = BRANCH_SPAN_TYPES.map(t => `'${t}'`).join(', ');\n\n// ---------------------------------------------------------------------------\n// Write operations\n// ---------------------------------------------------------------------------\n\n/** Insert a single completed span. */\nexport async function createSpan(client: ClickHouseClient, args: CreateSpanArgs): Promise<void> {\n const row = spanRecordToRow(args.span);\n await client.insert({\n table: TABLE_SPAN_EVENTS,\n values: [row],\n format: 'JSONEachRow',\n clickhouse_settings: CH_INSERT_SETTINGS,\n });\n}\n\n/** Insert a batch of completed spans. */\nexport async function batchCreateSpans(client: ClickHouseClient, args: BatchCreateSpansArgs): Promise<void> {\n if (args.records.length === 0) return;\n\n const rows = args.records.map(spanRecordToRow);\n await client.insert({\n table: TABLE_SPAN_EVENTS,\n values: rows,\n format: 'JSONEachRow',\n clickhouse_settings: CH_INSERT_SETTINGS,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Read operations\n// ---------------------------------------------------------------------------\n\n/**\n * Batch-fetch spans by spanId within a trace. Single SELECT keyed by\n * `(traceId, spanId)`; the span_events ORDER BY `(traceId, endedAt, spanId, dedupeKey)`\n * means traceId narrowing is index-prefixed and the spanId IN(...) filter is\n * cheap to evaluate within that range.\n *\n * Returns spans in arbitrary order; caller is expected to sort. Spans not\n * found are silently omitted (callers handle the empty/partial case).\n */\nexport async function getSpans(client: ClickHouseClient, args: GetSpansArgs): Promise<GetSpansResponse> {\n if (args.spanIds.length === 0) {\n return { traceId: args.traceId, spans: [] };\n }\n\n const result = await client.query({\n query: `\n SELECT * FROM (\n SELECT *\n FROM ${TABLE_SPAN_EVENTS}\n WHERE traceId = {traceId:String}\n AND spanId IN {spanIds:Array(String)}\n ORDER BY dedupeKey, endedAt DESC\n LIMIT 1 BY dedupeKey\n )\n `,\n query_params: { traceId: args.traceId, spanIds: args.spanIds },\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n });\n\n const rows = (await result.json()) as Record<string, any>[];\n const spans: SpanRecord[] = rows.map(rowToSpanRecord);\n return { traceId: args.traceId, spans };\n}\n\n/** Get a single span by (traceId, spanId). Uses ordinary LIMIT 1. */\nexport async function getSpan(client: ClickHouseClient, args: GetSpanArgs): Promise<GetSpanResponse | null> {\n const result = await client.query({\n query: `\n SELECT *\n FROM ${TABLE_SPAN_EVENTS}\n WHERE traceId = {traceId:String} AND spanId = {spanId:String}\n LIMIT 1\n `,\n query_params: { traceId: args.traceId, spanId: args.spanId },\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n });\n\n const rows = (await result.json()) as Record<string, any>[];\n if (!rows || rows.length === 0) return null;\n\n return { span: rowToSpanRecord(rows[0]!) };\n}\n\n/**\n * Get all spans for a trace.\n *\n * Uses two-stage query for ReplacingMergeTree deduplication:\n * Inner: narrow to traceId → deterministic ORDER BY → LIMIT 1 BY dedupeKey\n * Outer: no additional ordering needed (caller sorts)\n */\nexport async function getTrace(client: ClickHouseClient, args: GetTraceArgs): Promise<GetTraceResponse | null> {\n const result = await client.query({\n query: `\n SELECT * FROM (\n SELECT *\n FROM ${TABLE_SPAN_EVENTS}\n WHERE traceId = {traceId:String}\n ORDER BY dedupeKey, endedAt DESC\n LIMIT 1 BY dedupeKey\n )\n ORDER BY startedAt ASC\n `,\n query_params: { traceId: args.traceId },\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n });\n\n const rows = (await result.json()) as Record<string, any>[];\n if (!rows || rows.length === 0) return null;\n\n const spans: SpanRecord[] = rows.map(rowToSpanRecord);\n return { traceId: args.traceId, spans };\n}\n\n/**\n * Lightweight trace fetch — only timeline-relevant columns.\n */\nexport async function getTraceLight(\n client: ClickHouseClient,\n args: GetTraceArgs,\n): Promise<GetTraceLightResponse | null> {\n const result = await client.query({\n query: `\n SELECT traceId, spanId, parentSpanId, name,\n entityType, entityId, entityName,\n spanType, error, isEvent,\n startedAt, endedAt\n FROM (\n SELECT *\n FROM ${TABLE_SPAN_EVENTS}\n WHERE traceId = {traceId:String}\n ORDER BY dedupeKey, endedAt DESC\n LIMIT 1 BY dedupeKey\n )\n ORDER BY startedAt ASC\n `,\n query_params: { traceId: args.traceId },\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n });\n\n const rows = (await result.json()) as Record<string, any>[];\n if (!rows || rows.length === 0) return null;\n\n const spans: LightSpanRecord[] = rows.map(rowToSpanRecord);\n return { traceId: args.traceId, spans };\n}\n\n// ---------------------------------------------------------------------------\n// Delete operations\n// ---------------------------------------------------------------------------\n\n/**\n * Delete traces by traceId.\n * Issues lightweight DELETE against both span_events and trace_roots.\n *\n * Targets rows by tracing identity: traceId + dedupeKey (which starts with traceId).\n * The dedupeKey condition is redundant for correctness (dedupeKey = traceId:spanId)\n * but satisfies the design-doc requirement that trace deletes reference dedupeKey\n * and helps the engine narrow within the sorted ORDER BY key.\n */\nexport async function batchDeleteTraces(client: ClickHouseClient, args: BatchDeleteTracesArgs): Promise<void> {\n if (args.traceIds.length === 0) return;\n\n // Build parameterized IN list and dedupeKey prefix conditions\n const params: Record<string, string> = {};\n const traceInPlaceholders: string[] = [];\n const dedupeOrParts: string[] = [];\n for (let i = 0; i < args.traceIds.length; i++) {\n const tidParam = `tid_${i}`;\n const dkPrefix = `dk_${i}`;\n params[tidParam] = args.traceIds[i]!;\n params[dkPrefix] = `${args.traceIds[i]!}:`;\n traceInPlaceholders.push(`{${tidParam}:String}`);\n dedupeOrParts.push(`startsWith(dedupeKey, {${dkPrefix}:String})`);\n }\n const traceInList = traceInPlaceholders.join(', ');\n const dedupeCondition = dedupeOrParts.length === 1 ? dedupeOrParts[0] : `(${dedupeOrParts.join(' OR ')})`;\n\n // Lightweight deletes (DELETE FROM) are immediately visible to subsequent reads,\n // unlike ALTER TABLE ... DELETE which schedules an async mutation.\n await Promise.all([\n client.command({\n query: `DELETE FROM ${TABLE_SPAN_EVENTS} WHERE traceId IN (${traceInList}) AND ${dedupeCondition}`,\n query_params: params,\n }),\n client.command({\n query: `DELETE FROM ${TABLE_TRACE_ROOTS} WHERE traceId IN (${traceInList}) AND ${dedupeCondition}`,\n query_params: params,\n }),\n ]);\n}\n\n/** Truncate all tracing tables (span_events + trace_roots). */\nexport async function dangerouslyClearSpanEvents(client: ClickHouseClient): Promise<void> {\n await Promise.all([\n client.command({ query: `TRUNCATE TABLE IF EXISTS ${TABLE_SPAN_EVENTS}` }),\n client.command({ query: `TRUNCATE TABLE IF EXISTS ${TABLE_TRACE_ROOTS}` }),\n ]);\n}\n\n// ---------------------------------------------------------------------------\n// listBranches — read from MV-fed mastra_trace_branches table\n// ---------------------------------------------------------------------------\n\n/**\n * List trace branches with optional filtering, pagination, and ordering.\n *\n * Reads from `mastra_trace_branches` (one row per branch anchor span). Uses\n * the same two-stage dedupe + paginate pattern as listTraces.\n *\n * Filters apply to the anchor span itself (not to a containing trace root) --\n * which is the whole point of this surface.\n */\nexport async function listBranches(client: ClickHouseClient, args: ListBranchesArgs): Promise<ListBranchesResponse> {\n const { filters, pagination, orderBy } = listBranchesArgsSchema.parse(args);\n const page = pagination?.page ?? 0;\n const perPage = pagination?.perPage ?? 10;\n\n const conditions: string[] = [];\n const params: Record<string, unknown> = {};\n\n if (filters?.spanType) {\n conditions.push(`spanType = {spanType:String}`);\n params.spanType = filters.spanType;\n } else {\n // Defense in depth: the MV WHERE clause already restricts the table to\n // these span types, but pinning the predicate at query time also prunes\n // any row that may have leaked in via direct insertion.\n conditions.push(`spanType IN (${BRANCH_SPAN_TYPE_SQL_LIST})`);\n }\n\n if (filters?.startedAt?.start) {\n const op = filters.startedAt.startExclusive ? '>' : '>=';\n conditions.push(`startedAt ${op} {startedAtStart:DateTime64(3)}`);\n params.startedAtStart = filters.startedAt.start.getTime();\n }\n if (filters?.startedAt?.end) {\n const op = filters.startedAt.endExclusive ? '<' : '<=';\n conditions.push(`startedAt ${op} {startedAtEnd:DateTime64(3)}`);\n params.startedAtEnd = filters.startedAt.end.getTime();\n }\n if (filters?.endedAt?.start) {\n const op = filters.endedAt.startExclusive ? '>' : '>=';\n conditions.push(`endedAt ${op} {endedAtStart:DateTime64(3)}`);\n params.endedAtStart = filters.endedAt.start.getTime();\n }\n if (filters?.endedAt?.end) {\n const op = filters.endedAt.endExclusive ? '<' : '<=';\n conditions.push(`endedAt ${op} {endedAtEnd:DateTime64(3)}`);\n params.endedAtEnd = filters.endedAt.end.getTime();\n }\n\n // All other filters apply to the anchor span itself.\n type EqDef = { col: string; value: unknown; param: string };\n const eq: EqDef[] = [\n { col: 'traceId', value: filters?.traceId, param: 'traceId' },\n { col: 'entityType', value: filters?.entityType, param: 'entityType' },\n { col: 'entityId', value: filters?.entityId, param: 'entityId' },\n { col: 'entityName', value: filters?.entityName, param: 'entityName' },\n { col: 'entityVersionId', value: filters?.entityVersionId, param: 'entityVersionId' },\n { col: 'parentEntityVersionId', value: filters?.parentEntityVersionId, param: 'parentEntityVersionId' },\n { col: 'parentEntityType', value: filters?.parentEntityType, param: 'parentEntityType' },\n { col: 'parentEntityId', value: filters?.parentEntityId, param: 'parentEntityId' },\n { col: 'parentEntityName', value: filters?.parentEntityName, param: 'parentEntityName' },\n { col: 'rootEntityVersionId', value: filters?.rootEntityVersionId, param: 'rootEntityVersionId' },\n { col: 'rootEntityType', value: filters?.rootEntityType, param: 'rootEntityType' },\n { col: 'rootEntityId', value: filters?.rootEntityId, param: 'rootEntityId' },\n { col: 'rootEntityName', value: filters?.rootEntityName, param: 'rootEntityName' },\n { col: 'experimentId', value: filters?.experimentId, param: 'experimentId' },\n { col: 'userId', value: filters?.userId, param: 'userId' },\n { col: 'organizationId', value: filters?.organizationId, param: 'organizationId' },\n { col: 'resourceId', value: filters?.resourceId, param: 'resourceId' },\n { col: 'runId', value: filters?.runId, param: 'runId' },\n { col: 'sessionId', value: filters?.sessionId, param: 'sessionId' },\n { col: 'threadId', value: filters?.threadId, param: 'threadId' },\n { col: 'requestId', value: filters?.requestId, param: 'requestId' },\n { col: 'environment', value: filters?.environment, param: 'environment' },\n { col: 'executionSource', value: filters?.source, param: 'source' },\n { col: 'serviceName', value: filters?.serviceName, param: 'serviceName' },\n ];\n for (const { col, value, param } of eq) {\n if (value == null) continue;\n conditions.push(`${col} = {${param}:String}`);\n params[param] = value;\n }\n\n if (filters?.tags && filters.tags.length > 0) {\n for (let i = 0; i < filters.tags.length; i++) {\n const tag = filters.tags[i];\n if (typeof tag !== 'string' || tag.trim() === '') continue;\n const param = `tag_${i}`;\n conditions.push(`has(tags, {${param}:String})`);\n params[param] = tag;\n }\n }\n\n if (filters?.metadata != null && typeof filters.metadata === 'object') {\n let i = 0;\n for (const [key, value] of Object.entries(filters.metadata)) {\n if (typeof value !== 'string') continue;\n const keyParam = `meta_k_${i}`;\n const valParam = `meta_v_${i}`;\n conditions.push(`metadataSearch[{${keyParam}:String}] = {${valParam}:String}`);\n params[keyParam] = key;\n params[valParam] = value;\n i++;\n }\n }\n\n // scope is stored as JSON-encoded text (Nullable(String)) -- match the\n // semantics used by in-memory and DuckDB backends: every key/value in the\n // filter object must equal the same key in the row's scope. JSON-encoded\n // values (objects, arrays, numbers) are matched after JSON.stringify so a\n // caller can pass either a stringified scalar or the original value.\n if (filters?.scope != null && typeof filters.scope === 'object') {\n let i = 0;\n for (const [key, value] of Object.entries(filters.scope)) {\n if (value === undefined) continue;\n const normalized = typeof value === 'string' ? value : JSON.stringify(value);\n if (normalized == null) continue;\n const keyParam = `scope_k_${i}`;\n const valParam = `scope_v_${i}`;\n conditions.push(`JSONExtractString(scope, {${keyParam}:String}) = {${valParam}:String}`);\n params[keyParam] = key;\n params[valParam] = normalized;\n i++;\n }\n }\n\n if (filters?.status === TraceStatus.ERROR) {\n conditions.push(`error IS NOT NULL`);\n } else if (filters?.status === TraceStatus.SUCCESS) {\n conditions.push(`error IS NULL`);\n } else if (filters?.status === TraceStatus.RUNNING) {\n // listBranches reads completed-span data; running spans are not surfaced.\n conditions.push('1 = 0');\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const sortField = orderBy?.field === 'endedAt' ? 'endedAt' : 'startedAt';\n const sortDirection = orderBy?.direction === 'ASC' ? 'ASC' : 'DESC';\n\n // Count (deduplicated)\n const countResult = await client.query({\n query: `\n SELECT count() as cnt FROM (\n SELECT dedupeKey\n FROM ${TABLE_TRACE_BRANCHES}\n ${whereClause}\n ORDER BY dedupeKey\n LIMIT 1 BY dedupeKey\n )\n `,\n query_params: params,\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n });\n const countRows = (await countResult.json()) as Array<{ cnt: string | number }>;\n const total = Number(countRows[0]?.cnt ?? 0);\n\n if (total === 0) {\n return {\n pagination: { total: 0, page, perPage, hasMore: false },\n branches: [],\n };\n }\n\n const dataResult = await client.query({\n query: `\n SELECT * FROM (\n SELECT *\n FROM ${TABLE_TRACE_BRANCHES}\n ${whereClause}\n ORDER BY dedupeKey\n LIMIT 1 BY dedupeKey\n )\n ORDER BY ${sortField} ${sortDirection}, dedupeKey ASC\n LIMIT {limit:UInt32}\n OFFSET {offset:UInt32}\n `,\n query_params: {\n ...params,\n limit: perPage,\n offset: page * perPage,\n },\n format: 'JSONEachRow',\n clickhouse_settings: CH_SETTINGS,\n });\n const rows = (await dataResult.json()) as Record<string, any>[];\n const spans = rows.map(rowToSpanRecord);\n\n return {\n pagination: {\n total,\n page,\n perPage,\n hasMore: (page + 1) * perPage < total,\n },\n branches: toTraceSpans(spans),\n };\n}\n","/**\n * ClickHouse v-next observability storage domain.\n *\n * Insert-only model: Uses ReplacingMergeTree for all signals\n * with dedupeKey for retry-idempotency.\n *\n * Domain layout follows DuckDB reference: thin class delegating to module functions.\n */\n\nimport type { ClickHouseClient } from '@clickhouse/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { createStorageErrorId, ObservabilityStorage } from '@mastra/core/storage';\nimport type {\n ObservabilityStorageStrategy,\n BatchCreateSpansArgs,\n BatchDeleteTracesArgs,\n CreateSpanArgs,\n GetRootSpanArgs,\n GetRootSpanResponse,\n GetSpanArgs,\n GetSpanResponse,\n GetSpansArgs,\n GetSpansResponse,\n GetTraceArgs,\n GetTraceResponse,\n GetTraceLightResponse,\n ListBranchesArgs,\n ListBranchesResponse,\n ListTracesArgs,\n ListTracesResponse,\n BatchCreateLogsArgs,\n ListLogsArgs,\n ListLogsResponse,\n BatchCreateMetricsArgs,\n ListMetricsArgs,\n ListMetricsResponse,\n GetMetricAggregateArgs,\n GetMetricAggregateResponse,\n GetMetricBreakdownArgs,\n GetMetricBreakdownResponse,\n GetMetricTimeSeriesArgs,\n GetMetricTimeSeriesResponse,\n GetMetricPercentilesArgs,\n GetMetricPercentilesResponse,\n GetMetricNamesArgs,\n GetMetricNamesResponse,\n GetMetricLabelKeysArgs,\n GetMetricLabelKeysResponse,\n GetMetricLabelValuesArgs,\n GetMetricLabelValuesResponse,\n CreateScoreArgs,\n BatchCreateScoresArgs,\n ListScoresArgs,\n ListScoresResponse,\n ScoreRecord,\n GetScoreAggregateArgs,\n GetScoreAggregateResponse,\n GetScoreBreakdownArgs,\n GetScoreBreakdownResponse,\n GetScoreTimeSeriesArgs,\n GetScoreTimeSeriesResponse,\n GetScorePercentilesArgs,\n GetScorePercentilesResponse,\n CreateFeedbackArgs,\n BatchCreateFeedbackArgs,\n ListFeedbackArgs,\n ListFeedbackResponse,\n GetFeedbackAggregateArgs,\n GetFeedbackAggregateResponse,\n GetFeedbackBreakdownArgs,\n GetFeedbackBreakdownResponse,\n GetFeedbackTimeSeriesArgs,\n GetFeedbackTimeSeriesResponse,\n GetFeedbackPercentilesArgs,\n GetFeedbackPercentilesResponse,\n GetEntityTypesArgs,\n GetEntityTypesResponse,\n GetEntityNamesArgs,\n GetEntityNamesResponse,\n GetServiceNamesArgs,\n GetServiceNamesResponse,\n GetEnvironmentsArgs,\n GetEnvironmentsResponse,\n GetTagsArgs,\n GetTagsResponse,\n} from '@mastra/core/storage';\n\nimport { resolveClickhouseConfig } from '../../../db';\nimport type { ClickhouseDomainConfig } from '../../../db';\n\nimport {\n ALL_TABLE_DDL,\n ALL_MV_DDL,\n ALL_MIGRATIONS,\n DISCOVERY_MV_DDL,\n ALL_TABLE_NAMES,\n MV_DISCOVERY_VALUES,\n MV_DISCOVERY_PAIRS,\n buildRetentionDDL,\n} from './ddl';\nimport type { RetentionConfig } from './ddl';\nexport type { RetentionConfig } from './ddl';\n\n/** Extended config for v-next observability, adding per-signal retention. */\nexport type VNextObservabilityConfig = ClickhouseDomainConfig & {\n retention?: RetentionConfig;\n};\nimport * as discoveryOps from './discovery';\nimport * as feedbackOps from './feedback';\nimport * as logsOps from './logs';\nimport * as metricsOps from './metrics';\nimport { checkSignalTablesMigrationStatus, migrateSignalTables } from './migration';\nimport * as scoresOps from './scores';\nimport * as traceRootsOps from './trace-roots';\nimport * as tracingOps from './tracing';\n\nfunction buildSignalMigrationRequiredMessage(args: {\n store: 'ClickHouse';\n tables: Array<{ table: string; engine: string }>;\n}): string {\n const tableList = args.tables.map(table => ` - ${table.table} (${table.engine})`).join('\\n');\n\n return (\n `\\n` +\n `===========================================================================\\n` +\n `MIGRATION REQUIRED: ${args.store} observability signal tables need signal IDs\\n` +\n `===========================================================================\\n` +\n `\\n` +\n `The following signal tables still use the legacy schema and must be migrated\\n` +\n `before observability storage can initialize:\\n` +\n `\\n` +\n `${tableList}\\n` +\n `\\n` +\n `To fix this, run the manual migration command:\\n` +\n `\\n` +\n ` npx mastra migrate\\n` +\n `\\n` +\n `This command will:\\n` +\n ` 1. Create replacement signal tables with signal-ID dedupe keys\\n` +\n ` 2. Backfill missing signal IDs for legacy rows\\n` +\n ` 3. Swap the migrated tables into place\\n` +\n `\\n` +\n `WARNING: This migration recreates the signal tables and may take significant\\n` +\n `time for large databases. Please ensure you have a backup before proceeding.\\n` +\n `===========================================================================\\n`\n );\n}\n\nexport class ObservabilityStorageClickhouseVNext extends ObservabilityStorage {\n readonly #client: ClickHouseClient;\n readonly #retention?: RetentionConfig;\n\n constructor(config: VNextObservabilityConfig) {\n super();\n const { client } = resolveClickhouseConfig(config);\n this.#client = client;\n this.#retention = config.retention;\n }\n\n // -------------------------------------------------------------------------\n // Initialization\n // -------------------------------------------------------------------------\n\n async init(): Promise<void> {\n const migrationStatus = await checkSignalTablesMigrationStatus(this.#client);\n if (migrationStatus.needsMigration) {\n throw new MastraError({\n id: createStorageErrorId('CLICKHOUSE', 'MIGRATION_REQUIRED', 'SIGNAL_TABLES'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: buildSignalMigrationRequiredMessage({\n store: 'ClickHouse',\n tables: migrationStatus.tables.map(({ table, engine }) => ({ table, engine })),\n }),\n });\n }\n\n try {\n // Core tables + incremental MVs (must succeed)\n for (const ddl of [...ALL_TABLE_DDL, ...ALL_MV_DDL]) {\n await this.#client.command({ query: ddl });\n }\n\n // Additive migrations for existing databases (add new columns)\n for (const migration of ALL_MIGRATIONS) {\n await this.#client.command({ query: migration });\n }\n\n // Apply retention TTL if configured (per design doc: per-signal, day increments).\n // Uses ALTER TABLE ... MODIFY TTL so re-running init is idempotent.\n if (this.#retention) {\n const ttlStatements = buildRetentionDDL(this.#retention);\n for (const stmt of ttlStatements) {\n await this.#client.command({ query: stmt });\n }\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n const causeMessage = error instanceof Error ? error.message : String(error);\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'VNEXT_INIT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to initialize ClickHouse v-next observability tables: ${causeMessage}`,\n },\n error,\n );\n }\n\n // Discovery refreshable MVs — bootstrap separately.\n // Per design: \"bootstrap failure should not fail the base observability adapter;\n // discovery methods should continue returning empty results until a later refresh succeeds.\"\n try {\n for (const ddl of DISCOVERY_MV_DDL) {\n await this.#client.command({ query: ddl });\n }\n // Trigger an immediate refresh so discovery data is available right away\n // instead of waiting for the first scheduled refresh cycle.\n // SYSTEM REFRESH VIEW kicks off the refresh; SYSTEM WAIT VIEW blocks\n // until it finishes (or re-throws if the refresh failed).\n await this.#client.command({ query: `SYSTEM REFRESH VIEW ${MV_DISCOVERY_VALUES}` });\n await this.#client.command({ query: `SYSTEM WAIT VIEW ${MV_DISCOVERY_VALUES}` });\n await this.#client.command({ query: `SYSTEM REFRESH VIEW ${MV_DISCOVERY_PAIRS}` });\n await this.#client.command({ query: `SYSTEM WAIT VIEW ${MV_DISCOVERY_PAIRS}` });\n } catch {\n // Discovery MVs may fail on ClickHouse versions without refreshable MV support.\n // Discovery methods will return empty results until the MVs are created and refreshed.\n }\n }\n\n /**\n * Manually migrate legacy signal tables to the signal-ID ReplacingMergeTree schema.\n * The public method name is historical; the CLI still calls `migrateSpans()`\n * for observability migrations even though this now also migrates signal tables.\n */\n async migrateSpans(): Promise<{\n success: boolean;\n alreadyMigrated: boolean;\n duplicatesRemoved: number;\n message: string;\n }> {\n const migrationStatus = await checkSignalTablesMigrationStatus(this.#client);\n\n if (!migrationStatus.needsMigration) {\n return {\n success: true,\n alreadyMigrated: true,\n duplicatesRemoved: 0,\n message: 'Migration already complete. Signal tables already use signal-ID dedupe keys.',\n };\n }\n\n await migrateSignalTables(this.#client, this.logger);\n\n return {\n success: true,\n alreadyMigrated: false,\n duplicatesRemoved: 0,\n message: `Migration complete. Migrated signal tables: ${migrationStatus.tables.map(t => t.table).join(', ')}.`,\n };\n }\n\n // -------------------------------------------------------------------------\n // Strategy\n // -------------------------------------------------------------------------\n\n public override get observabilityStrategy(): {\n preferred: ObservabilityStorageStrategy;\n supported: ObservabilityStorageStrategy[];\n } {\n return {\n preferred: 'insert-only',\n supported: ['insert-only'],\n };\n }\n\n // -------------------------------------------------------------------------\n // Tracing — writes\n // -------------------------------------------------------------------------\n\n override async createSpan(args: CreateSpanArgs): Promise<void> {\n try {\n await tracingOps.createSpan(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'CREATE_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId: args.span.traceId, spanId: args.span.spanId },\n },\n error,\n );\n }\n }\n\n override async batchCreateSpans(args: BatchCreateSpansArgs): Promise<void> {\n try {\n await tracingOps.batchCreateSpans(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_CREATE_SPANS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { count: args.records.length },\n },\n error,\n );\n }\n }\n\n // -------------------------------------------------------------------------\n // Tracing — reads\n // -------------------------------------------------------------------------\n\n override async getSpan(args: GetSpanArgs): Promise<GetSpanResponse | null> {\n try {\n return await tracingOps.getSpan(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId: args.traceId, spanId: args.spanId },\n },\n error,\n );\n }\n }\n\n override async getSpans(args: GetSpansArgs): Promise<GetSpansResponse> {\n try {\n return await tracingOps.getSpans(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_SPANS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId: args.traceId, count: args.spanIds.length },\n },\n error,\n );\n }\n }\n\n override async getRootSpan(args: GetRootSpanArgs): Promise<GetRootSpanResponse | null> {\n try {\n return await traceRootsOps.getRootSpan(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_ROOT_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId: args.traceId },\n },\n error,\n );\n }\n }\n\n override async getTrace(args: GetTraceArgs): Promise<GetTraceResponse | null> {\n try {\n return await tracingOps.getTrace(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_TRACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId: args.traceId },\n },\n error,\n );\n }\n }\n\n override async getTraceLight(args: GetTraceArgs): Promise<GetTraceLightResponse | null> {\n try {\n return await tracingOps.getTraceLight(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_TRACE_LIGHT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId: args.traceId },\n },\n error,\n );\n }\n }\n\n override async listTraces(args: ListTracesArgs): Promise<ListTracesResponse> {\n try {\n return await traceRootsOps.listTraces(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async listBranches(args: ListBranchesArgs): Promise<ListBranchesResponse> {\n try {\n return await tracingOps.listBranches(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_BRANCHES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async batchCreateLogs(args: BatchCreateLogsArgs): Promise<void> {\n try {\n await logsOps.batchCreateLogs(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_CREATE_LOGS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { count: args.logs.length },\n },\n error,\n );\n }\n }\n\n override async listLogs(args: ListLogsArgs): Promise<ListLogsResponse> {\n try {\n return await logsOps.listLogs(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_LOGS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async batchCreateMetrics(args: BatchCreateMetricsArgs): Promise<void> {\n try {\n await metricsOps.batchCreateMetrics(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_CREATE_METRICS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { count: args.metrics.length },\n },\n error,\n );\n }\n }\n\n override async listMetrics(args: ListMetricsArgs): Promise<ListMetricsResponse> {\n try {\n return await metricsOps.listMetrics(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_METRICS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async createScore(args: CreateScoreArgs): Promise<void> {\n try {\n await scoresOps.createScore(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'CREATE_SCORE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async batchCreateScores(args: BatchCreateScoresArgs): Promise<void> {\n try {\n await scoresOps.batchCreateScores(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_CREATE_SCORES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { count: args.scores.length },\n },\n error,\n );\n }\n }\n\n override async listScores(args: ListScoresArgs): Promise<ListScoresResponse> {\n try {\n return await scoresOps.listScores(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_SCORES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getScoreById(scoreId: string): Promise<ScoreRecord | null> {\n try {\n return await scoresOps.getScoreById(this.#client, scoreId);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_SCORE_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scoreId },\n },\n error,\n );\n }\n }\n\n override async createFeedback(args: CreateFeedbackArgs): Promise<void> {\n try {\n await feedbackOps.createFeedback(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'CREATE_FEEDBACK', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async batchCreateFeedback(args: BatchCreateFeedbackArgs): Promise<void> {\n try {\n await feedbackOps.batchCreateFeedback(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_CREATE_FEEDBACK', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { count: args.feedbacks.length },\n },\n error,\n );\n }\n }\n\n override async listFeedback(args: ListFeedbackArgs): Promise<ListFeedbackResponse> {\n try {\n return await feedbackOps.listFeedback(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_FEEDBACK', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // -------------------------------------------------------------------------\n // Scores — OLAP\n // -------------------------------------------------------------------------\n\n override async getScoreAggregate(args: GetScoreAggregateArgs): Promise<GetScoreAggregateResponse> {\n try {\n return await scoresOps.getScoreAggregate(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_SCORE_AGGREGATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getScoreBreakdown(args: GetScoreBreakdownArgs): Promise<GetScoreBreakdownResponse> {\n try {\n return await scoresOps.getScoreBreakdown(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_SCORE_BREAKDOWN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getScoreTimeSeries(args: GetScoreTimeSeriesArgs): Promise<GetScoreTimeSeriesResponse> {\n try {\n return await scoresOps.getScoreTimeSeries(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_SCORE_TIME_SERIES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getScorePercentiles(args: GetScorePercentilesArgs): Promise<GetScorePercentilesResponse> {\n try {\n return await scoresOps.getScorePercentiles(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_SCORE_PERCENTILES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // -------------------------------------------------------------------------\n // Feedback — OLAP\n // -------------------------------------------------------------------------\n\n override async getFeedbackAggregate(args: GetFeedbackAggregateArgs): Promise<GetFeedbackAggregateResponse> {\n try {\n return await feedbackOps.getFeedbackAggregate(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_FEEDBACK_AGGREGATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getFeedbackBreakdown(args: GetFeedbackBreakdownArgs): Promise<GetFeedbackBreakdownResponse> {\n try {\n return await feedbackOps.getFeedbackBreakdown(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_FEEDBACK_BREAKDOWN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getFeedbackTimeSeries(args: GetFeedbackTimeSeriesArgs): Promise<GetFeedbackTimeSeriesResponse> {\n try {\n return await feedbackOps.getFeedbackTimeSeries(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_FEEDBACK_TIME_SERIES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getFeedbackPercentiles(args: GetFeedbackPercentilesArgs): Promise<GetFeedbackPercentilesResponse> {\n try {\n return await feedbackOps.getFeedbackPercentiles(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_FEEDBACK_PERCENTILES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // -------------------------------------------------------------------------\n // Metrics — OLAP\n // -------------------------------------------------------------------------\n\n override async getMetricAggregate(args: GetMetricAggregateArgs): Promise<GetMetricAggregateResponse> {\n try {\n return await metricsOps.getMetricAggregate(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_METRIC_AGGREGATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getMetricBreakdown(args: GetMetricBreakdownArgs): Promise<GetMetricBreakdownResponse> {\n try {\n return await metricsOps.getMetricBreakdown(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_METRIC_BREAKDOWN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getMetricTimeSeries(args: GetMetricTimeSeriesArgs): Promise<GetMetricTimeSeriesResponse> {\n try {\n return await metricsOps.getMetricTimeSeries(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_METRIC_TIME_SERIES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getMetricPercentiles(args: GetMetricPercentilesArgs): Promise<GetMetricPercentilesResponse> {\n try {\n return await metricsOps.getMetricPercentiles(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_METRIC_PERCENTILES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // -------------------------------------------------------------------------\n // Metrics — discovery\n // -------------------------------------------------------------------------\n\n override async getMetricNames(args: GetMetricNamesArgs): Promise<GetMetricNamesResponse> {\n try {\n return await metricsOps.getMetricNames(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_METRIC_NAMES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getMetricLabelKeys(args: GetMetricLabelKeysArgs): Promise<GetMetricLabelKeysResponse> {\n try {\n return await metricsOps.getMetricLabelKeys(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_METRIC_LABEL_KEYS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getMetricLabelValues(args: GetMetricLabelValuesArgs): Promise<GetMetricLabelValuesResponse> {\n try {\n return await metricsOps.getMetricLabelValues(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_METRIC_LABEL_VALUES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // -------------------------------------------------------------------------\n // General discovery\n // -------------------------------------------------------------------------\n\n override async getEntityTypes(args: GetEntityTypesArgs): Promise<GetEntityTypesResponse> {\n try {\n return await discoveryOps.getEntityTypes(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_ENTITY_TYPES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getEntityNames(args: GetEntityNamesArgs): Promise<GetEntityNamesResponse> {\n try {\n return await discoveryOps.getEntityNames(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_ENTITY_NAMES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getServiceNames(args: GetServiceNamesArgs): Promise<GetServiceNamesResponse> {\n try {\n return await discoveryOps.getServiceNames(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_SERVICE_NAMES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getEnvironments(args: GetEnvironmentsArgs): Promise<GetEnvironmentsResponse> {\n try {\n return await discoveryOps.getEnvironments(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_ENVIRONMENTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n override async getTags(args: GetTagsArgs): Promise<GetTagsResponse> {\n try {\n return await discoveryOps.getTags(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_TAGS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // -------------------------------------------------------------------------\n // Tracing — deletes\n // -------------------------------------------------------------------------\n\n override async batchDeleteTraces(args: BatchDeleteTracesArgs): Promise<void> {\n try {\n await tracingOps.batchDeleteTraces(this.#client, args);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_DELETE_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { count: args.traceIds.length },\n },\n error,\n );\n }\n }\n\n // -------------------------------------------------------------------------\n // Dangerous clear all\n // -------------------------------------------------------------------------\n\n override async dangerouslyClearAll(): Promise<void> {\n try {\n // Truncate all signal tables\n await Promise.all(\n ALL_TABLE_NAMES.map(table => this.#client.command({ query: `TRUNCATE TABLE IF EXISTS ${table}` })),\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'DANGEROUS_CLEAR_ALL', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { saveScorePayloadSchema } from '@mastra/core/evals';\nimport type { ListScoresResponse, SaveScorePayload, ScoreRowData, ScoringSource } from '@mastra/core/evals';\nimport {\n createStorageErrorId,\n ScoresStorage,\n SCORERS_SCHEMA,\n TABLE_SCORERS,\n calculatePagination,\n normalizePerPage,\n transformScoreRow as coreTransformScoreRow,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type { StoragePagination } from '@mastra/core/storage';\nimport { ClickhouseDB, resolveClickhouseConfig } from '../../db';\nimport type { ClickhouseDomainConfig } from '../../db';\n\nexport class ScoresStorageClickhouse extends ScoresStorage {\n protected client: ClickHouseClient;\n #db: ClickhouseDB;\n constructor(config: ClickhouseDomainConfig) {\n super();\n const { client, ttl } = resolveClickhouseConfig(config);\n this.client = client;\n this.#db = new ClickhouseDB({ client, ttl });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_SCORERS, schema: TABLE_SCHEMAS[TABLE_SCORERS] });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_SCORERS });\n }\n\n /**\n * ClickHouse-specific score row transformation.\n * Converts timestamps to Date objects and filters out '_null_' values.\n */\n private transformScoreRow(row: any): ScoreRowData {\n return coreTransformScoreRow(row, {\n convertTimestamps: true,\n nullValuePattern: '_null_',\n });\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n try {\n const result = await this.client.query({\n query: `SELECT * FROM ${TABLE_SCORERS} WHERE id = {var_id:String}`,\n query_params: { var_id: id },\n format: 'JSONEachRow',\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const resultJson = await result.json();\n if (!Array.isArray(resultJson) || resultJson.length === 0) {\n return null;\n }\n\n return this.transformScoreRow(resultJson[0]);\n // return this.parseScoreRow(resultJson[0]);\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_SCORE_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scoreId: id },\n },\n error,\n );\n }\n }\n\n async saveScore(score: SaveScorePayload): Promise<{ score: ScoreRowData }> {\n let parsedScore: SaveScorePayload;\n try {\n parsedScore = saveScorePayloadSchema.parse(score);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'SAVE_SCORE', 'VALIDATION_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n scorer: typeof score.scorer?.id === 'string' ? score.scorer.id : String(score.scorer?.id ?? 'unknown'),\n entityId: score.entityId ?? 'unknown',\n entityType: score.entityType ?? 'unknown',\n traceId: score.traceId ?? '',\n spanId: score.spanId ?? '',\n },\n },\n error,\n );\n }\n\n const now = new Date();\n const id = crypto.randomUUID();\n const createdAt = now;\n const updatedAt = now;\n\n try {\n // Build record from schema columns, converting undefined to null for ClickHouse\n const record: Record<string, unknown> = {};\n for (const key of Object.keys(SCORERS_SCHEMA)) {\n if (key === 'id') {\n record[key] = id;\n continue;\n }\n if (key === 'createdAt' || key === 'updatedAt') {\n record[key] = now.toISOString();\n continue;\n }\n const value = parsedScore[key as keyof typeof parsedScore];\n record[key] = value === undefined || value === null ? '_null_' : value;\n }\n\n await this.client.insert({\n table: TABLE_SCORERS,\n values: [record],\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n return { score: { ...parsedScore, id, createdAt, updatedAt } as ScoreRowData };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'SAVE_SCORE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scoreId: id },\n },\n error,\n );\n }\n }\n\n async listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n try {\n // Get total count\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_SCORERS} WHERE runId = {var_runId:String}`,\n query_params: { var_runId: runId },\n format: 'JSONEachRow',\n });\n const countRows = await countResult.json();\n let total = 0;\n if (Array.isArray(countRows) && countRows.length > 0 && countRows[0]) {\n const countObj = countRows[0] as { count: string | number };\n total = Number(countObj.count);\n }\n\n const { page, perPage: perPageInput } = pagination;\n\n if (!total) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n // Get paginated results\n const result = await this.client.query({\n query: `SELECT * FROM ${TABLE_SCORERS} WHERE runId = {var_runId:String} ORDER BY createdAt DESC LIMIT {var_limit:Int64} OFFSET {var_offset:Int64}`,\n query_params: {\n var_runId: runId,\n var_limit: limitValue,\n var_offset: start,\n },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n const rows = await result.json();\n const scores = Array.isArray(rows) ? rows.map(row => this.transformScoreRow(row)) : [];\n return {\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_SCORES_BY_RUN_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId },\n },\n error,\n );\n }\n }\n\n async listScoresByScorerId({\n scorerId,\n entityId,\n entityType,\n source,\n pagination,\n }: {\n scorerId: string;\n pagination: StoragePagination;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n }): Promise<ListScoresResponse> {\n let whereClause = `scorerId = {var_scorerId:String}`;\n if (entityId) {\n whereClause += ` AND entityId = {var_entityId:String}`;\n }\n if (entityType) {\n whereClause += ` AND entityType = {var_entityType:String}`;\n }\n if (source) {\n whereClause += ` AND source = {var_source:String}`;\n }\n\n try {\n // Get total count\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_SCORERS} WHERE ${whereClause}`,\n query_params: {\n var_scorerId: scorerId,\n var_entityId: entityId,\n var_entityType: entityType,\n var_source: source,\n },\n format: 'JSONEachRow',\n });\n const countRows = await countResult.json();\n let total = 0;\n if (Array.isArray(countRows) && countRows.length > 0 && countRows[0]) {\n const countObj = countRows[0] as { count: string | number };\n total = Number(countObj.count);\n }\n\n const { page, perPage: perPageInput } = pagination;\n\n if (!total) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n // Get paginated results\n const result = await this.client.query({\n query: `SELECT * FROM ${TABLE_SCORERS} WHERE ${whereClause} ORDER BY createdAt DESC LIMIT {var_limit:Int64} OFFSET {var_offset:Int64}`,\n query_params: {\n var_scorerId: scorerId,\n var_limit: limitValue,\n var_offset: start,\n var_entityId: entityId,\n var_entityType: entityType,\n var_source: source,\n },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n const rows = await result.json();\n const scores = Array.isArray(rows) ? rows.map(row => this.transformScoreRow(row)) : [];\n return {\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_SCORES_BY_SCORER_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerId },\n },\n error,\n );\n }\n }\n\n async listScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n pagination: StoragePagination;\n entityId: string;\n entityType: string;\n }): Promise<ListScoresResponse> {\n try {\n // Get total count\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_SCORERS} WHERE entityId = {var_entityId:String} AND entityType = {var_entityType:String}`,\n query_params: { var_entityId: entityId, var_entityType: entityType },\n format: 'JSONEachRow',\n });\n const countRows = await countResult.json();\n let total = 0;\n if (Array.isArray(countRows) && countRows.length > 0 && countRows[0]) {\n const countObj = countRows[0] as { count: string | number };\n total = Number(countObj.count);\n }\n\n const { page, perPage: perPageInput } = pagination;\n\n if (!total) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n // Get paginated results\n const result = await this.client.query({\n query: `SELECT * FROM ${TABLE_SCORERS} WHERE entityId = {var_entityId:String} AND entityType = {var_entityType:String} ORDER BY createdAt DESC LIMIT {var_limit:Int64} OFFSET {var_offset:Int64}`,\n query_params: {\n var_entityId: entityId,\n var_entityType: entityType,\n var_limit: limitValue,\n var_offset: start,\n },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n const rows = await result.json();\n const scores = Array.isArray(rows) ? rows.map(row => this.transformScoreRow(row)) : [];\n return {\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_SCORES_BY_ENTITY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { entityId, entityType },\n },\n error,\n );\n }\n }\n\n async listScoresBySpan({\n traceId,\n spanId,\n pagination,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n try {\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_SCORERS} WHERE traceId = {var_traceId:String} AND spanId = {var_spanId:String}`,\n query_params: {\n var_traceId: traceId,\n var_spanId: spanId,\n },\n format: 'JSONEachRow',\n });\n const countRows = await countResult.json();\n let total = 0;\n if (Array.isArray(countRows) && countRows.length > 0 && countRows[0]) {\n const countObj = countRows[0] as { count: string | number };\n total = Number(countObj.count);\n }\n\n const { page, perPage: perPageInput } = pagination;\n\n if (!total) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n const result = await this.client.query({\n query: `SELECT * FROM ${TABLE_SCORERS} WHERE traceId = {var_traceId:String} AND spanId = {var_spanId:String} ORDER BY createdAt DESC LIMIT {var_limit:Int64} OFFSET {var_offset:Int64}`,\n query_params: {\n var_traceId: traceId,\n var_spanId: spanId,\n var_limit: limitValue,\n var_offset: start,\n },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = await result.json();\n const scores = Array.isArray(rows) ? rows.map(row => this.transformScoreRow(row)) : [];\n\n return {\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_SCORES_BY_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId, spanId },\n },\n error,\n );\n }\n }\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n normalizePerPage,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_SCHEMAS,\n WorkflowsStorage,\n} from '@mastra/core/storage';\nimport type {\n WorkflowRun,\n WorkflowRuns,\n StorageListWorkflowRunsInput,\n UpdateWorkflowStateOptions,\n} from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport { ClickhouseDB, resolveClickhouseConfig } from '../../db';\nimport type { ClickhouseDomainConfig } from '../../db';\nimport { TABLE_ENGINES } from '../../db/utils';\n\nexport class WorkflowsStorageClickhouse extends WorkflowsStorage {\n protected client: ClickHouseClient;\n #db: ClickhouseDB;\n constructor(config: ClickhouseDomainConfig) {\n super();\n const { client, ttl } = resolveClickhouseConfig(config);\n this.client = client;\n this.#db = new ClickhouseDB({ client, ttl });\n }\n\n supportsConcurrentUpdates(): boolean {\n // ClickHouse is an OLAP database using ReplacingMergeTree for deduplication\n // It doesn't support atomic read-modify-write operations needed for concurrent updates\n return false;\n }\n\n async init(): Promise<void> {\n const schema = TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT];\n await this.#db.createTable({ tableName: TABLE_WORKFLOW_SNAPSHOT, schema });\n // Add resourceId column for backwards compatibility\n await this.#db.alterTable({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n schema,\n ifNotExists: ['resourceId'],\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_WORKFLOW_SNAPSHOT });\n }\n\n async updateWorkflowResults(_args: {\n workflowName: string;\n runId: string;\n stepId: string;\n result: StepResult<any, any, any, any>;\n requestContext: Record<string, any>;\n }): Promise<Record<string, StepResult<any, any, any, any>>> {\n throw new Error(\n 'updateWorkflowResults is not implemented for ClickHouse storage. ClickHouse is an OLAP database and does not support atomic read-modify-write operations needed for concurrent workflow updates.',\n );\n }\n\n async updateWorkflowState(_args: {\n workflowName: string;\n runId: string;\n opts: UpdateWorkflowStateOptions;\n }): Promise<WorkflowRunState | undefined> {\n throw new Error(\n 'updateWorkflowState is not implemented for ClickHouse storage. ClickHouse is an OLAP database and does not support atomic read-modify-write operations needed for concurrent workflow updates.',\n );\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n createdAt,\n updatedAt,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n createdAt?: Date;\n updatedAt?: Date;\n }): Promise<void> {\n try {\n const currentSnapshot = await this.#db.load({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: { workflow_name: workflowName, run_id: runId },\n });\n\n const now = new Date();\n const persisting = currentSnapshot\n ? {\n ...currentSnapshot,\n resourceId,\n snapshot: JSON.stringify(snapshot),\n updatedAt: (updatedAt ?? now).toISOString(),\n }\n : {\n workflow_name: workflowName,\n run_id: runId,\n resourceId,\n snapshot: JSON.stringify(snapshot),\n createdAt: (createdAt ?? now).toISOString(),\n updatedAt: (updatedAt ?? now).toISOString(),\n };\n\n await this.client.insert({\n table: TABLE_WORKFLOW_SNAPSHOT,\n format: 'JSONEachRow',\n values: [persisting],\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'PERSIST_WORKFLOW_SNAPSHOT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n try {\n const result = await this.#db.load({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: {\n workflow_name: workflowName,\n run_id: runId,\n },\n });\n\n if (!result) {\n return null;\n }\n\n return (result as any).snapshot;\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LOAD_WORKFLOW_SNAPSHOT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n private parseWorkflowRun(row: any): WorkflowRun {\n let parsedSnapshot: WorkflowRunState | string = row.snapshot as string;\n if (typeof parsedSnapshot === 'string') {\n try {\n parsedSnapshot = JSON.parse(row.snapshot as string) as WorkflowRunState;\n } catch (e) {\n // If parsing fails, return the raw snapshot string\n this.logger.warn(`Failed to parse snapshot for workflow ${row.workflow_name}: ${e}`);\n }\n }\n\n return {\n workflowName: row.workflow_name,\n runId: row.run_id,\n snapshot: parsedSnapshot,\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n resourceId: row.resourceId,\n };\n }\n\n async listWorkflowRuns({\n workflowName,\n fromDate,\n toDate,\n page,\n perPage,\n resourceId,\n status,\n }: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n try {\n const conditions: string[] = [];\n const values: Record<string, any> = {};\n\n if (workflowName) {\n conditions.push(`workflow_name = {var_workflow_name:String}`);\n values.var_workflow_name = workflowName;\n }\n\n if (status) {\n conditions.push(`JSONExtractString(snapshot, 'status') = {var_status:String}`);\n values.var_status = status;\n }\n\n if (resourceId) {\n const hasResourceId = await this.#db.hasColumn(TABLE_WORKFLOW_SNAPSHOT, 'resourceId');\n if (hasResourceId) {\n conditions.push(`resourceId = {var_resourceId:String}`);\n values.var_resourceId = resourceId;\n } else {\n this.logger.warn(`[${TABLE_WORKFLOW_SNAPSHOT}] resourceId column not found. Skipping resourceId filter.`);\n }\n }\n\n if (fromDate) {\n conditions.push(`createdAt >= {var_from_date:DateTime64(3)}`);\n values.var_from_date = fromDate.getTime() / 1000; // Convert to Unix timestamp\n }\n\n if (toDate) {\n conditions.push(`createdAt <= {var_to_date:DateTime64(3)}`);\n values.var_to_date = toDate.getTime() / 1000; // Convert to Unix timestamp\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const usePagination = perPage !== undefined && page !== undefined;\n const normalizedPerPage = usePagination ? normalizePerPage(perPage, Number.MAX_SAFE_INTEGER) : 0;\n const offset = usePagination ? page * normalizedPerPage : 0;\n const limitClause = usePagination ? `LIMIT ${normalizedPerPage}` : '';\n const offsetClause = usePagination ? `OFFSET ${offset}` : '';\n\n let total = 0;\n // Only get total count when using pagination\n if (usePagination) {\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_WORKFLOW_SNAPSHOT} ${TABLE_ENGINES[TABLE_WORKFLOW_SNAPSHOT].startsWith('ReplacingMergeTree') ? 'FINAL' : ''} ${whereClause}`,\n query_params: values,\n format: 'JSONEachRow',\n });\n const countRows = await countResult.json();\n total = Number((countRows as Array<{ count: string | number }>)[0]?.count ?? 0);\n }\n\n // Get results\n const result = await this.client.query({\n query: `\n SELECT \n workflow_name,\n run_id,\n snapshot,\n toDateTime64(createdAt, 3) as createdAt,\n toDateTime64(updatedAt, 3) as updatedAt,\n resourceId\n FROM ${TABLE_WORKFLOW_SNAPSHOT} ${TABLE_ENGINES[TABLE_WORKFLOW_SNAPSHOT].startsWith('ReplacingMergeTree') ? 'FINAL' : ''}\n ${whereClause}\n ORDER BY createdAt DESC\n ${limitClause}\n ${offsetClause}\n `,\n query_params: values,\n format: 'JSONEachRow',\n });\n\n const resultJson = await result.json();\n const rows = resultJson as any[];\n const runs = rows.map(row => {\n return this.parseWorkflowRun(row);\n });\n\n // Use runs.length as total when not paginating\n return { runs, total: total || runs.length };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_WORKFLOW_RUNS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName: workflowName ?? '', resourceId: resourceId ?? '' },\n },\n error,\n );\n }\n }\n\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n try {\n const conditions: string[] = [];\n const values: Record<string, any> = {};\n\n if (runId) {\n conditions.push(`run_id = {var_runId:String}`);\n values.var_runId = runId;\n }\n\n if (workflowName) {\n conditions.push(`workflow_name = {var_workflow_name:String}`);\n values.var_workflow_name = workflowName;\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Get results\n const result = await this.client.query({\n query: `\n SELECT \n workflow_name,\n run_id,\n snapshot,\n toDateTime64(createdAt, 3) as createdAt,\n toDateTime64(updatedAt, 3) as updatedAt,\n resourceId\n FROM ${TABLE_WORKFLOW_SNAPSHOT} ${TABLE_ENGINES[TABLE_WORKFLOW_SNAPSHOT].startsWith('ReplacingMergeTree') ? 'FINAL' : ''}\n ${whereClause}\n ORDER BY createdAt DESC LIMIT 1\n `,\n query_params: values,\n format: 'JSONEachRow',\n });\n\n const resultJson = await result.json();\n if (!Array.isArray(resultJson) || resultJson.length === 0) {\n return null;\n }\n return this.parseWorkflowRun(resultJson[0]);\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_WORKFLOW_RUN_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId: runId ?? '', workflowName: workflowName ?? '' },\n },\n error,\n );\n }\n }\n\n async deleteWorkflowRunById({ runId, workflowName }: { runId: string; workflowName: string }): Promise<void> {\n try {\n const values: Record<string, any> = {\n var_runId: runId,\n var_workflow_name: workflowName,\n };\n\n await this.client.command({\n query: `DELETE FROM ${TABLE_WORKFLOW_SNAPSHOT} WHERE run_id = {var_runId:String} AND workflow_name = {var_workflow_name:String}`,\n query_params: values,\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'DELETE_WORKFLOW_RUN_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId, workflowName },\n },\n error,\n );\n }\n }\n}\n","import type { ClickHouseClient, ClickHouseClientConfigOptions } from '@clickhouse/client';\nimport { createClient } from '@clickhouse/client';\nimport { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport { createStorageErrorId, MastraCompositeStore } from '@mastra/core/storage';\nimport type { TABLE_NAMES, StorageDomains, TABLE_SCHEMAS } from '@mastra/core/storage';\nimport { BackgroundTasksStorageClickhouse } from './domains/background-tasks';\nimport { MemoryStorageClickhouse } from './domains/memory';\nimport { ObservabilityStorageClickhouse } from './domains/observability';\nimport { ObservabilityStorageClickhouseVNext } from './domains/observability/v-next';\nexport type { VNextObservabilityConfig, RetentionConfig } from './domains/observability/v-next';\nimport { ScoresStorageClickhouse } from './domains/scores';\nimport { WorkflowsStorageClickhouse } from './domains/workflows';\n\n// Export domain classes for direct use with MastraStorage composition\nexport {\n BackgroundTasksStorageClickhouse,\n MemoryStorageClickhouse,\n ObservabilityStorageClickhouse,\n ObservabilityStorageClickhouseVNext,\n ScoresStorageClickhouse,\n WorkflowsStorageClickhouse,\n};\nexport type { ClickhouseDomainConfig } from './db';\n\ntype IntervalUnit =\n | 'NANOSECOND'\n | 'MICROSECOND'\n | 'MILLISECOND'\n | 'SECOND'\n | 'MINUTE'\n | 'HOUR'\n | 'DAY'\n | 'WEEK'\n | 'MONTH'\n | 'QUARTER'\n | 'YEAR';\n\ntype ClickhouseTtlConfig = {\n [TableKey in TABLE_NAMES]?: {\n row?: { interval: number; unit: IntervalUnit; ttlKey?: string };\n columns?: Partial<{\n [ColumnKey in keyof (typeof TABLE_SCHEMAS)[TableKey]]: {\n interval: number;\n unit: IntervalUnit;\n ttlKey?: string;\n };\n }>;\n };\n};\n\n/**\n * ClickHouse credentials configuration.\n * Requires url, username, and password, plus supports all other ClickHouseClientConfigOptions.\n */\ntype ClickhouseCredentialsConfig = Omit<ClickHouseClientConfigOptions, 'url' | 'username' | 'password'> & {\n /** ClickHouse server URL (required) */\n url: string;\n /** ClickHouse username (required) */\n username: string;\n /** ClickHouse password (required) */\n password: string;\n};\n\n/**\n * ClickHouse configuration type.\n *\n * Accepts either:\n * - A pre-configured ClickHouse client: `{ id, client, ttl? }`\n * - ClickHouse credentials with optional advanced options: `{ id, url, username, password, ... }`\n *\n * All ClickHouseClientConfigOptions are supported (database, request_timeout,\n * compression, keep_alive, max_open_connections, etc.).\n *\n * @example\n * ```typescript\n * // Simple credentials config\n * const store = new ClickhouseStore({\n * id: 'my-store',\n * url: 'http://localhost:8123',\n * username: 'default',\n * password: '',\n * });\n *\n * // With advanced options\n * const store = new ClickhouseStore({\n * id: 'my-store',\n * url: 'http://localhost:8123',\n * username: 'default',\n * password: '',\n * request_timeout: 60000,\n * compression: { request: true, response: true },\n * keep_alive: { enabled: true },\n * });\n * ```\n */\nexport type ClickhouseConfig = {\n id: string;\n ttl?: ClickhouseTtlConfig;\n /**\n * When true, automatic initialization (table creation/migrations) is disabled.\n * This is useful for CI/CD pipelines where you want to:\n * 1. Run migrations explicitly during deployment (not at runtime)\n * 2. Use different credentials for schema changes vs runtime operations\n *\n * When disableInit is true:\n * - The storage will not automatically create/alter tables on first use\n * - You must call `storage.init()` explicitly in your CI/CD scripts\n *\n * @example\n * // In CI/CD script:\n * const storage = new ClickhouseStore({ ...config, disableInit: false });\n * await storage.init(); // Explicitly run migrations\n *\n * // In runtime application:\n * const storage = new ClickhouseStore({ ...config, disableInit: true });\n * // No auto-init, tables must already exist\n */\n disableInit?: boolean;\n} & (\n | {\n /**\n * Pre-configured ClickHouse client.\n * Use this when you need to configure the client before initialization,\n * e.g., to set custom connection settings or interceptors.\n *\n * @example\n * ```typescript\n * import { createClient } from '@clickhouse/client';\n *\n * const client = createClient({\n * url: 'http://localhost:8123',\n * username: 'default',\n * password: '',\n * // Custom settings\n * request_timeout: 60000,\n * });\n *\n * const store = new ClickhouseStore({ id: 'my-store', client });\n * ```\n */\n client: ClickHouseClient;\n }\n | ClickhouseCredentialsConfig\n);\n\n/**\n * Type guard for pre-configured client config\n */\nconst isClientConfig = (config: ClickhouseConfig): config is ClickhouseConfig & { client: ClickHouseClient } => {\n return 'client' in config;\n};\n\n/**\n * ClickHouse storage adapter for Mastra.\n *\n * Access domain-specific storage via `getStore()`:\n *\n * @example\n * ```typescript\n * const storage = new ClickhouseStore({ id: 'my-store', url: '...', username: '...', password: '...' });\n *\n * // Access memory domain\n * const memory = await storage.getStore('memory');\n * await memory?.saveThread({ thread });\n *\n * // Access workflows domain\n * const workflows = await storage.getStore('workflows');\n * await workflows?.persistWorkflowSnapshot({ workflowName, runId, snapshot });\n *\n * // Access observability domain\n * const observability = await storage.getStore('observability');\n * await observability?.createSpan(span);\n * ```\n */\nexport class ClickhouseStore extends MastraCompositeStore {\n protected db: ClickHouseClient;\n protected ttl: ClickhouseConfig['ttl'] = {};\n\n stores: StorageDomains;\n\n constructor(config: ClickhouseConfig) {\n super({ id: config.id, name: 'ClickhouseStore', disableInit: config.disableInit });\n\n // Handle pre-configured client vs creating new connection\n if (isClientConfig(config)) {\n // User provided a pre-configured ClickHouse client\n this.db = config.client;\n } else {\n // Validate URL before creating client\n if (!config.url || typeof config.url !== 'string' || config.url.trim() === '') {\n throw new Error('ClickhouseStore: url is required and cannot be empty.');\n }\n // Validate username and password are strings (can be empty for default user)\n if (typeof config.username !== 'string') {\n throw new Error('ClickhouseStore: username must be a string.');\n }\n if (typeof config.password !== 'string') {\n throw new Error('ClickhouseStore: password must be a string.');\n }\n\n // Extract Mastra-specific config, pass rest to ClickHouse client\n const { id, ttl, disableInit, clickhouse_settings, ...clientOptions } = config;\n\n // Create client with all provided options\n this.db = createClient({\n ...clientOptions,\n clickhouse_settings: {\n ...clickhouse_settings,\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso', // This is crucial\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n }\n\n this.ttl = config.ttl;\n\n const domainConfig = { client: this.db, ttl: this.ttl };\n const workflows = new WorkflowsStorageClickhouse(domainConfig);\n const scores = new ScoresStorageClickhouse(domainConfig);\n const memory = new MemoryStorageClickhouse(domainConfig);\n const observability = new ObservabilityStorageClickhouse(domainConfig);\n\n this.stores = {\n workflows,\n scores,\n memory,\n observability,\n backgroundTasks: new BackgroundTasksStorageClickhouse(domainConfig),\n };\n }\n\n async optimizeTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n await this.db.command({\n query: `OPTIMIZE TABLE ${tableName} FINAL`,\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'OPTIMIZE_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async materializeTtl({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n await this.db.command({\n query: `ALTER TABLE ${tableName} MATERIALIZE TTL;`,\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'MATERIALIZE_TTL', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n /**\n * Closes the ClickHouse client connection.\n *\n * This will close the ClickHouse client, including pre-configured clients.\n * The store assumes ownership of all clients and manages their lifecycle.\n */\n async close(): Promise<void> {\n try {\n await this.db.close();\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'CLOSE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n\n/**\n * ClickHouse storage adapter that uses the vNext observability domain by default.\n *\n * Equivalent to constructing a `ClickhouseStore` and overriding the `observability`\n * domain with `ObservabilityStorageClickhouseVNext` through `MastraCompositeStore`.\n * Use this in new projects to opt into the vNext observability schema without\n * needing to wire the composite manually.\n *\n * Accepts the same configuration as `ClickhouseStore`. The underlying ClickHouse\n * client is shared between every domain, including observability.\n *\n * @example\n * ```typescript\n * import { Mastra } from '@mastra/core';\n * import { ClickhouseStoreVNext } from '@mastra/clickhouse';\n *\n * export const mastra = new Mastra({\n * storage: new ClickhouseStoreVNext({\n * id: 'clickhouse-storage',\n * url: process.env.CLICKHOUSE_URL!,\n * username: process.env.CLICKHOUSE_USERNAME!,\n * password: process.env.CLICKHOUSE_PASSWORD!,\n * }),\n * });\n * ```\n */\nexport class ClickhouseStoreVNext extends ClickhouseStore {\n constructor(config: ClickhouseConfig) {\n super(config);\n\n // Identify as ClickhouseStoreVNext for callers that introspect `name`.\n // The logger created by MastraBase still reflects the parent name.\n this.name = 'ClickhouseStoreVNext';\n\n // Replace the legacy observability domain set up by ClickhouseStore with the\n // vNext implementation. Both share the same underlying client.\n const observability = new ObservabilityStorageClickhouseVNext({ client: this.db });\n\n this.stores = {\n ...this.stores,\n observability,\n };\n }\n}\n"]}